diff --git a/README.md b/README.md index 1dc567e..63ba111 100644 --- a/README.md +++ b/README.md @@ -3,5 +3,3 @@ Cell Ranger is a set of analysis pipelines that perform sample demultiplexing, b Please note that this source code is made available only for informational purposes. 10x does not provide support for interpreting, modifying, building, or running this code. The officially supported release binaries are available at . Documentation is available at . - -Note: This source code is for Cell Ranger 8.0.1. The source code for the latest Cell Ranger 9.0.0 release will be posted here soon. diff --git a/bin/rna/mkgtf_lib.py b/bin/rna/mkgtf_lib.py index cb50efd..8d31b15 100755 --- a/bin/rna/mkgtf_lib.py +++ b/bin/rna/mkgtf_lib.py @@ -61,7 +61,7 @@ def main(): for attribute_str in attributes_str: parts = attribute_str.split(":") if len(parts) != 2: - sys.exit("Attribute option must have format : %s" % attribute_str) + sys.exit(f"Attribute option must have format : {attribute_str}") key, value = parts attributes[key].add(value) diff --git a/bin/sc_rna/mkfastq b/bin/sc_rna/mkfastq index a861390..d8a6bc9 100755 --- a/bin/sc_rna/mkfastq +++ b/bin/sc_rna/mkfastq @@ -15,7 +15,6 @@ function implement_read_configuration { TENX_UMI_START_INDEX=16 TENX_UMI_LENGTH=10 TENX_SI_READ_TYPE=I1 - WHITELIST_NAME="737K-august-2016,3M-february-2018" else # 10x barcode in index read, v1 chemistry TENX_BC_READ_TYPE=I1 @@ -24,9 +23,7 @@ function implement_read_configuration { TENX_UMI_START_INDEX=0 TENX_UMI_LENGTH=10 TENX_SI_READ_TYPE=I2 - WHITELIST_NAME="737K-april-2014_rc" fi - TENX_BARCODE_WHITELIST=$(python -c 'from sys import argv;import cellranger.barcodes.utils as u;print(u.get_barcode_whitelist_paths(argv[1]))' "$WHITELIST_NAME") } # shellcheck source=../tenkit/_mkfastq diff --git a/bin/tenkit/_mkfastq b/bin/tenkit/_mkfastq index 00fc08a..7a6ffbb 100755 --- a/bin/tenkit/_mkfastq +++ b/bin/tenkit/_mkfastq @@ -434,10 +434,6 @@ fi ############################## # Check environment variables # -if [ -z "$TENX_BARCODE_WHITELIST" ]; then - echo "TENX_BARCODE_WHITELIST environment variable must be set by enclosing script." - exit 1 -fi if [ -z "$TENX_BC_READ_TYPE" ]; then echo "TENX_BC_READ_TYPE environment variable must be set by enclosing script." @@ -585,7 +581,6 @@ call MAKE_FASTQS_CS( specs = $specs, project = $project, bases_mask = $bcl2fastq_use_bases_mask, - barcode_whitelist = "$TENX_BARCODE_WHITELIST", bcl2fastq1_args = $bcl2fastq1_opts, bcl2fastq2_args = $bcl2fastq2_opts, bc_read_type = "$TENX_BC_READ_TYPE", diff --git a/bin/tenkit/check_fastq_params_lib.py b/bin/tenkit/check_fastq_params_lib.py index 4feb0d0..8052492 100755 --- a/bin/tenkit/check_fastq_params_lib.py +++ b/bin/tenkit/check_fastq_params_lib.py @@ -30,7 +30,7 @@ def get_mro_params(fastq_paths, fastqprefixes): print(f"{fastq_mode}\t{ensure_str(sample_name)}") sys.exit(0) except ValueError as ex: - sys.stderr.write("%s\n" % str(ex)) + sys.stderr.write(f"{ex!s}\n") sys.exit(1) diff --git a/bin/tenkit/check_fastq_paths_lib.py b/bin/tenkit/check_fastq_paths_lib.py index 546d0e1..ac497b7 100755 --- a/bin/tenkit/check_fastq_paths_lib.py +++ b/bin/tenkit/check_fastq_paths_lib.py @@ -36,7 +36,7 @@ def get_bcl2fastq_output_folder(path): :raises: ValueError if the path/project path is illegal """ if not os.path.exists(path): - raise ValueError("Invalid path: %s" % path) + raise ValueError(f"Invalid path: {path}") link = os.path.join(path, "outs", "fastq_path") # check path pointed to pipestance @@ -74,7 +74,7 @@ def main(): for path in fastq_paths: abs_path = os.path.abspath(os.path.expanduser(path)) if not os.path.exists(abs_path): - sys.stderr.write("Invalid path to --fastqs: %s\n" % abs_path) + sys.stderr.write(f"Invalid path to --fastqs: {abs_path}\n") try: fastq_path = get_bcl2fastq_output_folder(abs_path) @@ -97,21 +97,19 @@ def main(): raise ValueError( "The --project argument must be specified if BCLs " "were demultiplexed into multiple project folders. " - "Options:\n%s" % projects_list + f"Options:\n{projects_list}" ) # project length == 1 elif len(projects) == 1: output_paths.append(os.path.join(fastq_path, projects[0])) except ValueError as ex: - sys.stderr.write("%s\n" % str(ex)) + sys.stderr.write(f"{ex!s}\n") return 1 # if no paths selected because --project specified, say so if args.project and len(fastq_paths) > 0 and len(output_paths) == 0: - sys.stderr.write( - "Could not find any paths that matched --project value: %s\n" % args.project - ) + sys.stderr.write(f"Could not find any paths that matched --project value: {args.project}\n") return 1 # at this point all paths containing either paths to the bcl2fastq root folder diff --git a/bin/tenkit/sitecheck b/bin/tenkit/sitecheck deleted file mode 100755 index 44c6ea7..0000000 --- a/bin/tenkit/sitecheck +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (c) 2016 10x Genomics, Inc. All rights reserved. -# -# Site Check for 10x Genomics pipelines. -# - -eval "$(docopts -V " " -h - : "$@" <&1 - builtin read -t 20 < <( - eval /usr/bin/env $cmd 1>&3 2> /dev/null - builtin echo $? - ) 3>&1 && exit $REPLY || { - rc=$? - builtin echo "timed out" - builtin kill -s SIGHUP -- $! 2> /dev/null - exit $rc - } - ) - ecode=$? - echo "=====================================================================" - echo "" -} - -function ifchk { - if [ $ecode == 0 ]; then - check "$1" "$2" - fi -} - - -# Generate version banner -read -d '' BANNER < /dev/null && echo 'Detected'" -check "init process" "head -n 1 /proc/1/sched | cut -d ' ' -f 1" - -# cluster config -check "SGE Submit" "which qsub" -ifchk "SGE CLUSTER_NAME" "echo \$SGE_CLUSTER_NAME" -ifchk "SGE JOB_NAME" "echo \$JOB_NAME" - -check "LSF Submit" "which bsub" -ifchk "LSF LSB_JOBNAME" "echo \$LSB_JOBNAME" - -check "HTCondor Submit" "which condor_submit" -check "Batch system" "echo \$BATCH_SYSTEM" - -check "BCL2FASTQ 1" "which configureBclToFastq.pl" -ifchk "BCL2FASTQ 1 Version" "ls \$(dirname \$(which configureBclToFastq.pl))/../etc" -ifchk "Perl" "which perl" -ifchk "Perl Version" "perl -v" - -check "BCL2FASTQ 2" "which bcl2fastq" -ifchk "BCL2FASTQ 2 Version" "bcl2fastq --version" - -check "Java" "which java" -ifchk "Java Version" "java -version 2>&1 | cat" - -check "10X Refdata" "echo \$TENX_REFDATA" -ifchk "10X Refdata Version" "cat \$TENX_REFDATA/version" - -check "qconf" "which qconf" -ifchk "qconf -sc" "qconf -sc && qconf -sconf | grep -E '(shell_start_mode|login_shells|max_jobs)'" -ifchk "qhost" "which qhost" -ifchk "qhost count" "qhost -l \"mem_total=20G\" | tail -n +3 | wc -l" -ifchk "qhost -F" "qhost -F -q -h \$(qhost | sort -h -k 5 -r | head -n 1 | cut -d \" \" -f 1)" - -check "slurm info" "sinfo -O nodes,maxcpuspernode,memory,time" - -check "MRP" "mrp --version" -ifchk "mrp templates" "ls \$(dirname \$(dirname \$(which mrp)))/jobmanagers/*.template" -if [ $ecode == 0 ]; then - mrp_dir=$(dirname "$(which mrp)") - jobmanagers=$(dirname "$mrp_dir")/jobmanagers - for template in "$jobmanagers"/*.template; do - ifchk "$template" "cat $template" - done -fi - diff --git a/bin/tenkit/upload_lib.py b/bin/tenkit/upload_lib.py index 3117804..d97c1e5 100755 --- a/bin/tenkit/upload_lib.py +++ b/bin/tenkit/upload_lib.py @@ -27,7 +27,7 @@ def _parse_args(argv: list[str]) -> tuple[str, str]: """Parse command line.""" usage_message = """Usage: - %s upload """ % ( + {} upload """.format( os.getenv("TENX_PRODUCT", "") ) @@ -161,7 +161,7 @@ def read(self, csize: int) -> bytes: ("%d%%" % pctg).rjust(4), # percentage (("=" * (pctg // 3)) + ">").ljust(34), # progress bar pn(self.bcount).rjust(len(pn(self.bsize))), # bytes sent - ("%.2fMb/s" % mbps).rjust(10), # bitrate + (f"{mbps:.2f}Mb/s").rjust(10), # bitrate ("%dm" % etam), # eta min ("%ds" % etas).rjust(3), # eta sec ) @@ -202,7 +202,7 @@ def _upload(filename: str, size: int, upurl: str, context: ssl.SSLContext): print("\nError:") root = ET.fromstring(contents) for e in root: - if e.tag != "RequestId" and e.tag != "HostId": + if e.tag not in ("RequestId", "HostId"): print(f" {e.tag}: {e.text}") else: print("\nUpload complete!") diff --git a/conda_spec.bzl b/conda_spec.bzl deleted file mode 100644 index a8d1b8d..0000000 --- a/conda_spec.bzl +++ /dev/null @@ -1,3456 +0,0 @@ -# Code generated by make_conda_spec. DO NOT EDIT. -"""This file contains the workspace rules for the anaconda distribution. - -To use, add -``` - load(":conda_spec.bzl", "anaconda_workspace") - anaconda_workspace() -``` -to your `WORKSPACE` file. -""" - -load( - "@tenx_bazel_rules//rules:anaconda_repository.bzl", - "anaconda_repository", -) -load( - "@tenx_bazel_rules//rules:conda_package_repository.bzl", - "conda_package_repository", -) - -def anaconda_workspace(name = "anaconda"): - """Create remote repositories to download each conda package. - - Also create the repository rule to generate the complete distribution. In - general, other targets should depend on targets in the `@anaconda` - repository, rather than individual package repositories. - - Args: - name (string): The name of the top level distribution repo. - """ - - conda_package_repository( - name = "conda_package__libgcc_mutex", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "_libgcc_mutex-0.1-conda_forge", - sha256 = "fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726", - ) - - conda_package_repository( - name = "conda_package_aiohttp", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "aiohttp-3.9.3-py310h2372a71_0", - sha256 = "a0346028476deb19143b70a554a3c0b4bf03f2c344d4011385bacc6caabc669e", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_aiosignal", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "aiosignal-1.3.1-pyhd8ed1ab_0", - sha256 = "575c742e14c86575986dc867463582a970463da50b77264cdf54df74f5563783", - ) - - conda_package_repository( - name = "conda_package_altair", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "altair-5.2.0-pyhd8ed1ab_0", - sha256 = "9fbaf9d1d8b3c8b5649a36c27311d2a1ad4874ac69b2f8b77bb45989e1d0042d", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_anndata", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "anndata-0.10.5-pyhd8ed1ab_0", - sha256 = "d74b8e255cbaf58ffe0d8560f7b9a74a5752ec24fd8fbcc427f296ff2443440f", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_anyio", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "anyio-4.3.0-pyhd8ed1ab_0", - sha256 = "86aca4a31c09f9b4dbdb332cd9a6a7dbab62ca734d3f832651c0ab59c6a7f52e", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_anywidget", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "anywidget-0.9.2-pyhd8ed1ab_0", - sha256 = "a0ddf6859f628f35daa3d13141eb5c343d51b8c46622c4bb38ac1d129084219b", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_aom", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "aom-3.5.0-h27087fc_0", - sha256 = "ed05f72ffa891e3c6a507eac6f0221c85c1f0611491328cd098308060740891c", - ) - conda_package_repository( - name = "conda_package_appdirs", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "appdirs-1.4.4-pyh9f0ad1d_0", - sha256 = "ae9fb8f68281f84482f2c234379aa12405a9e365151d43af20b3ae1f17312111", - ) - conda_package_repository( - name = "conda_package_archspec", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "archspec-0.2.3-pyhd8ed1ab_0", - sha256 = "cef4062ea91f07a961a808801d6b34a163632150037f4bd28232310ff0301cd7", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_argcomplete", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "argcomplete-3.2.2-pyhd8ed1ab_0", - sha256 = "8a1d1f92d40c6686d10ecce290a42560d023ecc02676f54dcfedfc0ede354f52", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_argh", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "argh-0.31.2-pyhd8ed1ab_0", - sha256 = "dffd4089d8097d82482524f2e4db0f13ad976270bc5abbf42ac8e23e9f3eb3d4", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_argon2_cffi", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "argon2-cffi-23.1.0-pyhd8ed1ab_0", - sha256 = "130766446f5507bd44df957b6b5c898a8bd98f024bb426ed6cb9ff1ad67fc677", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_argon2_cffi_bindings", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "argon2-cffi-bindings-21.2.0-py310h2372a71_4", - sha256 = "af94cc9b4dcaa164e1cc7e7fa0b9eb56b87ea3dc6e093c8ef6c31cfa02d9ffdf", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_array_api_compat", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "array-api-compat-1.4.1-pyhd8ed1ab_0", - sha256 = "5af8f09ca354c8e9975a03bc4c60435851949667fe36a430624a52cfdb1e19cb", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_arrow", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "arrow-1.3.0-pyhd8ed1ab_0", - sha256 = "ff49825c7f9e29e09afa6284300810e7a8640d621740efb47c4541f4dc4969db", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_asgiref", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "asgiref-3.7.2-pyhd8ed1ab_0", - sha256 = "63f85717fd38912a69be5a03d35a648c404cb86843cd4a1302c380c0e7744e30", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_astroid", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "astroid-2.15.8-py310hff52083_0", - sha256 = "2987098715d7d6d66dfc7598648a28c07ff14e5f6622c63683c834623b376c9a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_asttokens", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "asttokens-2.4.1-pyhd8ed1ab_0", - sha256 = "708168f026df19a0344983754d27d1f7b28bb21afc7b97a82f02c4798a3d2111", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_async_lru", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "async-lru-2.0.4-pyhd8ed1ab_0", - sha256 = "7ed83731979fe5b046c157730e50af0e24454468bbba1ed8fc1a3107db5d7518", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_async_timeout", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "async-timeout-4.0.3-pyhd8ed1ab_0", - sha256 = "bd8b698e7f037a9c6107216646f1191f4f7a7fc6da6c34d1a6d4c211bcca8979", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_attrs", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "attrs-23.2.0-pyh71513ae_0", - sha256 = "77c7d03bdb243a048fff398cedc74327b7dc79169ebe3b4c8448b0331ea55fea", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_babel", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "babel-2.14.0-pyhd8ed1ab_0", - sha256 = "8584e3da58e92b72641c89ff9b98c51f0d5dbe76e527867804cbdf03ac91d8e6", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_backports_zoneinfo", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "backports.zoneinfo-0.2.1-py310hff52083_8", - sha256 = "18f868c36a5c6493c92acaab3753e9869b48bd486b2fcbc8e96d54b09c6a7512", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_bamtools", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "bamtools-2.5.2-hdcf5f25_2", - sha256 = "3fb1436f33b8b273b1a33ba234c4bff6d2b91aa0aaaa139b56ccb60f00c26295", - ) - conda_package_repository( - name = "conda_package_bcbio_gff", - base_urls = ["https://conda.anaconda.org/bioconda/noarch"], - dist_name = "bcbio-gff-0.7.1-pyh7cba7a3_0", - sha256 = "8a41f31ac1ba826c56b82c3d9626cd84d54f5a22aff0b38f515c8a5c2260f910", - ) - - conda_package_repository( - name = "conda_package_beautifulsoup4", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "beautifulsoup4-4.12.3-pyha770c72_0", - sha256 = "7b05b2d0669029326c623b9df7a29fa49d1982a9e7e31b2fea34b4c9a4a72317", - exclude = [ - "site-packages/bs4/tests/fuzz", - ], - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_bedtools", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "bedtools-2.31.1-hf5e1c6e_0", - sha256 = "ecabdcdd4a7c96a3303dea991fe4ab25d359f951893509a2bafa7f9e3d84c958", - licenses = ["@rules_license//licenses/spdx:MIT"], - ) - conda_package_repository( - name = "conda_package_biocantor", - base_urls = ["https://conda.anaconda.org/bioconda/noarch"], - dist_name = "biocantor-1.1.0-pyh7cba7a3_0", - sha256 = "9eb68b9559ae1b574ba7e49d4e8568cd3db883a65c9627191936fc9992d411ea", - ) - - conda_package_repository( - name = "conda_package_biopython", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "biopython-1.79-py310h5764c6d_3", - sha256 = "f513a026aba027ed78285b6083fc0a0e27d160c6e630770c1f5f46488928912a", - exclude = [ - "lib/python*/site-packages/Bio/Entrez/DTDs", - ], - ) - conda_package_repository( - name = "conda_package_black", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "black-23.12.1-py310hff52083_0", - sha256 = "3078e3475739382486162247b89c3bfb8f303ea8d38d1769229848784b797497", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_blas", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "blas-2.120-mkl", - sha256 = "e2310fc7086d0af41c62e0d84f04591bf4c3b974ae80754c3650f37f07c667ab", - exclude_deps = ["_openmp_mutex"], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_blas_devel", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "blas-devel-3.9.0-20_linux64_mkl", - sha256 = "74a99c20b857a01c0e1bdb00c2aec4696cf895451278d9e24171b3eed7ba1d68", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_blast", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "blast-2.14.1-pl5321h6f7f691_0", - sha256 = "a83d7e119a32a39d9d839c691d811dcea091e06dd4eac3032ab3244be606baa6", - exclude_deps = [ - "curl", - "perl", - "perl-archive-tar", - "perl-json", - "perl-list-moreutils", - ], - exclude = [ - "bin/legacy_blast.pl", - "bin/update_blastdb.pl", - "bin/update_blastdb.pl.bak", - ], - ) - - conda_package_repository( - name = "conda_package_bleach", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "bleach-6.1.0-pyhd8ed1ab_0", - sha256 = "845e77ef495376c5c3c328ccfd746ca0ef1978150cae8eae61a300fe7755fb08", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_blosc", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "blosc-1.21.5-h0f2a231_0", - sha256 = "e2b15b017775d1bda8edbb1bc48e545e45364edefa4d926732fc5488cc600731", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_boltons", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "boltons-23.1.1-pyhd8ed1ab_0", - sha256 = "0ff5173f6b20a5c95401aa52d10dbdc05c322fc568dc7417c6f76cf68e706d16", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_brotli", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "brotli-1.0.9-h166bdaf_9", - sha256 = "2357d205931912def55df0dc53573361156b27856f9bf359d464da162812ec1f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_brotli_bin", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "brotli-bin-1.0.9-h166bdaf_9", - sha256 = "1c128f136a59ee2fa47d7fbd9b6fc8afa8460d340e4ae0e6f5419ebbd7539a10", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_brotli_python", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "brotli-python-1.0.9-py310hd8f1fbe_9", - sha256 = "a4984cb906910850ae979387f0ac4e2623e0a3c8139bc67eb1fff0403bf8388b", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_brunsli", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "brunsli-0.1-h9c3ff4c_0", - sha256 = "36da32e5a6beab7a9af39be1c8f42e5eca716e64562cb9d5e0d559c14406b11d", - ) - - conda_package_repository( - name = "conda_package_bx_python", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "bx-python-0.11.0-py310h551a815_0", - sha256 = "3fce0cff8d9ea28b29523091ab87ea4c5dcece28134c4cc53f8bd631e059c8af", - ) - - conda_package_repository( - name = "conda_package_bzip2", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "bzip2-1.0.8-hd590300_5", - sha256 = "242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8", - exclude = [ - "man", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_c_ares", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "c-ares-1.27.0-hd590300_0", - sha256 = "2a5866b19d28cb963fab291a62ff1c884291b9d6f59de14643e52f103e255749", - archive_type = "conda", - exclude = [ - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_c_blosc2", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "c-blosc2-2.13.2-hb4ffafa_0", - sha256 = "525647593115f5feb8c82c227803bb84d65307756a19e755512931dc6e8c9ff3", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_ca_certificates", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "ca-certificates-2024.2.2-hbcca054_0", - sha256 = "91d81bfecdbb142c15066df70cc952590ae8991670198f92c66b62019b251aeb", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_cached_property", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "cached_property-1.5.2-pyha770c72_1", - sha256 = "6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7", - ) - - conda_package_repository( - name = "conda_package_certifi", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "certifi-2024.2.2-pyhd8ed1ab_0", - sha256 = "f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_cffi", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "cffi-1.16.0-py310h2fee648_0", - sha256 = "007e7f69ab45553b7bf11f2c1b8d3f3a13fd42997266a0d57795f41c7d38df36", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_cfitsio", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "cfitsio-4.1.0-hd9d235c_0", - sha256 = "ab51263a83b7138ed8f132d78381189cc4f9f79c95230634f39311759dbbaf4c", - ) - conda_package_repository( - name = "conda_package_charls", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "charls-2.3.4-h9c3ff4c_0", - sha256 = "28c3070a07d7bd441043c49dd7265acd0af824a6c0431ac891503e0973f9b0d3", - ) - - conda_package_repository( - name = "conda_package_charset_normalizer", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "charset-normalizer-3.3.2-pyhd8ed1ab_0", - sha256 = "20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_click", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "click-8.1.7-unix_pyh707e725_0", - sha256 = "f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_cloudpickle", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "cloudpickle-3.0.0-pyhd8ed1ab_0", - sha256 = "0dfbc1ffa72e7a0882f486c9b1e4e9cccb68cf5c576fe53a89d076c9f1d43754", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_colorama", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "colorama-0.4.6-pyhd8ed1ab_0", - sha256 = "2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698", - ) - - conda_package_repository( - name = "conda_package_comm", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "comm-0.2.1-pyhd8ed1ab_0", - sha256 = "bd90a200e6f7092a89f02c4800729a4a6d2b2de49d70a9706aeb083a635308c1", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_conda", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "conda-23.9.0-py310hff52083_2", - sha256 = "7c9916213879ded1142f95f058ec52da512bae7994105a35470aea66204c1683", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_conda_package_handling", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "conda-package-handling-2.2.0-pyh38be061_0", - sha256 = "9a221808405d813d8c555efce6944379b907d36d79e77d526d573efa6b996d26", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_conda_package_streaming", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "conda-package-streaming-0.9.0-pyhd8ed1ab_0", - sha256 = "654a2488f77bf43555787d952dbffdc5d97956ff4aa9e0414a7131bb741dcf4c", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_contourpy", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "contourpy-1.2.0-py310hd41b1e2_0", - sha256 = "73dd7868bfd98fa9e4d2cc524687b5c5c8f9d427d4e521875aacfe152eae4715", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_coverage", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "coverage-7.4.3-py310h2372a71_1", - sha256 = "15085cef9c602438214c7fd1ac1505b8ff02fe5255687d368bc53d7d2b1c9c21", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_cramjam", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "cramjam-2.8.1-py310hcb5633a_0", - sha256 = "2e1f80e7ab1291fef8b224d07b310b94d8c467ab4b61066d15f669c0b012c72f", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_cryptography", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "cryptography-39.0.0-py310h65dfdc0_0", - sha256 = "e3a50a09ad90d6b5a634146fddacb1897abcd3058fde33a38a2c2452fcce03ba", - archive_type = "conda", - exclude_deps = ["openssl<1.1.2a"], - ) - conda_package_repository( - name = "conda_package_curl", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "curl-7.87.0-h6312ad2_0", - sha256 = "5ca7a515166fc1960f7a0ff451c9d3ef1c35cd8d66f0780c91085a276b209e3e", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_cycler", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "cycler-0.12.1-pyhd8ed1ab_0", - sha256 = "f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_cython", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "cython-3.0.8-py310hc6cd4ac_0", - sha256 = "65412cbd9c794ebf75c71a80bc0ecc6eac2b73514c162ced2eb4acfc084c470d", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_cytoolz", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "cytoolz-0.12.3-py310h2372a71_0", - sha256 = "a75c195a71b8a1676f057a785515d1f78515d4f59389d5ac6d3cd9a08880566a", - archive_type = "conda", - exclude = [ - "lib/python*/site-packages/cytoolz/tests", - ], - ) - conda_package_repository( - name = "conda_package_dask_core", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "dask-core-2024.2.1-pyhd8ed1ab_0", - sha256 = "d394f19d6c7a04848861922416067c1c95c97739d802fb8d92e75f4baacdcb76", - archive_type = "conda", - exclude = [ - "site-packages/dask/*/tests", - "site-packages/dask/*/*/tests", - "site-packages/dask/tests", - ], - ) - conda_package_repository( - name = "conda_package_dataclasses", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "dataclasses-0.8-pyhc8e2a94_3", - sha256 = "63a83e62e0939bc1ab32de4ec736f6403084198c4639638b354a352113809c92", - ) - - conda_package_repository( - name = "conda_package_dav1d", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "dav1d-1.0.0-h166bdaf_1", - sha256 = "d03e95f2f7e49fd34fc8339a5af204dfaf69c2190bc03b1164d827aa78584765", - ) - conda_package_repository( - name = "conda_package_debugpy", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "debugpy-1.8.1-py310hc6cd4ac_0", - sha256 = "69d3970a9bb62d4e1e187f82248cc1cc924589c06100a6f1a065e063f4155978", - exclude = [ - "lib/python*/site-packages/debugpy/_vendored/pydevd/_pydevd_frame_eval/vendored/bytecode/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_decorator", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "decorator-5.1.1-pyhd8ed1ab_0", - sha256 = "328a6a379f9bdfd0230e51de291ce858e6479411ea4b0545fb377c71662ef3e2", - ) - conda_package_repository( - name = "conda_package_defusedxml", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "defusedxml-0.7.1-pyhd8ed1ab_0", - sha256 = "9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be", - ) - conda_package_repository( - name = "conda_package_dill", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "dill-0.3.8-pyhd8ed1ab_0", - sha256 = "482b5b566ca559119b504c53df12b08f3962a5ef8e48061d62fd58a47f8f2ec4", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_docopt", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "docopt-0.6.2-py_1", - sha256 = "4bbfb8ab343b4711223aedf797a2678955412124e71415dc2fe9816248f0b28d", - exclude = [ - "lib/python3.*/site-packages/docopt-0.6.2.dist-info/METADATA", - ], - license_file = "info/LICENSE.txt", - ) - conda_package_repository( - name = "conda_package_eigen", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "eigen-3.4.0-h00ab1b0_0", - sha256 = "53b15a98aadbe0704479bacaf7a5618fcb32d1577be320630674574241639b34", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_entrez_direct", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "entrez-direct-16.2-he881be0_1", - sha256 = "7c582b64e1c870704c3e705849f0277cb102a97387dc488e8384a89be762f941", - ) - conda_package_repository( - name = "conda_package_entrypoints", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "entrypoints-0.4-pyhd8ed1ab_0", - sha256 = "2ec4a0900a4a9f42615fc04d0fb3286b796abe56590e8e042f6ec25e102dd5af", - ) - - conda_package_repository( - name = "conda_package_et_xmlfile", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "et_xmlfile-1.1.0-pyhd8ed1ab_0", - sha256 = "0c7bb50e1382615a660468dc531b8b17c5b91b88a02ed131c8e3cc63db507ce2", - license_file = "info/licenses/LICENSE0.txt", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_exceptiongroup", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "exceptiongroup-1.2.0-pyhd8ed1ab_2", - sha256 = "a6ae416383bda0e3ed14eaa187c653e22bec94ff2aa3b56970cdf0032761e80d", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_executing", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "executing-2.0.1-pyhd8ed1ab_0", - sha256 = "c738804ab1e6376f8ea63372229a04c8d658dc90fd5a218c6273a2eaf02f4057", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_fastparquet", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "fastparquet-2023.10.1-py310h1f7b6fc_0", - sha256 = "66cd5afe619110fbcbb64f01321e7f114c02d500cb5278b627a6e4e6f2a08aab", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_fonttools", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "fonttools-4.49.0-py310h2372a71_0", - sha256 = "7aac51cdb7364f1534c352e15ecdd3d4f9b3889112e9b9716fa76bda9926a805", - archive_type = "conda", - exclude = [ - "share", - ], - ) - conda_package_repository( - name = "conda_package_fqdn", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "fqdn-1.5.1-pyhd8ed1ab_0", - sha256 = "6cfd1f9bcd2358a69fb571f4b3af049b630d52647d906822dbedac03e84e4f63", - ) - conda_package_repository( - name = "conda_package_freetype", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "freetype-2.12.1-h267a509_2", - sha256 = "b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6", - licenses = ["@rules_license//licenses/spdx:FTL"], - license_file = "info/licenses/docs/FTL.TXT", - exclude = [ - "share/man", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_frozenlist", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "frozenlist-1.4.1-py310h2372a71_0", - sha256 = "496d0ae05e81be0bd8e046bc48a3346f867caaad65041aa14ee2f3717af70db6", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_fsspec", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "fsspec-2024.2.0-pyhca7485f_0", - sha256 = "3f7e123dd82fe99450d1e0ffa389e8218ef8c9ee257c836e21b489548c039ae6", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_future", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "future-1.0.0-pyhd8ed1ab_0", - sha256 = "8c918a63595ae01575b738ddf0bff10dc23a5002d4af4c8b445d1179a76a8efd", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_geos", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "geos-3.12.1-h59595ed_0", - sha256 = "2593b255cb9c4639d6ea261c47aaed1380216a366546f0468e95c36c2afd1c1a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_gettext", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "gettext-0.21.1-h27087fc_0", - sha256 = "4fcfedc44e4c9a053f0416f9fc6ab6ed50644fca3a761126dbd00d09db1f546a", - ) - conda_package_repository( - name = "conda_package_gffutils", - base_urls = ["https://conda.anaconda.org/bioconda/noarch"], - dist_name = "gffutils-0.12-pyh7cba7a3_0", - sha256 = "73056ec25b0ccb9a6bee9fb397a89091eab15507b7182e31267951f3bc21106d", - ) - - conda_package_repository( - name = "conda_package_giflib", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "giflib-5.2.1-h0b41bf4_3", - sha256 = "41ec165704ccce2faa0437f4f53c03c06261a2cc9ff7614828e51427d9261f4b", - exclude = [ - "share/man", - ], - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_h11", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "h11-0.14.0-pyhd8ed1ab_0", - sha256 = "817d2c77d53afe3f3d9cf7f6eb8745cdd8ea76c7adaa9d7ced75c455a2c2c085", - ) - conda_package_repository( - name = "conda_package_h2", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "h2-4.1.0-pyhd8ed1ab_0", - sha256 = "bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a", - ) - conda_package_repository( - name = "conda_package_h5py", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "h5py-3.9.0-nompi_py310h367e799_100", - sha256 = "6a8a5b595032eff60df322492b865640dba7392348afe318756855f98de94792", - exclude = [ - "lib/python3.*/site-packages/h5py/tests", - ], - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_hdf5", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "hdf5-1.14.0-nompi_h5231ba7_103", - sha256 = "cfec313dcb1c51a0f6faee9c6af7dcb9cbe86847697f0be9846eaa0058500d29", - exclude = [ - "share", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_hpack", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "hpack-4.0.0-pyh9f0ad1d_0", - sha256 = "5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8", - ) - conda_package_repository( - name = "conda_package_htmltools", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "htmltools-0.5.1-pyhd8ed1ab_0", - sha256 = "98b564b30b29f41061518529629d27c6eb79aa00ca347c5938cb7e14a20802c6", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_htslib", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "htslib-1.16-h6bc39ce_0", - sha256 = "a2ac96fa30ff9153eb42deb46d10c32022d314eef94a5f64e65ba9928708f53a", - exclude = [ - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_httpcore", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "httpcore-1.0.4-pyhd8ed1ab_0", - sha256 = "dec07ca00223d52433e7c20c71d5e645a7828b3e50206d855ad7a540869341f2", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_httpx", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "httpx-0.27.0-pyhd8ed1ab_0", - sha256 = "fdaf341fb2630b7afe8238315448fc93947f77ebfa4da68bb349e1bcf820af58", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_hyperframe", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "hyperframe-6.0.1-pyhd8ed1ab_0", - sha256 = "e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330", - ) - conda_package_repository( - name = "conda_package_hypothesis", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "hypothesis-6.98.15-pyha770c72_0", - sha256 = "ab9f6a712da6cbb9eca021d4751eb5f4e4bea89d544873043b03001e1da4df5d", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_icu", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "icu-73.2-h59595ed_0", - sha256 = "e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_idna", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "idna-3.6-pyhd8ed1ab_0", - sha256 = "6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_imagecodecs", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "imagecodecs-2022.8.8-py310h61cb99f_4", - sha256 = "80dd42f3cf787486aadc9c80b5bdc9af29042b18df4aa1d2d7096e270017379b", - ) - - conda_package_repository( - name = "conda_package_imageio", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "imageio-2.34.0-pyh4b66e23_0", - sha256 = "be0eecc8b3ee49ffe3c38dedc4d3c121e18627624926f7d1d998e8027bce4266", - exclude = [ - "site-packages/imageio/resources/images", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_importlib_metadata", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "importlib-metadata-7.0.1-pyha770c72_0", - sha256 = "e72d05f171f4567004c9360a838e9d5df21e23dcfeb945066b53a6e5f754b861", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_importlib_resources", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "importlib_resources-6.1.2-pyhd8ed1ab_0", - sha256 = "3c99dc57b761517d142ce3aff36b7c3a1b413bb62431e535cfb8b04e11911230", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_iniconfig", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "iniconfig-2.0.0-pyhd8ed1ab_0", - sha256 = "38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_intervaltree", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "intervaltree-3.1.0-pyhd8ed1ab_1", - sha256 = "5d7f0d432772b2a1a750cd61b522e9c283dad04058a130656c95ad3321a308c5", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_ipykernel", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "ipykernel-6.29.3-pyhd33586a_0", - sha256 = "0314f15e666fd9a4fb653aae37d2cf4dc6bc3a18c0d9c2671a6a0783146adcfa", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_ipython", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "ipython-8.22.1-pyh707e725_0", - sha256 = "a18d481fb2d395a7dc70ef698ea6585341baa0003a230331afd05cb75c0912b2", - archive_type = "conda", - exclude = ["share/man"], - ) - - conda_package_repository( - name = "conda_package_ipywidgets", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "ipywidgets-8.1.2-pyhd8ed1ab_0", - sha256 = "0be846f1374faa2d9b6f5e100187d56afa9268221f7c7815265f30aa008da8ca", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_isoduration", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "isoduration-20.11.0-pyhd8ed1ab_0", - sha256 = "7bb5c4d994361022f47a807b5e7d101b3dce16f7dd8a0af6ffad9f479d346493", - ) - conda_package_repository( - name = "conda_package_isort", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "isort-5.13.2-pyhd8ed1ab_0", - sha256 = "78a7e2037029366d2149f73c8d02e93cac903d535e208cc4517808b0b42e85f2", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_isoseq", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "isoseq-4.0.0-h9ee0642_0", - sha256 = "de09488cf207ffaabbbe4c4d665c61b042a1d704c6dfd9d076bf535158ba37aa", - ) - - conda_package_repository( - name = "conda_package_isoseq3", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "isoseq3-4.0.0-h9ee0642_0", - sha256 = "1d9d636a723e78110c20ad7fb1788eb15aa330b1ece2e24807526c6ba312f5a3", - ) - - conda_package_repository( - name = "conda_package_jedi", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jedi-0.19.1-pyhd8ed1ab_0", - sha256 = "362f0936ef37dfd1eaa860190e42a6ebf8faa094eaa3be6aa4d9ace95f40047a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jinja2", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jinja2-3.1.3-pyhd8ed1ab_0", - sha256 = "fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_joblib", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "joblib-1.3.2-pyhd8ed1ab_0", - sha256 = "31e05d47970d956206188480b038829d24ac11fe8216409d8584d93d40233878", - exclude = [ - "site-packages/joblib/test", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jpeg", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "jpeg-9e-h0b41bf4_3", - sha256 = "8f73194d09c9ea4a7e2b3562766b8d72125cc147b62c7cf83393e3a3bbfd581b", - licenses = ["@rules_license//licenses/spdx:IJG"], - exclude = [ - "share/man", - ], - license_file = "info/licenses/LICENSE0.txt", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_json5", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "json5-0.9.17-pyhd8ed1ab_0", - sha256 = "e01ee861d57b748874f4b4f4392b82d9341f61819a35095b4f68fbdfc93041a1", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_jsonpatch", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jsonpatch-1.33-pyhd8ed1ab_0", - sha256 = "fbb17e33ace3225c6416d1604637c1058906b8223da968cc015128985336b2b4", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jsonpointer", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "jsonpointer-2.4-py310hff52083_3", - sha256 = "316db08863469a56cdbfd030de5a2cc11ec7649ed7c50eff507e9caa0070ccaa", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_jsonschema", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jsonschema-4.21.1-pyhd8ed1ab_0", - sha256 = "c5c1b4e08e91fdd697289015be1a176409b4e63942899a43b276f1f250be8129", - archive_type = "conda", - exclude = [ - "site-packages/jsonschema/tests", - ], - ) - conda_package_repository( - name = "conda_package_jsonschema_specifications", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jsonschema-specifications-2023.12.1-pyhd8ed1ab_0", - sha256 = "a9630556ddc3121c0be32f4cbf792dd9102bd380d5cd81d57759d172cf0c2da2", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jsonschema_with_format_nongpl", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jsonschema-with-format-nongpl-4.21.1-pyhd8ed1ab_0", - sha256 = "6e458c325c097956ac4605ef386f0d67bad5223041cedd66819892988b72f83a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jupyter_lsp", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyter-lsp-2.2.3-pyhd8ed1ab_0", - sha256 = "addac479dff3431131e1f4be352779bd4a6802b6f01f762db3dd276af02e3d7b", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jupyter_client", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyter_client-8.6.0-pyhd8ed1ab_0", - sha256 = "86cbb9070862cf23a245451efce539ca214e610849d0950bb8ac90c545bd158d", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jupyter_core", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "jupyter_core-5.7.1-py310hff52083_0", - sha256 = "cf1e7d31ffe6d976a0ad7a7264d90e644796e85370fa7cb9bd5211cfa82fb66d", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jupyter_events", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyter_events-0.9.0-pyhd8ed1ab_0", - sha256 = "713f0cc927a862862a6d35bfb29c4114f987e4f59e2a8a14f71f23fcd7edfec3", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_jupyter_server", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyter_server-2.12.5-pyhd8ed1ab_0", - sha256 = "43dcd238c656c7ecf3228be8735def530cad5181f990c042ba202b9e383d2b1f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jupyter_server_terminals", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyter_server_terminals-0.5.2-pyhd8ed1ab_0", - sha256 = "a625150744fdffb646fb4451edc68b3eff56eeace4e86b83dc4a860479c9857c", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jupyterlab", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyterlab-4.1.2-pyhd8ed1ab_0", - sha256 = "d4be2239d93c7db7db911b0e992bde6110f50cd705c23ac7e43483ded90a57ed", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_jupyterlab_pygments", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyterlab_pygments-0.3.0-pyhd8ed1ab_1", - sha256 = "4aa622bbcf97e44cd1adf0100b7ff71b7e20268f043bdf6feae4d16152f1f242", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jupyterlab_server", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyterlab_server-2.25.3-pyhd8ed1ab_0", - sha256 = "30269e4ab0e67935b15b012e5e97f5c5c72111d0f02e03b3c644e556fe1a5275", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_jupyterlab_widgets", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "jupyterlab_widgets-3.0.10-pyhd8ed1ab_0", - sha256 = "7c14d0b377ddd2e21f23d2f55fbd827aca726860e504a131b67ef936aef2b8c4", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_jxrlib", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "jxrlib-1.1-hd590300_3", - sha256 = "2057ca87b313bde5b74b93b0e696f8faab69acd4cb0edebb78469f3f388040c0", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_keyutils", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "keyutils-1.6.1-h166bdaf_0", - sha256 = "150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb", - exclude = [ - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_kiwisolver", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "kiwisolver-1.4.5-py310hd41b1e2_1", - sha256 = "bb51906639bced3de1d4d7740ac284cdaa89e2f22e0b1ec796378b090b0648ba", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_krb5", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "krb5-1.20.1-hf9c8cef_0", - sha256 = "3274ef26e40df1c23bd34adc075e40cc6c335540688c36ac261d64561da56278", - exclude = [ - "share/man", - "share/examples", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_lazy_object_proxy", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "lazy-object-proxy-1.10.0-py310h2372a71_0", - sha256 = "6dd8e02aa0ca786bae44793475141a2218882f5c225c4e31f0b1c70ac012e586", - archive_type = "conda", - exclude = ["lib/python*/__pycache__/_sysconfigdata*.pyc"], - ) - conda_package_repository( - name = "conda_package_lazy_loader", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "lazy_loader-0.3-pyhd8ed1ab_0", - sha256 = "fa32bafbf7f9238a9cb8f0aa1fb17d2fdcefa607c217b86c38c3b670c58d1ac6", - exclude = [ - "site-packages/lazy_loader/tests/fake_pkg", - ], - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_lcms2", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "lcms2-2.14-h6ed2654_0", - sha256 = "cbadb4150850941bf0518ba948effbbdd89b2c28dfdfed54eae196037e015b43", - exclude = [ - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_lerc", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "lerc-4.0.0-h27087fc_0", - sha256 = "cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12", - exclude = [ - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_libaec", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libaec-1.1.2-h59595ed_1", - sha256 = "fdde15e74dc099ab1083823ec0f615958e53d9a8fae10405af977de251668bea", - archive_type = "conda", - exclude = ["share/man"], - ) - - conda_package_repository( - name = "conda_package_libavif", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libavif-0.10.1-h5cdd6b5_2", - sha256 = "9efb7aa148fc4d29e0ac34f21d88624b835d0c6f934c44737fc174a43bb84afe", - ) - conda_package_repository( - name = "conda_package_libblas", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libblas-3.9.0-20_linux64_mkl", - sha256 = "9e5f27fca79223a5d38ccdf4c468e798c3684ba01bdb6b4b44e61f2103a298eb", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_libbrotlicommon", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libbrotlicommon-1.0.9-h166bdaf_9", - sha256 = "fc57c0876695c5b4ab7173438580c1d7eaa7dccaf14cb6467ca9e0e97abe0cf0", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libbrotlidec", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libbrotlidec-1.0.9-h166bdaf_9", - sha256 = "564f301430c3c61bc5e149e74157ec181ed2a758befc89f7c38466d515a0f614", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libbrotlienc", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libbrotlienc-1.0.9-h166bdaf_9", - sha256 = "d27bc2562ea3f3b2bfd777f074f1cac6bfa4a737233dad288cd87c4634a9bb3a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libcblas", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libcblas-3.9.0-20_linux64_mkl", - sha256 = "841b4d44e20e5207f4a74ca98176629ead5ba590384ed6b0fe3c8600248c9fef", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libcurl", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libcurl-7.87.0-h6312ad2_0", - sha256 = "4e95c12244a50c8f8e9173e0bd37d6067fd753437ab636afb44ce28382a325eb", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libdeflate", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libdeflate-1.13-h166bdaf_0", - sha256 = "2975c48208cdd8b59096b8bd368044dd1d531ba92da64f4814d58b1533eec1da", - ) - conda_package_repository( - name = "conda_package_libedit", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libedit-3.1.20191231-he28a2e2_2", - sha256 = "a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf", - exclude = [ - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_libev", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libev-4.33-hd590300_2", - sha256 = "1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4", - archive_type = "conda", - exclude = [ - "share/man", - ], - ) - - conda_package_repository( - name = "conda_package_libffi", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libffi-3.4.2-h7f98852_5", - sha256 = "ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e", - licenses = ["@rules_license//licenses/spdx:MIT"], - exclude = [ - "share/info", - "share/man", - ], - ) - - conda_package_repository( - name = "conda_package_libgcc_ng", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libgcc-ng-13.2.0-h807b86a_5", - sha256 = "d32f78bfaac282cfe5205f46d558704ad737b8dbf71f9227788a5ca80facaba4", - exclude = [ - "lib/libgomp.so*", - "x86_64-conda_cos6-linux-gnu/sysroot/lib/libgomp.so*", - "share/info", - ], - exclude_deps = ["_openmp_mutex"], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libgfortran_ng", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libgfortran-ng-13.2.0-h69a702a_5", - sha256 = "238c16c84124d58307376715839aa152bd4a1bf5a043052938ad6c3137d30245", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libgfortran5", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libgfortran5-13.2.0-ha4646dd_5", - sha256 = "ba8d94e8493222ce155bb264d9de4200e41498a458e866fedf444de809bde8b6", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libhwloc", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libhwloc-2.9.3-default_h554bfaf_1009", - sha256 = "6950fee24766d03406e0f6f965262a5d98829c71eed8d1004f313892423b559b", - archive_type = "conda", - exclude = [ - "share/doc", - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_libiconv", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libiconv-1.17-hd590300_2", - sha256 = "8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libidn2", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libidn2-2.3.7-hd590300_0", - sha256 = "253f9be445c58bf07b39d8f67ac08bccc5010c75a8c2070cddfb6c20e1ca4f4f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_liblapack", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "liblapack-3.9.0-20_linux64_mkl", - sha256 = "21b4324dd65815f6b5a83c15f0b9a201434d0aa55eeecc37efce7ee70bbbf482", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_liblapacke", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "liblapacke-3.9.0-20_linux64_mkl", - sha256 = "0e6ece3ff4b2088d30b5836771e87440840c643be0ab885a2605be002d566a34", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libllvm14", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libllvm14-14.0.6-hcd5def8_4", - sha256 = "225cc7c3b20ac1db1bdb37fa18c95bf8aecef4388e984ab2f7540a9f4382106a", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_libnghttp2", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libnghttp2-1.51.0-hdcd2b5c_0", - sha256 = "3f76e99eacfc4ce3deac3b78d5508449efb8b72dea3e31d9f2c6db7f5cf00e75", - archive_type = "conda", - exclude = [ - "share/doc", - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_libnsl", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libnsl-2.0.1-hd590300_0", - sha256 = "26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_libpng", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libpng-1.6.43-h2797004_0", - sha256 = "502f6ff148ac2777cc55ae4ade01a8fc3543b4ffab25c4e0eaa15f94e90dd997", - exclude = [ - "share/man", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libprotobuf", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libprotobuf-3.20.3-h3eb15da_0", - sha256 = "f9a34009abbaee35f570d0e3f27a9f606e5fedd953bd7b4a6fe17febe86a15a8", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libsodium", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libsodium-1.0.18-h36c2ea0_1", - sha256 = "53da0c8b79659df7b53eebdb80783503ce72fb4b10ed6e9e05cc0e9e4207a130", - ) - conda_package_repository( - name = "conda_package_libsqlite", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libsqlite-3.45.1-h2797004_0", - sha256 = "1b379d1c652b25d0540251d422ef767472e768fd36b77261045e97f9ba6d3faa", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libssh2", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libssh2-1.10.0-haa6b8db_3", - sha256 = "3c2ed83502bedf4ec8c5b972accb6ff1b6c018f72fb711cdb65cb8540d5ab89e", - exclude = [ - "share/doc", - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_libstdcxx_ng", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libstdcxx-ng-13.2.0-h7e041cc_5", - sha256 = "a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_libtiff", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libtiff-4.4.0-h0e0dad5_3", - sha256 = "1ffb2f138bb44a59d3e51d65cb471dece8cf46ec2d0fbdcbb1ab820edaa5706d", - ) - conda_package_repository( - name = "conda_package_libunistring", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libunistring-0.9.10-h7f98852_0", - sha256 = "e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d", - ) - - conda_package_repository( - name = "conda_package_libuuid", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libuuid-2.38.1-h0b41bf4_0", - sha256 = "787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_libwebp_base", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libwebp-base-1.3.2-hd590300_0", - sha256 = "68764a760fa81ef35dacb067fe8ace452bbb41476536a4a147a1051df29525f0", - exclude = [ - "share/man", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libxcb", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libxcb-1.13-h7f98852_1004", - sha256 = "8d5d24cbeda9282dd707edd3156e5fde2e3f3fe86c802fa7ce08c8f1e803bfd9", - ) - conda_package_repository( - name = "conda_package_libxcrypt", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libxcrypt-4.4.36-hd590300_1", - sha256 = "6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c", - archive_type = "conda", - exclude = [ - "share/man", - ], - ) - conda_package_repository( - name = "conda_package_libxml2", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libxml2-2.12.5-h232c23b_0", - sha256 = "db9bf97e9e367985204331b58a059ebd5a4e0cb9e1c8754e9ecb23046b7b7bc1", - archive_type = "conda", - exclude = [ - "share/man", - "share/doc", - ], - ) - conda_package_repository( - name = "conda_package_libzlib", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libzlib-1.2.13-hd590300_5", - sha256 = "370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_libzopfli", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "libzopfli-1.0.3-h9c3ff4c_0", - sha256 = "ff94f30b2e86cbad6296cf3e5804d442d9e881f7ba8080d92170981662528c6e", - ) - - conda_package_repository( - name = "conda_package_lima", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "lima-2.9.0-h9ee0642_1", - sha256 = "e884929a272592556fdfb3d5af315dea563494098cca3ad55fbae1562b991e15", - ) - - conda_package_repository( - name = "conda_package_line_profiler", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "line_profiler-4.1.1-py310hd41b1e2_1", - sha256 = "5dd3865d4bf7b8c645ceacc472a1c4309c867715b4c2f3b97d52f5435e5f9013", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_linkify_it_py", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "linkify-it-py-2.0.3-pyhd8ed1ab_0", - sha256 = "aa99d44e8c83865026575a8af253141c53e0b3ab05f053befaa7757c8525064f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_llvm_openmp", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "llvm-openmp-17.0.6-h4dfa4b3_0", - sha256 = "18a9db4cc139e72e8eac80a34f6536491fe318d3785bc2c35fac42cd00676376", - archive_type = "conda", - exclude = [ - "lib/libomptarget.rtl.*", - ], - exclude_deps = [ - "zstd", - "libzlib", - ], - patch_cmds = [ - "ln -s libomp.so lib/libgomp.so.1", - ], - patch_args = ["-p1"], - patches = [ - "@cellranger//third-party:intel-openmp-symlinks.patch", - ], - ) - - conda_package_repository( - name = "conda_package_llvmlite", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "llvmlite-0.42.0-py310h1b8f574_1", - sha256 = "2b25157b0724cbfc84b58e83a466d84afb8a5f09889a224c821d86adb4541ba1", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_locket", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "locket-1.0.0-pyhd8ed1ab_0", - sha256 = "9afe0b5cfa418e8bdb30d8917c5a6cec10372b037924916f1f85b9f4899a67a6", - ) - conda_package_repository( - name = "conda_package_lz4", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "lz4-4.3.3-py310h350c4a5_0", - sha256 = "119189a08204d97b1866e97d127d85574980547bc3b4aedc59ac6bb0b521a5c7", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_lz4_c", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "lz4-c-1.9.4-hcb278e6_0", - sha256 = "1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f", - exclude = [ - "share/man", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_lzstring", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "lzstring-1.0.4-py_1001", - sha256 = "b74a27f7156755502ce6efd4e9bab7b4352a4e825cdea9764626dabf0f8637ed", - ) - conda_package_repository( - name = "conda_package_markdown_it_py", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "markdown-it-py-3.0.0-pyhd8ed1ab_0", - sha256 = "c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_markupsafe", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "markupsafe-2.1.5-py310h2372a71_0", - sha256 = "3c18347adf1d091ee9248612308a6bef79038f80b626ef67f58cd0e8d25c65b8", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_marshmallow", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "marshmallow-3.21.0-pyhd8ed1ab_0", - sha256 = "9b032c4b9f24e333d61217c7b1bce47f0a5d7a86c394752d562cc7cc98811102", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_marshmallow_dataclass", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "marshmallow-dataclass-8.6.0-pyhd8ed1ab_0", - sha256 = "0c3b747e8071d5d89de86180d196ddf038d137e7e6c25c695060c273c52aeb08", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_marshmallow_enum", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "marshmallow-enum-1.5.1-pyh9f0ad1d_3", - sha256 = "7729d878c2129d691e86b81fce346320a0152a6bbfc862a8c12ec646763f4857", - ) - conda_package_repository( - name = "conda_package_marshmallow_union", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "marshmallow-union-0.1.15.post1-pyhd8ed1ab_0", - sha256 = "4910a2d4bbe0d1484b45a1b739256d81d1bb06de0dd7051c0cd8683cf54dc878", - ) - - conda_package_repository( - name = "conda_package_matplotlib_base", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "matplotlib-base-3.8.3-py310h62c0568_0", - sha256 = "f3179a086a10a0d7561b5935cfa5986ed9d1fd15b86f5a68de813455cd58f98f", - patch_args = ["-p1"], - patches = ["@cellranger//third-party:matplotlib-base-3.7.2-mplconfigdir.patch"], - exclude = [ - "lib/python3.*/site-packages/matplotlib/__pycache__/__init__.*.pyc", - "lib/python3.*/site-packages/matplotlib/mpl-data/sample_data", - "lib/python3.*/site-packages/matplotlib/testing", - "lib/python3.*/site-packages/*/tests", - "lib/python3.*/site-packages/mpl_toolkits/*/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_matplotlib_inline", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "matplotlib-inline-0.1.6-pyhd8ed1ab_0", - sha256 = "aa091b88aec55bfa2d9207028d8cdc689b9efb090ae27b99557e93c675be2f3c", - ) - - conda_package_repository( - name = "conda_package_mccabe", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "mccabe-0.7.0-pyhd8ed1ab_0", - sha256 = "0466ad9490b761e9a8c57fab574fc099136b45fa19a0746ce33acdeb2a84766b", - ) - conda_package_repository( - name = "conda_package_mdit_py_plugins", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "mdit-py-plugins-0.4.0-pyhd8ed1ab_0", - sha256 = "1ddac8d2be448cd1fbe49d2ca09df7e10d99679d53146a917f8bb4899f76d0ca", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_mdurl", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "mdurl-0.1.2-pyhd8ed1ab_0", - sha256 = "64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_melt", - base_urls = ["https://conda.anaconda.org/bioconda/noarch"], - dist_name = "melt-1.0.3-pyh864c0ab_4", - sha256 = "4f79a1a3481d9cffd63fc6ede3122fca0733e702583e65166af634bed2f902d6", - licenses = ["@rules_license//licenses/spdx:AGPL-3.0"], - extra_deps = [ - "setuptools", - ], - ) - - conda_package_repository( - name = "conda_package_memory_profiler", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "memory_profiler-0.61.0-pyhd8ed1ab_0", - sha256 = "d1d11b26be1fd8dfe042586d03739f4fec6822ac38158bb7a06ae0d4c24b9f3e", - ) - conda_package_repository( - name = "conda_package_methodtools", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "methodtools-0.4.7-pyhd8ed1ab_0", - sha256 = "e47f64c8a567a088d4dc58e74709f47551a3e0096007dcfc77232f16099a4891", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_mistune", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "mistune-3.0.2-pyhd8ed1ab_0", - sha256 = "f95cb70007e3cc2ba44e17c29a056b499e6dadf08746706d0c817c8e2f47e05c", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_mkl", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "mkl-2023.2.0-h84fe81f_50496", - sha256 = "046073737bf73153b0c39e343b197cdf0b7867d336962369407465a17ea5979a", - exclude = [ - "lib/libmkl_*avx512_mic.so.1", - "lib/libmkl_blacs_*mpi_*.so*", - "lib/libmkl_blacs_sgimpt*.so*", - "lib/libmkl_pgi_thread.so*", - "lib/libmkl_scalapack*.so*", - "lib/libmkl_*_ilp64.so*", - ], - patch_args = ["-p1"], - # Normally these symlinks would come from the libblas package, but the - # bazel rules won't generate those because they're broken symlinks in - # that package. So we add them here instead. Otherwise opencv ends up - # linking openblas, which causes problems. - patches = ["@cellranger//third-party:mkl-libblas-symlinks.patch"], - patch_cmds = [ - "ln -s libmkl_rt.so.2 lib/libblas.so", - "ln -s libmkl_rt.so.2 lib/libblas.so.3", - "ln -s libmkl_rt.so.2 lib/libcblas.so", - "ln -s libmkl_rt.so.2 lib/libcblas.so.3", - "ln -s libmkl_rt.so.2 lib/liblapack.so", - "ln -s libmkl_rt.so.2 lib/liblapack.so.3", - ], - exclude_deps = ["_openmp_mutex"], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_mkl_devel", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "mkl-devel-2023.2.0-ha770c72_50496", - sha256 = "ddd54fd21d6ac8eec97674db20a8752a7eadd60c9778eb1443e075196813037a", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_mkl_include", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - # Make sure this version stays in sync with mkl version. - dist_name = "mkl-include-2023.2.0-h84fe81f_50496", - sha256 = "da1720a3e065273e2456481b28abd64abc2396d221d87a02db5f14053be61a68", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_mkl_service", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "mkl-service-2.4.1-py310hc72dfd8_0", - sha256 = "831c4060683575d9d45f7bc2b5877461dfeb953a6da4069977d9daf3c5d603d7", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_multidict", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "multidict-6.0.5-py310h2372a71_0", - sha256 = "31258f8daee4e0e95cd6911a472f73f47f6d724676719a6a0a812ca144cab475", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_munkres", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "munkres-1.1.4-pyh9f0ad1d_0", - sha256 = "f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306", - ) - conda_package_repository( - name = "conda_package_mypy_extensions", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "mypy_extensions-1.0.0-pyha770c72_0", - sha256 = "f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_natsort", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "natsort-8.4.0-pyhd8ed1ab_0", - sha256 = "1d5c42c7f271779e450d095c49598ce7214a7089f229e59f0b78d8703de67059", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_nbclient", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "nbclient-0.8.0-pyhd8ed1ab_0", - sha256 = "4ebd237cdf4bfa5226f92d2ae78fab8dba27696909391884dc6594ca6f9df5ff", - exclude = ["site-packages/nbclient/tests"], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_nbconvert_core", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "nbconvert-core-7.16.1-pyhd8ed1ab_0", - sha256 = "684e0710abd6477ed9df743506edecb4b53d1c9deeaf8d6d7fdbb82e58f43090", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_nbformat", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "nbformat-5.9.2-pyhd8ed1ab_0", - sha256 = "fc82c5a9116820757b03ffb836b36f0f50e4cd390018024dbadb0ee0217f6992", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_ncbi_vdb", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "ncbi-vdb-2.11.0-h1b792b2_1", - sha256 = "babda6a7705288f2e149554f1b0541136f0d5d1a98b33e520f98dff5f62ee4be", - exclude_deps = [ - "perl", - "perl-xml-libxml", - "perl-uri", - ], - ) - - conda_package_repository( - name = "conda_package_ncurses", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "ncurses-6.4-h59595ed_2", - sha256 = "91cc03f14caf96243cead96c76fe91ab5925a695d892e83285461fb927dece5e", - licenses = ["@rules_license//licenses/spdx:MIT-open-group"], - # Exclude the capital-letter directories, which cause misbehavior on - # macs with their case-insensitive filesystems. That means also - # excluding a few other things which are symlinks to the others. - # Note that this does not make the build work on mac, because the - # exclusion happens after the untar step, which will still fail. But it - # does improve the situation for e.g. the cs tarball. - exclude = [ - "share/terminfo/[A-Z]", - "share/terminfo/d/darwin*", - "share/terminfo/n/n7900", - "share/terminfo/n/ncr*", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_nest_asyncio", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "nest-asyncio-1.6.0-pyhd8ed1ab_0", - sha256 = "30db21d1f7e59b3408b831a7e0417b83b53ee6223afae56482c5f26da3ceb49a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_networkx", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "networkx-3.2.1-pyhd8ed1ab_0", - sha256 = "7629aa4f9f8cdff45ea7a4701fe58dccce5bf2faa01c26eb44cbb27b7e15ca9d", - exclude = [ - "share/doc", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_notebook", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "notebook-7.1.1-pyhd8ed1ab_0", - sha256 = "ea6184c7c3d8c24ebb0241c74df70ffa6171952f91a4f58cd0812d7175cf79b6", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_notebook_shim", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "notebook-shim-0.2.4-pyhd8ed1ab_0", - sha256 = "9b5fdef9ebe89222baa9da2796ebe7bc02ec6c5a1f61327b651d6b92cf9a0230", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_numba", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "numba-0.59.0-py310h7dc5dd1_1", - sha256 = "bdf13fdeb3fdb4ca5380bba9716d7f7e8e1ac1ff299fb8f9fafa49893bcb5f1f", - patch_args = ["-p1"], - patches = ["@cellranger//third-party:numba-0.55.1-nocache.patch"], - exclude = [ - "lib/python3.*/site-packages/numba/core/__pycache__/ccallback.cpython-*.pyc", - "lib/python3.*/site-packages/numba/core/__pycache__/dispatcher.cpython-*.pyc", - "lib/python3.*/site-packages/numba/cuda/tests", - "lib/python3.*/site-packages/numba/np/ufunc/__pycache__/ufuncbuilder.cpython-*.pyc", - ], - exclude_deps = ["_openmp_mutex"], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_numexpr", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "numexpr-2.9.0-mkl_py310hc8c826e_0", - sha256 = "fa165677a258833be8195704298581e5d1f8a8774c07823f11c4cfe5d814d953", - exclude = [ - "lib/python*/site-packages/numexpr/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_numpy", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "numpy-1.24.4-py310ha4c1d20_0", - sha256 = "99d21a8b6c5777320257a74b61f5be3be9f6cb58625265ccb50bd0bddebe3917", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_openjpeg", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "openjpeg-2.5.0-h7d73246_1", - sha256 = "a715cba5649f12a1dca53dfd72fc49577152041f033d7595cf4b6a655a5b93b6", - ) - - conda_package_repository( - name = "conda_package_openpyxl", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "openpyxl-3.1.2-py310h2372a71_1", - sha256 = "283db2d555f93066d34e08a16d55f25a11b3b38ceb2897a0ce228c29c69f8e47", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_openssl", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "openssl-1.1.1w-hd590300_0", - sha256 = "4fe19885c77f0758084feb54954bd1977dfeeab7134fba0a1d9c0cfff821d6bd", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_overrides", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "overrides-7.7.0-pyhd8ed1ab_0", - sha256 = "5e238e5e646414d517a13f6786c7227206ace58271e3ef63f6adca4d6a4c2839", - license_file = "info/licenses/LICENSE0.txt", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_packaging", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "packaging-23.2-pyhd8ed1ab_0", - sha256 = "69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pandas", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pandas-2.1.4-py310hcc13569_0", - sha256 = "d0743541397140a25a89ab0686933005a4c104d95c23ff1c322f903a50b18099", - exclude = [ - "lib/python3.*/site-packages/pandas/tests", - ], - extra_deps = [ - "pytables", - ], - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_pandocfilters", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pandocfilters-1.5.0-pyhd8ed1ab_0", - sha256 = "2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f", - ) - conda_package_repository( - name = "conda_package_parasail_python", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "parasail-python-1.3.4-py310h6cc9453_0", - sha256 = "8d538d7fd4779f485b59d4eb25036324172c111051f0814009cb9c32b026f9c1", - ) - - conda_package_repository( - name = "conda_package_parso", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "parso-0.8.3-pyhd8ed1ab_0", - sha256 = "4e26d5daf5de0e31aa5e74ac56386a361b202433b83f024fdadbf07d4a244da4", - ) - conda_package_repository( - name = "conda_package_partd", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "partd-1.4.1-pyhd8ed1ab_0", - sha256 = "b248238da2bb9dfe98e680af911dc7013af86095e3ec8baf08905555632d34c7", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_pathspec", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pathspec-0.12.1-pyhd8ed1ab_0", - sha256 = "4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d", - exclude = [ - "site-packages/pathspec/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_patsy", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "patsy-0.5.6-pyhd8ed1ab_0", - sha256 = "35ad5cab1d9c08cf98576044bf28f75e62f8492afe6d1a89c94bbe93dc8d7258", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pbmm2", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "pbmm2-1.13.1-h9ee0642_0", - sha256 = "3f2b39a6dd5fd9bbd198db8e0c1a630e02686d6413ff2a58cd8555e006ede21d", - ) - conda_package_repository( - name = "conda_package_pbtk", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "pbtk-3.1.1-h9ee0642_0", - sha256 = "eab789f3a406ebcd9e332438cc48d135960360c3472702cd204d2b1bd37d5eba", - ) - - conda_package_repository( - name = "conda_package_pcre", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pcre-8.45-h9c3ff4c_0", - sha256 = "8f35c244b1631a4f31fb1d66ab6e1d9bfac0ca9b679deced1112c7225b3ad138", - ) - conda_package_repository( - name = "conda_package_pexpect", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pexpect-4.9.0-pyhd8ed1ab_0", - sha256 = "90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pickleshare", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pickleshare-0.7.5-py_1003", - sha256 = "a1ed1a094dd0d1b94a09ed85c283a0eb28943f2e6f22161fb45e128d35229738", - ) - conda_package_repository( - name = "conda_package_pillow", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pillow-9.2.0-py310h454ad03_3", - sha256 = "202cc5b4c60e32096b67791f822699bf91670584ac3db7e86ebb1b6a4c584218", - ) - conda_package_repository( - name = "conda_package_pip", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pip-24.0-pyhd8ed1ab_0", - sha256 = "b7c1c5d8f13e8cb491c4bd1d0d1896a4cf80fc47de01059ad77509112b664a4a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pkgutil_resolve_name", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1", - sha256 = "fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_platformdirs", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "platformdirs-4.2.0-pyhd8ed1ab_0", - sha256 = "2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_plotly", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "plotly-5.19.0-pyhd8ed1ab_0", - sha256 = "fa9ae81e1f304f1480378ea25d559748e061c5b8d55b3ade433c3bc483dbae9e", - license_file = "info/licenses/LICENSE0.txt", - archive_type = "conda", - exclude = [ - "lib/python3.*/site-packages/plotly/graph_objs/*/__pycache__", - "lib/python3.*/site-packages/plotly/graph_objs/*/*/__pycache__", - "lib/python3.*/site-packages/plotly/graph_objs/*/*/*/__pycache__", - "lib/python3.*/site-packages/plotly/graph_objs/*/*/*/*/__pycache__", - "lib/python3.*/site-packages/plotly/validators/*/__pycache__", - "lib/python3.*/site-packages/plotly/validators/*/*/__pycache__", - "lib/python3.*/site-packages/plotly/validators/*/*/*/__pycache__", - "lib/python3.*/site-packages/plotly/validators/*/*/*/*/__pycache__", - ], - ) - conda_package_repository( - name = "conda_package_pluggy", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pluggy-1.4.0-pyhd8ed1ab_0", - sha256 = "6edfd2c41938ea772096c674809bfcf2ebb9bef7e82de6c7ea0b966b86bfb4d0", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_polars", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "polars-0.20.8-py310h0dd625b_0", - sha256 = "c8162ea63b0094f3b36cc469f53062be3f00341700026e8edbefac907ac908b6", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_primer3_py", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "primer3-py-0.6.1-py310h1425a21_1", - sha256 = "9eea67e71932a5c8d2e0d2b901d62e5bd9ab5ac36fa98cf4d4b4e89bdf1a57c5", - ) - conda_package_repository( - name = "conda_package_progressbar2", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "progressbar2-4.4.1-pyhd8ed1ab_0", - sha256 = "c5c48787375444a003eac9f5571db85c5f07f3fcecff54eb3d8e3645800c94ca", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_prometheus_client", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "prometheus_client-0.20.0-pyhd8ed1ab_0", - sha256 = "757cd91d01c2e0b64fadf6bc9a11f558cf7638d897dfbaf7415ddf324d5405c9", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_prompt_toolkit", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "prompt-toolkit-3.0.42-pyha770c72_0", - sha256 = "58525b2a9305fb154b2b0d43a48b9a6495441b80e4fbea44f2a34a597d2cef16", - archive_type = "conda", - exclude_deps = ["prompt_toolkit"], - ) - conda_package_repository( - name = "conda_package_protobuf", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "protobuf-3.20.3-py310heca2aa9_1", - sha256 = "bab69c0320ac358e49b50cba036603052964f76397fb64984a84b50b8a9d1ef2", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_psutil", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "psutil-5.9.8-py310h2372a71_0", - sha256 = "f1866425aa67f3fe1e3f6e07562a4bc986fd487e01146a91eb1bdbe5ec16a836", - exclude = [ - "lib/python3.*/site-packages/psutil/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_psygnal", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "psygnal-0.9.5-pyhd8ed1ab_0", - sha256 = "13cf2597cb932c8eaac12f0f332cac84800cde01ba41d525fcbf53929baabf7d", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pthread_stubs", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pthread-stubs-0.4-h36c2ea0_1001", - sha256 = "67c84822f87b641d89df09758da498b2d4558d47b920fd1d3fe6d3a871e000ff", - ) - conda_package_repository( - name = "conda_package_ptyprocess", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "ptyprocess-0.7.0-pyhd3deb0d_0", - sha256 = "fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a", - ) - conda_package_repository( - name = "conda_package_pure_eval", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pure_eval-0.2.2-pyhd8ed1ab_0", - sha256 = "72792f9fc2b1820e37cc57f84a27bc819c71088c3002ca6db05a2e56404f9d44", - ) - conda_package_repository( - name = "conda_package_py_cpuinfo", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "py-cpuinfo-9.0.0-pyhd8ed1ab_0", - sha256 = "1bb0459fdebf2f3155ee511e99097c5506ef206acbdd871b74ae9fc4b0c4a019", - ) - - conda_package_repository( - name = "conda_package_pybedtools", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "pybedtools-0.9.1-py310h2b6aa90_0", - sha256 = "d45052976a7990030dc6460b64c45493e34b79cc1bbe64bc41f684944f16bfa9", - exclude = [ - "lib/python3.*/site-packages/pybedtools/test", - ], - ) - conda_package_repository( - name = "conda_package_pybigwig", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "pybigwig-0.3.18-py310h722e95c_2", - sha256 = "62114083521c6e43b2693299c55751c1a983e9b700fab28bbdef6304e3883a80", - exclude = [ - "lib/python3.*/site-packages/pyBigWigTest", - ], - ) - conda_package_repository( - name = "conda_package_pycosat", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pycosat-0.6.6-py310h2372a71_0", - sha256 = "ea7faba72a38b1d9e799294ea270916d2ea3f4a491df06a4d5a55347f3a036ce", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pycparser", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pycparser-2.21-pyhd8ed1ab_0", - sha256 = "74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc", - ) - conda_package_repository( - name = "conda_package_pyfaidx", - base_urls = ["https://conda.anaconda.org/bioconda/noarch"], - dist_name = "pyfaidx-0.8.1.1-pyhdfd78af_0", - sha256 = "35d79d8bd350f9f4a21a4890a438514a14860821933fb0c61db1237cfcf922c0", - ) - conda_package_repository( - name = "conda_package_pyflakes", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pyflakes-3.2.0-pyhd8ed1ab_0", - sha256 = "b1582410fcfa30b3597629e39b688ead87833c4a64f7c4637068f80aa1411d49", - exclude = [ - "site-packages/pyflakes/test", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pygments", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pygments-2.17.2-pyhd8ed1ab_0", - sha256 = "af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_pylint", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pylint-2.16.4-pyhd8ed1ab_0", - sha256 = "b9e6c3b6f55a6e5494a440ab312ff39f9de9d0367a3c089fd5f442ffe6df4175", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pynndescent", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pynndescent-0.5.11-pyhca7485f_0", - sha256 = "00c66daaed46218e743f370cfe122dc77a75169f592878c18c6552511fb73a11", - license_file = "info/licenses/LICENSE0.txt", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_pyopenssl", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pyopenssl-23.2.0-pyhd8ed1ab_1", - sha256 = "4daea3dc896987cc1334956fccfc0ed738663a84ad0c1d3f576a7a7936091534", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pyparsing", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pyparsing-3.1.1-pyhd8ed1ab_0", - sha256 = "4a1332d634b6c2501a973655d68f08c9c42c0bd509c349239127b10572b8354b", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_pysam", - base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], - dist_name = "pysam-0.21.0-py310hff46b53_0", - sha256 = "c231557375a2fb4db78ecdd0d63a660c9316244885e9cc8e5eee75d0f5cb97b3", - ) - conda_package_repository( - name = "conda_package_pysocks", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pysocks-1.7.1-pyha2e5f31_6", - sha256 = "a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b", - ) - - conda_package_repository( - name = "conda_package_pytables", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pytables-3.8.0-py310hde6a235_1", - sha256 = "2b444e6e7fe42ac9a025661a4bb00b1de4d8e08c260d9e242cb790cb8cd32ba7", - patch_args = ["-p1"], - patches = ["@cellranger//third-party:pytables-3.8.0-slurmdir.patch"], - exclude = [ - "lib/python3.*/site-packages/tables/tests/*.h5", - "lib/python3.*/site-packages/tables/tests/*.mat", - "lib/python3.*/site-packages/tables/tests/*/*", - ], - exclude_deps = ["lzo"], - extra_deps = [ - "setuptools", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pytest", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pytest-8.0.2-pyhd8ed1ab_0", - sha256 = "ea81e7efe66cffab5c8316d3a7e125e29dff9cfb19fc3578b72f965e8a876539", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_python", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "python-3.10.8-h257c98d_0_cpython", - sha256 = "090a5d0ed7acf75479664f4751f69833c9aa183f73366fe83681f4e85f72670b", - exclude = [ - "lib/python*/lib2to3", - "lib/python*/distutils/tests", - "lib/python*/ensurepip", - "lib/python*/idlelib/idle_test", - "lib/python*/test", - "doc", - "share/man", - ], - exclude_deps = [ - "ld_impl_linux-64", - "readline", - "tk", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_python_annoy", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "python-annoy-1.17.2-py310hc6cd4ac_1", - sha256 = "98bbb3aa7ae9a56049c3cfe03a12e695420be1a313b4b327c76cb750ed9e9e6f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_python_dateutil", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "python-dateutil-2.8.2-pyhd8ed1ab_0", - sha256 = "54d7785c7678166aa45adeaccfc1d2b8c3c799ca2dc05d4a82bb39b1968bd7da", - ) - conda_package_repository( - name = "conda_package_python_fastjsonschema", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "python-fastjsonschema-2.19.1-pyhd8ed1ab_0", - sha256 = "38b2db169d65cc5595e3ce63294c4fdb6a242ecf71f70b3ad8cad3bd4230d82f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_python_json_logger", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "python-json-logger-2.0.7-pyhd8ed1ab_0", - sha256 = "4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_python_multipart", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "python-multipart-0.0.9-pyhd8ed1ab_0", - sha256 = "026467128031bd667c4a32555ae07e922d5caed257e4815c44e7338887bbd56a", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_python_tzdata", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "python-tzdata-2024.1-pyhd8ed1ab_0", - sha256 = "9da9a849d53705dee450b83507df1ca8ffea5f83bd21a215202221f1c492f8ad", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_python_utils", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "python-utils-3.8.2-pyhd8ed1ab_0", - sha256 = "56aac9317cde48fc8ff59806587afd4d1c262dcd7598f94c0748a2ec51523d09", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_python_abi", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "python_abi-3.10-4_cp310", - sha256 = "456bec815bfc2b364763084d08b412fdc4c17eb9ccc66a36cb775fa7ac3cbaec", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_pytz", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "pytz-2024.1-pyhd8ed1ab_0", - sha256 = "1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pyvcf3", - base_urls = ["https://conda.anaconda.org/bioconda/noarch"], - dist_name = "pyvcf3-1.0.3-pyhdfd78af_0", - sha256 = "5283bca618cea395f5aabdc40a9a136c0203c247e16935a2b250e84670e1dccb", - ) - - conda_package_repository( - name = "conda_package_pywavelets", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pywavelets-1.4.1-py310h1f7b6fc_1", - sha256 = "2aa5da771dd7e4ec8316de51edd7aefcb6f688f7e4d2a2905faac76462826cf7", - exclude = [ - "lib/python*/site-packages/pywt/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pyyaml", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pyyaml-6.0.1-py310h2372a71_1", - sha256 = "aa78ccddb0a75fa722f0f0eb3537c73ee1219c9dd46cea99d6b9eebfdd780f3d", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_pyzmq", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "pyzmq-25.1.2-py310h795f18f_0", - sha256 = "6ce93fd1e847ce02c2bbfa6022b639b21d4229d61b21ce0ecacb22c380e5680e", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_read_roi", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "read-roi-1.6.0-py_0", - sha256 = "509231a8a4418deceadb533de00ea44eabddb4bf4aeebcea6383b240ee4f62ba", - ) - conda_package_repository( - name = "conda_package_referencing", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "referencing-0.33.0-pyhd8ed1ab_0", - sha256 = "5707eb9ee2c7cfcc56a5223b24ab3133ff61aaa796931f3b22068e0a43ea6ecf", - exclude = ["site-packages/referencing/tests"], - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_requests", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "requests-2.31.0-pyhd8ed1ab_0", - sha256 = "9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_rfc3339_validator", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "rfc3339-validator-0.1.4-pyhd8ed1ab_0", - sha256 = "7c7052b51de0b5c558f890bb11f8b5edbb9934a653d76be086b1182b9f54185d", - ) - conda_package_repository( - name = "conda_package_rfc3986_validator", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "rfc3986-validator-0.1.1-pyh9f0ad1d_0", - sha256 = "2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37", - ) - - conda_package_repository( - name = "conda_package_rpds_py", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "rpds-py-0.18.0-py310hcb5633a_0", - sha256 = "180f734f14402a3605cc0d0a70dd52539c87ba76337da6eb73ebf603c8405c6b", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_ruamel_yaml", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "ruamel.yaml-0.17.40-py310h2372a71_0", - sha256 = "b9179de5e519cf83b9bbb99bdf3ca372281b213169c5d36e4a6d1de8b8d3ba05", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_ruamel_yaml_clib", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "ruamel.yaml.clib-0.2.8-py310h2372a71_0", - sha256 = "cfcb1b4528074684b2e339b6854320f42a03e7545ff1944ef8262e0130e5c6c8", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_scikit_image", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "scikit-image-0.20.0-py310h9b08913_1", - sha256 = "523dbd074d6260070fe27be33218efea2027a4196f651bbda6f68355900d9f40", - patch_args = ["-p1"], - patches = ["@cellranger//third-party:scikit-image-0.20.0-nocache.patch"], - exclude = [ - "lib/python*/site-packages/skimage/data/__pycache__/_fetchers.cpython-*.pyc", - "lib/python*/site-packages/skimage/*/tests", - "lib/python*/site-packages/skimage/*/*/tests", - ], - exclude_deps = ["_openmp_mutex"], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_scikit_learn", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "scikit-learn-1.3.0-py310hf7d194e_0", - sha256 = "4d31aad800aa867d8d46dbf1359c1f2079684f9b6eef380f64e4a481c00b000e", - exclude = [ - "lib/python*/site-packages/sklearn/*/*/tests", - "lib/python*/site-packages/sklearn/*/tests", - "lib/python*/site-packages/sklearn/tests", - ], - archive_type = "conda", - exclude_deps = ["_openmp_mutex"], - ) - conda_package_repository( - name = "conda_package_scipy", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "scipy-1.10.1-py310ha4c1d20_3", - sha256 = "c7beb091db82a1be2fa9dafb878695b1e8bd6d7efe7764afa457cabfea2a93d3", - exclude = [ - "lib/python*/site-packages/scipy/linalg/src/id_dist/doc", - "lib/python*/site-packages/scipy/*/*/*/*/tests", - "lib/python*/site-packages/scipy/*/*/*/tests", - "lib/python*/site-packages/scipy/*/*/tests", - "lib/python*/site-packages/scipy/*/tests", - ], - archive_type = "conda", - exclude_deps = [ - "fftw", - "pooch", - ], - ) - conda_package_repository( - name = "conda_package_seaborn", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "seaborn-0.13.2-hd8ed1ab_0", - sha256 = "60a49c630bf429ae5264ee52f1e6a08df1d8b98c93047ec57f58786ef3094854", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_seaborn_base", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "seaborn-base-0.13.2-pyhd8ed1ab_0", - sha256 = "0c40edc2f36edbeeb38dd8fb667f63ce7759a2c148d5d5ca2044a791fe9898a1", - exclude = [ - "site-packages/seaborn/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_send2trash", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "send2trash-1.8.2-pyh41d4057_0", - sha256 = "e74d3faf51a6cc429898da0209d95b209270160f3edbf2f6d8b61a99428301cd", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_setuptools", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "setuptools-69.1.1-pyhd8ed1ab_0", - sha256 = "7a6dca60efcaa42d0ebb784950bc16230a968256cb5048a4441cb34653b5ec58", - exclude = [ - "lib/python*/site-packages/setuptools/command/launcher manifest.xml", - "lib/python*/site-packages/setuptools/script (dev).tmpl", - "lib/python*/site-packages/setuptools/*.exe", - "lib/python*/site-packages/pkg_resources/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_shapely", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "shapely-2.0.3-py310hc3e127f_0", - sha256 = "63cbe3c285b7be6fc12e27e296fe2e6e99f856046b21547d7f22d2d5d084d8e3", - exclude = ["lib/python*/site-packages/shapely/tests"], - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_shellcheck", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "shellcheck-0.9.0-ha770c72_0", - sha256 = "77e492c84b2029144a12e7c7abe47a6f485d2485272cfe9d1fc17eb8b23cd618", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_shiny", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "shiny-0.7.1-pyhd8ed1ab_0", - sha256 = "519e3e9e0e9e4e84a69597dffcee9b50a60cc58a2b000f1bcf44715c25c4967b", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_simpleitk", - base_urls = ["https://conda.anaconda.org/simpleitk/linux-64"], - dist_name = "simpleitk-2.2.1-py310h3fd9d12_0", - sha256 = "bbe4fce613459cf15d5c176b30ecc0d8b7c17d594822c36af9b3d735c7283aee", - ) - conda_package_repository( - name = "conda_package_simplejson", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "simplejson-3.19.2-py310h2372a71_0", - sha256 = "4f25f8e74915744537b432d13b42a0e4029c0f114b6d68f24b2bfe62b85b777c", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_six", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "six-1.16.0-pyh6c4a22f_0", - sha256 = "a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6", - ) - conda_package_repository( - name = "conda_package_snappy", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "snappy-1.1.10-h9fff704_0", - sha256 = "02219f2382b4fe39250627dade087a4412d811936a5a445636b7260477164eac", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_sniffio", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "sniffio-1.3.1-pyhd8ed1ab_0", - sha256 = "bc12100b2d8836b93c55068b463190505b8064d0fc7d025e89f20ebf22fe6c2b", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_sortedcontainers", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "sortedcontainers-2.4.0-pyhd8ed1ab_0", - sha256 = "0cea408397d50c2afb2d25e987ebac4546ae11e549d65b1403d80dc368dfaaa6", - ) - conda_package_repository( - name = "conda_package_soupsieve", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "soupsieve-2.5-pyhd8ed1ab_1", - sha256 = "54ae221033db8fbcd4998ccb07f3c3828b4d77e73b0c72b18c1d6a507059059c", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_stack_data", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "stack_data-0.6.2-pyhd8ed1ab_0", - sha256 = "a58433e75229bec39f3be50c02efbe9b7083e53a1f31d8ee247564f370191eec", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_starlette", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "starlette-0.37.1-pyhd8ed1ab_0", - sha256 = "41d7c051f56f86446a13fc7887d6a888a686c1300bcc1ed4834f1d592a0a724c", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_statsmodels", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "statsmodels-0.14.1-py310h1f7b6fc_0", - sha256 = "35333b5ed842c3b047a573611f37d4f626de576551d13421d3f489af604d5783", - exclude = [ - "lib/python*/site-packages/statsmodels/*/tests", - "lib/python*/site-packages/statsmodels/*/*/tests", - "lib/python*/site-packages/statsmodels/*/*/*/tests", - "lib/python*/site-packages/statsmodels/tests", - "lib/python*/site-packages/statsmodels/sandbox/distributions/examples", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_tbb", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "tbb-2021.11.0-h00ab1b0_1", - sha256 = "ded4de0d5a3eb7b47ed829f0ed0e3c61ccd428308bde52d8d22ced228038223b", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_tbb_devel", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "tbb-devel-2021.11.0-h5ccd973_1", - sha256 = "d133e16e784e2e6836150c433cf4dbfa60a82ef08f7f27df2a082e7090d05073", - archive_type = "conda", - exclude = [ - "share/doc", - ], - ) - conda_package_repository( - name = "conda_package_tenacity", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "tenacity-8.2.3-pyhd8ed1ab_0", - sha256 = "860c11e7369d6a86fcc9c6cbca49d5c457f6c0a27faeacca4d46267f9dd10d78", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_terminado", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "terminado-0.18.0-pyh0d859eb_0", - sha256 = "e90139ef15ea9d75a69cd6b6302c29ed5b01c03ddfa717b71acb32b60af74269", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_threadpoolctl", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "threadpoolctl-3.3.0-pyhc1e730c_0", - sha256 = "5ba8bd3f2d49b3b860eb4481ca9505c57d4427212eb12cadd2b351309d5c28e6", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_tifffile", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "tifffile-2022.10.10-pyhd8ed1ab_0", - sha256 = "85153fe85b205e01f62fcfddcc47c2c6a8cb6062d4e0e73e0a0a71f01a984f33", - exclude_deps = [ - # From tifffile.py's description of its dependencies: - # "required only for encoding or decoding LZW, JPEG, etc." - # Previous versions of the conda package didn't have a dependency on - # imagecodecs (and had the same notice), so we should be safe - # excluding this here. Anything downstream which needs imagecodecs - # (and it's gigantic transitive dependency tree) can depend on it - # directly. - "imagecodecs", - ], - ) - conda_package_repository( - name = "conda_package_tinycss2", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "tinycss2-1.2.1-pyhd8ed1ab_0", - sha256 = "f0db1a2298a5e10e30f4b947566c7229442834702f549dded40a73ecdea7502d", - ) - - conda_package_repository( - name = "conda_package_tk", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "tk-8.6.13-noxft_h4845f30_101", - sha256 = "e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_tomli", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "tomli-2.0.1-pyhd8ed1ab_0", - sha256 = "4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f", - ) - conda_package_repository( - name = "conda_package_tomlkit", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "tomlkit-0.12.4-pyha770c72_0", - sha256 = "8d45c266bf919788abacd9828f4a2101d7216f6d4fc7c8d3417034fe0d795a18", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_toolz", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "toolz-0.12.1-pyhd8ed1ab_0", - sha256 = "22b0a9790317526e08609d5dfdd828210ae89e6d444a9e954855fc29012e90c6", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_tornado", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "tornado-6.4-py310h2372a71_0", - sha256 = "bf3f211554444e03ed4663c0704fada38e0440fa723f1e32e12243ab026e3817", - exclude = [ - "site-packages/toolz/tests", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_tqdm", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "tqdm-4.66.2-pyhd8ed1ab_0", - sha256 = "416d1d9318f3267325ad7e2b8a575df20ff9031197b30c0222c3d3b023877260", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_traitlets", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "traitlets-5.14.1-pyhd8ed1ab_0", - sha256 = "fa78d68f74ec8aae5c93f135140bfdbbf0ab60a79c6062b55d73c316068545ec", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_truststore", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "truststore-0.8.0-pyhd8ed1ab_0", - sha256 = "ba49bed74ca170c5a3bf995c33a6179fd74b33abb2444f511862e7f9f57f9149", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_typeguard", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "typeguard-4.1.5-pyhd8ed1ab_1", - sha256 = "df63f90625d2eaefcb6990437b941c1c90ec3c224bc65a2becac928542d0aa5f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_types_python_dateutil", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "types-python-dateutil-2.8.19.20240106-pyhd8ed1ab_0", - sha256 = "09ef8cc587bdea80a83b6f820dbae24daadcf82be088fb0a9f6495781653e300", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_typing_extensions", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "typing_extensions-4.10.0-pyha770c72_0", - sha256 = "4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_typing_inspect", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "typing_inspect-0.9.0-pyhd8ed1ab_0", - sha256 = "16e0b825c138e14ebc84623248d91d93a8cff29bb93595cc4aa46ca32f24f1de", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_typing_utils", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "typing_utils-0.1.0-pyhd8ed1ab_0", - sha256 = "9e3758b620397f56fb709f796969de436d63b7117897159619b87938e1f78739", - ) - - conda_package_repository( - name = "conda_package_tzdata", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "tzdata-2024a-h0c530f3_0", - sha256 = "7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_uc_micro_py", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "uc-micro-py-1.0.3-pyhd8ed1ab_0", - sha256 = "54293cd94da3a6b978b353eb7897555055d925ad0008bc73e85cca19e2587ed0", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_umap_learn", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "umap-learn-0.5.5-py310hff52083_1", - sha256 = "de2ff2d3522adaea174922d20a41a3d74a60420b28d760b79fe6157480f5d157", - license_file = "info/licenses/LICENSE0.txt", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_unicodedata2", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "unicodedata2-15.1.0-py310h2372a71_0", - sha256 = "5ab2f2d4542ba0cc27d222c08ae61706babe7173b0c6dfa748aa37ff2fa9d824", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_uri_template", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "uri-template-1.3.0-pyhd8ed1ab_0", - sha256 = "b76904b53721dc88a46352324c79d2b077c2f74a9f7208ad2c4249892669ae94", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_urllib3", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "urllib3-2.0.7-pyhd8ed1ab_0", - sha256 = "9fe14735dde74278c6f1710cbe883d5710fc98501a96031dec6849a8d8a1bb11", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_uvicorn", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "uvicorn-0.27.1-py310hff52083_0", - sha256 = "de013370ca8c05c5f2ba58c383ec91d9c77937dc038a55e0a465d8e7bbf4d491", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_watchfiles", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "watchfiles-0.21.0-py310hcb5633a_0", - sha256 = "72cfe33e98fbf3190e6ac89e457a389c86eb741f84fafa7c74ec2b55658f46be", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_wcwidth", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "wcwidth-0.2.13-pyhd8ed1ab_0", - sha256 = "b6cd2fee7e728e620ec736d8dfee29c6c9e2adbd4e695a31f1d8f834a83e57e3", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_webcolors", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "webcolors-1.13-pyhd8ed1ab_0", - sha256 = "6e097d5fe92849ad3af2c2a313771ad2fbf1cadd4dc4afd552303b2bf3f85211", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_webencodings", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "webencodings-0.5.1-pyhd8ed1ab_2", - sha256 = "2adf9bd5482802837bc8814cbe28d7b2a4cbd2e2c52e381329eaa283b3ed1944", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_websocket_client", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "websocket-client-1.7.0-pyhd8ed1ab_0", - sha256 = "d9b537d5b7c5aa7a02a4ce4c6b755e458bd8083b67752a73c92d113ccec6c10f", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_websockets", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "websockets-12.0-py310h2372a71_0", - sha256 = "9d99b58e2eb349124198a41a254bedd3543f43522f51bf086bfe3e87a2a6647b", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_wget", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "wget-1.20.3-ha56f1ee_1", - sha256 = "d46fe5f94627cc2cdbed1f3cbadd9693a7ff9550fce2b892ed4d334de841b6ce", - license_file = "info/licenses/COPYING", - exclude = [ - "share/info", - "share/locale", - ], - ) - - conda_package_repository( - name = "conda_package_wheel", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "wheel-0.42.0-pyhd8ed1ab_0", - sha256 = "80be0ccc815ce22f80c141013302839b0ed938a2edb50b846cf48d8a8c1cfa01", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_widgetsnbextension", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "widgetsnbextension-4.0.10-pyhd8ed1ab_0", - sha256 = "981b06c76a1a86bb84be09522768be0458274926b22f4b0225dfcdd30a6593e0", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_wirerope", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "wirerope-0.4.7-pyhd8ed1ab_0", - sha256 = "b8efbb2ff354dc47899339d048140b01a11fe964f3f9c2ff468d4ba394f4f6dd", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_wrapt", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "wrapt-1.16.0-py310h2372a71_0", - sha256 = "2adc15cd1e66845c1ab498735e2f828003e2d5fe20eed1febddb712f58793c31", - exclude = ["lib/python*/__pycache__/_sysconfigdata*.pyc"], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_xmltodict", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "xmltodict-0.13.0-pyhd8ed1ab_0", - sha256 = "eb40b33ae953e0020406318c9be0eb6edf62f3aa8e64ab0bf1953440b1a92763", - ) - conda_package_repository( - name = "conda_package_xorg_libxau", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "xorg-libxau-1.0.11-hd590300_0", - sha256 = "309751371d525ce50af7c87811b435c176915239fc9e132b99a25d5e1703f2d4", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_xorg_libxdmcp", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "xorg-libxdmcp-1.1.3-h7f98852_0", - sha256 = "4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77", - ) - - conda_package_repository( - name = "conda_package_xz", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "xz-5.2.6-h166bdaf_0", - sha256 = "03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162", - licenses = ["@rules_license//licenses/spdx:LGPL-2.1"], - exclude = [ - # GPL-licensed scripts which we don't need. - "bin/*cmp", - "bin/*diff", - "bin/*grep", - "bin/*less", - "bin/*more", - # Not useful - "share", - ], - ) - conda_package_repository( - name = "conda_package_yaml", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "yaml-0.2.5-h7f98852_2", - sha256 = "a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535", - ) - conda_package_repository( - name = "conda_package_yarl", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "yarl-1.9.4-py310h2372a71_0", - sha256 = "0851ac8c66e99faa9c885a2905c2b7b227a051c008cfaed97eeec0f82a9cdbcf", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_zeromq", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "zeromq-4.3.5-h59595ed_1", - sha256 = "3bec658f5c23abf5e200d98418add7a20ff7b45c928ad4560525bef899496256", - exclude = [ - "share/man", - ], - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_zfp", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "zfp-1.0.1-h59595ed_0", - sha256 = "52c3bb8ab48892a2851e84764b0d35589434aebebe7941d44d9aeffde53c26d3", - archive_type = "conda", - exclude_deps = ["_openmp_mutex"], - ) - - conda_package_repository( - name = "conda_package_zipp", - base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], - dist_name = "zipp-3.17.0-pyhd8ed1ab_0", - sha256 = "bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_zlib", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "zlib-1.2.13-hd590300_5", - sha256 = "9887a04d7e7cb14bd2b52fa01858f05a6d7f002c890f618d9fcd864adbfecb1b", - archive_type = "conda", - ) - conda_package_repository( - name = "conda_package_zlib_ng", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "zlib-ng-2.0.7-h0b41bf4_0", - sha256 = "6b3a22b7cc219e8d83f16c1ceba67aa51e0b7e3bcc4a647b97a0a510559b0477", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_zstandard", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "zstandard-0.22.0-py310h1275a96_0", - sha256 = "1c1b91e5c5246b13ca25728ea6200dfd230d8ce8ca6910cd0b70fc5e43065a04", - archive_type = "conda", - ) - - conda_package_repository( - name = "conda_package_zstd", - base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], - dist_name = "zstd-1.5.5-hfc55251_0", - sha256 = "607cbeb1a533be98ba96cf5cdf0ddbb101c78019f1fda063261871dad6248609", - exclude = [ - "share/man", - ], - licenses = [ - "@rules_license//licenses/spdx:BSD-3-Clause", - ], - archive_type = "conda", - ) - anaconda_repository( - name = name, - conda_packages = [ - "_libgcc_mutex", - "aiohttp", - "aiosignal", - "altair", - "anndata", - "anyio", - "anywidget", - "aom", - "appdirs", - "archspec", - "argcomplete", - "argh", - "argon2-cffi", - "argon2-cffi-bindings", - "array-api-compat", - "arrow", - "asgiref", - "astroid", - "asttokens", - "async-lru", - "async-timeout", - "attrs", - "babel", - "backports.zoneinfo", - "bamtools", - "bcbio-gff", - "beautifulsoup4", - "bedtools", - "biocantor", - "biopython", - "black", - "blas", - "blas-devel", - "blast", - "bleach", - "blosc", - "boltons", - "brotli", - "brotli-bin", - "brotli-python", - "brunsli", - "bx-python", - "bzip2", - "c-ares", - "c-blosc2", - "ca-certificates", - "cached_property", - "certifi", - "cffi", - "cfitsio", - "charls", - "charset-normalizer", - "click", - "cloudpickle", - "colorama", - "comm", - "conda", - "conda-package-handling", - "conda-package-streaming", - "contourpy", - "coverage", - "cramjam", - "cryptography", - "curl", - "cycler", - "cython", - "cytoolz", - "dask-core", - "dataclasses", - "dav1d", - "debugpy", - "decorator", - "defusedxml", - "dill", - "docopt", - "eigen", - "entrez-direct", - "entrypoints", - "et_xmlfile", - "exceptiongroup", - "executing", - "fastparquet", - "fonttools", - "fqdn", - "freetype", - "frozenlist", - "fsspec", - "future", - "geos", - "gettext", - "gffutils", - "giflib", - "h11", - "h2", - "h5py", - "hdf5", - "hpack", - "htmltools", - "htslib", - "httpcore", - "httpx", - "hyperframe", - "hypothesis", - "icu", - "idna", - "imagecodecs", - "imageio", - "importlib-metadata", - "importlib_resources", - "iniconfig", - "intervaltree", - "ipykernel", - "ipython", - "ipywidgets", - "isoduration", - "isort", - "isoseq", - "isoseq3", - "jedi", - "jinja2", - "joblib", - "jpeg", - "json5", - "jsonpatch", - "jsonpointer", - "jsonschema", - "jsonschema-specifications", - "jsonschema-with-format-nongpl", - "jupyter-lsp", - "jupyter_client", - "jupyter_core", - "jupyter_events", - "jupyter_server", - "jupyter_server_terminals", - "jupyterlab", - "jupyterlab_pygments", - "jupyterlab_server", - "jupyterlab_widgets", - "jxrlib", - "keyutils", - "kiwisolver", - "krb5", - "lazy-object-proxy", - "lazy_loader", - "lcms2", - "lerc", - "libaec", - "libavif", - "libblas", - "libbrotlicommon", - "libbrotlidec", - "libbrotlienc", - "libcblas", - "libcurl", - "libdeflate", - "libedit", - "libev", - "libffi", - "libgcc-ng", - # DO NOT REMOVE, DO NOT ADD libgfortran(non_ng) - "libgfortran-ng", - "libgfortran5", - "libhwloc", - "libiconv", - "libidn2", - "liblapack", - "liblapacke", - "libllvm14", - "libnghttp2", - "libnsl", - "libpng", - "libprotobuf", - "libsodium", - "libsqlite", - "libssh2", - "libstdcxx-ng", - "libtiff", - "libunistring", - "libuuid", - "libwebp-base", - "libxcb", - "libxcrypt", - "libxml2", - "libzlib", - "libzopfli", - "lima", - "line_profiler", - "linkify-it-py", - "llvm-openmp", - "llvmlite", - "locket", - "lz4", - "lz4-c", - "lzstring", - "markdown-it-py", - "markupsafe", - "marshmallow", - "marshmallow-dataclass", - "marshmallow-enum", - "marshmallow-union", - "matplotlib-base", - "matplotlib-inline", - "mccabe", - "mdit-py-plugins", - "mdurl", - "melt", - "memory_profiler", - "methodtools", - "mistune", - "mkl", - "mkl-devel", - "mkl-include", - "mkl-service", - "multidict", - "munkres", - "mypy_extensions", - "natsort", - "nbclient", - "nbconvert-core", - "nbformat", - "ncbi-vdb", - "ncurses", - "nest-asyncio", - "networkx", - "notebook", - "notebook-shim", - "numba", - "numexpr", - "numpy", - "openjpeg", - "openpyxl", - "openssl", - "overrides", - "packaging", - "pandas", - "pandocfilters", - "parasail-python", - "parso", - "partd", - "pathspec", - "patsy", - "pbmm2", - "pbtk", - "pcre", - "pexpect", - "pickleshare", - "pillow", - "pip", - "pkgutil-resolve-name", - "platformdirs", - "plotly", - "pluggy", - "polars", - "primer3-py", - "progressbar2", - "prometheus_client", - "prompt-toolkit", - "protobuf", - "psutil", - "psygnal", - "pthread-stubs", - "ptyprocess", - "pure_eval", - "py-cpuinfo", - "pybedtools", - "pybigwig", - "pycosat", - "pycparser", - "pyfaidx", - "pyflakes", - "pygments", - "pylint", - "pynndescent", - "pyopenssl", - "pyparsing", - "pysam", - "pysocks", - "pytables", - "pytest", - "python", - "python-annoy", - "python-dateutil", - "python-fastjsonschema", - "python-json-logger", - "python-multipart", - "python-tzdata", - "python-utils", - "python_abi", - "pytz", - "pyvcf3", - "pywavelets", - "pyyaml", - "pyzmq", - "read-roi", - "referencing", - "requests", - "rfc3339-validator", - "rfc3986-validator", - "rpds-py", - "ruamel.yaml", - "ruamel.yaml.clib", - "scikit-image", - "scikit-learn", - "scipy", - "seaborn", - "seaborn-base", - "send2trash", - "setuptools", - "shapely", - "shellcheck", - "shiny", - "simpleitk", - "simplejson", - "six", - "snappy", - "sniffio", - "sortedcontainers", - "soupsieve", - "stack_data", - "starlette", - "statsmodels", - "tbb", - "tbb-devel", - "tenacity", - "terminado", - "threadpoolctl", - "tifffile", - "tinycss2", - "tk", - "tomli", - "tomlkit", - "toolz", - "tornado", - "tqdm", - "traitlets", - "truststore", - "typeguard", - "types-python-dateutil", - "typing_extensions", - "typing_inspect", - "typing_utils", - "tzdata", - "uc-micro-py", - "umap-learn", - "unicodedata2", - "uri-template", - "urllib3", - "uvicorn", - "watchfiles", - "wcwidth", - "webcolors", - "webencodings", - "websocket-client", - "websockets", - "wget", - "wheel", - "widgetsnbextension", - "wirerope", - "wrapt", - "xmltodict", - "xorg-libxau", - "xorg-libxdmcp", - "xz", - "yaml", - "yarl", - "zeromq", - "zfp", - "zipp", - "zlib", - "zlib-ng", - "zstandard", - "zstd", - "cellarium", - "fbpca", - "faicons", - "hjson", - "ipytablewidgets", - "moods", - "py-opencv", - "shiny_semantic", - "shinywidgets", - "tenxpy", - "tsne", - "vega", - ], - executable_packages = [ - "conda", - "coverage", - "cython", - "ipython", - "notebook", - "python", - "shellcheck", - ], - aliases = { - "bh_sne_3d": "tsne", - "bh_sne": "tsne", - "cached-property": "cached_property", - "Bio": "biopython", - "importlib_metadata": "importlib-metadata", - "matplotlib": "matplotlib-base", - "melting": "melt", - "MOODS": "moods", - "numpy-base": "numpy", - "numpy_base": "numpy", - "parasail": "parasail-python", - "PIL": "pillow", - "pyBigWig": "pybigwig", - "primer3": "primer3-py", - "progressbar": "progressbar2", - "prompt_toolkit": "prompt-toolkit", - "SimpleITK": "simpleitk", - "skimage": "scikit-image", - "sklearn": "scikit-learn", - "tables": "pytables", - "typing-extensions": "typing_extensions", - "umap": "umap-learn", - }, - py_version = 3, - ) - native.register_toolchains("@{}//:python_toolchain".format(name)) diff --git a/etc/cellranger_telemetry.yaml b/etc/cellranger_telemetry.yaml new file mode 100644 index 0000000..42bdc55 --- /dev/null +++ b/etc/cellranger_telemetry.yaml @@ -0,0 +1,2211 @@ +# yaml-language-server: $schema=../lib/go/telemetry/config/telemetry_schema.json +--- +config_version: 1 +product: cellranger +version: "9.0.0" + +groups: + os_stats: + when: command + hardware_stats: + when: command + count_args: + when: command + subcommands: + - count + vdj_args: + when: command + subcommands: + - vdj + aggr_args: + when: command + subcommands: + - aggr + mkref_args: + when: command + subcommands: + - mkref + - mkvdjref + multi_config: + when: command + subcommands: + - multi + failure: + when: failure + subcommands: + - count + - multi + - vdj + - aggr + - annotate + - reanalyze + - mkvdjref + - mkfastq + - mkref + pipeline_success: + when: success + subcommands: + - count + - multi + - vdj + - aggr + - annotate + - reanalyze + - mkvdjref + - mkfastq + - mkref + detected_chemistry: + when: success + subcommands: + - count + - multi + globs: + lib_metrics: "SC_*/SC_MULTI_CORE/MULTI_REPORTER/SUMMARIZE_REPORTS/fork0/files/metrics_summary_json.json" + library_metrics: + when: success + subcommands: + - count + - multi + - vdj + globs: + lib_metrics: "SC_*/SC_MULTI_CORE/MULTI_REPORTER/SUMMARIZE_REPORTS/fork0/files/metrics_summary_json.json" + library_metrics_vdj: + when: success + subcommands: + - multi + - vdj + globs: + vdj_lib_metrics: "SC_*/SC_MULTI_CORE/MULTI_GEM_WELL_PROCESSOR/VDJ_*_GEM_WELL_PROCESSOR/LIB_VDJ_ANALYZER/SUMMARIZE_VDJ_REPORTS/fork0/files/metrics_summary_json.json" + + sample_metrics: + when: success + subcommands: + - multi + globs: + sample_metrics: "SC_*/SC_MULTI_CORE/SANITIZE_MAP_CALLS/fork0/files/*_summary.json" + + sample_metrics_vdj: + when: success + subcommands: + - multi + globs: + vdj_sample_metrics: "SC_*/SC_MULTI_CORE/MULTI_GEM_WELL_PROCESSOR/VDJ_*_GEM_WELL_PROCESSOR/PER_SAMPLE_VDJ_ANALYZER/SUMMARIZE_VDJ_REPORTS/*/files/metrics_summary_json.json" + +presets: + filesystem: + match: + - key: wsl + exp: >- + \b(?:(?:9p)|(?:lxfs))\b + - key: local + exp: >- + \b(?:(?:ext[34])|(?:(?:btr|x|z)fs))\b + - exp: "\\bnfs" + - exp: "lustre" + # Usually means docker + - exp: "overlay" + - exp: squashfs + - exp: panfs + - exp: gpfs + - exp: beegfs + - exp: cifs + - exp: ceph + - exp: "fat\\b" + - exp: "\\bfuse" + chemistry: + match: + - key: auto + exp: "(?i)^auto$" + - key: custom + exp: "(?i)^custom$" + - key: threeprime + exp: "(?i)^threeprime$" + - key: fiveprime + exp: "(?i)^fiveprime$" + - key: sc3pv1 + exp: "(?i)^sc3pv1$" + - key: sc3pv2 + exp: "(?i)^sc3pv2$" + - key: sc3pv3-polya + exp: "(?i)^sc3pv3-polya$" + - key: sc3pv3-cs1 + exp: "(?i)^sc3pv3-cs1$" + - key: sc3pv4-polya + exp: "(?i)^sc3pv4-polya$" + - key: sc3pv4-cs1 + exp: "(?i)^sc3pv4-cs1$" + - key: sc3pv4-polya-ocm + exp: "(?i)^sc3pv4-polya-ocm$" + - key: sc3pv4-cs1-ocm + exp: "(?i)^sc3pv4-cs1-ocm$" + - key: sc3pv3lt + exp: "(?i)^sc3pv3lt$" + - key: sc3pv3ht-polya + exp: "(?i)^sc3pv3ht-polya$" + - key: sc3pv3ht-cs1 + exp: "(?i)^sc3pv3ht-cs1$" + - key: sc5p-pe + exp: "(?i)^sc5p-?pe$" + - key: sc5p-pe-v3 + exp: "(?i)^sc5p-?pe-?v3$" + - key: sc5p-pe-ocm-v3 + exp: "(?i)^sc5p-?pe-?ocm-?v3$" + - key: sc5p-r2 + exp: "(?i)^sc5p-?r2$" + - key: sc5p-r2-v3 + exp: "(?i)^sc5p-?r2-?v3$" + - key: sc5p-r2-ocm-v3 + exp: "(?i)^sc5p-?r2-?ocm-?v3$" + - key: sc5pht + exp: "(?i)^sc5pht$" + - key: sc-fb + exp: "(?i)^sc-?fb$" + - key: sfrp + exp: "(?i)^sfrp$" + - key: sfrp-no-trim-r2 + exp: "(?i)^sfrp-no-trim-r2$" + - key: mfrp-rna + exp: "(?i)^mfrp-rna$" + - key: mfrp-ab + exp: "(?i)^mfrp-ab$" + - key: mfrp-crispr + exp: "(?i)^mfrp-crispr$" + - key: mfrp-47 + exp: "(?i)^mfrp-47$" + - key: mfrp-uncollapsed + exp: "(?i)^mfrp-uncollapsed$" + - key: mfrp-rna-r1 + exp: "(?i)^mfrp-rna-r1$" + - key: mfrp-ab-r1 + exp: "(?i)^mfrp-ab-r1$" + - key: mfrp-ab-r2pos50 + exp: "(?i)^mfrp-ab-r2pos50$" + - key: mfrp-r1-48-uncollapsed + exp: "(?i)^mfrp-r1-48-uncollapsed$" + - key: mfrp-r1-no-trim-r2 + exp: "(?i)^mfrp-r1-no-trim-r2$" + - key: arc-v1 + exp: "(?i)^arc-v1$" + - key: unknown + exp: ".*" + +metrics: + # OS stats + + - name: event_count + groups: + - os_stats + - hardware_stats + - failure + - pipeline_success + recent_count: os_stats + values: + exponential: + multiple: 2 + min: 3 + max: 768 + + - name: glibc + groups: os_stats + special: glibc + values: + semver_thresholds: + - "2.12" + - "2.17" + - "2.28" + - "2.34" + + - name: kernel + groups: os_stats + special: kernel + values: + semver_thresholds: + - "3.10" # centos/rhel 7 + - "4.4" # Ubunut 16 + - "4.15" # Ubuntu 18 + - "4.18" # rhel 8 + - "5.4" # Ubuntu 20 + - "5.14" # rhel 9 + - "5.15" # Ubuntu 22 + + - name: distro + groups: os_stats + special: distro + + - name: container + groups: os_stats + special: container + + - name: cgroup_memory_soft_limit + groups: os_stats + file_content: + cgroup: "memory" + path: + - memory.soft_limit_in_bytes + - memory.memsw.soft_limit_in_bytes + - memory.high + line: "[0-9]+" + values: + exponential: + multiple: 2 + min: 1073741824 + + - name: cgroup_memory_hard_limit + groups: os_stats + file_content: + cgroup: "memory" + path: + - memory.limit_in_bytes + - memory.memsw.limit_in_bytes + - memory.max + line: "[0-9]+" + values: + exponential: + multiple: 2 + min: 1073741824 + + - name: bin_filesystem + filesystem: + which: bins + property: type + groups: os_stats + preset: filesystem + + - name: pipestance_filesystem + filesystem: + which: pipestance + property: type + groups: + - pipeline_success + - failure + preset: filesystem + + - name: process_ulimit + groups: os_stats + rlimit: + resource: nproc + values: + thresholds: + - 1024 + - 2048 + - 65536 + - 131072 + + - name: vmem_ulimit + groups: os_stats + rlimit: + resource: as + values: + thresholds: + - 1024 + - 2048 + - 65536 + - 131072 + + - name: transparent_huge_pages + groups: os_stats + file_content: + path: /sys/kernel/mm/transparent_hugepage/enabled + line: >- + \[(\w+)\] + values: + match: + - exp: always + - exp: madvise + - exp: never + + # Hardware stats: CPU info + - name: cpu_mfg + file_content: + path: /proc/cpuinfo + line: >- + vendor_id\s*:\s*(\S*) + groups: + - hardware_stats + - pipeline_success + values: + match: + - exp: "(?i:Intel)" + - exp: "(?i:AMD)" + + - name: avx + file_content: + path: /proc/cpuinfo + line: >- + flags\s*:\s*(.*) + groups: hardware_stats + values: + match: + - exp: "\\bavx512" + - exp: "\\bavx2\\b" + - exp: "\\bavx\\b" + + - name: processor_count + # technically this is vCPU count - 1, because they're numbered from 0. + groups: + - hardware_stats + - pipeline_success + file_content: + path: /proc/cpuinfo + last_line: >- + processor\s*:\s*(\d+) + values: + thresholds: + - 7 + - 15 + - 23 + - 31 + - 47 + - 65 + - 95 + - 127 + + - name: socket_count + # technically this is socket count - 1, because they're numbered from 0. + groups: hardware_stats + file_content: + path: /proc/cpuinfo + last_line: >- + physical id\s*:\s*(\d+) + values: + thresholds: + - 0 + - 1 + - 3 + - name: cores_per_socket + groups: hardware_stats + file_content: + path: /proc/cpuinfo + line: >- + cpu cores\s*:\s*(\d+) + values: + thresholds: + - 4 + - 8 + - 12 + - 16 + - 24 + - 32 + + # Hardware stats: memory + - name: memory + groups: + - hardware_stats + - pipeline_success + file_content: + path: /proc/meminfo + line: >- + ^MemTotal:\s*([0-9]+) + values: + exponential: + multiple: 2 + min: 8388608 + + # Failure information + - name: failed_stage + groups: failure + special: failed_stage + - name: error + groups: ["failure"] + file_content: + path: _errors + stage_relative: true + # match the first line that starts with a non-whitespace character + line: >- + ^\S.+ + values: + match: + - exp: >- + ^\S+Error: + key: python exception + - exp: "not queued or running" + key: cluster failure + + - name: subcommand + groups: + - failure + - pipeline_success + special: subcommand + + # count CLI args + + - name: expect_cells + groups: count_args + flag: --expect-cells + values: + float: true + + - name: force_cells + groups: count_args + flag: --force-cells + values: + float: true + + - name: create_bam + groups: count_args + flag: --create-bam + values: + boolean: true + + - name: no_bam + groups: count_args + flag: --no-bam + values: + boolean: true + + - name: nosecondary + groups: count_args + flag: --nosecondary + values: + boolean: true + + - name: r1_length + groups: count_args + flag: --r1-length + values: + float: true + + - name: r2_length + groups: count_args + flag: --r2-length + values: + float: true + + - name: include_introns + groups: count_args + flag: --include-introns + values: + boolean: true + + - name: chemistry + groups: count_args + flag: --chemistry + preset: chemistry + + - name: no_libraries + groups: count_args + flag: --no-libraries + values: + boolean: true + + - name: check_library_compatibility + groups: count_args + flag: --check-library-compatibility + values: + boolean: true + + - name: filter_aggregates + groups: count_args + flag: --filter-aggregates + values: + boolean: true + + - name: min-crispr-umi + groups: count_args + flag: --min-crispr-umi + values: + float: true + + # vdj CLI args + + - name: denovo + groups: vdj_args + flag: --denovo + values: + boolean: true + + - name: skip_clonotyping + groups: vdj_args + flag: --skip-clonotyping + values: + boolean: true + + - name: chain + groups: vdj_args + flag: --chain + values: + match: + - key: auto + exp: ^auto$ + - key: TR + exp: ^TR$ + - key: IG + exp: ^IG$ + - key: TR_GD + exp: ^TR_GD$ + + # shared mkref args + + - name: memgb + groups: mkref_args + flag: --memgb + values: + float: true + + - name: nthreads + groups: mkref_args + flag: --nthreads + values: + float: true + + # aggr CLI args + + - name: normalize + groups: aggr_args + flag: --normalize + values: + match: + - key: mapped + exp: ^mapped$ + - key: none + exp: ^none$ + + - name: nosecondary + groups: aggr_args + flag: --normalize + values: + boolean: true + + - name: min-crispr-umi + groups: aggr_args + flag: --min-crispr-umi + values: + float: true + + - name: enable-tsne + groups: aggr_args + flag: --enable-tsne + values: + boolean: true + + # multi config CSV in JSON format + + - name: emptydrops_minimum_umis + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - emptydrops_minimum_umis + values: + float: true + + - name: global_minimum_umis + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - global_minimum_umis + values: + float: true + + - name: gene_expression_r1_length + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - r1_length + values: + float: true + + - name: gene_expression_r2_length + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - r2_length + values: + float: true + + - name: chemistry + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - chemistry + preset: chemistry + + - name: expect_cells + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - expect_cells + values: + float: true + + - name: force_cells + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - force_cells + values: + float: true + + - name: nosecondary + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - nosecondary + values: + boolean: true + + - name: include_introns + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - include_introns + values: + boolean: true + + - name: check_library_compatibility + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - check_library_compatibility + values: + boolean: true + + - name: aligner + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - aligner + values: + match: + - key: hurtle + exp: ^hurtle$ + - key: star + exp: ^star$ + + - name: create_bam + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - create_bam + values: + boolean: true + + - name: filter_probes + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - filter_probes + values: + boolean: true + + - name: filter_high_occupancy_gems + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - filter_high_occupancy_gems + values: + boolean: true + + - name: min_assignment_confidence + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - min_assignment_confidence + values: + float: true + + - name: skip_cell_annotation + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - gene_expression + - skip_cell_annotation + values: + boolean: true + + - name: feature_r1_length + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - feature + - r1_length + values: + float: true + + - name: feature_r2_length + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - feature + - r2_length + values: + float: true + + - name: filter_aggregates + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - feature + - filter_aggregates + values: + boolean: true + + - name: min_crispr_umi + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - feature + - min_crispr_umi + values: + float: true + + - name: r1_length + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - vdj + - r1_length + values: + float: true + + - name: r2_length + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - vdj + - r2_length + values: + float: true + + - name: multiplet_filter + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - vdj + - multiplet_filter + values: + boolean: true + + - name: shared_contig_filter + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - vdj + - shared_contig_filter + values: + boolean: true + + - name: umi_baseline_filter + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - vdj + - umi_baseline_filter + values: + boolean: true + + - name: min_contig_length + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - vdj + - min_contig_length + values: + float: true + + - name: skip_clonotyping + groups: multi_config + file_content: + flag: --csv + converter: multicsv + json_path: + - vdj + - skip_clonotyping + values: + boolean: true + + # collect for all pipelines on success + - name: runtime + groups: + - pipeline_success + - failure + special: runtime + values: + float: true + + - name: core_hours + groups: + - pipeline_success + file_content: + path: _perf + json_path: + - forks + - fork_stats + - core_hours + values: + float: true + + - name: utime + groups: + - pipeline_success + file_content: + path: _perf + json_path: + - forks + - fork_stats + - usertime + values: + float: true + + - name: disk_hwm + groups: + - pipeline_success + file_content: + path: _perf + json_path: + - maxbytes + values: + exponential: + multiple: 2 + min: 1 + + - name: jobmode + groups: + - pipeline_success + - failure + mro_flag: --jobmode + values: + match: + - exp: local + - exp: lsf + - exp: pbspro + - exp: sge + - exp: slurm + - exp: torque + + # result of chemistry detection at the per-library level + - name: GEX_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - Gene Expression + - name + preset: chemistry + - name: ANTIBODY_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - Antibody Capture + - name + preset: chemistry + - name: ANTIGEN_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - Antigen Capture + - name + preset: chemistry + - name: CRISPR_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - CRISPR Guide Capture + - name + preset: chemistry + - name: MULTIPLEXING_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - Multiplexing Capture + - name + preset: chemistry + - name: Custom_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - Custom + - name + preset: chemistry + - name: VDJ_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - VDJ + - name + preset: chemistry + - name: VDJ_B_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - VDJ-B + - name + preset: chemistry + - name: VDJ_T_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - VDJ-T + - name + preset: chemistry + - name: VDJ_T_GD_chemistry + groups: detected_chemistry + file_content: + path: ${lib_metrics} + json_path: + - chemistry_defs + - VDJ-T-GD + - name + preset: chemistry + + # pipeline metrics + - name: chemistry_name + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: chemistry_name + preset: chemistry + - name: ANTIBODY_bc_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_bc_bases_with_q30_frac + values: + float: true + - name: ANTIBODY_bc_bases_with_q30_in_gel_bead_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_bc_bases_with_q30_in_gel_bead_frac + values: + float: true + - name: ANTIBODY_bc_bases_with_q30_in_probe_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_bc_bases_with_q30_in_probe_frac + values: + float: true + - name: ANTIBODY_feature_reads_in_cells + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_feature_reads_in_cells + values: + float: true + - name: ANTIBODY_filtered_bcs_transcriptome_union + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_filtered_bcs_transcriptome_union + values: + float: true + - name: ANTIBODY_frac_feature_reads_usable + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_frac_feature_reads_usable + values: + float: true + - name: ANTIBODY_good_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_good_bc_frac + values: + float: true + - name: ANTIBODY_good_bc_in_gel_bead_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_good_bc_in_gel_bead_frac + values: + float: true + - name: ANTIBODY_good_bc_in_probe_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_good_bc_in_probe_frac + values: + float: true + - name: ANTIBODY_good_umi_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_good_umi_frac + values: + float: true + - name: ANTIBODY_multi_cdna_pcr_dupe_reads_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_multi_cdna_pcr_dupe_reads_frac + values: + float: true + - name: ANTIBODY_read_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_read_bases_with_q30_frac + values: + float: true + - name: ANTIBODY_reads_lost_to_aggregate_GEMs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_reads_lost_to_aggregate_GEMs + values: + float: true + - name: ANTIBODY_reads_per_cell + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_reads_per_cell + values: + float: true + - name: ANTIBODY_recognized_feature_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_recognized_feature_bc_frac + values: + float: true + - name: ANTIBODY_total_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_total_read_pairs + values: + float: true + - name: ANTIBODY_umi_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_umi_bases_with_q30_frac + values: + float: true + - name: ANTIBODY_unprocessed_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIBODY_unprocessed_read_pairs + values: + float: true + - name: ANTIGEN_bc_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_bc_bases_with_q30_frac + values: + float: true + - name: ANTIGEN_bc_bases_with_q30_in_gel_bead_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_bc_bases_with_q30_in_gel_bead_frac + values: + float: true + - name: ANTIGEN_bc_bases_with_q30_in_probe_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_bc_bases_with_q30_in_probe_frac + values: + float: true + - name: ANTIGEN_feature_reads_in_cells + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_feature_reads_in_cells + values: + float: true + - name: ANTIGEN_good_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_good_bc_frac + values: + float: true + - name: ANTIGEN_good_umi_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_good_umi_frac + values: + float: true + - name: ANTIGEN_multi_cdna_pcr_dupe_reads_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_multi_cdna_pcr_dupe_reads_frac + values: + float: true + - name: ANTIGEN_read_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_read_bases_with_q30_frac + values: + float: true + - name: ANTIGEN_reads_per_cell + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_reads_per_cell + values: + float: true + - name: ANTIGEN_total_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_total_read_pairs + values: + float: true + - name: ANTIGEN_umi_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_umi_bases_with_q30_frac + values: + float: true + - name: ANTIGEN_unprocessed_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: ANTIGEN_unprocessed_read_pairs + values: + float: true + - name: CRISPR_bc_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_bc_bases_with_q30_frac + values: + float: true + - name: CRISPR_bc_bases_with_q30_in_gel_bead_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_bc_bases_with_q30_in_gel_bead_frac + values: + float: true + - name: CRISPR_bc_bases_with_q30_in_probe_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_bc_bases_with_q30_in_probe_frac + values: + float: true + - name: CRISPR_feature_bc_extracted_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_feature_bc_extracted_frac + values: + float: true + - name: CRISPR_feature_reads_in_cells + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_feature_reads_in_cells + values: + float: true + - name: CRISPR_frac_feature_reads_usable + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_frac_feature_reads_usable + values: + float: true + - name: CRISPR_good_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_good_bc_frac + values: + float: true + - name: CRISPR_good_bc_in_gel_bead_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_good_bc_in_gel_bead_frac + values: + float: true + - name: CRISPR_good_bc_in_probe_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_good_bc_in_probe_frac + values: + float: true + - name: CRISPR_good_umi_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_good_umi_frac + values: + float: true + - name: CRISPR_multi_cdna_pcr_dupe_reads_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_multi_cdna_pcr_dupe_reads_frac + values: + float: true + - name: CRISPR_read_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_read_bases_with_q30_frac + values: + float: true + - name: CRISPR_reads_per_cell + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_reads_per_cell + values: + float: true + - name: CRISPR_recognized_feature_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_recognized_feature_bc_frac + values: + float: true + - name: CRISPR_total_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_total_read_pairs + values: + float: true + - name: CRISPR_umi_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_umi_bases_with_q30_frac + values: + float: true + - name: CRISPR_unprocessed_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_unprocessed_read_pairs + values: + float: true + - name: CRISPR_unrecognized_feature_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: CRISPR_unrecognized_feature_bc_frac + values: + float: true + - name: Custom_bc_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_bc_bases_with_q30_frac + values: + float: true + - name: Custom_bc_bases_with_q30_in_gel_bead_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_bc_bases_with_q30_in_gel_bead_frac + values: + float: true + - name: Custom_bc_bases_with_q30_in_probe_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_bc_bases_with_q30_in_probe_frac + values: + float: true + - name: Custom_feature_reads_in_cells + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_feature_reads_in_cells + values: + float: true + - name: Custom_good_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_good_bc_frac + values: + float: true + - name: Custom_good_umi_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_good_umi_frac + values: + float: true + - name: Custom_multi_cdna_pcr_dupe_reads_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_multi_cdna_pcr_dupe_reads_frac + values: + float: true + - name: Custom_read_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_read_bases_with_q30_frac + values: + float: true + - name: Custom_reads_per_cell + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_reads_per_cell + values: + float: true + - name: Custom_total_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_total_read_pairs + values: + float: true + - name: Custom_umi_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_umi_bases_with_q30_frac + values: + float: true + - name: Custom_unprocessed_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: Custom_unprocessed_read_pairs + values: + float: true + - name: MULTIPLEXING_bc_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_bc_bases_with_q30_frac + values: + float: true + - name: MULTIPLEXING_bc_bases_with_q30_in_gel_bead_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_bc_bases_with_q30_in_gel_bead_frac + values: + float: true + - name: MULTIPLEXING_bc_bases_with_q30_in_probe_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_bc_bases_with_q30_in_probe_frac + values: + float: true + - name: MULTIPLEXING_feature_reads_in_cells + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_feature_reads_in_cells + values: + float: true + - name: MULTIPLEXING_good_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_good_bc_frac + values: + float: true + - name: MULTIPLEXING_good_umi_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_good_umi_frac + values: + float: true + - name: MULTIPLEXING_multi_cdna_pcr_dupe_reads_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_multi_cdna_pcr_dupe_reads_frac + values: + float: true + - name: MULTIPLEXING_read_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_read_bases_with_q30_frac + values: + float: true + - name: MULTIPLEXING_reads_per_cell + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_reads_per_cell + values: + float: true + - name: MULTIPLEXING_total_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_total_read_pairs + values: + float: true + - name: MULTIPLEXING_umi_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_umi_bases_with_q30_frac + values: + float: true + - name: MULTIPLEXING_unprocessed_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: MULTIPLEXING_unprocessed_read_pairs + values: + float: true + - name: bc_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: bc_bases_with_q30_frac + values: + float: true + - name: bc_bases_with_q30_in_gel_bead_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: bc_bases_with_q30_in_gel_bead_frac + values: + float: true + - name: bc_bases_with_q30_in_probe_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: bc_bases_with_q30_in_probe_frac + values: + float: true + - name: filtered_bcs_transcriptome_union + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: filtered_bcs_transcriptome_union + values: + float: true + - name: good_bc_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: good_bc_frac + values: + float: true + - name: good_umi_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: good_umi_frac + values: + float: true + - name: multi_cdna_pcr_dupe_reads_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: multi_cdna_pcr_dupe_reads_frac + values: + float: true + - name: read_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: read_bases_with_q30_frac + values: + float: true + - name: reads_per_cell + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: reads_per_cell + values: + float: true + - name: total_cell_associated_partitions + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: total_cell_associated_partitions + values: + float: true + - name: total_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: total_read_pairs + values: + float: true + - name: umi_bases_with_q30_frac + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: umi_bases_with_q30_frac + values: + float: true + - name: unprocessed_read_pairs + groups: library_metrics + file_content: + path: ${lib_metrics} + json_path: unprocessed_read_pairs + values: + float: true + + # VDJ library metrics + + - name: IGH_vdj_recombinome_mapped_reads_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: IGH_vdj_recombinome_mapped_reads_frac + values: + float: true + - name: IGK_vdj_recombinome_mapped_reads_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: IGK_vdj_recombinome_mapped_reads_frac + values: + float: true + - name: IGL_vdj_recombinome_mapped_reads_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: IGL_vdj_recombinome_mapped_reads_frac + values: + float: true + - name: TRA_vdj_recombinome_mapped_reads_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: TRA_vdj_recombinome_mapped_reads_frac + values: + float: true + - name: TRB_vdj_recombinome_mapped_reads_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: TRB_vdj_recombinome_mapped_reads_frac + values: + float: true + - name: VDJ_bc_bases_with_q30_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: VDJ_bc_bases_with_q30_frac + values: + float: true + - name: VDJ_read_bases_with_q30_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: VDJ_read_bases_with_q30_frac + values: + float: true + - name: VDJ_total_read_pairs + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: VDJ_total_read_pairs + values: + float: true + - name: VDJ_umi_bases_with_q30_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: VDJ_umi_bases_with_q30_frac + values: + float: true + - name: VDJ_unprocessed_read_pairs + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: VDJ_unprocessed_read_pairs + values: + float: true + - name: multi_vdj_recombinome_mapped_reads_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: multi_vdj_recombinome_mapped_reads_frac + values: + float: true + - name: vdj_assemblable_read_pairs_per_filtered_bc + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: vdj_assemblable_read_pairs_per_filtered_bc + values: + float: true + - name: vdj_filtered_bcs + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: vdj_filtered_bcs + values: + float: true + - name: vdj_filtered_bcs_cum_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: vdj_filtered_bcs_cum_frac + values: + float: true + - name: vdj_good_bc_frac + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: vdj_good_bc_frac + values: + float: true + - name: vdj_total_raw_read_pairs_per_filtered_bc + groups: library_metrics_vdj + file_content: + path: ${vdj_lib_metrics} + json_path: vdj_total_raw_read_pairs_per_filtered_bc + values: + float: true + + # Sample-level metrics. + + - name: ANTIBODY_feature_reads_in_cells + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIBODY_feature_reads_in_cells + values: + float: true + - name: ANTIBODY_multi_filtered_bcs + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIBODY_multi_filtered_bcs + values: + float: true + - name: ANTIBODY_multi_filtered_bcs_median_counts + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIBODY_multi_filtered_bcs_median_counts + values: + float: true + - name: ANTIBODY_multi_usable_reads_per_filtered_bc + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIBODY_multi_usable_reads_per_filtered_bc + values: + float: true + - name: ANTIBODY_reads_lost_to_aggregate_GEMs + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIBODY_reads_lost_to_aggregate_GEMs + values: + float: true + - name: ANTIBODY_recognized_feature_bc_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIBODY_recognized_feature_bc_frac_in_filtered_barcodes + values: + float: true + - name: ANTIBODY_total_read_pairs_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIBODY_total_read_pairs_in_filtered_barcodes + values: + float: true + - name: ANTIGEN_feature_reads_in_cells + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIGEN_feature_reads_in_cells + values: + float: true + - name: ANTIGEN_multi_filtered_bcs + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIGEN_multi_filtered_bcs + values: + float: true + - name: ANTIGEN_multi_filtered_bcs_median_counts + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIGEN_multi_filtered_bcs_median_counts + values: + float: true + - name: ANTIGEN_multi_usable_reads_per_filtered_bc + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIGEN_multi_usable_reads_per_filtered_bc + values: + float: true + - name: ANTIGEN_total_read_pairs_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: ANTIGEN_total_read_pairs_in_filtered_barcodes + values: + float: true + - name: CRISPR_feature_bc_extracted_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_feature_bc_extracted_frac_in_filtered_barcodes + values: + float: true + - name: CRISPR_feature_reads_in_cells + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_feature_reads_in_cells + values: + float: true + - name: CRISPR_frac_cells_with_multiple_protospacer + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_frac_cells_with_multiple_protospacer + values: + float: true + - name: CRISPR_frac_cells_with_protospacer + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_frac_cells_with_protospacer + values: + float: true + - name: CRISPR_multi_filtered_bcs + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_multi_filtered_bcs + values: + float: true + - name: CRISPR_multi_filtered_bcs_median_counts + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_multi_filtered_bcs_median_counts + values: + float: true + - name: CRISPR_multi_usable_reads_per_filtered_bc + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_multi_usable_reads_per_filtered_bc + values: + float: true + - name: CRISPR_recognized_feature_bc_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_recognized_feature_bc_frac_in_filtered_barcodes + values: + float: true + - name: CRISPR_total_read_pairs_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_total_read_pairs_in_filtered_barcodes + values: + float: true + - name: CRISPR_unrecognized_feature_bc_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: CRISPR_unrecognized_feature_bc_frac_in_filtered_barcodes + values: + float: true + - name: Custom_feature_reads_in_cells + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: Custom_feature_reads_in_cells + values: + float: true + - name: Custom_multi_filtered_bcs + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: Custom_multi_filtered_bcs + values: + float: true + - name: Custom_multi_filtered_bcs_median_counts + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: Custom_multi_filtered_bcs_median_counts + values: + float: true + - name: Custom_multi_usable_reads_per_filtered_bc + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: Custom_multi_usable_reads_per_filtered_bc + values: + float: true + - name: Custom_total_read_pairs_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: Custom_total_read_pairs_in_filtered_barcodes + values: + float: true + - name: estimated_gdna_content + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: estimated_gdna_content + values: + float: true + - name: estimated_gdna_unspliced_threshold + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: estimated_gdna_unspliced_threshold + values: + float: true + - name: filtered_reads_per_filtered_bc + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: filtered_reads_per_filtered_bc + values: + float: true + - name: median_genes_per_singlet + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: median_genes_per_singlet + values: + float: true + - name: median_umi_per_singlet + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: median_umi_per_singlet + values: + float: true + - name: multi_filtered_bcs_conf_mapped_barcoded_reads_cum_frac + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: multi_filtered_bcs_conf_mapped_barcoded_reads_cum_frac + values: + float: true + - name: multi_transcriptome_conf_mapped_reads_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: multi_transcriptome_conf_mapped_reads_frac_in_filtered_barcodes + values: + float: true + - name: multi_transcriptome_half_mapped_reads_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: multi_transcriptome_half_mapped_reads_frac_in_filtered_barcodes + values: + float: true + - name: multi_transcriptome_mapped_reads_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: multi_transcriptome_mapped_reads_frac_in_filtered_barcodes + values: + float: true + - name: multi_transcriptome_split_mapped_reads_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: multi_transcriptome_split_mapped_reads_frac_in_filtered_barcodes + values: + float: true + - name: multi_transcriptome_targeted_conf_mapped_reads_frac_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: multi_transcriptome_targeted_conf_mapped_reads_frac_in_filtered_barcodes + values: + float: true + - name: singlets_assigned_to_other_samples + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: singlets_assigned_to_other_samples + values: + float: true + - name: singlets_assigned_to_this_sample + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: singlets_assigned_to_this_sample + values: + float: true + - name: total_genes_detected + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: total_genes_detected + values: + float: true + - name: total_read_pairs_in_filtered_barcodes + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: total_read_pairs_in_filtered_barcodes + values: + float: true + - name: total_singlets + groups: sample_metrics + file_content: + path: ${sample_metrics} + json_path: total_singlets + values: + float: true + + # VDJ sample-level metrics + + - name: IGH_vdj_assembly_prod_cdr_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: IGH_vdj_assembly_prod_cdr_bc_frac + values: + float: true + - name: IGH_vdj_assembly_umis_per_cell_median + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: IGH_vdj_assembly_umis_per_cell_median + values: + float: true + - name: IGK_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: IGK_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac + values: + float: true + - name: IGK_vdj_assembly_prod_cdr_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: IGK_vdj_assembly_prod_cdr_bc_frac + values: + float: true + - name: IGK_vdj_assembly_umis_per_cell_median + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: IGK_vdj_assembly_umis_per_cell_median + values: + float: true + - name: IGL_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: IGL_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac + values: + float: true + - name: IGL_vdj_assembly_prod_cdr_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: IGL_vdj_assembly_prod_cdr_bc_frac + values: + float: true + - name: IGL_vdj_assembly_umis_per_cell_median + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: IGL_vdj_assembly_umis_per_cell_median + values: + float: true + - name: TRA_TRB_vdj_assembly_contig_pair_productive_full_len_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRA_TRB_vdj_assembly_contig_pair_productive_full_len_bc_frac + values: + float: true + - name: TRA_vdj_assembly_prod_cdr_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRA_vdj_assembly_prod_cdr_bc_frac + values: + float: true + - name: TRA_vdj_assembly_umis_per_cell_median + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRA_vdj_assembly_umis_per_cell_median + values: + float: true + - name: TRB_vdj_assembly_prod_cdr_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRB_vdj_assembly_prod_cdr_bc_frac + values: + float: true + - name: TRB_vdj_assembly_umis_per_cell_median + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRB_vdj_assembly_umis_per_cell_median + values: + float: true + - name: TRD_vdj_assembly_prod_cdr_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRD_vdj_assembly_prod_cdr_bc_frac + values: + float: true + - name: TRD_vdj_assembly_umis_per_cell_median + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRD_vdj_assembly_umis_per_cell_median + values: + float: true + - name: TRG_TRD_vdj_assembly_contig_pair_productive_full_len_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRG_TRD_vdj_assembly_contig_pair_productive_full_len_bc_frac + values: + float: true + - name: TRG_vdj_assembly_prod_cdr_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRG_vdj_assembly_prod_cdr_bc_frac + values: + float: true + - name: TRG_vdj_assembly_umis_per_cell_median + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: TRG_vdj_assembly_umis_per_cell_median + values: + float: true + - name: multi_raw_vdj_paired_clonotype_diversity + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: multi_raw_vdj_paired_clonotype_diversity + values: + float: true + - name: multi_vdj_assembly_contig_pair_productive_full_len_bc_count + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: multi_vdj_assembly_contig_pair_productive_full_len_bc_count + values: + float: true + - name: multi_vdj_assembly_contig_pair_productive_full_len_bc_frac + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: multi_vdj_assembly_contig_pair_productive_full_len_bc_frac + values: + float: true + - name: vdj_filtered_bcs + groups: sample_metrics_vdj + file_content: + path: ${vdj_sample_metrics} + json_path: vdj_filtered_bcs + values: + float: true diff --git a/lib/bin/fetch_imgt_lib.py b/lib/bin/fetch_imgt_lib.py index 73249a4..5bd1e32 100755 --- a/lib/bin/fetch_imgt_lib.py +++ b/lib/bin/fetch_imgt_lib.py @@ -59,15 +59,16 @@ def main(): filenames = download_files(args.species, queries) except urllib.error.URLError as ex: - print("Failed to download from IMGT. %s\n" % ex) + print(f"Failed to download from IMGT. {ex}\n") print("Failed to download all files from IMGT. Exiting.") sys.exit(1) fid = 0 # Write IMGT fasta to a file - with open(args.genome + "-imgt-raw.fasta", "w") as raw_imgt_fa, open( - args.genome + "-mkvdjref-input.fasta", "w" - ) as mkvdjref_fa: + with ( + open(args.genome + "-imgt-raw.fasta", "w") as raw_imgt_fa, + open(args.genome + "-mkvdjref-input.fasta", "w") as mkvdjref_fa, + ): for filename in filenames: with open(filename) as htmlfile: fa_txt = _GetLastPreTag() @@ -165,7 +166,7 @@ def download_files(species, queries): filename = "_".join((species.replace(" ", ""), number, gene)) + ".html" filenames.append(filename) if os.path.exists(filename): - print("Already downloaded %s, skipping" % filename) + print(f"Already downloaded {filename}, skipping") continue # Note: IMGT is sensitive to the param order @@ -226,7 +227,7 @@ def make_feature(record, fid): region_type = get_region_type(row[4]) if region_type is None: - print("Warning: Unrecognized IMGT region type: %s; skipping..." % row[4]) + print(f"Warning: Unrecognized IMGT region type: {row[4]}; skipping...") return None chain_type = infer_imgt_vdj_chain_type(row[1]) diff --git a/lib/go/cmd/godemux/main.go b/lib/go/cmd/godemux/main.go index 0cb3cbf..e75ad11 100644 --- a/lib/go/cmd/godemux/main.go +++ b/lib/go/cmd/godemux/main.go @@ -8,7 +8,6 @@ import ( "encoding/json" "errors" "io" - "io/ioutil" "log" "os" "runtime/pprof" @@ -144,7 +143,7 @@ func parseConfig(inputJsonFile string, isDualIndexed bool) (InputJson, map[string]int, i7i5Lookup) { defer trace.StartRegion(context.Background(), "parseConfig").End() // Parse input JSON - bytes, err := ioutil.ReadFile(inputJsonFile) + bytes, err := os.ReadFile(inputJsonFile) if err != nil { log.Fatal("ERROR: Unable to read input JSON file: ", err.Error()) } @@ -265,7 +264,7 @@ Options: if err != nil { log.Fatal("ERROR: Failed to serialize summary counts: ", err.Error()) } - if err := ioutil.WriteFile(outputJsonFile, summaryCountsData, 0644); err != nil { + if err := os.WriteFile(outputJsonFile, summaryCountsData, 0644); err != nil { log.Fatal("ERROR: Failed to write summary counts file: ", err.Error()) } } diff --git a/lib/go/cmd/sitecheck/main.go b/lib/go/cmd/sitecheck/main.go new file mode 100644 index 0000000..10957a3 --- /dev/null +++ b/lib/go/cmd/sitecheck/main.go @@ -0,0 +1,40 @@ +// Copyright (c) 2024 10x Genomics, Inc. All rights reserved. + +// Command sitecheck generates a telemetry report about a system's capabilities. +// +// Use care when making changes here, to avoid collecting privacy-sensitive +// information. +// +// Also, avoid making changes to the formatting of the output, as we have tools +// meant to parse it. Those tools can adapt, of course, but we're rather not +// have to. +package main + +import ( + "context" + "flag" + "fmt" + "os" + + "github.com/10XDev/cellranger/lib/go/sitecheck" +) + +func main() { + showVersion := flag.Bool("version", false, "Show version and exit.") + flag.Usage = func() { + product := os.Getenv("TENX_PRODUCT") + fmt.Fprintf(flag.CommandLine.Output(), + "Usage: %s sitecheck [options]\n", + product) + flag.PrintDefaults() + } + flag.Parse() + if *showVersion { + version := os.Getenv("TENX_VERSION") + fmt.Println(version) + os.Exit(0) + } + if err := sitecheck.SiteCheck(context.Background(), os.Stdout); err != nil { + os.Exit(1) + } +} diff --git a/lib/go/cmd/telemetry/default.pgo b/lib/go/cmd/telemetry/default.pgo new file mode 100644 index 0000000..0945c25 Binary files /dev/null and b/lib/go/cmd/telemetry/default.pgo differ diff --git a/lib/go/cmd/telemetry/main.go b/lib/go/cmd/telemetry/main.go new file mode 100644 index 0000000..0a825c1 --- /dev/null +++ b/lib/go/cmd/telemetry/main.go @@ -0,0 +1,457 @@ +// Command telemetry collects and transmits usage statistics for the product. +package main + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "flag" + "fmt" + "io/fs" + "os" + "path" + "regexp" + "runtime/pprof" + "runtime/trace" + "sort" + "strings" + "time" + + "github.com/10XDev/cellranger/lib/go/telemetry/event" + "github.com/10XDev/cellranger/lib/go/telemetry/settings" + "github.com/10XDev/cellranger/lib/go/telemetry/value_context" +) + +const usage = `Usage: telemetry [help] (collect|check|disable|enable|list|show) + +collect: Collect telemetry data, if enabled. +check: Show whether telemetry is currently enabled and + configuration information. +disable: Disable telemetry collection for this user. +enable: Enable telemetry collection for this user. +list: List files containing saved telemetry data for this product. +show: Display contents of saved telemetry data for this product. + +For more information about what data is collected and how it's used, visit +` + settings.PrivacyStatementUrl + +func main() { + f := flag.NewFlagSet("telemetry", flag.ExitOnError) + f.Usage = func() { + fmt.Fprintln(os.Stderr, usage) + } + var cpuProfile, traceFile string + f.StringVar(&cpuProfile, "profile", "", + "Save CPU profiling information for this process to the given file.") + f.StringVar(&traceFile, "trace", "", + "Save an execution trace to the given file.") + + if err := f.Parse(os.Args[1:]); err != nil { + panic(err) + } + if f.NArg() < 1 { + f.Usage() + os.Exit(1) + } + + os.Exit(func(f *flag.FlagSet) int { + if cpuProfile != "" { + f, err := os.Create(cpuProfile) + if err != nil { + fmt.Fprintln(os.Stderr, + "Error opening profile destination:", err) + os.Exit(7) + } + if err := pprof.StartCPUProfile(f); err != nil { + f.Close() + fmt.Fprintln(os.Stderr, "Error recording CPU profile:", err) + os.Exit(7) + } + defer func(f *os.File) { + pprof.StopCPUProfile() + if err := f.Close(); err != nil { + fmt.Fprintln(os.Stderr, "Error recording CPU profile:", err) + } + }(f) + } + if traceFile != "" { + f, err := os.Create(traceFile) + if err != nil { + fmt.Fprintln(os.Stderr, + "Error opening trace destination:", err) + os.Exit(7) + } + if err := trace.Start(f); err != nil { + f.Close() + fmt.Fprintln(os.Stderr, "Error recording trace:", err) + os.Exit(7) + } + defer func(f *os.File) { + trace.Stop() + if err := f.Close(); err != nil { + fmt.Fprintln(os.Stderr, "Error recording trace:", err) + } + }(f) + } + + switch f.Arg(0) { + case "help": + return doHelp(f.Args()[1:]) + case "collect": + return doCollect(f.Args()[1:]) + case "disable": + return doDisable(f.Args()[1:]) + case "enable": + return doEnable(f.Args()[1:]) + case "check": + return doCheck() + case "list": + return doList(f.Args()[1:]) + case "show": + return doShow(f.Args()[1:]) + default: + fmt.Fprintln(os.Stderr, usage) + return 1 + } + }(f)) +} + +func doHelp(args []string) int { + if len(args) == 0 { + fmt.Fprintln(os.Stderr, usage) + return 0 + } + switch args[0] { + case "collect": + value_context.ParseFlags([]string{"--help"}) + case "disable": + fmt.Fprintln(os.Stderr, disableUsage()) + case "enable": + fmt.Fprintln(os.Stderr, enableUsage()) + case "check": + fmt.Fprintln(os.Stderr, `Show the whether telemetry is enabled.`) + case "list": + fmt.Fprintln(os.Stderr, `List saved telemetry files.`) + case "show": + return doShow([]string{"-h"}) + default: + fmt.Fprintln(os.Stderr, usage) + return 1 + } + return 0 +} + +func disableUsage() string { + conf, _ := settings.ConfigDir() + cache, _ := settings.CacheDir() + if conf == "" { + conf = "~/.config/tenx/telemetry" + } + if cache == "" { + cache = "~/.cache/tenx/telemetry" + } + return `Usage: telemetry disable [upload|update] + +This will write a file to ` + conf + ` +to disable part or all of telemetry collection. + +With no arguments, all telemetry collection will be disabled. + +Disabling 'update' will prevent the tool from checking for an updated +configuration file. + +Disabling 'upload' will prevent collected telemetry data from being sent to +10X Genomics, but will still collect it locally into +` + cache + ` + +Disabling both upload and update will prevent any communication between this +tool and 10XGenomics, but allow one to view the data that would have been sent. + +Note that telemetry may also be disabled by setting the environment variables +` + settings.DisableEnvVar + `, ` + settings.DisableEnvVar + `_UPDATE, +or ` + settings.DisableEnvVar + `_UPLOAD to non-empty values. +Config updates or upload can be disabled for all users by creating the files +/etc/tenx/telemetry/disable_update or /etc/tenx/telemetry/disable_upgrade.` +} + +func enableUsage() string { + conf, _ := settings.ConfigDir() + if conf == "" { + conf = "~/.config/tenx/telemetry" + } + return `Usage: telemetry enable [upload|update] + +This will remove the file in ` + conf + ` +that would disable part or all of telemetry collection. +Telemetry may remain disabled based on environment variables or +system-wide settings in /etc/tenx/telemetry/. + +With no arguments, all telemetry collection will be enabled. + +Enabling 'update' will allow the tool to check for an updated +configuration file. + +Allowing 'upload' will permit collected telemetry data from being sent +to 10X Genomics. + +For more information about what data is collected and how it's used, visit +` + settings.PrivacyStatementUrl +} + +func doCollect(args []string) int { + ctx, cancel := context.WithTimeout(context.Background(), + 15*time.Second) + defer cancel() + f := value_context.ParseFlags(args) + status := settings.GetTelemetryStatus() + if status.DisableAll { + return 0 + } + config, err := status.GetConfig(ctx, f.Verbose) + if err != nil { + if f.Verbose { + fmt.Fprintln(os.Stderr, err) + } + return 1 + } + c, err := config.Compile() + if err != nil { + if f.Verbose { + fmt.Fprintln(os.Stderr, err) + } + return 1 + } + vc, err := f.MakeValueContext(settings.CountRecentCacheFiles) + if err != nil { + if f.Verbose { + fmt.Fprintln(os.Stderr, err) + } + return 1 + } + if err := status.GatherEvents( + ctx, vc.PipestanceDir(), + event.Collect(ctx, &c, vc)); err != nil { + if f.Verbose { + fmt.Fprintln(os.Stderr, err) + } + return 1 + } + return 0 +} + +func doDisable(args []string) int { + var all, upload, update bool + if len(args) == 0 { + all = true + } + for _, arg := range args { + if arg == "-h" || arg == "--help" { + fmt.Println(disableUsage()) + return 0 + } + if strings.EqualFold(arg, "all") { + all = true + } else if strings.EqualFold(arg, "upload") { + upload = true + } else if strings.EqualFold(arg, "update") { + update = true + } else { + fmt.Println(disableUsage()) + return 1 + } + } + if err := settings.Disable(all, upload, update); err != nil { + fmt.Fprintln(os.Stderr, "Failed to disable telemetry:\n", err) + return 3 + } + return 0 +} + +func doEnable(args []string) int { + var all, upload, update bool + if len(args) == 0 { + all = true + } + for _, arg := range args { + if arg == "-h" || arg == "--help" { + fmt.Println(enableUsage()) + return 0 + } + if strings.EqualFold(arg, "all") { + all = true + } else if strings.EqualFold(arg, "upload") { + upload = true + } else if strings.EqualFold(arg, "update") { + update = true + } else { + fmt.Println(disableUsage()) + return 1 + } + } + if err := settings.Enable(all, upload, update); err != nil { + fmt.Fprintln(os.Stderr, "Failed to disable telemetry:\n", err) + return 3 + } + return 0 +} + +func doCheck() int { + status := settings.GetTelemetryStatus() + if status.DisableAll { + fmt.Println("Telemetry collection is disabled.") + return 0 + } else { + if status.DisableConfigUpdate { + fmt.Println("Telemetry configuration updates are disabled.") + } + if status.DisableUpload { + fmt.Println("Telemetry uploads are disabled.\n" + + "Data is still collected locally.") + } + } + if conf, err := settings.ConfigDir(); err != nil { + fmt.Fprintln(os.Stderr, + "Could not locate configuration directory:", err) + } else { + fmt.Println("Configuration data is stored in", conf) + } + if cache, err := settings.ProductCacheDir(); err != nil { + if cache, err := settings.CacheDir(); cache == "" { + fmt.Fprintln(os.Stderr, + "Could not locate cache directory:", err) + } else { + fmt.Println("Collected telemetry data is being saved to", cache) + } + } else { + fmt.Println("Collected telemetry data is being saved to", cache) + } + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + config, err := status.GetConfig(ctx, true) + cancel() + if err != nil { + fmt.Fprintln(os.Stderr, "Error retrieving configuration:", err) + return 1 + } + if config.ConfigTime.IsZero() { + fmt.Printf("Configuration for %s v%s version %d\n", + config.Product, config.Version, config.ConfigVersion) + } else { + fmt.Printf("Configuration for %s v%s version %d, dated %s\n", + config.Product, config.Version, config.ConfigVersion, + config.ConfigTime.Format(time.RFC1123)) + } + return 0 +} + +func doList(args []string) int { + if len(args) > 0 && (args[0] == "-h" || args[0] == "--help") { + return doHelp([]string{"list"}) + } + listing, err := settings.ListCache() + if err != nil { + fmt.Fprintln(os.Stderr, err) + return 3 + } + for _, f := range listing { + fmt.Println(f) + } + return 0 +} + +func doShow(args []string) int { + flagset := flag.NewFlagSet("telemetry show", flag.ExitOnError) + var limit int + var eventType string + var asJson bool + flagset.IntVar(&limit, "limit", 0, + "Limit to at most N entries.") + flagset.StringVar(&eventType, "type", "", + "Limit to events of the given type.") + flagset.BoolVar(&asJson, "json", false, + "Output as json, one entry per line.") + if err := flagset.Parse(args); err != nil { + panic(err) + } + listing, err := settings.ListCache() + if err != nil { + fmt.Fprintln(os.Stderr, err) + return 3 + } + eventRe := regexp.MustCompile(`^(\w+)_\d{4}-\d{2}-\d{2}T\w+.json$`) + if eventType != "" { + filteredListing := make([]string, 0, len(listing)) + for _, f := range listing { + m := eventRe.FindStringSubmatch(path.Base(f)) + if len(m) > 1 && m[1] == eventType { + filteredListing = append(filteredListing, f) + } + } + if limit > 0 && limit < len(filteredListing) { + filteredListing = filteredListing[len(filteredListing)-limit:] + } + showEvents(filteredListing, asJson) + } else { + groups := make(map[string][]string) + for _, f := range listing { + m := eventRe.FindStringSubmatch(path.Base(f)) + if len(m) > 1 { + groups[m[1]] = append(groups[m[1]], f) + } + } + groupNames := make([]string, 0, len(groups)) + for g := range groups { + groupNames = append(groupNames, g) + } + sort.Strings(groupNames) + for i, g := range groupNames { + if !asJson { + if i != 0 { + fmt.Println() + } + fmt.Printf("%s:\n", g) + } + list := groups[g] + if limit > 0 && limit < len(list) { + list = list[len(list)-limit:] + } + showEvents(list, asJson) + } + } + return 0 +} + +func showEvents(list []string, asJson bool) { + for i, f := range list { + b, err := os.ReadFile(f) + if err != nil { + if !errors.Is(err, fs.ErrNotExist) { + fmt.Fprintln(os.Stderr, "Could not read file:", err) + } + continue + } + if asJson { + var buf bytes.Buffer + if err := json.Indent(&buf, b, "", " "); err != nil { + fmt.Fprintln(os.Stderr, "Invalid json found in", + f, ":", err) + continue + } + os.Stdout.Write(buf.Bytes()) + os.Stdout.Write([]byte{'\n'}) + } else { + var ev event.Event + if err := json.Unmarshal(b, &ev); err != nil { + fmt.Fprintln(os.Stderr, "Invalid json found in", + f, ":", err) + continue + } + if i != 0 { + fmt.Println() + } + if err := ev.Print(os.Stdout); err != nil { + panic(err) + } + } + } +} diff --git a/lib/go/cmd/telemetry_config_converter/main.go b/lib/go/cmd/telemetry_config_converter/main.go new file mode 100644 index 0000000..321c45e --- /dev/null +++ b/lib/go/cmd/telemetry_config_converter/main.go @@ -0,0 +1,97 @@ +// Command telemetry_converter is used to convert from yaml to json. +// +// It will also validate the config file. +// +// The command does not accept any command-line flags. +// It reads from stdin and writes to stdout. +package main + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "io" + "os" + "strconv" + "time" + + "github.com/10XDev/cellranger/lib/go/telemetry/config" + "gopkg.in/yaml.v3" +) + +func main() { + var hashes bool + flag.BoolVar(&hashes, "hash", false, + "Output group hashes instead of json.") + flag.Parse() + in, err := io.ReadAll(os.Stdin) + if err != nil { + fmt.Fprintln(os.Stderr, "error reading from stdin:", err) + os.Exit(1) + } + if len(in) == 0 { + fmt.Fprintln(os.Stderr, "empty input") + os.Exit(1) + } + var jsonify any + if err := yaml.Unmarshal(in, &jsonify); err != nil { + fmt.Fprintln(os.Stderr, "invalid yaml:", err) + os.Exit(1) + } + b, err := json.Marshal(jsonify) + if err != nil { + fmt.Fprintln(os.Stderr, "could not marshal yaml to json:", err) + os.Exit(1) + } + dec := json.NewDecoder(bytes.NewReader(b)) + dec.DisallowUnknownFields() + var conf config.Config + if err := dec.Decode(&conf); err != nil { + fmt.Fprintln(os.Stderr, "malformed config:", err) + os.Exit(3) + } + if t, ok := findBuildTime(); ok { + conf.ConfigTime = t + } + if c, err := conf.Compile(); err != nil { + fmt.Fprintln(os.Stderr, "invalid config:", err) + os.Exit(4) + } else if hashes { + groups := make(config.SortedAnyMap, len(c.Groups)) + for gn, gc := range c.Groups { + h := gc.Hash() + groups[gn] = h[:] + } + b, err := json.MarshalIndent(groups, "", " ") + if err != nil { + fmt.Fprintln(os.Stderr, "Error marshaling result:", err) + os.Exit(5) + } + os.Stdout.Write(b) + return + } + if b, err := json.Marshal(&conf); err != nil { + fmt.Fprintln(os.Stderr, "could not marshal config to json:", err) + os.Exit(1) + } else { + os.Stdout.Write(b) + } +} + +func findBuildTime() (time.Time, bool) { + b, err := os.ReadFile("bazel-out/volatile-status.txt") + if err != nil { + return time.Time{}, false + } + i := bytes.Index(b, []byte("BUILD_TIMESTAMP ")) + if i < 0 { + return time.Time{}, false + } + ts, _, _ := bytes.Cut(b[i+len("BUILD_TIMESTAMP "):], []byte("\n")) + ti, err := strconv.ParseInt(string(ts), 10, 64) + if err != nil { + return time.Time{}, false + } + return time.Unix(ti, 0), true +} diff --git a/lib/go/multi_csv/multi.go b/lib/go/multi_csv/multi.go new file mode 100644 index 0000000..d3053a3 --- /dev/null +++ b/lib/go/multi_csv/multi.go @@ -0,0 +1,65 @@ +// Package multi_csv allows conversion from multi config csv to json. +// +// It is implemented as a go binding to the rust code. +package multi_csv + +/* +long long convert_multi_config( + char *buffer, + unsigned long buf_len, + const char *input, + unsigned long input_len +); +*/ +import "C" +import ( + "fmt" + "runtime" + "unsafe" +) + +// convertMultiConfig wraps convert_multi_config to avoid repeating +// the type-casting in multiple places. +func convertMultiConfig(buf, input []byte) int { + r := C.convert_multi_config( + (*C.char)(unsafe.Pointer(unsafe.SliceData(buf))), C.ulong(len(buf)), + (*C.char)(unsafe.Pointer(unsafe.SliceData(input))), C.ulong(len(input))) + // buf is going to be kept alive by whatever called this wanting to read + // its contents after the call, but we do need to make sure that `input` + // isn't GC'ed in the middle of the call. + runtime.KeepAlive(input) + return int(r) +} + +// ConvertMultiConfig parses the input as a multi config CSV. +// Returns the JSON representation of the parsed config. +func ConvertMultiConfig(input []byte) ([]byte, error) { + var buf []byte + // To avoid unnecessary back and forth with the C API, try to guestimate + // how much buffer space is likely to be required. + // Always allocate at least enough to usually get the error message. + if l := len(input) * 3; l > 256 { + buf = make([]byte, l) + } else { + buf = make([]byte, 256) + } + r := convertMultiConfig(buf, input) + if r == 0 { + return nil, nil + } + if r < 0 { + l := -r + if l > len(buf) { + buf = make([]byte, l) + r = convertMultiConfig(buf, input) + l = -r + } + return nil, fmt.Errorf( + "conversion error: %s", buf[:l]) + } + if r > len(buf) { + buf = make([]byte, r) + r = convertMultiConfig(buf, input) + } + return buf[:r], nil +} diff --git a/lib/go/sitecheck/checkers.go b/lib/go/sitecheck/checkers.go new file mode 100644 index 0000000..1017530 --- /dev/null +++ b/lib/go/sitecheck/checkers.go @@ -0,0 +1,1044 @@ +// Copyright (c) 2024 10x Genomics, Inc. All rights reserved. + +package sitecheck + +import ( + "bufio" + "bytes" + "context" + "errors" + "fmt" + "os" + "os/exec" + "path" + "path/filepath" + "regexp" + "runtime" + "sort" + "strconv" + "strings" + "syscall" + "time" + + "golang.org/x/sys/unix" +) + +// #include +import "C" + +func getLibcVersion() string { + return C.GoString(C.gnu_get_libc_version()) +} + +// Convert a null-terminated byte array to a string. +func cstring(b []byte) string { + if before, _, found := bytes.Cut(b, nullByte); !found { + return "" + } else { + return string(before) + } +} + +// Collect the uname data. +func checkUname(_ context.Context, index int, results chan<- siteCheckSection) { + var buf unix.Utsname + if err := unix.Uname(&buf); err != nil { + fmt.Fprintf(os.Stderr, "Could not get OS info: %v\n", + err) + return + } + results <- siteCheckSection{ + Section: "System Info", + Cmd: "uname -a", + Output: fmt.Sprintf("%s %s %s %s %s", + cstring(buf.Sysname[:]), + cstring(buf.Nodename[:]), + cstring(buf.Release[:]), + cstring(buf.Version[:]), + cstring(buf.Machine[:]), + ), + Index: index, + } +} + +// Collect information about the OS distribution. +func checkDistro(ctx context.Context, index int, results chan<- siteCheckSection) { + matches, err := filepath.Glob("/etc/*-release") + if err != nil { + return + } + lines := make(map[string]struct{}, 16) + for _, f := range matches { + b, err := os.ReadFile(f) + if err != nil || ctx.Err() != nil { + continue + } + for _, line := range strings.Split(string(bytes.TrimSpace(b)), "\n") { + lines[line] = struct{}{} + } + } + result := make([]string, 0, len(lines)) + for line := range lines { + result = append(result, line) + } + sort.Strings(result) + + results <- siteCheckSection{ + Section: "Linux Distro", + Cmd: "cat /etc/*-release | sort -u", + Output: strings.Join(result, "\n"), + Index: index, + } +} + +func catFiles(section string, index int, results chan<- siteCheckSection, names ...string) error { + if len(names) == 1 { + b, err := os.ReadFile(names[0]) + if err != nil { + return err + } + results <- siteCheckSection{ + Section: section, + Cmd: "cat " + names[0], + Output: string(bytes.TrimSpace(b)), + Index: index, + } + return nil + } + var result strings.Builder + var lastErr error + for _, name := range names { + b, err := os.ReadFile(name) + if err != nil { + lastErr = err + continue + } + b = bytes.TrimSpace(b) + if result.Len() > 0 && len(b) > 0 { + result.WriteByte('\n') + } + result.Write(b) + } + if result.Len() > 0 { + results <- siteCheckSection{ + Section: section, + Cmd: "cat " + strings.Join(names, " "), + Output: result.String(), + Index: index, + } + } + return lastErr +} + +// Collect the kernel version information. +func checkKernel(_ context.Context, index int, results chan<- siteCheckSection) { + if err := catFiles("Kernel Build", index, results, "/proc/version"); err != nil { + fmt.Fprintf(os.Stderr, "Could not get kernel info: %v\n", + err) + } +} + +// Collect glibc version. +func checkGlibc(_ context.Context, index int, results chan<- siteCheckSection) { + results <- siteCheckSection{ + Section: "glibc version", + Cmd: "ldd --version | head -n 1", + Output: "ldd (GNU libc) " + getLibcVersion(), + Index: index, + } +} + +// Reusable byte arrays +var ( + colon = []byte{':'} + slash = []byte{'/'} + space = []byte{'/'} + newline = []byte{'\n'} + nullByte = []byte{0} +) + +func lineValue(line, search []byte) ([]byte, bool) { + after, found := bytes.CutPrefix(line, search) + if !found { + return nil, false + } + _, after, found = bytes.Cut(after, colon) + if !found { + return nil, false + } + return bytes.TrimSpace(after), true +} + +// Collect information about the CPU model, features, and count. +func checkCpu(_ context.Context, index int, results chan<- siteCheckSection) { + f, err := os.Open("/proc/cpuinfo") + if err != nil { + fmt.Fprintf(os.Stderr, "Could not get cpu info: %v\n", + err) + return + } + defer f.Close() + scanner := bufio.NewScanner(f) + var procs int + sockets := make(map[string]struct{}, runtime.NumCPU()) + var foundModel, foundFlags bool + modelSearch := []byte("model name") + flagSearch := []byte("flags") + physIdSearch := []byte("physical id") + procSearch := []byte("processor") + for scanner.Scan() { + if !foundModel { + if v, found := lineValue(scanner.Bytes(), modelSearch); found { + foundModel = true + results <- siteCheckSection{ + Section: "CPU Model", + Cmd: "grep -m 1 'model name' /proc/cpuinfo | " + + "cut -d ':' -f 2 | sed 's/^[ \t]*//'", + Output: string(v), + } + continue + } + } + if !foundFlags { + if v, found := lineValue(scanner.Bytes(), flagSearch); found { + foundFlags = true + results <- siteCheckSection{ + Section: "CPU Support", + Cmd: "grep -m 1 'flags' /proc/cpuinfo | " + + "cut -d ':' -f 2 | sed 's/^[ \t]*//'", + Output: string(v), + Index: index, + } + continue + } + } + if v, found := lineValue(scanner.Bytes(), physIdSearch); found { + sockets[string(v)] = struct{}{} + } else if _, found = lineValue(scanner.Bytes(), procSearch); found { + procs++ + } + } + results <- siteCheckSection{ + Section: "CPU Sockets", + Cmd: "grep 'physical id' /proc/cpuinfo | sort -u | wc -l", + Output: strconv.Itoa(len(sockets)), + Index: index, + } + results <- siteCheckSection{ + Section: "CPU Cores", + Cmd: "grep -c processor /proc/cpuinfo", + Output: strconv.Itoa(procs), + Index: index, + } +} + +// Get total system memory amount +func checkMemory(_ context.Context, index int, results chan<- siteCheckSection) { + f, err := os.Open("/proc/meminfo") + if err != nil { + fmt.Fprintf(os.Stderr, "Could not get mem info: %v\n", + err) + return + } + defer f.Close() + scanner := bufio.NewScanner(f) + totalSearch := []byte("MemTotal") + for scanner.Scan() { + if v, found := lineValue(scanner.Bytes(), totalSearch); found { + results <- siteCheckSection{ + Section: "Memory Total", + Cmd: "grep MemTotal /proc/meminfo | cut -d ':' -f 2 | sed 's/^[ \t]*//'", + Output: string(v), + Index: index, + } + return + } + } + fmt.Fprintln(os.Stderr, "Could not find MemTotal in /proc/meminfo") +} + +// Check disk free space and mount options. +func checkDisk(_ context.Context, index int, results chan<- siteCheckSection) { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + fmt.Fprintf(os.Stderr, "Could not get mount info: %v\n", + err) + return + } + defer f.Close() + scanner := bufio.NewScanner(f) + var spaceBuf, optsBuf strings.Builder + spaceBuf.WriteString("Size Used Avail") + spaceStartLen := spaceBuf.Len() + autofs := []byte("autofs") + for scanner.Scan() { + // From `man 5 proc`: + // /proc/[pid]/mountinfo (since Linux 2.6.26) + // This file contains information about mount points. It contains lines of the form: + // + // 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue + // (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) + // + // The numbers in parentheses are labels for the descriptions below: + // (1) mount ID: unique identifier of the mount (may be reused after umount(2)). + // (2) parent ID: ID of parent mount (or of self for the top of the mount tree). + // (3) major:minor: value of st_dev for files on file system (see stat(2)). + // (4) root: root of the mount within the file system. + // (5) mount point: mount point relative to the process's root. + // (6) mount options: per-mount options. + // (7) optional fields: zero or more fields of the form "tag[:value]". + // (8) separator: marks the end of the optional fields. + // (9) file system type: name of file system in the form "type[.subtype]". + // (10) mount source: file system-specific information or "none". + // (11) super options: per-super block options. + fields := bytes.Fields(scanner.Bytes()) + if len(fields) < 9 { + continue + } + sep := 7 + for i, f := range fields[5:] { + if len(f) == 1 && f[0] == '-' { + sep = 5 + i + break + } + } + kind := fields[sep+1] + optsBuf.Write(kind) + optsBuf.WriteString(" (") + optsBuf.Write(fields[5]) + optsBuf.WriteString(")\n") + if !bytes.Equal(kind, autofs) { + getSpace(&spaceBuf, string(fields[4])) + } + } + if space := spaceBuf.String(); len(space) > spaceStartLen { + results <- siteCheckSection{ + Section: "Disk Space", + Cmd: "df -Ph | awk '{print $2, $3, $4}'", + Output: space, + Index: index, + } + } + if opts := strings.TrimSpace(optsBuf.String()); len(opts) > 0 { + results <- siteCheckSection{ + Section: "Filesystem Options", + Cmd: "mount | cut -d ' ' -f 5,6", + Output: opts, + Index: index, + } + } +} + +// Convert block size and number of blocks into human-readable value. +func humanSpace(bsize int64, amount uint64) (string, rune) { + total := uint64(bsize) * amount + if total < 1024 { + return strconv.FormatUint(total, 10), 0 + } + for i, suffix := range sizeSuffixes[:len(sizeSuffixes)-1] { + unit := ((total >> (9 + 10*i)) + 1) / 2 + if unit < 1024 { + return strconv.FormatUint(unit, 10), suffix + } + } + unit := ((total >> (9 + 40)) + 1) / 2 + return strconv.FormatUint(unit, 10), 'P' +} + +// Write the total/used/avail space for a mount to the given string builder. +func getSpace(builder *strings.Builder, mount string) { + if strings.HasPrefix(mount, "/sys/kernel/debug") { + return + } + var buf unix.Statfs_t + err := unix.Statfs(mount, &buf) + if err != nil { + fmt.Fprintf(os.Stderr, "Could not get disk stats for %s: %v\n", + mount, err) + return + } + if buf.Blocks == 0 { + return + } + builder.WriteByte('\n') + a, s := humanSpace(buf.Bsize, buf.Blocks) + builder.WriteString(a) + if s != 0 { + builder.WriteRune(s) + } + builder.WriteByte(' ') + a, s = humanSpace(buf.Bsize, buf.Blocks-buf.Bfree) + builder.WriteString(a) + if s != 0 { + builder.WriteRune(s) + } + builder.WriteByte(' ') + a, s = humanSpace(buf.Bsize, buf.Bavail) + builder.WriteString(a) + if s != 0 { + builder.WriteRune(s) + } +} + +func writeRlim(v, scaleN, scaleD uint64, buf *strings.Builder) { + if v == unix.RLIM_INFINITY { + buf.WriteString("unlimited") + } else { + buf.WriteString(strconv.FormatUint((v*scaleN)/scaleD, 10)) + } + buf.WriteByte('\n') +} + +func writeRlims(resource int, head string, soft, hard *strings.Builder, + scaleN, scaleD uint64) { + var rlim unix.Rlimit + if unix.Getrlimit(resource, &rlim) != nil { + return + } + soft.WriteString(head) + writeRlim(rlim.Cur, scaleN, scaleD, soft) + hard.WriteString(head) + writeRlim(rlim.Max, scaleN, scaleD, hard) +} + +// Report rlimit values. +func checkUlimits(_ context.Context, index int, results chan<- siteCheckSection) { + var soft, hard strings.Builder + writeRlims(unix.RLIMIT_CORE, + "core file size (blocks, -c) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_DATA, + "data seg size (kbytes, -d) ", + &soft, &hard, 1, 1024) + writeRlims(unix.RLIMIT_NICE, + "scheduling priority (-e) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_FSIZE, + "file size (blocks, -f) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_SIGPENDING, + "pending signals (-i) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_MEMLOCK, + "max locked memory (kbytes, -l) ", + &soft, &hard, 1, 1024) + writeRlims(unix.RLIMIT_RSS, + "max memory size (kbytes, -m) ", + &soft, &hard, uint64(unix.Getpagesize()), 1024) + writeRlims(unix.RLIMIT_NOFILE, + "open files (-n) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_MSGQUEUE, + "POSIX message queues (bytes, -q) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_RTPRIO, + "real-time priority (-r) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_STACK, + "stack size (kbytes, -s) ", + &soft, &hard, 1, 1024) + writeRlims(unix.RLIMIT_CPU, + "cpu time (seconds, -t) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_NPROC, + "max user processes (-u) ", + &soft, &hard, 1, 1) + writeRlims(unix.RLIMIT_AS, + "virtual memory (kbytes, -v) ", + &soft, &hard, 1, 1024) + writeRlims(unix.RLIMIT_LOCKS, + "file locks (-x) ", + &soft, &hard, 1, 1) + results <- siteCheckSection{ + Section: "User Limits", + Cmd: "bash -c 'ulimit -a'", + Output: strings.TrimSpace(soft.String()), + Index: index, + } + results <- siteCheckSection{ + Section: "User Limits (hard)", + Cmd: "bash -c 'ulimit -aH'", + Output: strings.TrimSpace(hard.String()), + Index: index, + } +} + +func checkFileLimit(_ context.Context, index int, results chan<- siteCheckSection) { + if err := catFiles("Global File Limit", index, results, + "/proc/sys/fs/file-max", "/proc/sys/fs/file-nr"); err != nil { + fmt.Fprintf(os.Stderr, "Could not get file max: %v\n", + err) + } +} + +// Report kernel memory settings. +func checkVmConfig(_ context.Context, index int, results chan<- siteCheckSection) { + if entries, err := os.ReadDir("/proc/sys/vm"); err != nil { + fmt.Fprintf(os.Stderr, "Could not list vm proc directory: %v\n", + err) + } else { + var buf strings.Builder + for _, ent := range entries { + b, err := os.ReadFile(path.Join("/proc/sys/vm", ent.Name())) + if err != nil { + continue + } + buf.WriteString("vm.") + buf.WriteString(ent.Name()) + buf.WriteString(" = ") + buf.Write(bytes.TrimSpace(b)) + buf.WriteByte('\n') + } + results <- siteCheckSection{ + Section: "Memory config", + Cmd: "sysctl vm", + Output: strings.TrimSpace(buf.String()), + Index: index, + } + } + if thp, err := filepath.Glob("/sys/kernel/mm/*transparent_hugepage/enabled"); err != nil { + fmt.Fprintf(os.Stderr, "Could not list hugepage config files: %v\n", + err) + } else if len(thp) > 0 { + if err := catFiles("THP memory config", index, results, thp...); err != nil { + fmt.Fprintf(os.Stderr, "Could not read hugepage config file: %v\n", + err) + } + } +} + +// Report information about cgroups. +func checkCgroups(_ context.Context, index int, results chan<- siteCheckSection) { + b, err := os.ReadFile("/proc/self/cgroup") + if err != nil { + // no cgroup + return + } + content := string(bytes.TrimSpace(b)) + results <- siteCheckSection{ + Section: "cgroups", + Cmd: "cat /proc/self/cgroup", + Output: content, + Index: index, + } + for _, line := range strings.Split(content, "\n") { + if _, after, found := strings.Cut(line, ":memory:"); found { + checkMemoryCgroup(after, false, index, results) + return + } else if _, after, found := strings.Cut(line, "::"); found { + checkMemoryCgroup(after, true, index, results) + return + } + } +} + +func findMemCgroup() []byte { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return nil + } + defer f.Close() + scanner := bufio.NewScanner(f) + search := regexp.MustCompile(`\bmemory\b`) + for scanner.Scan() { + fields := bytes.Fields(scanner.Bytes()) + if len(fields) < 11 { + continue + } + if search.Match(fields[10]) { + return fields[4] + } + } + return nil +} + +func findCgroupV2() []byte { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return nil + } + defer f.Close() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + fields := bytes.Fields(scanner.Bytes()) + if len(fields) < 11 { + continue + } + if string(fields[8]) == "cgroup2" { + return fields[4] + } + } + return nil +} + +// See https://github.com/golang/go/issues/67758 for why this needs to exist. +func makeString(b []byte) string { + return string(b) +} + +func checkMemoryCgroup(cgroup string, v2 bool, index int, results chan<- siteCheckSection) { + var cgroupRoot []byte + var ( + softLimit string + softSwapLimt string + hardLimit string + hardSwapLimit string + ) + if v2 { + cgroupRoot = findCgroupV2() + softLimit = "high" + softSwapLimt = "swap.high" + hardLimit = "max" + hardSwapLimit = "swap.max" + } else { + cgroupRoot = findMemCgroup() + softLimit = "soft_limit_in_bytes" + softSwapLimt = "memsw.soft_limit_in_bytes" + hardLimit = "limit_in_bytes" + hardSwapLimit = "memsw.limit_in_bytes" + } + if len(cgroupRoot) == 0 { + return + } + cgroupRoot = bytes.TrimSuffix(cgroupRoot, slash) + cgroupBuf := make([]byte, len(cgroupRoot), + len(cgroupRoot)+len(cgroup)+1+len("memory.memsw.soft_limit_in_bytes")) + copy(cgroupBuf, cgroupRoot) + cgroupBuf = append(cgroupBuf, strings.TrimSuffix(cgroup, "/")...) + cgroupBuf = append(cgroupBuf, "/memory."...) + if err := catFiles("cgroup mem stats", index, results, + string(append(cgroupBuf, "stat"...))); err != nil { + fmt.Fprintf(os.Stderr, "Could not read cgroup stats: %v\n", + err) + } + if err := catFiles("memory soft limit", index, results, + makeString(append(cgroupBuf, softLimit...)), + makeString(append(cgroupBuf, softSwapLimt...))); err != nil && + !errors.Is(err, os.ErrNotExist) { + fmt.Fprintf(os.Stderr, "Could not read cgroup soft limit: %v\n", + err) + } + if err := catFiles("memory hard limit", index, results, + string(append(cgroupBuf, hardLimit...))); err != nil && + !errors.Is(err, os.ErrNotExist) { + fmt.Fprintf(os.Stderr, "Could not read cgroup hard limit: %v\n", + err) + } + if err := catFiles("memory swap limit", index, results, + string(append(cgroupBuf, hardSwapLimit...))); err != nil && + !errors.Is(err, os.ErrNotExist) { + fmt.Fprintf(os.Stderr, "Could not read cgroup swap limit: %v\n", + err) + } +} + +func fExists(p string) bool { + _, err := os.Stat(p) + return !errors.Is(err, os.ErrNotExist) +} + +func isContainer() bool { + if fExists("/.dockerenv") || fExists("/.dockerinit") || + os.Getenv("container") != "" { + return true + } + b, err := os.ReadFile("/proc/1/cgroup") + if err != nil { + return false + } + if bytes.Contains(b, []byte("docker")) || + bytes.Contains(b, []byte("lxc")) { + return true + } + return false +} + +// Report our best guess as to whether we're running in a container. +func checkContainer(_ context.Context, index int, results chan<- siteCheckSection) { + var output string + if isContainer() { + output = "Detected" + } + results <- siteCheckSection{ + Section: "Container", + Cmd: `[ -e /.dockerenv ] || [ -e /.dockerinit ] \ + || [ ! -z "$container" ] || grep -m 1 -E 'docker|lxc' /proc/1/cgroup \ + > /dev/null && echo 'Detected'`, + Output: output, + Index: index, + } +} + +// Report the current init method (e.g. systemd). +func checkInit(_ context.Context, index int, results chan<- siteCheckSection) { + f, err := os.Open("/proc/1/sched") + if err != nil { + fmt.Fprintf(os.Stderr, "Could not read init process info: %v\n", + err) + } + defer f.Close() + scanner := bufio.NewScanner(f) + if scanner.Scan() { + prefix, _, _ := bytes.Cut(scanner.Bytes(), space) + results <- siteCheckSection{ + Section: "init process", + Cmd: "head -n 1 /proc/1/sched | cut -d ' ' -f 1", + Output: string(prefix), + Index: index, + } + } +} + +// Run an executable and return its output. +func execOut(ctx context.Context, stderr bool, e string, args ...string) []byte { + ctx, cancel := context.WithTimeout(ctx, time.Second*20) + defer cancel() + cmd := exec.CommandContext(ctx, e, args...) + cmd.SysProcAttr = &syscall.SysProcAttr{ + Pdeathsig: syscall.SIGKILL, + } + var buf bytes.Buffer + cmd.Stdout = &buf + if stderr { + cmd.Stderr = &buf + } + if err := cmd.Run(); err != nil && errors.Is(err, exec.ErrNotFound) { + return nil + } + if ctx.Err() != nil { + fmt.Fprintln(os.Stderr, e, "timed out") + } + return bytes.TrimSpace(buf.Bytes()) +} + +type hostMemData struct { + name []byte + mem float64 +} + +const sizeSuffixes = "kMGTP" + +var sizeSuffixesBytes = []byte(sizeSuffixes) + +func humanParse(b []byte) float64 { + var v float64 + for i := range sizeSuffixesBytes { + if n, found := bytes.CutSuffix(b, sizeSuffixesBytes[i:i+1]); found { + v, _ = strconv.ParseFloat(string(n), 64) + return v * float64(int64(1)<<((i+1)*10)) + } + } + v, _ = strconv.ParseFloat(string(b), 64) + return v +} + +func parseQhost(line []byte) hostMemData { + f := bytes.Fields(line) + if len(f) == 0 { + return hostMemData{} + } + if len(f) < 5 { + return hostMemData{ + name: f[0], + } + } + return hostMemData{ + name: f[0], + mem: humanParse(f[4]), + } +} + +// Report SGE parameters. +func checkSGE(ctx context.Context, index int, results chan<- siteCheckSection) { + p, _ := exec.LookPath("qsub") + results <- siteCheckSection{ + Section: "SGE Submit", + Cmd: "which qsub", + Output: p, + Index: index, + } + if p == "" { + return + } + results <- siteCheckSection{ + Section: "SGE CLUSTER_NAME", + Cmd: "echo $SGE_CLUSTER_NAME", + Output: os.Getenv("SGE_CLUSTER_NAME"), + Index: index, + } + results <- siteCheckSection{ + Section: "SGE JOB_NAME", + Cmd: "echo $JOB_NAME", + Output: os.Getenv("JOB_NAME"), + Index: index, + } + + p, _ = exec.LookPath("qconf") + results <- siteCheckSection{ + Section: "qconf", + Cmd: "which qconf", + Output: p, + Index: index, + } + if p == "" { + return + } + qsc := execOut(ctx, false, p, "-sc") + sconf := bytes.Split(execOut(ctx, false, p, "-sconf"), newline) + var qconfBuf strings.Builder + qconfBuf.Write(qsc) + for _, line := range sconf { + if bytes.Contains(line, []byte("shell_start_mode")) || + bytes.Contains(line, []byte("login_shells")) || + bytes.Contains(line, []byte("max_jobs")) { + qconfBuf.WriteByte('\n') + qconfBuf.Write(line) + } + } + results <- siteCheckSection{ + Section: "qconf -sc", + Cmd: "qconf -sc && qconf -sconf | grep -E '(shell_start_mode|login_shells|max_jobs)'", + Output: qconfBuf.String(), + Index: index, + } + + p, _ = exec.LookPath("qhost") + results <- siteCheckSection{ + Section: "qhost", + Cmd: "which qhost", + Output: p, + Index: index, + } + if p == "" { + return + } + qhostOut := execOut(ctx, false, p, "-l", "mem_total=20G") + _, qhostOut, _ = bytes.Cut(qhostOut, newline) + _, qhostOut, _ = bytes.Cut(qhostOut, newline) + if len(qhostOut) == 0 { + results <- siteCheckSection{ + Section: "qhost count", + Cmd: "qhost -l \"mem_total=20G\" | tail -n +3 | wc -l", + Output: "0", + Index: index, + } + return + } + hosts := bytes.Split(qhostOut, newline) + results <- siteCheckSection{ + Section: "qhost count", + Cmd: "qhost -l \"mem_total=20G\" | tail -n +3 | wc -l", + Output: strconv.Itoa(len(hosts)), + Index: index, + } + var biggest hostMemData + for _, h := range hosts { + data := parseQhost(h) + if data.mem > biggest.mem { + biggest = data + } + } + results <- siteCheckSection{ + Section: "qhost -F", + Cmd: "qhost -F -q -h $(qhost | sort -h -k 5 -r | head -n 1 | cut -d \" \" -f 1)", + Output: string(execOut(ctx, false, p, + "-F", "-q", "-h", string(biggest.name))), + Index: index, + } +} + +// Report LSF information. +func checkLSF(_ context.Context, index int, results chan<- siteCheckSection) { + p, _ := exec.LookPath("bsub") + results <- siteCheckSection{ + Section: "LSF Submit", + Cmd: "which bsub", + Output: p, + Index: index, + } + if p == "" { + return + } + results <- siteCheckSection{ + Section: "LSF LSB_JOBNAME", + Cmd: "echo $LSB_JOBNAME", + Output: os.Getenv("LSB_JOBNAME"), + Index: index, + } +} + +// Report HTCondor information. +func checkCondor(_ context.Context, index int, results chan<- siteCheckSection) { + p, _ := exec.LookPath("condor_submit") + results <- siteCheckSection{ + Section: "HTCondor Submit", + Cmd: "which condor_submit", + Output: p, + Index: index, + } + results <- siteCheckSection{ + Section: "Batch system", + Cmd: "echo $BATCH_SYSTEM", + Output: os.Getenv("BATCH_SYSTEM"), + Index: index, + } +} + +func listDir(dir string, n int) string { + f, err := os.Open(dir) + if err != nil { + return "" + } + defer f.Close() + names, _ := f.Readdirnames(n) + return strings.Join(names, "\n") +} + +// Report information relevant to BCL2FASTQ. +func checkBCL2FASTQ(ctx context.Context, index int, results chan<- siteCheckSection) { + p, _ := exec.LookPath("configureBclToFastq.pl") + results <- siteCheckSection{ + Section: "BCL2FASTQ 1", + Cmd: "which configureBclToFastq.pl", + Output: p, + Index: index, + } + if p != "" { + results <- siteCheckSection{ + Section: "BCL2FASTQ 1 Version", + Cmd: "ls $(dirname $(which configureBclToFastq.pl))/../etc", + Output: listDir(path.Join(path.Dir(path.Dir(p)), "etc"), 10), + Index: index, + } + p, _ := exec.LookPath("perl") + results <- siteCheckSection{ + Section: "Perl", + Cmd: "which perl", + Output: p, + Index: index, + } + if p != "" { + if o := execOut(ctx, false, p, "-v"); len(o) > 0 { + results <- siteCheckSection{ + Section: "Perl Version", + Cmd: "perl -v", + Output: string(o), + Index: index, + } + } + } + } + p, _ = exec.LookPath("bcl2fastq") + results <- siteCheckSection{ + Section: "BCL2FASTQ 1", + Cmd: "which bcl2fastq", + Output: p, + Index: index, + } + if p != "" { + if o := execOut(ctx, false, p, "--version"); len(o) > 0 { + results <- siteCheckSection{ + Section: "BCL2FASTQ 2 Version", + Cmd: "bcl2fastq --version", + Output: string(o), + Index: index, + } + } + } +} + +// Report java information. +func checkJava(ctx context.Context, index int, results chan<- siteCheckSection) { + p, _ := exec.LookPath("java") + results <- siteCheckSection{ + Section: "Java", + Cmd: "which java", + Output: p, + Index: index, + } + if p != "" { + if o := execOut(ctx, true, p, "-version"); len(o) > 0 { + results <- siteCheckSection{ + Section: "Java Version", + Cmd: "java -version 2>&1 | cat", + Output: string(o), + Index: index, + } + } + } +} + +func checkRefdata(_ context.Context, index int, results chan<- siteCheckSection) { + refdata := os.Getenv("TENX_REFDATA") + results <- siteCheckSection{ + Section: "10X Refdata", + Cmd: "echo $TENX_REFDATA", + Output: refdata, + Index: index, + } + if refdata != "" { + if err := catFiles("10X Refdata Version", index, results, + path.Join(refdata, "version")); err != nil { + fmt.Fprintf(os.Stderr, "Could not read refdata version: %v\n", + err) + } + } +} + +func checkSlurm(ctx context.Context, index int, results chan<- siteCheckSection) { + o := execOut(ctx, false, "sinfo", "-O", + "nodes,maxcpuspernode,memory,time") + results <- siteCheckSection{ + Section: "slurm info", + Cmd: "sinfo -O nodes,maxcpuspernode,memory,time", + Output: string(o), + Index: index, + } +} + +// Report mrp path and version. +func checkMrp(ctx context.Context, index int, results chan<- siteCheckSection) { + p, _ := exec.LookPath("mrp") + if p == "" { + results <- siteCheckSection{ + Section: "MRP", + Cmd: "mrp --version", + Output: "", + Index: index, + } + return + } + o := execOut(ctx, false, "mrp", "--version") + results <- siteCheckSection{ + Section: "MRP", + Cmd: "mrp --version", + Output: string(o), + Index: index, + } + if len(o) == 0 { + return + } + if ctx.Err() != nil { + return + } + dir := path.Join(path.Dir(path.Dir(p)), "jobmanagers") + entries, _ := os.ReadDir(dir) + var listBuf strings.Builder + for _, ent := range entries { + if !strings.HasSuffix(ent.Name(), ".template") { + continue + } + if listBuf.Len() > 0 { + listBuf.WriteByte('\n') + } + f := path.Join(dir, ent.Name()) + listBuf.WriteString(f) + _ = catFiles(f, index, results, f) + } + results <- siteCheckSection{ + Section: "mrp templates", + Cmd: "ls $(dirname $(dirname $(which mrp)))/jobmanagers/*.template", + Output: listBuf.String(), + Index: index, + } +} diff --git a/lib/go/sitecheck/sitecheck.go b/lib/go/sitecheck/sitecheck.go new file mode 100644 index 0000000..0d99504 --- /dev/null +++ b/lib/go/sitecheck/sitecheck.go @@ -0,0 +1,196 @@ +// Copyright (c) 2024 10x Genomics, Inc. All rights reserved. + +// Package sitecheck implements a function for generating sitecheck telemetry file. +package sitecheck + +import ( + "context" + "fmt" + "io" + "os" + "sort" + "sync" + "time" +) + +type siteCheckSection struct { + // Title of the section, e.g. "System Information" + Section string + // Ideally, a shell script which would generate equivalent output. + Cmd string + Output string + // The order in which this should show up in the output, ideally. + Index int + // This is the last section with this index. + Last bool +} + +func SiteCheck(ctx context.Context, dest io.Writer) error { + ctx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + results := collectData(ctx) + + product := os.Getenv("TENX_PRODUCT") + version := os.Getenv("TENX_VERSION") + subcommand := os.Getenv("TENX_SUBCMD") + copyright := os.Getenv("TENX_COPYRIGHT") + if copyright == "" { + copyright = "Copyright (c) 2021 10x Genomics, Inc. All rights reserved." + } + + if version != "" { + fmt.Fprintf(dest, "%s %s (%s)\n", + product, subcommand, version) + } else if subcommand != "" { + fmt.Fprintf(dest, "%s %s (unknown version)\n", + product, subcommand) + } else if product != "" { + fmt.Fprintf(dest, "%s (unknown version)\n", product) + } else { + fmt.Fprintln(dest, "10X Genomics sitecheck") + } + fmt.Fprintln(dest, copyright) + fmt.Fprintln(dest, + "-------------------------------------------------------------------------------") + fmt.Fprintln(dest, time.Now().Format(time.UnixDate)) + fmt.Fprintln(dest) + + return orderedPrint(ctx, dest, results) +} + +// Print sections, ordered by index. +// +// The contract here is is that each checker will have a unique index >= 0, +// and will emit zero or more sections with that index, followed by a section +// with no content and `Last` set to true. +// +// This prints the sections as soon as it can without violating the ordering +// constraint. If the context times out, it will print any sections which +// arrived out of order. +func orderedPrint(ctx context.Context, dest io.Writer, results <-chan siteCheckSection) error { + index := 0 + // In order to maintain a consistent ordering for sections, + // when we receive one that shouldn't be reported yet, we add it to a + // buffer. Otherwise we print it immediately - better to get it out there + // ASAP in case the program is terminated. + // If we time out, we dump out any buffered sections regardless of whether + // we're still missing some. + buffer := make([]siteCheckSection, 0, 24) + for { + select { + case section, ok := <-results: + if !ok { + clearBuffer(buffer, -1, dest) + return nil + } + if section.Index > index { + // Not ready to report this one yet, just stick it in the buffer. + buffer = append(buffer, section) + } else if section.Last { + // Sentinel indicating that we're done with this index. + index++ + // See if we can remove any buffered items. + buffer, index = clearBuffer(buffer, index, dest) + } else { + section.Print(dest) + } + + case <-ctx.Done(): + fmt.Fprintln(os.Stderr, "timed out") + clearBuffer(buffer, -1, dest) + return ctx.Err() + } + } +} + +func clearBuffer(buffer []siteCheckSection, index int, dest io.Writer) ([]siteCheckSection, int) { + if len(buffer) == 0 { + return buffer, index + } + sort.SliceStable(buffer, func(i, j int) bool { + return buffer[i].Index < buffer[j].Index + }) + if index < 0 { + // Just dump everything. + for _, section := range buffer { + if !section.Last { + section.Print(dest) + } + } + } else { + // Dump sections which aren't out of order. + for i, section := range buffer { + if section.Index > index { + return append(buffer[:0], buffer[i:]...), index + } + if section.Last { + index++ + } else { + section.Print(dest) + } + } + } + return buffer[:0], index +} + +func (section *siteCheckSection) Print(dest io.Writer) { + fmt.Fprintln(dest, "=====================================================================") + fmt.Fprintln(dest, section.Section) + fmt.Fprintln(dest, section.Cmd) + fmt.Fprintln(dest, "---------------------------------------------------------------------") + if section.Output != "" { + fmt.Fprintln(dest, section.Output) + } + fmt.Fprintln(dest, "=====================================================================") + fmt.Fprintln(dest) +} + +type checkFunc func(context.Context, int, chan<- siteCheckSection) + +// Run a check. +func (c checkFunc) Do(ctx context.Context, + wg *sync.WaitGroup, i int, + results chan<- siteCheckSection) { + defer wg.Done() + if ctx.Err() != nil { + return + } + c(ctx, i, results) + results <- siteCheckSection{Index: i, Last: true} +} + +func collectData(ctx context.Context) <-chan siteCheckSection { + results := make(chan siteCheckSection, 24) + var wg sync.WaitGroup + for i, c := range [...]checkFunc{ + checkUname, + checkDistro, + checkKernel, + checkGlibc, + checkCpu, + checkMemory, + checkDisk, + checkUlimits, + checkFileLimit, + checkVmConfig, + checkCgroups, + checkContainer, + checkInit, + checkSGE, + checkLSF, + checkCondor, + checkBCL2FASTQ, + checkJava, + checkRefdata, + checkSlurm, + checkMrp, + } { + wg.Add(1) + go c.Do(ctx, &wg, i, results) + } + go func(wg *sync.WaitGroup, results chan<- siteCheckSection) { + wg.Wait() + close(results) + }(&wg, results) + return results +} diff --git a/lib/go/telemetry/collector/cgroup.go b/lib/go/telemetry/collector/cgroup.go new file mode 100644 index 0000000..961a970 --- /dev/null +++ b/lib/go/telemetry/collector/cgroup.go @@ -0,0 +1,154 @@ +package collector + +import ( + "bytes" + "context" + "encoding/json" + "os" + "path" + "runtime/trace" +) + +func doCgroups(ctx context.Context, + requests map[string][]cgroupRequest, mounts <-chan map[string]string) { + defer trace.StartRegion(ctx, "doCgroups").End() + groupFile, err := os.ReadFile("/proc/self/cgroup") + if err != nil { + for _, cs := range requests { + for _, c := range cs { + close(c.result) + } + } + return + } + var cgMounts map[string]string + select { + case cgMounts = <-mounts: + case <-ctx.Done(): + for _, cs := range requests { + for _, c := range cs { + close(c.result) + } + } + return + } + if len(cgMounts) == 0 { + for _, cs := range requests { + for _, c := range cs { + close(c.result) + } + } + return + } + var v2 string + dirs := make(map[string]string, len(requests)) + for _, line := range bytes.Split( + bytes.TrimSpace(groupFile), + []byte{'\n'}) { + _, after, ok := bytes.Cut(line, []byte{':'}) + if !ok || len(after) == 0 { + continue + } + if after[0] == ':' { + if p := cgMounts[""]; p == "" { + continue + } else { + v2 = p + string(after[1:]) + } + } + ctrl, pb, ok := bytes.Cut(after, []byte{':'}) + if !ok { + continue + } + p := string(pb) + for _, c := range bytes.Split(ctrl, []byte{','}) { + if _, ok := requests[string(c)]; !ok { + continue + } + if m := cgMounts[string(c)]; m != "" { + dirs[string(c)] = m + p + } + } + } + for ctrl, rs := range requests { + p := dirs[ctrl] + if p == "" { + if v2 != "" { + go doCgReqs(ctx, v2, rs) + } else { + for _, r := range rs { + close(r.result) + } + } + } else { + go doCgReqs(ctx, p, rs) + } + } +} + +func doCgReqs(ctx context.Context, dir string, reqs []cgroupRequest) { + for _, req := range reqs { + doCgReq(ctx, dir, req) + } +} + +func doCgReq(ctx context.Context, dir string, req cgroupRequest) { + defer close(req.result) + if ctx.Err() != nil { + return + } + for _, fn := range req.names { + if c, err := os.ReadFile(path.Join(dir, fn)); err == nil { + req.result <- c + return + } + } +} + +type cgroupExtractor struct { + simpleExtractor + filter *LineFilter + paths []string + ctrl string +} + +func (c *cgroupExtractor) Start(ctx context.Context, _ ValueContext, + fc *FileContext, result chan<- any) { + cr := fc.cgroup(c.ctrl, c.paths) + go c.get(ctx, cr, result) +} + +func (c *cgroupExtractor) get(ctx context.Context, cr <-chan []byte, result chan<- any) { + defer close(result) + select { + case content := <-cr: + if r, ok := c.filter.compile().matchContent(string(content)); ok { + result <- r + } + case <-ctx.Done(): + } +} + +func (c *cgroupExtractor) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(struct { + Filter FileFilter `json:"filter"` + Paths []string `json:"paths"` + Ctrl string `json:"controller"` + }{ + Filter: c.filter, + Paths: c.paths, + Ctrl: c.ctrl, + }) + if err != nil { + return nil, err + } + return append(append([]byte(`{"cgroup":`), b...), '}'), nil +} + +func Cgroup(ctrl string, paths []string, filter *LineFilter) ValueExtractor { + return &cgroupExtractor{ + filter: filter, + paths: paths, + ctrl: ctrl, + } +} diff --git a/lib/go/telemetry/collector/distro.go b/lib/go/telemetry/collector/distro.go new file mode 100644 index 0000000..70bebf7 --- /dev/null +++ b/lib/go/telemetry/collector/distro.go @@ -0,0 +1,210 @@ +package collector + +import ( + "bytes" + "context" + "io" + "os" + "path" + "path/filepath" + "strings" + + "github.com/google/shlex" +) + +type distroExtractor struct{ noBucketsExtractor } + +func (distroExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"distro"}`), nil +} + +func (d *distroExtractor) Start(ctx context.Context, + _ ValueContext, _ *FileContext, result chan<- any) { + go d.get(ctx, result) +} + +func openOsReleaseFile() *os.File { + etc := os.Getenv("UNIXCONFDIR") + if etc == "" { + etc = "/etc" + } + usrLib := os.Getenv("UNIXUSRLIBDIR") + if usrLib == "" { + usrLib = "/usr/lib" + } + f, err := os.Open(path.Join(etc, "os-release")) + if err == nil { + return f + } + f, err = os.Open(path.Join(usrLib, "os-release")) + if err == nil { + return f + } + if etc != "/etc" { + f, err = os.Open("/etc/os-release") + if err == nil { + return f + } + } + if usrLib != "/usr/lib" { + f, err = os.Open("os-release") + if err == nil { + return f + } + } + f, err = os.Open("/lib/os-release") + if err == nil { + return f + } + f, err = os.Open("/etc/lsb-release") + if err == nil { + return f + } + return nil +} + +func parseOsRelease(f io.Reader) string { + lex := shlex.NewLexer(f) + var id, name string + for word, err := lex.Next(); err == nil; word, err = lex.Next() { + if word == "" { + continue + } + key, val, ok := strings.Cut(word, "=") + if !ok || val == "" { + continue + } + if strings.EqualFold(key, "ID_LIKE") { + for _, d := range strings.Fields(val) { + if n := normalizeDistro(d); n != "" { + return n + } + } + } else if strings.EqualFold(key, "ID") { + id = val + } else if strings.EqualFold(key, "NAME") { + name = val + } else if strings.EqualFold(key, "DISTRIB_ID") && id == "" { + id = val + } + } + if id != "" { + if n := normalizeDistro(id); n != "" { + return n + } + id, _, _ = strings.Cut(id, " ") + if n := normalizeDistro(id); n != "" { + return n + } + } + if n := normalizeDistro(name); n != "" { + return n + } + name, _, _ = strings.Cut(name, " ") + if n := normalizeDistro(name); n != "" { + return n + } + return "unknown" +} + +func getDistroFromOsRelease() string { + f := openOsReleaseFile() + if f == nil { + return "" + } + defer f.Close() + return parseOsRelease(f) +} + +func normalizeDistro(distro string) string { + distro = strings.ToLower(distro) + // Some distros can't be ID'ed from the first word + switch distro { + case "linux mint": + return "debian" + case "ibm powerkvm": + return "kvm" + case "debian", "devuan", "ubuntu", "raspbian": + return "debian" + case "redhat", "rhel", "rocky", "almalinux", + "alt", "altlinux", + "centos", "fedora", + "amazon", "amzn", + "cloudlinux", "pidora", + "oracle", + "springdale", "scientific", "red": + return "rhel" + case "suse", "openSUSE": + return "suse" + case "arch": + return "arch" + case "gentoo", "exherbo": + return "gentoo" + case "kvm": + return "kvm" + case "mandriva", "mageia": + return "mandriva" + case "parallels": + return "parallels" + case "xenserver": + return "xenserver" + case "slackware": + return "slackware" + case "guix": + return "guix" + case "nixos": + return "nixos" + } + return "" +} + +func (d *distroExtractor) get(ctx context.Context, result chan<- any) { + defer close(result) + + if distro := getDistroFromOsRelease(); distro != "" { + result <- distro + return + } + if ctx.Err() != nil { + return + } + releaseFiles, _ := filepath.Glob("/etc/*-release") + for _, fn := range releaseFiles { + if n := normalizeDistro(strings.TrimSuffix( + strings.TrimPrefix(fn, "/etc/"), "-release")); n != "" { + result <- n + return + } + } +} + +type containerExtractor struct{ noBucketsExtractor } + +func (containerExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"container"}`), nil +} + +func (d *containerExtractor) Start(ctx context.Context, + _ ValueContext, _ *FileContext, result chan<- any) { + go d.get(ctx, result) +} + +func (d *containerExtractor) get(ctx context.Context, result chan<- any) { + defer close(result) + if ctx.Err() != nil { + return + } + content, _ := os.ReadFile("/proc/1/sched") + if len(content) > 0 { + content, _, _ := bytes.Cut(content, []byte{'\n'}) + content, _, _ = bytes.Cut(content, []byte{'('}) + content, _, _ = bytes.Cut(bytes.TrimSpace(content), []byte{' '}) + if string(content) == "init" || + string(content) == "systemd" || + string(content) == "system" { + result <- false + } else { + result <- true + } + } +} diff --git a/lib/go/telemetry/collector/file_context.go b/lib/go/telemetry/collector/file_context.go new file mode 100644 index 0000000..da36a9d --- /dev/null +++ b/lib/go/telemetry/collector/file_context.go @@ -0,0 +1,124 @@ +package collector + +import ( + "context" + "io/fs" + + "golang.org/x/sys/unix" +) + +type fileResult struct { + info fs.FileInfo + fullPath string + relPath string +} + +type errorFile struct { + path string + content string +} + +type cgroupRequest struct { + result chan<- []byte + names []string +} + +// In order to facilitate having multiple metrics collected +// from the same file (e.g. different lines or json keys), +// a shared instance of this gets passed in to all of the +// value extractor's Start functions. +// +// Essentially this works a bit like a sync.OnceValue, +// except with several keyed maps, and without the concurrency +// protections. +// +// Once all active metrics' Start functions have been called, +// the FileContext's `Close()` method should be called. +// It is undefined behavior for any other methods to be called +// after that point. +// The `Close()` method will launch goroutines to start +// collecting the requested data and distribute it to the waiting +// value extractors. +type FileContext struct { + statfs map[string][]chan<- unix.Statfs_t + mounts map[string][]chan<- mountInfo + cgroups map[string][]cgroupRequest + + files multiFileResultMap + // We don't want to walk the directory structure more than once. + stageRelFiles multiFileResultMap + errorFiles []chan<- errorFile +} + +func (fc *FileContext) errorFile() <-chan errorFile { + c := make(chan errorFile, 1) + fc.errorFiles = append(fc.errorFiles, c) + return c +} + +func (fc *FileContext) stageRelative(p []string) *fileSink { + if fc.stageRelFiles == nil { + fc.stageRelFiles = make(multiFileResultMap) + } + return fc.stageRelFiles.getSink(p) +} + +func (fc *FileContext) statFs(p string) <-chan unix.Statfs_t { + if fc.statfs == nil { + fc.statfs = make(map[string][]chan<- unix.Statfs_t, 2) + } + c := make(chan unix.Statfs_t, 1) + fc.statfs[p] = append(fc.statfs[p], c) + return c +} + +func (fc *FileContext) mountInfo(p string) <-chan mountInfo { + if fc.statfs == nil { + fc.mounts = make(map[string][]chan<- mountInfo, 2) + } + c := make(chan mountInfo, 1) + fc.mounts[p] = append(fc.mounts[p], c) + return c +} + +func (fc *FileContext) cgroup(ctrl string, paths []string) <-chan []byte { + if fc.cgroups == nil { + fc.cgroups = make(map[string][]cgroupRequest) + } + c := make(chan []byte, 1) + fc.cgroups[ctrl] = append(fc.cgroups[ctrl], cgroupRequest{ + result: c, + names: paths, + }) + return c +} + +func (fc *FileContext) Close(ctx context.Context, pipestance string) { + for p, cs := range fc.statfs { + go doStatfs(ctx, p, cs) + } + fc.statfs = nil // Allow gc to clean up + var cgm chan map[string]string + if len(fc.cgroups) > 0 { + cgm = make(chan map[string]string, 1) + } + if len(fc.mounts) > 0 || len(fc.cgroups) > 0 { + go doMountInfos(ctx, fc.mounts, cgm) + } + fc.mounts = nil + if len(fc.cgroups) > 0 { + go doCgroups(ctx, fc.cgroups, cgm) + } + fc.cgroups = nil + + if len(fc.errorFiles) > 0 || len(fc.stageRelFiles) > 0 { + go findRelativeFiles(ctx, pipestance, + fc.errorFiles, fc.stageRelFiles) + } + fc.errorFiles = nil + fc.stageRelFiles = nil + if len(fc.files) > 0 { + go findFiles(ctx, pipestance, fc.files) + } + fc.files = nil +} diff --git a/lib/go/telemetry/collector/file_filter.go b/lib/go/telemetry/collector/file_filter.go new file mode 100644 index 0000000..d5a1152 --- /dev/null +++ b/lib/go/telemetry/collector/file_filter.go @@ -0,0 +1,91 @@ +package collector + +import ( + "fmt" + "regexp" + "strings" +) + +type FileFilter interface { + // We've only got two implementations of this + // interface, and we want to keep them private to + // this package, because to be efficient, they + // have to be special-cased regardless. + isJson() bool +} + +type JsonPathFilter []string + +func (JsonPathFilter) isJson() bool { + return true +} + +type LineFilter struct { + Filter string `json:"filter"` + Last bool `json:"last,omitempty"` +} + +func (LineFilter) isJson() bool { + return false +} + +func (lf LineFilter) compile() compiledLineFilter { + // We store the filter string rather than the compiled regexp + // because we want to be able to use `LineFilter` as a map key. + return compiledLineFilter{ + filter: regexp.MustCompile(lf.Filter), + last: lf.Last, + } +} + +type compiledLineFilter struct { + filter *regexp.Regexp + last bool +} + +func (lf compiledLineFilter) matchContent(content string) (string, bool) { + lines := strings.Split(content, "\n") + if lf.last { + for i := len(lines) - 1; i >= 0; i-- { + sm := lf.filter.FindStringSubmatch(lines[i]) + if len(sm) == 1 { + return sm[0], true + } else if len(sm) >= 2 { + return sm[1], true + } + } + } else { + for _, line := range lines { + sm := lf.filter.FindStringSubmatch(line) + if len(sm) == 1 { + return sm[0], true + } else if len(sm) >= 2 { + return sm[1], true + } + } + } + return "", false +} + +func (lf compiledLineFilter) matchLine(line []byte) ([]byte, bool) { + sm := lf.filter.FindSubmatch(line) + if len(sm) == 1 { + return sm[0], true + } else if len(sm) >= 2 { + return sm[1], true + } + return nil, false +} + +func MakeLineFilter(filter string, last bool) (*LineFilter, error) { + _, err := regexp.Compile(filter) + if err != nil { + return nil, fmt.Errorf( + "invalid regex for line filter: %w", + err) + } + return &LineFilter{ + Filter: filter, + Last: last, + }, nil +} diff --git a/lib/go/telemetry/collector/file_size.go b/lib/go/telemetry/collector/file_size.go new file mode 100644 index 0000000..56ced54 --- /dev/null +++ b/lib/go/telemetry/collector/file_size.go @@ -0,0 +1,11 @@ +package collector + +func MakeFileSize(paths []string, isCount bool) ValueExtractor { + // TODO + panic("not implemented") +} + +func MakeFileSizeFlag(flag string, isCount bool) ValueExtractor { + // TODO + panic("not implemented") +} diff --git a/lib/go/telemetry/collector/filesystem.go b/lib/go/telemetry/collector/filesystem.go new file mode 100644 index 0000000..55cc344 --- /dev/null +++ b/lib/go/telemetry/collector/filesystem.go @@ -0,0 +1,339 @@ +package collector + +import ( + "bufio" + "bytes" + "context" + "encoding/json" + "os" + "path" + "runtime/trace" + "strconv" + "strings" + "sync" + "syscall" + + "golang.org/x/sys/unix" +) + +func doStatfs(ctx context.Context, p string, cs []chan<- unix.Statfs_t) { + defer trace.StartRegion(ctx, "doStatfs").End() + for _, c := range cs { + cc := c // don't capture the loop variable + defer close(cc) + } + if ctx.Err() != nil { + return + } + var buf unix.Statfs_t + if err := unix.Statfs(p, &buf); err == nil { + for _, c := range cs { + c <- buf + } + } +} + +type mountInfo struct { + mType string + opts string +} + +func parseMountLine(line []byte, want map[string][]chan<- mountInfo, cg map[string]string) { + // From `man 5 proc`: + // /proc/[pid]/mountinfo (since Linux 2.6.26) + // This file contains information about mount points. It contains lines of the form: + // + // 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue + // (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) + // + // The numbers in parentheses are labels for the descriptions below: + // (1) mount ID: unique identifier of the mount (may be reused after umount(2)). + // (2) parent ID: ID of parent mount (or of self for the top of the mount tree). + // (3) major:minor: value of st_dev for files on file system (see stat(2)). + // (4) root: root of the mount within the file system. + // (5) mount point: mount point relative to the process's root. + // (6) mount options: per-mount options. + // (7) optional fields: zero or more fields of the form "tag[:value]". + // (8) separator: marks the end of the optional fields. + // (9) file system type: name of file system in the form "type[.subtype]". + // (10) mount source: file system-specific information or "none". + // (11) super options: per-super block options. + + fields := bytes.Fields(line) + if len(fields) < 9 { + return + } + results := want[string(fields[2])] + if len(results) == 0 && cg == nil { + return + } + var fsType string + opts := fields[5][0:len(fields[5]):len(fields[5])] + for i, f := range fields[6:] { + if len(f) == 1 && f[0] == '-' { + if len(fields) >= i+7 { + fsType = string(fields[i+7]) + if len(results) > 0 && len(fields) >= i+9 && len(fields[i+9]) > 0 { + opts = append(opts, ',') + opts = append(opts, fields[i+9]...) + } else if fsType == "cgroup" || fsType == "cgroup2" { + opts = fields[i+9] + } + } + break + } + } + if len(results) > 0 { + info := mountInfo{ + mType: fsType, + opts: string(opts), + } + for _, r := range results { + r <- info + } + } + if cg != nil { + if fsType == "cgroup2" { + cg[""] = string(fields[4]) + } else if fsType == "cgroup" { + mount := string(fields[4]) + for _, ctrl := range strings.Split(string(bytes.TrimPrefix(opts, []byte("rw,"))), ",") { + cg[ctrl] = mount + } + } + } +} + +func makeMountId(p string) []byte { + mountId := make([]byte, 0, 21) + if info, err := os.Stat(p); err != nil || info == nil { + return nil + } else if sysInfo, ok := info.Sys().(*syscall.Stat_t); !ok { + return nil + } else { + itoa := func(i uint32) { + if i == 0 { + mountId = append(mountId, '0') + } else { + mountId = append(mountId, strconv.Itoa(int(i))...) + } + } + itoa(unix.Major(sysInfo.Dev)) + mountId = append(mountId, ':') + itoa(unix.Minor(sysInfo.Dev)) + return mountId + } +} + +func doMountInfos(ctx context.Context, request map[string][]chan<- mountInfo, + cgroupMounts chan<- map[string]string) { + defer trace.StartRegion(ctx, "doMountInfos").End() + if cgroupMounts != nil { + defer close(cgroupMounts) + } + for _, cs := range request { + for _, c := range cs { + cc := c // don't capture the loop variable + defer close(cc) + } + } + if ctx.Err() != nil { + return + } + devs := make(map[string][]chan<- mountInfo, len(request)) + for p, cs := range request { + id := makeMountId(p) + if len(id) == 0 { + continue + } + sid := string(id) + if ecs := devs[sid]; len(ecs) == 0 { + devs[sid] = cs + } else { + devs[sid] = append(ecs, cs...) + } + } + if ctx.Err() != nil { + return + } + + getMountInfos(devs, cgroupMounts) +} + +func getMountInfos(devs map[string][]chan<- mountInfo, + cgroupMounts chan<- map[string]string) { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return + } + defer f.Close() + scan := bufio.NewScanner(f) + var cg map[string]string + if cgroupMounts != nil { + cg = make(map[string]string) + } + for scan.Scan() { + parseMountLine(scan.Bytes(), devs, cg) + } + if cgroupMounts != nil { + cgroupMounts <- cg + } +} + +type FilesystemProperty int + +const ( + FsKind = FilesystemProperty(iota) + FsOpts + FsCapacity + FsInodeCap + FsAvail + FsInodeAvail +) + +func (p FilesystemProperty) String() string { + switch p { + case FsKind: + return "kind" + case FsOpts: + return "mnt_opts" + case FsCapacity: + return "bytes_cap" + case FsInodeCap: + return "inode_cap" + case FsAvail: + return "bytes_avail" + case FsInodeAvail: + return "inode_avail" + } + return "unknown" +} + +var exeDir = sync.OnceValue[string](func() string { + exe, err := os.Executable() + if err != nil || exe == "" { + return "" + } + if !strings.ContainsRune(exe, os.PathSeparator) { + return exe + } + return path.Dir(exe) +}) + +type statfsInfoExtractor struct { + simpleExtractor + kind FilesystemProperty + pipestance bool +} + +func (m *statfsInfoExtractor) MarshalJSON() ([]byte, error) { + return json.Marshal(struct { + Kind string `json:"filesystem"` + Pipestance bool `json:"pipestance,omitempty"` + }{ + Kind: m.kind.String(), + Pipestance: m.pipestance, + }) +} + +func (fs *statfsInfoExtractor) Start(ctx context.Context, vc ValueContext, + fc *FileContext, result chan<- any) { + var r <-chan unix.Statfs_t + if fs.pipestance { + r = fc.statFs(vc.PipestanceDir()) + } else if exe := exeDir(); exe == "" { + close(result) + return + } else { + r = fc.statFs(path.Dir(exe)) + } + go fs.get(ctx, r, result) +} + +func (fs *statfsInfoExtractor) get(ctx context.Context, + r <-chan unix.Statfs_t, result chan<- any) { + defer close(result) + select { + case s := <-r: + switch fs.kind { + case FsAvail: + result <- int64(s.Bavail) * s.Bsize + case FsCapacity: + result <- int64(s.Blocks) * s.Bsize + case FsInodeAvail: + result <- int64(s.Ffree) + case FsInodeCap: + result <- int64(s.Files) + } + case <-ctx.Done(): + } +} + +func (fs *statfsInfoExtractor) RequiresPipeline() bool { + return fs.pipestance +} + +type mountInfoExtractor struct { + simpleExtractor + kind FilesystemProperty + pipestance bool +} + +func (m *mountInfoExtractor) MarshalJSON() ([]byte, error) { + return json.Marshal(struct { + Kind string `json:"filesystem"` + Pipestance bool `json:"pipestance,omitempty"` + }{ + Kind: m.kind.String(), + Pipestance: m.pipestance, + }) +} + +func (fs *mountInfoExtractor) Start(ctx context.Context, vc ValueContext, + fc *FileContext, result chan<- any) { + var r <-chan mountInfo + if fs.pipestance { + r = fc.mountInfo(vc.PipestanceDir()) + } else if exe := exeDir(); exe == "" { + close(result) + return + } else { + r = fc.mountInfo(exe) + } + go fs.get(ctx, r, result) +} + +func (fs *mountInfoExtractor) get(ctx context.Context, r <-chan mountInfo, + result chan<- any) { + defer close(result) + select { + case s := <-r: + switch fs.kind { + case FsKind: + result <- s.mType + case FsOpts: + result <- s.opts + } + case <-ctx.Done(): + } +} + +func (fs *mountInfoExtractor) RequiresPipeline() bool { + return fs.pipestance +} + +func MakeFilesystem(pipestance bool, prop FilesystemProperty) ValueExtractor { + switch prop { + case FsKind, FsOpts: + return &mountInfoExtractor{ + kind: prop, + pipestance: pipestance, + } + case FsAvail, FsInodeAvail, FsCapacity, FsInodeCap: + return &statfsInfoExtractor{ + kind: prop, + pipestance: pipestance, + } + } + panic("Invalid filesystem property") +} diff --git a/lib/go/telemetry/collector/find_files.go b/lib/go/telemetry/collector/find_files.go new file mode 100644 index 0000000..699262d --- /dev/null +++ b/lib/go/telemetry/collector/find_files.go @@ -0,0 +1,872 @@ +package collector + +import ( + "archive/zip" + "bufio" + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "io/fs" + "os" + "path" + "path/filepath" + "regexp" + "runtime/trace" + "sort" + "strings" + "sync" + + "github.com/10XDev/cellranger/lib/go/telemetry/converter" +) + +var chunkDirNameRe = regexp.MustCompile( + `^(?:(?:chnk[0-9]+)|split|join)(?:-u[0-9a-z]+)?$`, +) + +func isChunkDir(name string) bool { + return chunkDirNameRe.MatchString(name) +} + +type jsonSink struct { + // Listeners for sub-keys. + children map[string]*jsonSink + // Listeners for the value at this level of hierarchy + listeners []chan<- any +} + +func (j *jsonSink) subscribe(p []string, r chan<- any) { + if len(p) == 0 { + j.listeners = append(j.listeners, r) + return + } + if j.children == nil { + child := new(jsonSink) + j.children = map[string]*jsonSink{ + p[0]: child, + } + child.subscribe(p[1:], r) + } else if child := j.children[p[0]]; child == nil { + child = new(jsonSink) + j.children[p[0]] = child + child.subscribe(p[1:], r) + } else { + child.subscribe(p[1:], r) + } +} + +func (j *jsonSink) close() { + for _, c := range j.listeners { + close(c) + } + for _, c := range j.children { + c.close() + } +} + +func readJson(ctx context.Context, p string, sinks map[converter.Converter]*jsonSink) { + defer trace.StartRegion(ctx, "readJson").End() + content, err := os.ReadFile(p) + if err != nil { + for _, sink := range sinks { + sink.close() + } + return + } + for conv, sink := range sinks { + if ctx.Err() != nil { + sink.close() + continue + } + if conv != nil { + converted, err := conv.Convert(content) + if err == nil { + sink.process(converted) + } + } else { + sink.process(content) + } + } +} + +func unmarshalPrimative(b json.RawMessage) (any, bool) { + if len(b) == 0 { + return nil, false + } + switch b[0] { + case '[', '{': + return nil, false + case '"': + var s string + if json.Unmarshal(b, &s) == nil { + return s, true + } + case 'n': + if string(b) == "null" { + return nil, true + } + case 't', 'f': + var v bool + if json.Unmarshal(b, &v) == nil { + return v, true + } + default: + var v json.Number + if json.Unmarshal(b, &v) == nil { + return v, true + } + } + return nil, false +} + +func (j *jsonSink) process(content json.RawMessage) { + content = bytes.TrimSpace(content) + if content[0] == '[' { + // Take the first array element. + // This is mostly to simplify handling of `_perf`, from which + // we may wish to extract the storage high-water-mark. + var arr []json.RawMessage + if json.Unmarshal(content, &arr) == nil && len(arr) > 0 { + j.process(arr[0]) + } else { + j.close() + } + return + } + defer j.close() + if len(j.listeners) > 0 { + if v, ok := unmarshalPrimative(content); ok { + for _, r := range j.listeners { + r <- v + close(r) + } + } else { + for _, r := range j.listeners { + close(r) + } + } + j.listeners = nil + } + if len(j.children) > 0 { + var m map[string]json.RawMessage + if json.Unmarshal(content, &m) == nil { + for k, s := range j.children { + if v, ok := m[k]; ok { + s.process(v) + } else { + s.close() + } + } + j.children = nil + } + } +} + +// A fileSink represents subscribers waiting for results from a file. +type fileSink struct { + // Listeners waiting for specific line results. + lineListeners map[converter.Converter]lineFilterSet + // listeners for json keys + jsonListeners map[converter.Converter]*jsonSink + key string + alternatePaths []string +} + +func (sink *fileSink) subscribe(filter FileFilter, conv converter.Converter, result chan<- any) { + switch f := filter.(type) { + case *LineFilter: + if sink.lineListeners == nil { + sink.lineListeners = map[converter.Converter]lineFilterSet{ + conv: { + *f: []chan<- any{result}, + }, + } + } else { + m := sink.lineListeners[conv] + if m == nil { + sink.lineListeners[conv] = lineFilterSet{ + *f: []chan<- any{result}, + } + } else { + m[*f] = append(m[*f], result) + } + } + case JsonPathFilter: + var root *jsonSink + if sink.jsonListeners == nil { + root = new(jsonSink) + sink.jsonListeners = map[converter.Converter]*jsonSink{ + conv: root, + } + } else { + root = sink.jsonListeners[conv] + if root == nil { + root = new(jsonSink) + sink.jsonListeners[conv] = root + } + } + root.subscribe(f, result) + default: + validateFilterType(filter) + } +} + +func (sink *fileSink) notify(ctx context.Context, res fileResult) { + if sink.jsonListeners != nil { + go readJson(ctx, res.fullPath, sink.jsonListeners) + sink.jsonListeners = nil + } + if len(sink.lineListeners) > 0 { + go readLines(ctx, res.fullPath, sink.lineListeners) + sink.lineListeners = nil + } +} + +func readLines(ctx context.Context, p string, + results map[converter.Converter]lineFilterSet) { + for conv, filters := range results { + if conv == nil { + readRawLines(ctx, p, filters) + } else { + convertLines(ctx, p, conv, filters) + } + } +} + +type lineFilterSet map[LineFilter][]chan<- any + +func (lf lineFilterSet) close() { + for _, cs := range lf { + for _, c := range cs { + close(c) + } + } +} + +func readRawLines(ctx context.Context, p string, filters lineFilterSet) { + defer trace.StartRegion(ctx, "readRawLines").End() + f, err := os.Open(p) + if err != nil || ctx.Err() != nil { + filters.close() + return + } + defer f.Close() + + first := make(map[*compiledLineFilter][]chan<- any) + type lastSeen struct { + saw string + r []chan<- any + } + last := make(map[*compiledLineFilter]*lastSeen) + + for lf, cs := range filters { + cf := lf.compile() + if cf.last { + last[&cf] = &lastSeen{r: cs} + } else { + first[&cf] = cs + } + } + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + if ctx.Err() != nil { + for _, cs := range first { + for _, c := range cs { + close(c) + } + } + for _, seen := range last { + for _, c := range seen.r { + close(c) + } + } + return + } + for lf, cs := range first { + if m, ok := lf.matchLine(scanner.Bytes()); ok { + s := string(m) + for _, c := range cs { + c <- s + close(c) + } + delete(first, lf) + } + } + if len(first) == 0 && len(last) == 0 { + return + } + for lf, seen := range last { + if m, ok := lf.matchLine(scanner.Bytes()); ok { + seen.saw = string(m) + } + } + } + for _, cs := range first { + for _, c := range cs { + close(c) + } + } + for _, seen := range last { + for _, c := range seen.r { + if seen.saw != "" && scanner.Err() == nil { + c <- seen.saw + } + close(c) + } + } +} + +func convertLines(ctx context.Context, p string, + conv converter.Converter, filters lineFilterSet) { + defer trace.StartRegion(ctx, "convertLines").End() + b, err := os.ReadFile(p) + if err != nil || ctx.Err() != nil { + filters.close() + return + } + converted, err := conv.Convert(b) + if err != nil || ctx.Err() != nil { + filters.close() + return + } + cStr := string(converted) + for filter, cs := range filters { + v, ok := filter.compile().matchContent(cStr) + for _, c := range cs { + if ok { + c <- v + } + close(c) + } + } +} + +func (sink *fileSink) close() { + for _, ls := range sink.lineListeners { + for _, cs := range ls { + for _, c := range cs { + close(c) + } + } + } + sink.lineListeners = nil + for _, j := range sink.jsonListeners { + j.close() + } + sink.jsonListeners = nil +} + +// We can have multiple requests for a single file, and we can have multiple +// files for a single request. +// This type encapsulates the complexity of making sure we +// 1. Don't notify a given requestor more than once. +// 2. Don't keep searching for files we no longer need. +type multiFileResultMap map[string]map[string]*fileSink + +func (m multiFileResultMap) close() { + for _, sinks := range m { + for _, sink := range sinks { + sink.close() + } + } +} + +func (m multiFileResultMap) getSink(paths []string) *fileSink { + if len(paths) == 0 { + panic("at least one path required") + } + var key string + if len(paths) > 1 { + sort.Strings(paths) + key = strings.Join(paths, "\x00") + } + cs := m[paths[0]] + if sink := cs[key]; sink != nil { + return sink + } + sink := &fileSink{ + key: key, + } + if len(paths) > 1 { + // Re-split rather than simply using `paths` so we don't + // retain a reference to `paths`. + sink.alternatePaths = strings.SplitN(key, "\x00", len(paths)) + } + if cs == nil { + m[paths[0]] = map[string]*fileSink{key: sink} + } else { + cs[key] = sink + } + for _, p := range paths[1:] { + cs := m[p] + if cs == nil { + m[p] = map[string]*fileSink{key: sink} + } else { + cs[key] = sink + } + } + return sink +} + +func (m multiFileResultMap) notify(ctx context.Context, fn string, + sinks map[string]*fileSink, result fileResult) { + // assert: sinks == m[fn]. This is perhaps a premature optimization. + for _, sink := range sinks { + sink.notify(ctx, result) + for _, alt := range sink.alternatePaths { + if alt != fn { + o := m[alt] + delete(o, sink.key) + if len(o) == 0 { + delete(m, alt) + } + } + } + } +} + +func findFiles(ctx context.Context, pipestance string, requests multiFileResultMap) { + defer trace.StartRegion(ctx, "findFiles").End() + defer requests.close() + psfs := os.DirFS(pipestance) + sfs := psfs.(fs.StatFS) + for p, sinks := range requests { + if !path.IsAbs(p) { + paths, _ := fs.Glob(psfs, p) + if len(paths) > 0 { + fp := paths[0] + info, _ := sfs.Stat(fp) + requests.notify(ctx, p, sinks, fileResult{ + info: info, + fullPath: path.Join(pipestance, fp), + relPath: fp, + }) + } + } else if info, err := os.Stat(p); err == nil { + requests.notify(ctx, p, sinks, fileResult{ + info: info, + fullPath: p, + relPath: p, + }) + } + } +} + +func findRelativeFiles(ctx context.Context, pipestance string, + errFiles []chan<- errorFile, requests multiFileResultMap) { + defer trace.StartRegion(ctx, "findRelativeFiles").End() + for _, c := range errFiles { + cc := c // don't capture the loop variable + defer close(cc) + } + defer requests.close() + _ = filepath.WalkDir(pipestance, func(p string, d fs.DirEntry, err error) error { + defer trace.StartRegion(ctx, "findRelativeFiles_walk").End() + if ctx.Err() != nil { + return fs.SkipAll + } + rp := strings.TrimPrefix(strings.TrimPrefix(p, pipestance), "/") + if !d.IsDir() { + return nil + } + // Don't walk top-level outs or extras directories. + // They don't contain stage-relative files. + if rp == "outs" || rp == "extras" { + return fs.SkipDir + } + if isChunkDir(d.Name()) { + if len(errFiles) > 0 { + // Must do this synchronously because we need to take just the + // first result. + if content := readErrorFile(p); len(content) > 0 { + efr := errorFile{ + path: rp, + content: content, + } + for _, c := range errFiles { + c <- efr + } + errFiles = nil + } + } + for fn, sinks := range requests { + fp := path.Join(p, fn) + if info, err := os.Stat(fp); err == nil { + requests.notify(ctx, fn, sinks, fileResult{ + info: info, + fullPath: fp, + relPath: strings.TrimPrefix(strings.TrimPrefix(fp, pipestance), "/"), + }) + break + } + } + if len(errFiles) == 0 && len(requests) == 0 { + return fs.SkipAll + } + return fs.SkipDir + } + return nil + }) + if len(errFiles) == 0 { + return + } + // We might have metadata files in a `_metadata.zip` + // It's a bit tricky to support this in the general case + // but also largely unnecessary except in the case of error + // files. + zr, err := zip.OpenReader(path.Join(pipestance, "_metadata.zip")) + if err != nil { + return + } + defer zr.Close() + for _, zf := range zr.File { + if zf.FileInfo().IsDir() { + continue + } + bn := path.Base(zf.Name) + if bn == "_assert" || bn == "_error" { + if content := readErrorFromZip(zf); content != "" { + efr := errorFile{ + path: zf.Name, + content: content, + } + for _, c := range errFiles { + c <- efr + } + return + } + } + } +} + +func readErrorFile(p string) string { + content, err := os.ReadFile(path.Join(p, "_assert")) + if err == nil { + return string(bytes.TrimSpace(content)) + } + content, err = os.ReadFile(path.Join(p, "_errors")) + if err != nil { + return "" + } + content = bytes.TrimSpace(content) + if string(content) == "Caught signal terminated" { + // Usually, this is what you get when `mrp` shuts down + // due to some other stage encountering an error. + // It's not helpful to report it as "the" error. + return "" + } + return string(content) +} + +func readErrorFromZip(zf *zip.File) string { + zfr, err := zf.Open() + if err != nil { + return "" + } + content, err := io.ReadAll(zfr) + zfr.Close() + if err != nil { + return "" + } + content = bytes.TrimSpace(content) + if string(content) == "Caught signal terminated" && + path.Base(zf.Name) == "_errors" { + return "" + } + return string(content) +} + +type fileContentExtractor struct { + filter FileFilter + conv converter.Converter + paths []string +} + +func (f *fileContentExtractor) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(struct { + Filter FileFilter `json:"filter"` + Conv converter.Converter `json:"converter,omitempty"` + Paths []string `json:"paths"` + }{ + Filter: f.filter, + Conv: f.conv, + Paths: f.paths, + }) + if err != nil { + return nil, err + } + return append(append([]byte(`{"file_content":`), b...), '}'), nil +} + +// Start implements ValueExtractor. +func (f *fileContentExtractor) Start(ctx context.Context, _ ValueContext, + fc *FileContext, result chan<- any) { + if fc.files == nil { + fc.files = make(multiFileResultMap) + } + fc.files.getSink(f.paths).subscribe(f.filter, f.conv, result) +} + +func (f *fileContentExtractor) RequiresPipeline() bool { + return !path.IsAbs(f.paths[0]) +} + +func (fileContentExtractor) RequiresFailure() bool { + return false +} + +func (f *fileContentExtractor) RequiresSuccess() bool { + return f.RequiresPipeline() +} + +var globKeyRegex = regexp.MustCompile(`\$\{([^}]+)\}`) + +func appendGlobKeys(keys []string, p string) []string { + for _, m := range globKeyRegex.FindAllStringSubmatch(p, -1) { + keys = append(keys, m[1]) + } + return keys +} + +func (f *fileContentExtractor) RequiredGlobKeys() []string { + if !f.RequiresPipeline() { + return nil + } + var keys []string + for _, p := range f.paths { + keys = appendGlobKeys(keys, p) + } + return keys +} + +func (f *fileContentExtractor) withGlob(globs map[string]string) ValueExtractor { + keys := f.RequiredGlobKeys() + if len(keys) == 0 { + return f + } + replacements := make([]string, 0, 2*len(keys)) + for _, key := range keys { + replace, ok := globs[key] + if !ok { + panic("this should have failed configuration validation") + } + replacements = append(replacements, "${"+key+"}", replace) + } + replacer := strings.NewReplacer(replacements...) + newPaths := make([]string, len(f.paths)) + for i, p := range f.paths { + newPaths[i] = replacer.Replace(p) + } + return &fileContentExtractor{ + filter: f.filter, + conv: f.conv, + paths: newPaths, + } +} + +func (fileContentExtractor) BucketsOptional() bool { return false } + +func MakeAbsFile(ps []string, conv converter.Converter, + filter FileFilter) ValueExtractor { + return &fileContentExtractor{ + filter: filter, + conv: conv, + paths: ps, + } +} + +type stageRelativeExtractor struct { + simpleExtractor + filter FileFilter + conv converter.Converter + paths []string +} + +func (f *stageRelativeExtractor) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(struct { + Filter FileFilter `json:"filter"` + Conv converter.Converter `json:"converter,omitempty"` + Paths []string `json:"paths"` + Rel bool `json:"stage_relative"` + }{ + Filter: f.filter, + Conv: f.conv, + Paths: f.paths, + Rel: true, + }) + if err != nil { + return nil, err + } + return append(append([]byte(`{"file_content":`), b...), '}'), nil +} + +func (f *stageRelativeExtractor) Start(ctx context.Context, _ ValueContext, + fc *FileContext, result chan<- any) { + fc.stageRelative(f.paths).subscribe(f.filter, f.conv, result) +} + +func (stageRelativeExtractor) RequiresPipeline() bool { return true } + +type errorContentExtractor struct { + simpleExtractor + filter *LineFilter +} + +func (ec errorContentExtractor) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(ec.filter) + if err != nil { + return nil, err + } + return append(append([]byte(`{"error_content":`), b...), '}'), nil +} + +func (e errorContentExtractor) RequiresFailure() bool { + return true +} + +func (e errorContentExtractor) RequiresPipeline() bool { + return true +} + +// Start implements ValueExtractor. +func (e errorContentExtractor) Start(ctx context.Context, _ ValueContext, + fc *FileContext, result chan<- any) { + r := fc.errorFile() + go func(result chan<- any, r <-chan errorFile) { + defer close(result) + select { + case ef := <-r: + if m, ok := e.filter.compile().matchContent(ef.content); ok { + result <- m + } + case <-ctx.Done(): + } + }(result, r) +} + +func isErrors(paths []string) bool { + if len(paths) == 1 { + if paths[0] == "_errors" || paths[0] == "_assert" { + return true + } + } else if len(paths) == 2 { + if paths[0] == "_errors" && paths[1] == "_assert" || + paths[0] == "_assert" && paths[1] == "_errors" { + return true + } + } + return false +} + +func validateFilterType(filter FileFilter) { + switch filter.(type) { + case *LineFilter: + case JsonPathFilter: + default: + panic(fmt.Sprintf("invalid filter type %T", filter)) + } +} + +func MakeRelativeFile(paths []string, stageRel bool, + conv converter.Converter, filter FileFilter) (ValueExtractor, error) { + validateFilterType(filter) + if stageRel { + if isErrors(paths) { + // Special case this for a couple of reasons. + // One is that we want to error out in config validation + // if someone looks for this in non-failure situations. + // Another is that we have special-case code for looking + // at the errors files because we want to ignore the + // "Caught signal terminate" errors. + lf, ok := filter.(*LineFilter) + if !ok { + return nil, errors.New("only line filters are permitted for error files") + } + if conv != nil { + return nil, errors.New("converters are not supported for error files") + } + return errorContentExtractor{ + filter: lf, + }, nil + } + return &stageRelativeExtractor{ + paths: paths, + filter: filter, + conv: conv, + }, nil + } + + return &fileContentExtractor{ + paths: paths, + filter: filter, + conv: conv, + }, nil +} + +type fileFlagExtractor struct { + simpleExtractor + filter FileFilter + conv converter.Converter + flag string +} + +func (f *fileFlagExtractor) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(struct { + Filter FileFilter `json:"filter"` + Conv converter.Converter `json:"converter,omitempty"` + Flag string `json:"flag"` + }{ + Filter: f.filter, + Conv: f.conv, + Flag: f.flag, + }) + if err != nil { + return nil, err + } + return append(append([]byte(`{"file_content":`), b...), '}'), nil +} + +var getWd = sync.OnceValue(func() string { + dir, _ := os.Getwd() + return dir +}) + +func (f *fileFlagExtractor) Start(ctx context.Context, vc ValueContext, + fc *FileContext, result chan<- any) { + for _, arg := range vc.CommandLine() { + flag, value, ok := strings.Cut(arg, "=") + if !ok { + continue + } + if flag == f.flag { + if value == "" { + close(result) + return + } + if path.IsAbs(value) { + value = path.Clean(value) + } else if cwd := getWd(); cwd != "" { + value = path.Join(cwd, value) + } + if fc.files == nil { + fc.files = make(multiFileResultMap) + } + fc.files.getSink([]string{value}).subscribe( + f.filter, f.conv, result) + return + } + } + close(result) +} + +func MakeFileFlag(flag string, + conv converter.Converter, filter FileFilter) ValueExtractor { + return &fileFlagExtractor{ + filter: filter, + conv: conv, + flag: flag, + } +} diff --git a/lib/go/telemetry/collector/flag.go b/lib/go/telemetry/collector/flag.go new file mode 100644 index 0000000..1f0ee7f --- /dev/null +++ b/lib/go/telemetry/collector/flag.go @@ -0,0 +1,59 @@ +package collector + +import ( + "context" + "encoding/json" + "os" + "strings" +) + +type flagExtractor struct { + simpleExtractor + flag string + mro bool +} + +func (f *flagExtractor) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(f.flag) + if err != nil { + return nil, err + } + if f.mro { + return append(append([]byte(`{"mro_flag":`), b...), '}'), nil + } else { + return append(append([]byte(`{"flag":`), b...), '}'), nil + } +} + +func (f *flagExtractor) Start(_ context.Context, + vc ValueContext, _ *FileContext, result chan<- any) { + defer close(result) + if f.mro { + for _, flag := range vc.MroFlags() { + if before, after, found := strings.Cut(flag, "="); found && before == f.flag { + result <- after + return + } + } + for _, flag := range strings.Fields(os.Getenv("MROFLAGS")) { + if before, after, found := strings.Cut(flag, "="); found && before == f.flag { + result <- after + return + } + } + return + } + for _, flag := range vc.CommandLine() { + if before, after, found := strings.Cut(flag, "="); found && before == f.flag { + result <- after + return + } + } +} + +func MakeFlag(flag string, mro bool) ValueExtractor { + return &flagExtractor{ + flag: flag, + mro: mro, + } +} diff --git a/lib/go/telemetry/collector/glibc.go b/lib/go/telemetry/collector/glibc.go new file mode 100644 index 0000000..385f233 --- /dev/null +++ b/lib/go/telemetry/collector/glibc.go @@ -0,0 +1,17 @@ +package collector + +// #include +import "C" +import "context" + +type glibcExtractor struct{ simpleExtractor } + +func (glibcExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"glibc"}`), nil +} + +// Start implements ValueExtractor. +func (glibcExtractor) Start(_ context.Context, _ ValueContext, _ *FileContext, result chan<- any) { + defer close(result) + result <- C.GoString(C.gnu_get_libc_version()) +} diff --git a/lib/go/telemetry/collector/group_count.go b/lib/go/telemetry/collector/group_count.go new file mode 100644 index 0000000..9790c4b --- /dev/null +++ b/lib/go/telemetry/collector/group_count.go @@ -0,0 +1,29 @@ +package collector + +import "context" + +// MakeRecentCounter returns a ValueExtractor to count recent events +// from the given group. +func MakeRecentCounter(group string) ValueExtractor { + return &recentCountExtractor{groupName: group} +} + +type recentCountExtractor struct { + simpleExtractor + groupName string +} + +func (recentCountExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"recent_count"}`), nil +} + +func (f *recentCountExtractor) Start(ctx context.Context, + vc ValueContext, _ *FileContext, result chan<- any) { + go func(result chan<- any, name string) { + defer close(result) + c, ok := vc.RecentCount(name) + if ok { + result <- c + } + }(result, f.groupName) +} diff --git a/lib/go/telemetry/collector/rlimit.go b/lib/go/telemetry/collector/rlimit.go new file mode 100644 index 0000000..ff73e7a --- /dev/null +++ b/lib/go/telemetry/collector/rlimit.go @@ -0,0 +1,48 @@ +package collector + +import ( + "context" + "encoding/json" + + "golang.org/x/sys/unix" +) + +type rlimitCollector struct { + simpleExtractor + resource int + hard bool +} + +func (r *rlimitCollector) MarshalJSON() ([]byte, error) { + return json.Marshal(struct { + Res int `json:"rlimit"` + Hard bool `json:"hard,omitempty"` + }{ + Res: r.resource, + Hard: r.hard, + }) +} + +// Get implements ValueExtractor. +func (r *rlimitCollector) Start(_ context.Context, + _ ValueContext, _ *FileContext, result chan<- any) { + go func(result chan<- any) { + defer close(result) + var rlim unix.Rlimit + if err := unix.Getrlimit(r.resource, &rlim); err != nil { + return + } + if r.hard { + result <- rlim.Max + } else { + result <- rlim.Cur + } + }(result) +} + +func MakeRlimit(resource int, hard bool) ValueExtractor { + return &rlimitCollector{ + resource: resource, + hard: hard, + } +} diff --git a/lib/go/telemetry/collector/special.go b/lib/go/telemetry/collector/special.go new file mode 100644 index 0000000..e99b259 --- /dev/null +++ b/lib/go/telemetry/collector/special.go @@ -0,0 +1,175 @@ +package collector + +import ( + "bytes" + "context" + "fmt" + "path" + "regexp" + "strings" + + "golang.org/x/sys/unix" +) + +func MakeSpecial(name string) (ValueExtractor, error) { + switch name { + case "glibc": + return glibcExtractor{}, nil + case "kernel": + return kernelExtractor{}, nil + case "subcommand": + return new(subcommandExtractor), nil + case "runtime": + return new(runtimeExtractor), nil + case "distro": + return new(distroExtractor), nil + case "container": + return new(containerExtractor), nil + case "success": + return new(successExtractor), nil + case "failed_stage": + return new(failedStageExtractor), nil + } + return nil, fmt.Errorf("unknown special collector type %s", name) +} + +// Unit struct to be embedded in othe extractor types to avoid re-implementing +// common functions all over the place. +type simpleExtractor struct{} + +func (simpleExtractor) RequiredGlobKeys() []string { + return nil +} + +// Because functions from embedded types don't have access to the object +// they're embedded in, this can't just return that object by default, +// so we just return nil and let the public `WithGlob` function deal with it, +// to avoid needing to reimplement this everywhere. +func (simpleExtractor) withGlob(map[string]string) ValueExtractor { + return nil +} + +func (simpleExtractor) RequiresPipeline() bool { + return false +} + +func (simpleExtractor) RequiresSuccess() bool { + return false +} + +func (simpleExtractor) RequiresFailure() bool { + return false +} + +func (simpleExtractor) BucketsOptional() bool { + return false +} + +type noBucketsExtractor struct{ simpleExtractor } + +func (noBucketsExtractor) BucketsOptional() bool { + return true +} + +type kernelExtractor struct{ simpleExtractor } + +func (kernelExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"kernel"}`), nil +} + +var semverRegex = regexp.MustCompile(`\d+\.\d+`) + +func (kernelExtractor) Start(_ context.Context, _ ValueContext, _ *FileContext, result chan<- any) { + go func(result chan<- any) { + defer close(result) + var buf unix.Utsname + if unix.Uname(&buf) != nil { + return + } + beforeNull, _, _ := bytes.Cut(buf.Release[:], []byte{0}) + if v := semverRegex.Find(beforeNull); len(v) > 0 { + result <- string(v) + } + }(result) +} + +type subcommandExtractor struct{ noBucketsExtractor } + +func (subcommandExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"subcommand"}`), nil +} + +func (subcommandExtractor) Start(_ context.Context, + vc ValueContext, _ *FileContext, result chan<- any) { + defer close(result) + if cl := vc.CommandLine(); len(cl) > 0 { + result <- cl[0] + } +} + +type runtimeExtractor struct{ simpleExtractor } + +func (runtimeExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"runtime"}`), nil +} + +func (runtimeExtractor) Start(_ context.Context, + vc ValueContext, _ *FileContext, result chan<- any) { + defer close(result) + if rt := vc.Runtime(); rt != 0 { + result <- rt.Seconds() + } +} + +func (runtimeExtractor) RequiresPipeline() bool { + return true +} + +type successExtractor struct{ noBucketsExtractor } + +func (successExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"success"}`), nil +} + +func (successExtractor) RequiresPipeline() bool { + return true +} + +// Start implements ValueExtractor. +func (successExtractor) Start(_ context.Context, + vc ValueContext, _ *FileContext, result chan<- any) { + defer close(result) + result <- vc.Success() +} + +type failedStageExtractor struct{ noBucketsExtractor } + +func (failedStageExtractor) MarshalJSON() ([]byte, error) { + return []byte(`{"special":"failed_stage"}`), nil +} + +// Start implements ValueExtractor. +func (f *failedStageExtractor) Start(ctx context.Context, + vc ValueContext, fc *FileContext, result chan<- any) { + r := fc.errorFile() + go func(result chan<- any, r <-chan errorFile) { + defer close(result) + select { + case ef := <-r: + result <- stagePathToFqid(ef.path) + case <-ctx.Done(): + } + }(result, r) +} + +func stagePathToFqid(s string) string { + return strings.ReplaceAll(path.Dir(path.Dir(s)), "/", ".") +} + +func (failedStageExtractor) RequiresPipeline() bool { + return true +} + +func (failedStageExtractor) RequiresFailure() bool { + return true +} diff --git a/lib/go/telemetry/collector/value.go b/lib/go/telemetry/collector/value.go new file mode 100644 index 0000000..20fe280 --- /dev/null +++ b/lib/go/telemetry/collector/value.go @@ -0,0 +1,85 @@ +package collector + +import ( + "context" + "encoding/json" + "time" +) + +// This allows e.g. command line flags to be passed in to +// the value extractor. +type ValueContext interface { + CommandLine() []string + MroFlags() []string + PipestanceDir() string + Runtime() time.Duration + MrpHasRun() bool + Success() bool + RecentCount(group string) (int, bool) +} + +// A source of metric data. +// +// This gets a little bit complicated because of performance requirements. +// We need to be able to collect multiple values in parallel. +// It is also going to be fairly common for the source of multiple +// metric values to involve shared work, +// e.g. different keys from the same json file, +// or different files in the same cgroup controller. +// We also need to support timeouts. +// There is also context that needs to be passed down from +// the top level, e.g. command line flags, pipestance location, +// etc. +type ValueExtractor interface { + json.Marshaler + + // Begin the search for value data. + // + // Implementations MUST close the result channel, + // either synchronously or from a goroutine they start. + // + // Implementations SHOULD supply at most one value as + // a result on the channel. + // They MAY supply that result synchronously. + // It therefore follows that callers SHOULD supply a channel + // with a capacity of one. + // If they do not, then there MUST be some other goroutine + // reading from the channel. + // + // Implementations SHOULD start a goroutine to produce + // results and return them on the given channel if producing + // the result may block, e.g. if making a syscall. + // + // Implementations MUST NOT call any methods on the + // `FileContext` after it returns (e.g. from a + // goroutine that it starts). + // + // Implementations MUST NOT synchronously block on + // any result channels returned by the `FileContext`. + Start(ctx context.Context, vc ValueContext, + fc *FileContext, result chan<- any) + + // If true, this collector is only valid when a pipestance has completed. + RequiresPipeline() bool + // If true, this collector is only valid when a pipestance + // has completed successfully. + RequiresSuccess() bool + // If true, this collector is only valid when a pipestance + // has completed with a failure. + RequiresFailure() bool + // If non-empty, this collector expects the metric group(s) + // that it participates in to have the given glob keys defined. + RequiredGlobKeys() []string + + withGlob(map[string]string) ValueExtractor + + // Returns true if buckets are optional for this metric. + BucketsOptional() bool +} + +func WithGlob(ve ValueExtractor, globs map[string]string) ValueExtractor { + if r := ve.withGlob(globs); r != nil { + return r + } + return ve +} diff --git a/lib/go/telemetry/config/bucket.go b/lib/go/telemetry/config/bucket.go new file mode 100644 index 0000000..cb52ac5 --- /dev/null +++ b/lib/go/telemetry/config/bucket.go @@ -0,0 +1,600 @@ +package config + +import ( + "bytes" + "cmp" + "encoding/json" + "errors" + "fmt" + "math" + "regexp" + "slices" + "sort" + "strconv" + "strings" +) + +func nTrue(b ...bool) int { + n := 0 + for _, v := range b { + if v { + n++ + } + } + return n +} + +func (pc *BucketSpec) compile(name string) (Bucketizer, error) { + // Ensure we have exactly one option set. + nOpt := nTrue( + len(pc.Thresholds) > 0, + pc.Range != nil, + pc.Exponential != nil, + len(pc.Semver) > 0, + pc.Bool, + pc.Float, + len(pc.Match) > 0, + ) + + if nOpt > 1 { + return nil, fmt.Errorf( + "%w %s: more than one option set: %+v", + BucketConfigurationError, + name, + *pc, + ) + } + + if len(pc.Thresholds) > 0 { + return thresholdBuckets(name, pc.Thresholds) + } + if pc.Range != nil { + return pc.compileRange(name) + } + if pc.Exponential != nil { + return pc.complileExponential(name) + } + if len(pc.Semver) > 0 { + return pc.compileSemver(name) + } + if len(pc.Match) > 0 { + return pc.compileMatch(name) + } + if pc.Bool { + return boolBuckets{}, nil + } + if pc.Float { + return rawFloat{}, nil + } + return nil, fmt.Errorf("%w %s: must specify bucket parameters", + BucketConfigurationError, name) +} + +func (pc *BucketSpec) compileRange(name string) (Bucketizer, error) { + if pc.Range.Buckets == 0 { + pc.Range.Buckets = 10 + } else if pc.Range.Buckets < 1 { + return nil, fmt.Errorf("%w %s: invalid bucket count %d", + BucketConfigurationError, name, pc.Range.Buckets) + } else if pc.Range.Buckets > 20 { + return nil, fmt.Errorf("%w %s: too many buckets %d", + BucketConfigurationError, name, pc.Range.Buckets) + } + bucketSize := (pc.Range.Max - pc.Range.Min) / float64(pc.Range.Buckets) + if !(bucketSize > 0) { // catch NaN as well here + return nil, fmt.Errorf("%w %s: max <= min", + BucketConfigurationError, name) + } + thresholds := make([]float64, pc.Range.Buckets+1) + thresholds[0] = pc.Range.Min + for i, v := range thresholds[:len(thresholds)-1] { + thresholds[i+1] = v + bucketSize + } + // Set explicitly because of the potential for round-off error + thresholds[len(thresholds)-1] = pc.Range.Max + return thresholdBuckets(name, thresholds) +} + +func (pc *BucketSpec) complileExponential(name string) (Bucketizer, error) { + if !(pc.Exponential.Min > math.SmallestNonzeroFloat32) { + return nil, fmt.Errorf( + "%w %s: invalid exponential min %g", + BucketConfigurationError, name, pc.Exponential.Min) + } + if !(pc.Exponential.Multiple >= 2) { + return nil, fmt.Errorf( + "%w %s: invalid exponential multiple %g", + BucketConfigurationError, name, pc.Exponential.Multiple) + } + if pc.Exponential.Max == 0 { + return &unboundedExponentialBuckets{ + Min: pc.Exponential.Min, + Multiple: pc.Exponential.Multiple, + }, nil + } + if !(pc.Exponential.Max > pc.Exponential.Min*pc.Exponential.Multiple) { + return nil, fmt.Errorf( + "%w %s: max %g too small compared to min %g", + BucketConfigurationError, name, + pc.Exponential.Max, pc.Exponential.Min) + } + // estimate required bucket count + bucketCount := int(math.Ceil(math.Log(pc.Exponential.Max/pc.Exponential.Min) / + math.Log(pc.Exponential.Multiple))) + thresholds := make([]float64, 1, bucketCount+1) + thresholds[0] = pc.Exponential.Min + for thresholds[len(thresholds)-1] < pc.Exponential.Max { + thresholds = append(thresholds, + thresholds[len(thresholds)-1]*pc.Exponential.Multiple) + } + // Round-off error, or in case the max threshold is not aligned to + // a multiple of min. + thresholds[len(thresholds)-1] = pc.Exponential.Max + if len(thresholds) > 2 && + (pc.Exponential.Max-thresholds[len(thresholds)-2] < pc.Exponential.Min) { + thresholds = thresholds[:len(thresholds)-1] + thresholds[len(thresholds)-1] = pc.Exponential.Max + } + return thresholdBuckets(name, thresholds) +} + +// thresholdBuckets includes common checks and implementation for floatBuckets. +// When a range or bounded exponential is encountered, it is compiled to a +// standard float bucket to cannonicalize the representation. +func thresholdBuckets(name string, thresholds []float64) (Bucketizer, error) { + if len(thresholds) < 2 { + return nil, fmt.Errorf("%w %s: at least two buckets required", + BucketConfigurationError, name) + } + sort.Float64s(thresholds) + for i, v := range thresholds { + if math.IsNaN(v) { + return nil, fmt.Errorf("%w %s: threshold value is not a number", + BucketConfigurationError, name) + } + if math.IsInf(v, 0) { + return nil, fmt.Errorf("%w %s: threshold value is not finite", + BucketConfigurationError, name) + } + if i > 0 { + diff := v - thresholds[i-1] + if diff < math.SmallestNonzeroFloat32 { + return nil, fmt.Errorf( + "%w %s: threshold values %g and %g are too close together", + BucketConfigurationError, name, + thresholds[i-1], v) + } + } + } + return &floatBuckets{thresholds: thresholds}, nil +} + +type floatBuckets struct { + thresholds []float64 +} + +func (f *floatBuckets) bucket(v float64) any { + for i, t := range f.thresholds { + if t > v { + if i == 0 { + return fmt.Sprintf("<%g", t) + } + return fmt.Sprintf("%g-%g", f.thresholds[i-1], t) + } + } + if f.thresholds[len(f.thresholds)-1] == v { + return fmt.Sprintf("%g", + f.thresholds[len(f.thresholds)-1]) + } + + return fmt.Sprintf(">%g", + f.thresholds[len(f.thresholds)-1]) +} + +func coerceFloat(value any) any { + if value == nil { + return nil + } + switch v := value.(type) { + case float64: + if math.IsNaN(v) { + return "NaN" + } else if math.IsInf(v, -1) { + return "-Inf" + } else if math.IsInf(v, 1) { + return "Inf" + } + return v + case float32: + return coerceFloat(float64(v)) + case int: + return coerceFloat(float64(v)) + case uint: + return coerceFloat(float64(v)) + case int8: + return coerceFloat(float64(v)) + case uint8: + return coerceFloat(float64(v)) + case int16: + return coerceFloat(float64(v)) + case uint16: + return coerceFloat(float64(v)) + case int32: + return coerceFloat(float64(v)) + case uint32: + return coerceFloat(float64(v)) + case int64: + return coerceFloat(float64(v)) + case uint64: + return coerceFloat(float64(v)) + case string: + v = strings.TrimSpace(v) + if n, err := strconv.ParseFloat(v, 64); err != nil { + return "NaN" + } else { + return coerceFloat(n) + } + case json.Number: + if n, err := v.Float64(); err != nil { + return "NaN" + } else { + return coerceFloat(n) + } + case json.RawMessage: + v = bytes.TrimSpace(v) + if len(v) == 0 { + return nil + } + if v[0] == '"' { + var s string + if json.Unmarshal(v, &s) == nil { + return coerceFloat(s) + } + } + if string(v) == "true" || string(v) == "false" { + return "NaN" + } + if string(v) == "null" { + return nil + } + return coerceFloat(json.Number(v)) + case []byte: + return coerceFloat(string(bytes.TrimSpace(v))) + } + return "NaN" +} + +func (f *floatBuckets) Bucket(value any) any { + value = coerceFloat(value) + if value == nil { + return nil + } + if v, ok := value.(float64); ok { + return f.bucket(v) + } + return value +} + +func (f *floatBuckets) MarshalJSON() ([]byte, error) { + return json.Marshal(struct { + Thresholds []float64 `json:"thresholds"` + }{f.thresholds}) +} + +func (floatBuckets) private() {} + +type unboundedExponentialBuckets struct { + Min float64 `json:"min"` + Multiple float64 `json:"multiple"` +} + +func (u *unboundedExponentialBuckets) bucket(v float64) any { + if v < u.Min { + return fmt.Sprintf("<%g", u.Min) + } + bound := u.Min + for bound*u.Multiple <= v { + bound *= u.Multiple + } + return fmt.Sprintf(">=%g", bound) +} + +// Bucket implements Bucketizer. +func (u *unboundedExponentialBuckets) Bucket(value any) any { + value = coerceFloat(value) + if v, ok := value.(float64); ok { + return u.bucket(v) + } + return value +} + +func (u *unboundedExponentialBuckets) MarshalJSON() ([]byte, error) { + return json.Marshal(struct { + Exp unboundedExponentialBuckets `json:"exponential"` + }{*u}) +} + +func (unboundedExponentialBuckets) private() {} + +func (pc *BucketSpec) compileSemver(name string) (Bucketizer, error) { + th := make([][2]int, len(pc.Semver)) + for i, ver := range pc.Semver { + maj, min, ok := strings.Cut(strings.TrimSpace(ver), ".") + if !ok { + return nil, fmt.Errorf("%w %s: version %q did not contain a .", + BucketConfigurationError, name, ver) + } + mav, err := strconv.Atoi(maj) + if err != nil { + return nil, fmt.Errorf("%w %s: invalid major version %q: %w", + BucketConfigurationError, name, maj, err) + } + miv, err := strconv.Atoi(min) + if err != nil { + return nil, fmt.Errorf("%w %s: invalid minor version %q: %w", + BucketConfigurationError, name, min, err) + } + th[i] = [2]int{mav, miv} + } + slices.SortFunc(th, func(a, b [2]int) int { + if x := cmp.Compare(a[0], b[0]); x != 0 { + return -x + } + return -cmp.Compare(a[1], b[1]) + }) + for i, v := range pc.Semver[1:] { + if v == pc.Semver[i] { + return nil, fmt.Errorf("%w %s: duplicate version %d.%d", + BucketConfigurationError, name, v[0], v[1]) + } + } + return &semverBuckets{ + thresholds: th, + }, nil +} + +type semverBuckets struct { + thresholds [][2]int +} + +var semverRe = regexp.MustCompile(`^(\d+)\.(\d+)(?:$|[a-z._-])`) + +func coerceString(value any) (string, bool) { + switch v := value.(type) { + case string: + return v, true + case json.RawMessage: + var s string + if json.Unmarshal(v, &s) == nil { + return s, true + } + case []byte: + return string(v), true + } + return "", false +} + +func (s *semverBuckets) Bucket(value any) any { + if value == nil { + return nil + } + v, ok := coerceString(value) + if !ok { + return nil + } + m := semverRe.FindStringSubmatch(strings.TrimSpace(v)) + if len(m) < 3 { + return "invalid" + } + maj, err := strconv.Atoi(m[1]) + if err != nil { + return "invalid" + } + min, err := strconv.Atoi(m[2]) + if err != nil { + return "invalid" + } + + for _, t := range s.thresholds { + if t[0] < maj || t[0] == maj && t[1] <= min { + return fmt.Sprintf(">=%d.%d", t[0], t[1]) + } + } + return fmt.Sprintf("<%d.%d", + s.thresholds[len(s.thresholds)-1][0], + s.thresholds[len(s.thresholds)-1][1]) +} + +func (s *semverBuckets) MarshalJSON() ([]byte, error) { + th := make([]string, len(s.thresholds)) + for i, t := range s.thresholds { + th[i] = fmt.Sprintf("%d.%d", t[0], t[1]) + } + return json.Marshal(struct { + Sv []string `json:"semver_thresholds"` + }{th}) +} + +func (semverBuckets) private() {} + +func (pc *BucketSpec) compileMatch(name string) (Bucketizer, error) { + var errs []error + buckets := make([]compiledReBucket, len(pc.Match)) + for i, exp := range pc.Match { + if re, err := regexp.Compile(exp.Exp); err != nil { + errs = append(errs, fmt.Errorf("%q: %w", exp.Exp, err)) + } else { + if exp.Key == "" { + buckets[i] = compiledReBucket{ + RegexpBucket: RegexpBucket{ + Key: exp.Exp, + Exp: exp.Exp, + }, + re: re, + } + } else { + buckets[i] = compiledReBucket{ + RegexpBucket: exp, + re: re, + } + } + } + } + if len(errs) > 0 { + return nil, fmt.Errorf("%w %s: %w", BucketConfigurationError, + name, errors.Join(errs...)) + } + return ®exBuckets{ + buckets: buckets, + }, nil +} + +type compiledReBucket struct { + RegexpBucket + re *regexp.Regexp +} + +type regexBuckets struct { + buckets []compiledReBucket +} + +// Bucket implements Bucketizer. +func (r *regexBuckets) Bucket(value any) any { + if value == nil { + return nil + } + v, ok := coerceString(value) + if !ok { + return nil + } + for _, b := range r.buckets { + if b.re.MatchString(v) { + return b.Key + } + } + return "unknown" +} + +// MarshalJSON implements Bucketizer. +func (r *regexBuckets) MarshalJSON() ([]byte, error) { + return json.Marshal(struct { + Match []compiledReBucket `json:"match"` + }{r.buckets}) +} + +func (regexBuckets) private() {} + +type boolBuckets struct{} + +func (boolBuckets) Bucket(value any) any { + if value == nil { + return nil + } + switch v := value.(type) { + case bool: + return v + case string: + if v == "" || strings.EqualFold(v, "false") { + return false + } + return true + case float64: + if v == 0 { + return false + } + return true + case float32: + if v == 0 { + return false + } + return true + case int: + if v == 0 { + return false + } + return true + case uint: + if v == 0 { + return false + } + return true + case int8: + if v == 0 { + return false + } + return true + case uint8: + if v == 0 { + return false + } + return true + case int16: + if v == 0 { + return false + } + return true + case uint16: + if v == 0 { + return false + } + return true + case int32: + if v == 0 { + return false + } + return true + case uint32: + if v == 0 { + return false + } + return true + case int64: + if v == 0 { + return false + } + return true + case uint64: + if v == 0 { + return false + } + return true + case json.RawMessage: + v = bytes.TrimSpace(v) + if string(v) == "null" { + return nil + } + var uv any + if json.Unmarshal(v, &uv) == nil { + return boolBuckets{}.Bucket(uv) + } + case []byte: + return boolBuckets{}.Bucket(string(v)) + } + return true +} + +func (boolBuckets) MarshalJSON() ([]byte, error) { + return []byte(`{"boolean": true}`), nil +} + +func (boolBuckets) private() {} + +type rawFloat struct { +} + +func (f rawFloat) Bucket(value any) any { + value = coerceFloat(value) + if value == nil { + return nil + } + if v, ok := value.(float64); ok { + return v + } + return value +} + +func (f rawFloat) MarshalJSON() ([]byte, error) { + return []byte(`{"float": true}`), nil +} + +func (rawFloat) private() {} diff --git a/lib/go/telemetry/config/compile.go b/lib/go/telemetry/config/compile.go new file mode 100644 index 0000000..42bef85 --- /dev/null +++ b/lib/go/telemetry/config/compile.go @@ -0,0 +1,393 @@ +package config + +import ( + "context" + "crypto/sha256" + "encoding/json" + "errors" + "fmt" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/10XDev/cellranger/lib/go/telemetry/collector" +) + +type CompiledConfig struct { + ConfigVersion int `json:"config_version"` + ConfigTime time.Time `json:"config_time"` + Product string `json:"product"` + Version string `json:"version"` + Groups map[string]*MetricGroup +} + +// A compiled, validated metric group. +type MetricGroup struct { + MetricGroupConfig + Metrics SortedMetricMap +} + +func (g *MetricGroup) Hash() [sha256.Size]byte { + hashContent, err := json.Marshal(g) + if err != nil { + panic(err) + } + return sha256.Sum256(hashContent) +} + +// A compiled metric. +type Metric struct { + Name string + Source ValueExtractor + Bucket Bucketizer + get func() any +} + +// A source of metric data. +type ValueExtractor = collector.ValueExtractor + +// Converts a raw metric to a bucketed value. +type Bucketizer interface { + json.Marshaler + + // Converts a raw metric source to a bucketed value. + Bucket(any) any + + // Cannot be implemented outside of this package. + private() +} + +func (m *Metric) WithGlob(globs map[string]string) *Metric { + if ve := collector.WithGlob(m.Source, globs); ve == m.Source { + return m + } else { + return &Metric{ + Name: m.Name, + Source: ve, + Bucket: m.Bucket, + } + } +} + +func (m *Metric) Start(ctx context.Context, vc collector.ValueContext, fc *collector.FileContext) { + result := make(chan any, 1) + m.Source.Start(ctx, vc, fc, result) + m.get = sync.OnceValue(func() any { + select { + case r := <-result: + if r == nil { + return nil + } + if m.Bucket != nil { + return m.Bucket.Bucket(r) + } + return r + case <-ctx.Done(): + return nil + } + }) +} + +func (m *Metric) Get() any { + if m.get == nil { + panic("Get called without a call to Start") + } + return m.get() +} + +var ( + GroupConfigurationError = errors.New("invalid group") + MetricConfigurationError = errors.New("invalid metric") + BucketConfigurationError = errors.New("invalid bucketization") +) + +const ( + WhenCommand = "command" + WhenSuccess = "success" + WhenFailure = "failure" +) + +// Compile validates a config and converts it to a canonical +// form to be used in actually collecting metrics. +func (c *Config) Compile() (CompiledConfig, error) { + var errs []error + if c.ConfigVersion < 0 { + errs = append(errs, fmt.Errorf("invalid version %d", + c.ConfigVersion)) + } + if c.Product == "" { + errs = append(errs, errors.New("product not specified")) + } + if c.Version == "" { + errs = append(errs, errors.New("version not specified")) + } + if len(c.Groups) == 0 { + errs = append(errs, errors.New("no groups specified")) + } + if len(c.Metrics) == 0 { + errs = append(errs, errors.New("no metrics specified")) + } + cc := CompiledConfig{ + ConfigVersion: c.ConfigVersion, + ConfigTime: c.ConfigTime, + Product: c.Product, + Version: c.Version, + Groups: make(map[string]*MetricGroup, len(c.Groups)), + } + for n, mg := range c.Groups { + g, err := mg.compile(n) + if err != nil { + errs = append(errs, err) + continue + } + if n == "" { + errs = append(errs, fmt.Errorf("%w: blank group name", + GroupConfigurationError)) + } + cc.Groups[n] = g + } + var presets map[string]Bucketizer + if len(c.Presets) > 0 { + presets = make(map[string]Bucketizer, len(c.Presets)) + for n, pc := range c.Presets { + if p, err := pc.compile(n); err != nil { + errs = append(errs, err) + } else { + presets[n] = p + } + } + } + for _, mc := range c.Metrics { + m, err := mc.compile(presets) + if err != nil { + errs = append(errs, err) + continue + } + for _, gn := range mc.Groups { + g := cc.Groups[gn] + if g == nil { + errs = append(errs, fmt.Errorf( + "%w %s: unknown group %s", + MetricConfigurationError, mc.Name, gn)) + continue + } + if err := g.addMetric(gn, m); err != nil { + errs = append(errs, err) + } + } + } + for name, mg := range cc.Groups { + if len(mg.Metrics) == 0 { + errs = append(errs, fmt.Errorf("%w: no metrics defined for group %s", + GroupConfigurationError, name)) + } + } + return cc, errors.Join(errs...) +} + +func (mg *MetricGroupConfig) compile(name string) (*MetricGroup, error) { + if mg == nil { + return nil, fmt.Errorf("%w %s: null group config", + GroupConfigurationError, name) + } + var errs []error + g := MetricGroup{ + MetricGroupConfig: *mg, + Metrics: make(SortedMetricMap), + } + switch mg.When { + case WhenCommand: + if len(mg.Globs) != 0 { + errs = append(errs, + fmt.Errorf( + "%w %s: globs are not permitted for groups which run on command", + GroupConfigurationError, name)) + } + g.Globs = nil + case WhenSuccess: + if len(mg.Subcommands) == 0 { + errs = append(errs, fmt.Errorf( + "%w %s: success groups must specify a subcommand", + GroupConfigurationError, name)) + } + case WhenFailure: + default: + errs = append(errs, fmt.Errorf( + "%w %s: invalid value %q for when", + GroupConfigurationError, name, mg.When)) + return nil, errors.Join(errs...) + } + for n, glob := range g.Globs { + if n == "" { + errs = append(errs, fmt.Errorf( + "%w %s: empty glob key", + GroupConfigurationError, name)) + } else if glob == "" { + errs = append(errs, fmt.Errorf( + "%w %s: empty glob for key %s", + GroupConfigurationError, name, n, + )) + } else if _, err := filepath.Match(glob, "test"); err != nil { + errs = append(errs, fmt.Errorf( + "%w %s: glob %s: %w", + GroupConfigurationError, name, n, err, + )) + } else if strings.Contains(glob, "..") || strings.HasPrefix(glob, "/") { + errs = append(errs, fmt.Errorf( + "%w %s: glob %s: not relative to pipestance directory", + GroupConfigurationError, name, n, + )) + } + } + return &g, errors.Join(errs...) +} + +func (mg *MetricGroup) addMetric(gn string, m *Metric) error { + var errs []error + if !mg.Metrics.Add(m) { + return fmt.Errorf( + "%w: multiple metrics named %q in group %s", + MetricConfigurationError, + m.Name, gn) + } + if m.Source.RequiresPipeline() { + if m.Source.RequiresSuccess() && mg.When != WhenSuccess { + errs = append(errs, fmt.Errorf( + "%w: metric %s cannot be added to group %s because"+ + " its source is only valid on success, but %s "+ + "triggers on %s", + MetricConfigurationError, + m.Name, gn, gn, mg.When)) + } else if m.Source.RequiresFailure() && mg.When != WhenFailure { + errs = append(errs, fmt.Errorf( + "%w: metric %s cannot be added to group %s because"+ + " its source is only valid on failure, but %s "+ + "triggers on %s", + MetricConfigurationError, + m.Name, gn, gn, mg.When)) + } else if mg.When != WhenSuccess && mg.When != WhenFailure { + errs = append(errs, fmt.Errorf( + "%w: metric %s cannot be added to group %s because"+ + " its source is only valid after a pipeline completes, "+ + "but %s triggers on %s", + MetricConfigurationError, + m.Name, gn, gn, mg.When)) + } + for _, glob := range m.Source.RequiredGlobKeys() { + if v := mg.Globs[glob]; v == "" { + errs = append(errs, fmt.Errorf( + "%w: metric %s cannot be added to group %s because"+ + " its source expects a glob key %s", + MetricConfigurationError, + m.Name, gn, glob)) + } + } + } + return errors.Join(errs...) +} + +func (mc *MetricConfig) checkOneSource() error { + sources := make([]string, 0, 8) + if mc.Special != "" { + sources = append(sources, "special") + } + if mc.Filesystem != nil { + sources = append(sources, "filesystem") + } + if mc.FileContent != nil { + sources = append(sources, "file_content") + } + if mc.FileSize != nil { + sources = append(sources, "file_size") + } + if mc.FileCount != nil { + sources = append(sources, "file_count") + } + if mc.Rlimit != nil { + sources = append(sources, "rlimit") + } + if mc.Flag != "" { + sources = append(sources, "flag") + } + if mc.MroFlag != "" { + sources = append(sources, "mro_flag") + } + if mc.RecentCount != "" { + sources = append(sources, "recent_count") + } + if len(sources) == 0 { + return errors.New("no sources specified") + } else if len(sources) != 1 { + return fmt.Errorf("%d sources specified: %s", + len(sources), strings.Join(sources, ",")) + } + return nil +} + +func (mc *MetricConfig) compileSource() (ValueExtractor, error) { + if err := mc.checkOneSource(); err != nil { + return nil, err + } + switch { + case mc.Special != "": + return getSpecialSource(mc.Special) + case mc.Filesystem != nil: + return mc.Filesystem.compile() + case mc.FileContent != nil: + return mc.FileContent.compile() + case mc.FileSize != nil: + return mc.FileSize.compile(false) + case mc.FileCount != nil: + return mc.FileCount.compile(true) + case mc.Rlimit != nil: + return mc.Rlimit.compile() + case mc.Flag != "": + return compileFlagSource(mc.Flag, false) + case mc.MroFlag != "": + return compileFlagSource(mc.MroFlag, true) + case mc.RecentCount != "": + return compileRecentCountSource(mc.RecentCount, mc.Groups) + } + return nil, errors.New("no sources specified") +} + +func (mc *MetricConfig) compile(presets map[string]Bucketizer) (*Metric, error) { + if mc.Name == "" { + return nil, fmt.Errorf("%w: empty name", + MetricConfigurationError) + } + v, err := mc.compileSource() + if err != nil { + return nil, fmt.Errorf("%w %s: %w", + MetricConfigurationError, mc.Name, err) + } + m := Metric{ + Name: mc.Name, + Source: v, + } + if mc.Preset != "" { + if mc.Values != nil { + return nil, fmt.Errorf( + "%w %s: both preset and values were specified", + MetricConfigurationError, mc.Name) + } + if b := presets[mc.Preset]; b == nil { + return nil, fmt.Errorf("%w %s: unknown preset %s", + MetricConfigurationError, mc.Name, mc.Preset) + } else { + m.Bucket = b + } + } else if mc.Values == nil { + if !v.BucketsOptional() { + return nil, fmt.Errorf("%w %s: either values or preset must be specified", + MetricConfigurationError, mc.Name) + } + } else if b, err := mc.Values.compile(mc.Name); err != nil { + return nil, fmt.Errorf("%w %s: %w", + MetricConfigurationError, mc.Name, err) + } else { + m.Bucket = b + } + return &m, nil +} diff --git a/lib/go/telemetry/config/config.go b/lib/go/telemetry/config/config.go new file mode 100644 index 0000000..8ba136b --- /dev/null +++ b/lib/go/telemetry/config/config.go @@ -0,0 +1,97 @@ +package config + +import ( + "time" +) + +type Config struct { + ConfigVersion int `json:"config_version"` + ConfigTime time.Time `json:"config_version_time"` + Product string `json:"product"` + Version string `json:"version"` + Groups map[string]*MetricGroupConfig `json:"groups"` + Metrics []*MetricConfig `json:"metrics"` + Presets map[string]*BucketSpec `json:"presets"` +} + +type MetricGroupConfig struct { + When string `json:"when"` + Subcommands StringOrList `json:"subcommands,omitempty"` + Globs SortedStringMap `json:"globs,omitempty"` +} + +type MetricConfig struct { + Name string `json:"name"` + Groups StringOrList `json:"groups"` + + Values *BucketSpec `json:"values,omitempty"` + Preset string `json:"preset,omitempty"` + + // Data source + Special string `json:"special,omitempty"` + Filesystem *FilesystemValue `json:"filesystem,omitempty"` + FileContent *FileContentConfig `json:"file_content,omitempty"` + FileSize *FileSizeConfig `json:"file_size,omitempty"` + FileCount *FileSizeConfig `json:"file_count,omitempty"` + Rlimit *RlimitValue `json:"rlimit,omitempty"` + Flag string `json:"flag,omitempty"` + MroFlag string `json:"mro_flag,omitempty"` + RecentCount string `json:"recent_count,omitempty"` +} + +type FilesystemValue struct { + Which string `json:"which"` + Property string `json:"property"` +} + +type FileContentConfig struct { + FileSizeConfig + Cgroup string `json:"cgroup,omitempty"` + Converter string `json:"converter,omitempty"` + Line string `json:"line,omitempty"` + LastLine string `json:"last_line,omitempty"` + JsonPath StringOrList `json:"json_path,omitempty"` + StageRel bool `json:"stage_relative,omitempty"` +} + +type FileSizeConfig struct { + Path StringOrList `json:"path,omitempty"` + Flag string `json:"flag,omitempty"` +} + +type CgroupSource struct { + Controller string `json:"controller"` + File StringOrList `json:"file"` +} + +type RlimitValue struct { + Hard bool `json:"hard"` + Resource string `json:"resource"` +} + +type RegexpBucket struct { + Exp string `json:"exp"` + Key string `json:"key,omitempty"` +} + +type RangeBucketSpec struct { + Min float64 `json:"min"` + Max float64 `json:"max"` + Buckets int `json:"buckets"` +} + +type ExpBucketSpec struct { + Multiple float64 `json:"multiple"` + Min float64 `json:"min"` + Max float64 `json:"max,omitempty"` +} + +type BucketSpec struct { + Thresholds []float64 `json:"thresholds,omitempty"` + Range *RangeBucketSpec `json:"range,omitempty"` + Exponential *ExpBucketSpec `json:"exponential,omitempty"` + Semver []string `json:"semver_thresholds,omitempty"` + Bool bool `json:"boolean,omitempty"` + Float bool `json:"float,omitempty"` + Match []RegexpBucket `json:"match,omitempty"` +} diff --git a/lib/go/telemetry/config/sources.go b/lib/go/telemetry/config/sources.go new file mode 100644 index 0000000..843d076 --- /dev/null +++ b/lib/go/telemetry/config/sources.go @@ -0,0 +1,269 @@ +package config + +import ( + "errors" + "fmt" + "path" + "strings" + "unicode" + "unicode/utf8" + + "github.com/10XDev/cellranger/lib/go/telemetry/collector" + "github.com/10XDev/cellranger/lib/go/telemetry/converter" + "golang.org/x/sys/unix" +) + +func getSpecialSource(name string) (ValueExtractor, error) { + return collector.MakeSpecial(name) +} + +func (fs *FilesystemValue) compile() (ValueExtractor, error) { + var prop collector.FilesystemProperty + switch fs.Property { + case "type": + prop = collector.FsKind + case "options": + prop = collector.FsOpts + case "available_bytes": + prop = collector.FsAvail + case "available_inodes": + prop = collector.FsInodeAvail + case "total_bytes": + prop = collector.FsCapacity + case "total_inodes": + prop = collector.FsInodeCap + default: + return nil, fmt.Errorf("invalid property %q", fs.Property) + } + switch fs.Which { + case "bins": + return collector.MakeFilesystem(false, prop), nil + case "pipestance": + return collector.MakeFilesystem(true, prop), nil + default: + return nil, fmt.Errorf("invalid filesystem kind %q", fs.Which) + } +} + +func (fc *FileContentConfig) lineFilter() (*collector.LineFilter, error) { + line := fc.Line + if (fc.LastLine == "") == (fc.Line == "") { + return nil, errors.New( + "exactly one of line or last_line must be specified") + } + if line == "" { + line = fc.LastLine + } + return collector.MakeLineFilter(line, fc.LastLine != "") +} + +func (fc *FileContentConfig) compile() (ValueExtractor, error) { + conv, err := converter.Make(fc.Converter) + if err != nil { + return nil, err + } + if fc.Cgroup != "" { + if len(fc.Path) == 0 { + return nil, errors.New("cgroup requres path") + } + if fc.Flag != "" { + return nil, errors.New( + "exactly one of flag or path may be specified") + } + if fc.StageRel { + return nil, errors.New("cgroup cannot be stage relative") + } + for _, p := range fc.Path { + if p == "" || p == "." || p == ".." || strings.ContainsAny(p, `/\`) { + return nil, fmt.Errorf("invalid cgroup path %q", p) + } + } + if len(fc.JsonPath) != 0 { + return nil, errors.New("cgroup files are not json") + } + if conv != nil { + return nil, errors.New("no converters with cgroup files") + } + filter, err := fc.lineFilter() + if err != nil { + return nil, err + } + return collector.Cgroup(fc.Cgroup, fc.Path, filter), nil + } + var filter collector.FileFilter + if len(fc.JsonPath) != 0 { + if fc.Line != "" || fc.LastLine != "" { + return nil, errors.New("cannot specify both json_path and line") + } + filter = collector.JsonPathFilter(fc.JsonPath) + } else if fc.Line == "" && fc.LastLine == "" { + return nil, errors.New("must specify exactly one of line, last_line, or json_path") + } else { + filter, err = fc.lineFilter() + if err != nil { + return nil, err + } + } + if fc.Flag != "" { + if len(fc.Path) != 0 { + return nil, errors.New( + "exactly one of flag or path may be specified") + } + if err := validateFlag(fc.Flag); err != nil { + return nil, err + } + if fc.StageRel { + return nil, errors.New("flag-specified file cannot be stage relative") + } + return collector.MakeFileFlag(fc.Flag, conv, filter), nil + } + if len(fc.Path) == 0 { + return nil, errors.New("must specify a source for file_content") + } + var isAbs bool + for i, p := range fc.Path { + p = path.Clean(p) + if p == "." { + return nil, fmt.Errorf("empty path %q", + fc.Path[i]) + } + if p == ".." || strings.HasPrefix(p, "../") { + return nil, fmt.Errorf( + "path %q is outside of the pipestance directory", + p) + } + if path.IsAbs(p) { + if !strings.HasPrefix(p, "/proc/self/") && + !strings.HasPrefix(p, "/proc/sys/") && + !strings.HasPrefix(p, "/sys/kernel/") && + p != "/proc/cpuinfo" && p != "/proc/meminfo" { + return nil, fmt.Errorf("disallowed absolute path %q", p) + } + if i > 0 && !isAbs { + return nil, errors.New("mixed absolute and relative paths") + } + if fc.StageRel { + return nil, errors.New("absolute path cannot be stage relative") + } + isAbs = true + } else if isAbs { + return nil, errors.New("mixed absolute and relative paths") + } + fc.Path[i] = p + } + if isAbs { + return collector.MakeAbsFile(fc.Path, conv, filter), nil + } + return collector.MakeRelativeFile( + fc.Path, fc.StageRel, conv, filter) +} + +func (fs *FileSizeConfig) compile(count bool) (ValueExtractor, error) { + if (fs.Flag == "") == (len(fs.Path) == 0) { + return nil, errors.New("exactly one of flag or path must be specified") + } + if fs.Flag != "" { + if err := validateFlag(fs.Flag); err != nil { + return nil, err + } + return nil, errors.ErrUnsupported + // return collector.MakeFileSizeFlag(fs.Flag, count), nil + } + for i, p := range fs.Path { + p = path.Clean(p) + fs.Path[i] = p + if p == "." { + return nil, errors.New("empty path") + } + if p == ".." || p[0] == '/' || strings.HasPrefix(p, "../") { + return nil, fmt.Errorf( + "%q is outside of the pipestance directory", p) + } + } + if count { + return nil, fmt.Errorf("%w: file count not yet implemented", + errors.ErrUnsupported) + } else { + return nil, fmt.Errorf("%w: file size not yet implemented", + errors.ErrUnsupported) + } + // return collector.MakeFileSize(fs.Path, count), nil +} + +func parseRlimit(res string) (int, error) { + switch res { + case "as": + return unix.RLIMIT_AS, nil + case "core": + return unix.RLIMIT_CORE, nil + case "cpu": + return unix.RLIMIT_CPU, nil + case "data": + return unix.RLIMIT_DATA, nil + case "fsize": + return unix.RLIMIT_FSIZE, nil + case "memlock": + return unix.RLIMIT_MEMLOCK, nil + case "msgqueue": + return unix.RLIMIT_MSGQUEUE, nil + case "nice": + return unix.RLIMIT_NICE, nil + case "nofile": + return unix.RLIMIT_NOFILE, nil + case "nproc": + return unix.RLIMIT_NPROC, nil + case "rttime": + return unix.RLIMIT_RTTIME, nil + case "sigpending": + return unix.RLIMIT_SIGPENDING, nil + case "stack": + return unix.RLIMIT_STACK, nil + } + return 0, fmt.Errorf("unrecognized rlimit resource %s", + res) +} + +func (rlim *RlimitValue) compile() (ValueExtractor, error) { + if res, err := parseRlimit(rlim.Resource); err != nil { + return nil, err + } else { + return collector.MakeRlimit(res, rlim.Hard), nil + } +} + +func compileFlagSource(flag string, mro bool) (ValueExtractor, error) { + if err := validateFlag(flag); err != nil { + return nil, err + } + return collector.MakeFlag(flag, mro), nil +} + +func validateFlag(flag string) error { + if !strings.HasPrefix(flag, "--") { + return fmt.Errorf("flag %q does not start with --", flag) + } + if len(flag) < 3 { + return errors.New("empty flag name") + } + if strings.ContainsFunc(flag[2:], func(r rune) bool { + // flag names should only contain ascii letters and digits + // or - or _ as word separators. + return r > utf8.RuneSelf || + (!unicode.IsLetter(r) && !unicode.IsDigit(r) && + r != '-' && r != '_') + }) { + return fmt.Errorf("invalid flag name %s", flag) + } + return nil +} + +func compileRecentCountSource(group string, groups []string) (ValueExtractor, error) { + for _, g := range groups { + if group == g { + return collector.MakeRecentCounter(group), nil + } + } + return nil, fmt.Errorf( + "recent counter for group %s must be included in a group of that name", + group) +} diff --git a/lib/go/telemetry/config/support.go b/lib/go/telemetry/config/support.go new file mode 100644 index 0000000..5483406 --- /dev/null +++ b/lib/go/telemetry/config/support.go @@ -0,0 +1,96 @@ +package config + +import ( + "bytes" + "encoding/json" + "sort" +) + +// In a few places, for convenience we allow +// either a list or a string, where we want the string +// to be interpreted as a singleton list. +type StringOrList []string + +func (sl *StringOrList) UnmarshalJSON(b []byte) error { + if len(b) == 0 { + *sl = nil + return nil + } else if b[0] == '"' { + *sl = []string{""} + return json.Unmarshal(b, &(*sl)[0]) + } else { + var ll []string + err := json.Unmarshal(b, &ll) + *sl = ll + return err + } +} + +// marshalSorted marshals a string-keyed map to json, +// with the keys in sorted order. +func marshalSorted[T any](sm map[string]T) ([]byte, error) { + if sm == nil { + return []byte("null"), nil + } + if len(sm) == 0 { + return []byte("{}"), nil + } + keys := make([]string, 0, len(sm)) + for k := range sm { + keys = append(keys, k) + } + sort.Strings(keys) + var buf bytes.Buffer + buf.WriteByte('{') + for i, k := range keys { + if i != 0 { + buf.WriteByte(',') + } + if b, err := json.Marshal(k); err != nil { + return nil, err + } else { + buf.Write(b) + } + buf.WriteByte(':') + if b, err := json.Marshal(sm[k]); err != nil { + return nil, err + } else { + buf.Write(b) + } + } + buf.WriteByte('}') + return buf.Bytes(), nil +} + +// Just a map[string]string but serializes +// with keys in sorted order for reproducibility. +type SortedStringMap map[string]string + +func (sm SortedStringMap) MarshalJSON() ([]byte, error) { + return marshalSorted(sm) +} + +// Just a map[string]*Metric but serializes +// with keys in sorted order for reproducibility. +type SortedMetricMap map[string]*Metric + +func (sm SortedMetricMap) MarshalJSON() ([]byte, error) { + return marshalSorted(sm) +} + +// Add adds a metric to the map. It returns true +// if the metric was added, or false if a metric +// with that name was already present. +func (sm SortedMetricMap) Add(m *Metric) bool { + if om := sm[m.Name]; om != nil { + return false + } + sm[m.Name] = m + return true +} + +type SortedAnyMap map[string]any + +func (sm SortedAnyMap) MarshalJSON() ([]byte, error) { + return marshalSorted(sm) +} diff --git a/lib/go/telemetry/converter/convert.go b/lib/go/telemetry/converter/convert.go new file mode 100644 index 0000000..5d4efe2 --- /dev/null +++ b/lib/go/telemetry/converter/convert.go @@ -0,0 +1,35 @@ +package converter + +import ( + "encoding/json" + "fmt" + + "github.com/10XDev/cellranger/lib/go/multi_csv" +) + +type Converter interface { + json.Marshaler + Convert(b []byte) ([]byte, error) +} + +type multicsv struct{} + +func (multicsv) Convert(b []byte) ([]byte, error) { + return multi_csv.ConvertMultiConfig(b) +} + +// MarshalJSON implements Converter. +func (multicsv) MarshalJSON() ([]byte, error) { + return []byte(`{"converter":"multicsv"}`), nil +} + +func Make(name string) (Converter, error) { + if name == "" { + return nil, nil + } + switch name { + case "multicsv": + return multicsv{}, nil + } + return nil, fmt.Errorf("converter %q not implemented", name) +} diff --git a/lib/go/telemetry/event/event.go b/lib/go/telemetry/event/event.go new file mode 100644 index 0000000..ae7f0db --- /dev/null +++ b/lib/go/telemetry/event/event.go @@ -0,0 +1,229 @@ +// Package event defines a telemetry event type and code for collecting them. +package event + +import ( + "context" + "fmt" + "io" + "io/fs" + "maps" + "os" + "runtime/trace" + "sort" + "sync" + + "github.com/10XDev/cellranger/lib/go/telemetry/collector" + "github.com/10XDev/cellranger/lib/go/telemetry/config" +) + +type Event struct { + Properties config.SortedAnyMap `json:"properties"` + GroupHash []byte `json:"group_hash"` + Name string `json:"name"` + Product string `json:"product"` + Version string `json:"version"` + Internal string `json:"internal_user,omitempty"` + ConfigVersion int `json:"config_version"` + Replicas int `json:"replicas,omitempty"` +} + +type StringOrBytesWriter interface { + io.Writer + io.StringWriter +} + +// Print outputs a human-readable presentation of the data. +func (ev *Event) Print(w StringOrBytesWriter) error { + if ev.Replicas != 0 { + if _, err := fmt.Fprintf(w, "(one of %d)\n", ev.Replicas); err != nil { + return err + } + } + if len(ev.Properties) == 0 { + _, err := w.WriteString("(no data)\n") + return err + } + keys := make([]string, 0, len(ev.Properties)) + for k := range ev.Properties { + keys = append(keys, k) + } + sort.Strings(keys) + for _, key := range keys { + if _, err := w.WriteString(key); err != nil { + return err + } + if _, err := w.WriteString(":\t"); err != nil { + return err + } + if v := ev.Properties[key]; v == nil { + if _, err := w.WriteString("null\n"); err != nil { + return err + } + } else if _, err := fmt.Fprintln(w, v); err != nil { + return err + } + } + return nil +} + +func Collect(ctx context.Context, c *config.CompiledConfig, + vc collector.ValueContext) <-chan Event { + ctx, task := trace.NewTask(ctx, "Collect") + defer trace.StartRegion(ctx, "beginCollect").End() + results := make(chan Event, len(c.Groups)) + var doneWait sync.WaitGroup + var fc collector.FileContext + internalTag := os.Getenv("_TENX_TELEMETRY_INTERNAL") + for gn := range c.Groups { + collectGroup(ctx, &doneWait, c, gn, vc, &fc, + internalTag, results) + } + fc.Close(ctx, vc.PipestanceDir()) + go func(wg *sync.WaitGroup, r chan<- Event) { + wg.Wait() + task.End() + close(r) + }(&doneWait, results) + return results +} + +// groupActive returns true if the given group is active given the context. +func groupActive(g *config.MetricGroup, vc collector.ValueContext) bool { + switch g.When { + case config.WhenCommand: + if vc.MrpHasRun() { + return false + } + case config.WhenSuccess: + if vc.PipestanceDir() == "" || !vc.MrpHasRun() || !vc.Success() { + return false + } + case config.WhenFailure: + if vc.PipestanceDir() == "" || !vc.MrpHasRun() || vc.Success() { + return false + } + } + if len(g.Subcommands) != 0 { + subcommand := vc.CommandLine()[0] + for _, sc := range g.Subcommands { + if subcommand == sc { + return true + } + } + return false + } + return true +} + +func makeGlobs(ps string, globs map[string]string) []map[string]string { + psfs := os.DirFS(ps) + result := make([]map[string]string, 0, 2*len(globs)) + for key, val := range globs { + matches, err := fs.Glob(psfs, val) + if err != nil { + // This should have been caught in config validation, unless the + // pipestance directory itself is an invalid glob. + continue + } + if len(matches) == 0 { + // If there's no match, we have a few choices. + // We could just not run this group at all, but that's not great + // because there may be metrics which don't depend on the missing + // key. + // We could use an empty string, except that much of the time + // the glob is going to be used in expressions like `${key}/foo`, + // so using `.` is safer. + if len(result) == 0 { + result = append(result, map[string]string{key: "."}) + } else { + for _, m := range result { + m[key] = "." + } + } + continue + } + if len(result) == 0 { + for _, match := range matches { + result = append(result, map[string]string{ + key: match, + }) + } + } else { + for _, m := range result { + m[key] = matches[0] + } + existing := result + for _, match := range matches[1:] { + for _, m := range existing { + mc := maps.Clone(m) + mc[key] = match + result = append(result, mc) + } + } + } + } + return result +} + +func collectGroup(ctx context.Context, + doneWait *sync.WaitGroup, + c *config.CompiledConfig, groupName string, + vc collector.ValueContext, + fc *collector.FileContext, + internalTag string, + results chan<- Event) { + g := c.Groups[groupName] + if g == nil { + panic("invalid group name") + } + if !groupActive(g, vc) { + return + } + hash := g.Hash() + ev := Event{ + GroupHash: hash[:], + Name: groupName, + ConfigVersion: c.ConfigVersion, + Product: c.Product, + Version: c.Version, + Internal: internalTag, + } + if len(g.Globs) == 0 { + collectWithGlob(ctx, doneWait, g, nil, vc, fc, ev, results) + return + } + globs := makeGlobs(vc.PipestanceDir(), g.Globs) + ev.Replicas = len(globs) + for _, glob := range globs { + collectWithGlob(ctx, doneWait, g, glob, vc, fc, ev, results) + } +} + +func collectWithGlob(ctx context.Context, + doneWait *sync.WaitGroup, + g *config.MetricGroup, + glob map[string]string, + vc collector.ValueContext, + fc *collector.FileContext, + ev Event, results chan<- Event) { + ev.Properties = make(config.SortedAnyMap, len(g.Metrics)) + metrics := g.Metrics + if len(glob) > 0 { + metrics = make(config.SortedMetricMap, len(g.Metrics)) + for n, m := range g.Metrics { + metrics[n] = m.WithGlob(glob) + } + } + for _, m := range metrics { + m.Start(ctx, vc, fc) + } + doneWait.Add(1) + go func(ev Event, + doneWait *sync.WaitGroup, results chan<- Event) { + defer doneWait.Done() + for n, m := range metrics { + ev.Properties[n] = m.Get() + } + results <- ev + }(ev, doneWait, results) +} diff --git a/lib/go/telemetry/settings/cache.go b/lib/go/telemetry/settings/cache.go new file mode 100644 index 0000000..1e6b9de --- /dev/null +++ b/lib/go/telemetry/settings/cache.go @@ -0,0 +1,86 @@ +package settings + +import ( + "errors" + "fmt" + "io/fs" + "os" + "os/user" + "path" + "path/filepath" + "time" +) + +// CacheDir returns the path to the directory containing previously +// collected data. +func CacheDir() (string, error) { + c, err := os.UserCacheDir() + if err != nil { + // os.UserCacheDir can fail if $HOME isn't set, but there's another + // way to get the user's home directory if you're willing to take a + // dependency on libc, which we are, here. + if u, err := user.Current(); err == nil && u.HomeDir != "" { + return path.Join(u.HomeDir, ".cache", "tenx", "telemetry"), nil + } + return "", err + } + return path.Join(c, "tenx", "telemetry"), nil +} + +func ProductCacheDir() (string, error) { + c, err := CacheDir() + if err != nil { + return "", fmt.Errorf( + "could not determine location of cache directory: %w", err) + } + p, err := getProduct() + if err != nil { + return "", err + } + v, err := getVersion() + if err != nil { + return "", err + } + return filepath.Join(c, p, v), nil +} + +func ListCache() ([]string, error) { + d, err := ProductCacheDir() + if err != nil { + return nil, err + } + listing, err := os.ReadDir(d) + if err != nil { + if errors.Is(err, fs.ErrNotExist) { + return nil, nil + } + return nil, fmt.Errorf("could not list cache directory: %w", err) + } + r := make([]string, 0, len(listing)) + for _, ent := range listing { + if !ent.IsDir() { + r = append(r, filepath.Join(d, ent.Name())) + } + } + return r, nil +} + +// CountRecentCacheFiles returns the number of cache files that have been saved +// for each group in the past 30 days. +func CountRecentCacheFiles() map[string]int { + listing, err := ListCache() + if err != nil { + return nil + } + if len(listing) == 0 { + return nil + } + result := make(map[string]int) + for _, fn := range listing { + group, tm := parseEventFileName(fn) + if group != "" && !tm.IsZero() && time.Since(tm) <= maxEventTTL { + result[group] += 1 + } + } + return result +} diff --git a/lib/go/telemetry/settings/send.go b/lib/go/telemetry/settings/send.go new file mode 100644 index 0000000..e27622d --- /dev/null +++ b/lib/go/telemetry/settings/send.go @@ -0,0 +1,337 @@ +package settings + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "os" + "path" + "regexp" + "runtime/trace" + "strings" + "sync" + "time" + + "github.com/10XDev/cellranger/lib/go/telemetry/event" +) + +type eventPayload struct { + content []byte + product string + version string + name string +} + +func (status *TelemetryStatus) GatherEvents(ctx context.Context, psDir string, + events <-chan event.Event) error { + ctx, task := trace.NewTask(ctx, "GatherEvents") + defer task.End() + errs, errc := func() ([]error, <-chan error) { + defer trace.StartRegion(ctx, "GatherEvents.forwarding").End() + var wg sync.WaitGroup + var errs []error + errc := make(chan error, 4) + // Separate save and send channels so they can run in parallel. + var save chan eventPayload + cache, _ := CacheDir() + if cache != "" || psDir != "" { + if cache != "" { + if err := os.MkdirAll(cache, 0755); err != nil { + errs = append(errs, + fmt.Errorf("creating save location: %w", err)) + cache = "" + } + } + if psDir != "" { + if err := os.MkdirAll(psDir, 0777); err != nil { + errs = append(errs, + fmt.Errorf("creating save location: %w", err)) + psDir = "" + } + } + if cache != "" || psDir != "" { + save = make(chan eventPayload, 4) + defer close(save) + wg.Add(1) + go saveEvents(ctx, cache, psDir, save, errc, &wg) + } + } + for event := range events { + b, err := json.Marshal(event) + if err != nil { + errs = append(errs, err) + continue + } + p := eventPayload{ + content: b, + product: event.Product, + version: event.Version, + name: event.Name, + } + if !status.DisableUpload { + wg.Add(1) + // Upload in parallel, because network requests to the same URL + // can be combined efficiently. + go uploadEvent(ctx, p, errc, &wg) + } + if cache != "" || psDir != "" { + // But save serially because they cannot. + select { + case save <- p: + case <-ctx.Done(): + } + } + } + go func() { + wg.Wait() + close(errc) + }() + return errs, errc + }() + for err := range errc { + errs = append(errs, err) + } + return errors.Join(errs...) +} + +func uploadEvent(ctx context.Context, event eventPayload, + errc chan<- error, wg *sync.WaitGroup) { + defer wg.Done() + defer trace.StartRegion(ctx, "uploadEvent").End() + if ctx.Err() != nil { + return + } + ctx, cancel := context.WithTimeout(ctx, time.Second*5) + defer cancel() + req, err := http.NewRequestWithContext(ctx, http.MethodPost, + telemetryUploadUrl, bytes.NewReader(event.content)) + if err != nil { + select { + case errc <- fmt.Errorf( + "creating request telementry upload request: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + return + } + req.Header.Set("Content-Type", "application/json") + // This isn't a "key", really. + // There's no way to protect an actually secret key in this binary, since it + // is being distributed to users. + // It's set here simply to prevent accidental or casual abuse of the upload + // API endpoint (in addition to server-side DDoS protections etc.) + pvHash := sha256.Sum256(append([]byte(event.product), event.version...)) + req.Header.Set("X-Api-Key", + base64.RawStdEncoding.EncodeToString(pvHash[:])) + resp, err := http.DefaultClient.Do(req) + if err != nil { + select { + case errc <- fmt.Errorf("sending telementry: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + return + } + b, _ := io.ReadAll(resp.Body) + resp.Body.Close() + b = bytes.TrimSpace(b) + if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { + if len(b) > 0 { + errc <- fmt.Errorf("sending telementry: http %d: %s\n%s", + resp.StatusCode, resp.Status, string(b)) + } else { + errc <- fmt.Errorf("sending telementry: http %d: %s", + resp.StatusCode, resp.Status) + } + } +} + +func saveEvents(ctx context.Context, cache, psDir string, events <-chan eventPayload, + errc chan<- error, wg *sync.WaitGroup) { + defer trace.StartRegion(ctx, "saveEvents").End() + defer wg.Done() + var cleanupDirs map[string]struct{} + var extrasDir string + if psDir != "" { + extrasDir = path.Join(psDir, "extras", "telemetry") + for _, d := range [...]string{path.Dir(extrasDir), extrasDir} { + if err := os.Mkdir(d, 0777); err != nil && !errors.Is(err, os.ErrExist) { + select { + case errc <- fmt.Errorf( + "creating save location in pipestance directory file: %w", + err): + default: + // Enough errors to overwhelm reporting anyway. + } + } + } + } + for event := range events { + if ctx.Err() != nil { + return + } + var fn string + if cache != "" { + fn = saveEventCache(cache, event, errc) + if fn != "" { + if cleanupDirs == nil { + cleanupDirs = make(map[string]struct{}, 1) + } + cleanupDirs[path.Dir(fn)] = struct{}{} + } + } + if psDir != "" { + saveEventInPipestance(extrasDir, path.Base(fn), event, errc) + } + } + for dir := range cleanupDirs { + cleanOldEvents(dir, errc) + } +} + +func saveEventCache(cache string, event eventPayload, errc chan<- error) string { + dir := path.Join(cache, event.product, event.version) + if err := os.MkdirAll(dir, 0755); err != nil { + select { + case errc <- fmt.Errorf("creating telementry directory: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + } + f, err := os.CreateTemp(dir, + event.name+"_"+ + // Include the date so that we can reliably remove old files. + // Convert `:` to `_` so that the file paths remain valid + // on Windows, because sometimes people browse linux directories + // from windows via WSL or SMB. + strings.Replace(time.Now().UTC().Format(time.RFC3339), + ":", "_", 2)+ + "*.json") + if err != nil { + select { + case errc <- fmt.Errorf("creating telementry file: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + return "" + } + defer f.Close() + if _, err := f.Write(event.content); err != nil { + select { + case errc <- fmt.Errorf("writing telementry file: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + } + if err := f.Close(); err != nil { + select { + case errc <- fmt.Errorf("closing telementry file: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + } + return f.Name() +} + +var eventFileDateRe = regexp.MustCompile(`([^/]*)_(\d{4}-\d{2}-\d{2}T\d{2}_\d{2}_\d{2}Z).*\.json`) + +func parseEventFileName(fn string) (string, time.Time) { + match := eventFileDateRe.FindStringSubmatch(fn) + if len(match) != 3 { + return "", time.Time{} + } + dateString := strings.Replace(match[2], "_", ":", 2) + t, err := time.Parse(time.RFC3339, dateString) + if err != nil { + return match[1], time.Time{} + } + return match[1], t +} + +const maxEventTTL = 30 * 24 * time.Hour + +func cleanOldEvents(dir string, errc chan<- error) { + entries, err := os.ReadDir(dir) + if err != nil { + select { + case errc <- fmt.Errorf( + "checking telementry output directory: %w", err): + default: + } + return + } + for _, entry := range entries { + if entry.IsDir() { + continue + } + _, t := parseEventFileName(entry.Name()) + if !t.IsZero() && time.Since(t) > maxEventTTL { + if err := os.Remove(path.Join(dir, entry.Name())); err != nil { + select { + case errc <- fmt.Errorf( + "removing old telementry event: %w", err): + default: + } + } + } + } +} + +func saveEventInPipestance(dir, fn string, event eventPayload, errc chan<- error) string { + if err := os.MkdirAll(dir, 0755); err != nil { + select { + case errc <- fmt.Errorf("creating telementry directory: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + } + var f *os.File + var err error + if fn == "" && fn != "." { + f, err = os.CreateTemp(dir, + event.name+"_"+ + // Include the date so that we can reliably remove old files. + // Convert `:` to `_` so that the file paths remain valid + // on Windows, because sometimes people browse linux directories + // from windows via WSL or SMB. + strings.Replace(time.Now().UTC().Format(time.RFC3339), + ":", "_", -1)+ + "*.json") + if err == nil { + // Ignore errors; not much we can do about it. + _ = os.Chmod(f.Name(), 0644) + } + } else { + f, err = os.Create(path.Join(dir, fn)) + } + if err != nil { + select { + case errc <- fmt.Errorf("creating telementry file: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + return "" + } + defer f.Close() + if _, err := f.Write(event.content); err != nil { + select { + case errc <- fmt.Errorf("writing telementry file: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + } + if err := f.Close(); err != nil { + select { + case errc <- fmt.Errorf("closing telementry file: %w", err): + default: + // Enough errors to overwhelm reporting anyway. + } + } + return f.Name() +} diff --git a/lib/go/telemetry/settings/settings.go b/lib/go/telemetry/settings/settings.go new file mode 100644 index 0000000..4c12380 --- /dev/null +++ b/lib/go/telemetry/settings/settings.go @@ -0,0 +1,482 @@ +// Package settings provides global persisted settings access the telemetry. +// +// Logic for interacting with on-disk configuration and result files, +// as well as remote URL endpoings, is all contained here. +package settings + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "io/fs" + "net/http" + "os" + "os/exec" + "os/user" + "path" + "path/filepath" + "runtime/trace" + "sync" + "time" + + "github.com/10XDev/cellranger/lib/go/telemetry/config" +) + +const ( + configCheckSentinel = "config-update-check" + configFileName = "config.json" + disableFile = "disable" + disableUploadFile = "disable_upload" + disableUpdateFile = "disable_update" + configUpdateInterval = time.Hour + DisableEnvVar = "TENX_DISABLE_TELEMETRY" + + configDownloadUrlBase = "https://config.telemetry.10xgenomics.com/" + telemetryUploadUrl = "https://upload.telemetry.10xgenomics.com/api/v1/event" + PrivacyStatementUrl = "https://10xgen.com/pipeline-telemetry" +) + +// Attempts to find the directory containing the root of the pipeline +// deployment. +var PipelineRoot = sync.OnceValue(getPipelineRoot) + +// Check that any of the expected files exist in that directory. +func isPipelineRoot(dir string) bool { + if _, err := os.Stat(filepath.Join(dir, + ".version")); err == nil { + return true + } + if _, err := os.Stat(filepath.Join(dir, + "external", "martian")); err == nil { + return true + } + if _, err := os.Stat(filepath.Join(dir, + "lib", "bin")); err == nil { + return true + } + if _, err := os.Stat(filepath.Join(dir, + "bin", "tenkit")); err == nil { + return true + } + return false +} + +func getPipelineRoot() string { + // There are several ways to find the path to an executable. In some + // cases it is important not to resolve symlinks, for example if the + // executable is in a `runfiles` tree generated by bazel. + if exe, err := exec.LookPath(os.Args[0]); err == nil || errors.Is(err, exec.ErrDot) { + if dir, err := filepath.Abs(filepath.Dir(exe)); err == nil { + // It is expected that this binary is in $ROOT/lib/bin. + dir = filepath.Dir(filepath.Dir(dir)) + // dir should be the root directory. + if isPipelineRoot(dir) { + return dir + } + } + } + // If the executable had been symlinked into another location, or if it was + // run with for example `exec -a` so that args[0] isn't actually the name of + // the binary, use an alternate method to find the executable. + // On linux, this will use /proc/self/exe, which resolves all symlinks. + exe, err := os.Executable() + if err != nil { + panic(err) + } + if dir, err := filepath.Abs(filepath.Dir(exe)); err == nil { + // It is expected that this binary is in $ROOT/lib/bin + dir = filepath.Dir(filepath.Dir(dir)) + // dir should be the root directory. + if isPipelineRoot(dir) { + return dir + } + } + exe, err = filepath.EvalSymlinks(exe) + if err != nil { + panic(err) + } + return filepath.Dir(filepath.Dir(filepath.Dir(exe))) +} + +// ConfigDir returns the path to the configuration settings directory. +func ConfigDir() (string, error) { + c, err := os.UserConfigDir() + if err != nil { + // os.UserConfigDir can fail if $HOME isn't set, but there's another + // way to get the user's home directory if you're willing to take a + // dependency on libc, which we are, here. + if u, err := user.Current(); err == nil && u.HomeDir != "" { + return path.Join(u.HomeDir, ".config", "tenx", "telemetry"), nil + } + return "", err + } + return path.Join(c, "tenx", "telemetry"), nil +} + +type TelemetryStatus struct { + DisableAll bool + DisableConfigUpdate bool + DisableUpload bool + HasRun bool +} + +func getProduct() (string, error) { + if p := os.Getenv("TENX_PRODUCT"); p != "" { + return p, nil + } + // Find parent process. + if exe, err := executableForPid(os.Getppid()); err != nil { + return "", fmt.Errorf( + "could not detect product; error getting parent executable: %w", + err) + } else { + // in some situations, this process may have been reparented to + // an init process. We don't want to treat that as the product, + // so we reject those cases. + switch bn := path.Base(exe); bn { + case "systemd", "init": + return "", fmt.Errorf( + "could not detect product; parent executable was %s", + bn) + default: + return bn, nil + } + } +} + +var noPipelineRoot = errors.New("failed to locate pipeline root") + +func getVersion() (string, error) { + if v := os.Getenv("TENX_VERSION"); v != "" { + return v, nil + } + r := PipelineRoot() + if r == "" { + return "", fmt.Errorf("could not detect version: %w", noPipelineRoot) + } + b, err := os.ReadFile(path.Join(r, ".version")) + if err != nil { + return "", fmt.Errorf("could not read version file: %w", err) + } + b = bytes.TrimSpace(b) + if len(b) == 0 { + return "", errors.New("empty version file") + } + return string(b), nil +} + +// GetTelemetryStatus returns whether telemetry is disabled, and whether this +// user has run telemetry before. +func GetTelemetryStatus() TelemetryStatus { + defer trace.StartRegion(context.TODO(), "GetTelemetryStatus").End() + // Check environment first, since it's faster. + if os.Getenv(DisableEnvVar) != "" { + return TelemetryStatus{ + DisableAll: true, + DisableConfigUpdate: true, + DisableUpload: true, + HasRun: true, + } + } + var status TelemetryStatus + if os.Getenv(DisableEnvVar+"_UPLOAD") != "" { + status.DisableUpload = true + status.HasRun = true + } + if os.Getenv(DisableEnvVar+"_UPDATE") != "" { + status.DisableConfigUpdate = true + status.HasRun = true + } + if c, _ := ConfigDir(); c != "" { + configFiles, err := os.ReadDir(c) + if err == nil { + status.HasRun = true + for _, entry := range configFiles { + switch entry.Name() { + case disableFile: + return TelemetryStatus{ + DisableAll: true, + DisableConfigUpdate: true, + DisableUpload: true, + HasRun: true, + } + case disableUploadFile: + status.DisableUpload = true + case disableUpdateFile: + status.DisableConfigUpdate = true + } + } + } + } + if !status.DisableConfigUpdate { + if _, err := os.Stat("/etc/tenx/telemetry/" + disableUpdateFile); err == nil { + status.DisableConfigUpdate = true + } + } + if !status.DisableUpload { + if _, err := os.Stat("/etc/tenx/telemetry/" + disableUploadFile); err == nil { + status.DisableUpload = true + // This user hasn't necessarily run before, but it's not necessary + // to warn them if the upload is disabled globally. + status.HasRun = true + } + } + if !status.HasRun { + if c, _ := CacheDir(); c != "" { + if _, err := os.Stat(c); err == nil { + status.HasRun = true + } + } + } + return status +} + +func lastConfigUpdateCheck(product, version string) time.Time { + c, _ := ConfigDir() + if c == "" { + return time.Time{} + } + info, err := os.Stat(path.Join(c, product, version, configCheckSentinel)) + if err != nil { + return time.Time{} + } + return info.ModTime() +} + +// Print a message warning the user about telemetry upload and informing them +// about how to opt out. +func printWarningMessage() { + dir, err := ProductCacheDir() + if err != nil { + dir = `~/.cache/tenx/telemetry/` + } + fmt.Fprintf(os.Stderr, + `Thank you for using cellranger. To help us improve our product, +anonymized telemetry data has been collected and sent to 10X Genomics. +This data helps us understand usage patterns, diagnose issues, +and prioritize improvements. + +You can inspect the telemetry metrics sent by looking in +%s + +For more details on what data is collected and how it's used, please visit +`+PrivacyStatementUrl+` + +You can disable telemetry at any time by running the following command: + cellranger telemetry disable +`, dir) +} + +func (status *TelemetryStatus) maybeWarn() { + if !status.HasRun { + printWarningMessage() + status.HasRun = true + } +} + +func configFilePath(product, version string) string { + if c, _ := ConfigDir(); c != "" { + return path.Join(c, product, version, configFileName) + } else { + return "" + } +} + +func downloadConfig(ctx context.Context, product, version string, verbose bool) []byte { + defer trace.StartRegion(ctx, "downloadConfig").End() + ctx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + confUrl := configDownloadUrlBase + product + "/" + version + "/config.json" + r, err := http.NewRequestWithContext(ctx, http.MethodGet, + confUrl, nil) + if err != nil { + if verbose { + fmt.Fprintln(os.Stderr, "Error creating config download request:", err) + } + return nil + } + r.Header.Set("Accept", "application/json") + resp, err := http.DefaultClient.Do(r) + if err != nil { + if verbose { + fmt.Fprintf(os.Stderr, "Error downloading from %s: %v\n", + confUrl, err) + } + return nil + } + defer resp.Body.Close() + if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { + if verbose { + fmt.Fprintf(os.Stderr, "Error downloading from %s: %d %s\n", + confUrl, resp.StatusCode, resp.Status) + if b, _ := io.ReadAll(resp.Body); len(bytes.TrimSpace(b)) > 0 { + fmt.Fprintln(os.Stderr, string(b)) + } + } + return nil + } + b, err := io.ReadAll(resp.Body) + if err != nil || len(b) == 0 { + if verbose { + fmt.Fprintf(os.Stderr, "Error downloading from %s: %v\n", + confUrl, err) + } + return nil + } + if c := configFilePath(product, version); c != "" { + _ = os.MkdirAll(path.Dir(c), 0755) + // Don't touch the config file if it is unchanged. + oldB, _ := os.ReadFile(c) + if bytes.Equal(oldB, b) || (os.WriteFile(c+".tmp", b, 0644) == nil && + os.Rename(c+".tmp", c) == nil) { + if err := os.WriteFile( + path.Join(path.Dir(c), configCheckSentinel), + nil, 0644); err != nil && verbose { + fmt.Fprintf(os.Stderr, "Error saving config file from %s: %v\n", + confUrl, err) + } + } + } + return b +} + +func readConfigFile(product, version string) ([]byte, error) { + if c := configFilePath(product, version); c != "" { + b, err := os.ReadFile(c) + if err == nil { + return b, nil + } + } + r := PipelineRoot() + if r == "" { + return nil, fmt.Errorf( + "could not find fallback config: %w", noPipelineRoot) + } + // Fall back to file in the deployment tarball. + return os.ReadFile(path.Join(r, "etc", product+"_telemetry.json")) +} + +// GetConfig loads the most appropriate version of the config file. +// +// Errors from this pathway are ignored unless verbose logging is enabled, +// because they are not interesting to a user. +func (status *TelemetryStatus) GetConfig( + ctx context.Context, + verbose bool, +) (*config.Config, error) { + defer trace.StartRegion(ctx, "GetConfig").End() + if status.DisableAll { + return nil, nil + } + product, err := getProduct() + if err != nil { + return nil, err + } + if err := ctx.Err(); err != nil { + return nil, err + } + version, err := getVersion() + if err != nil { + return nil, err + } + if err := ctx.Err(); err != nil { + return nil, err + } + var confBytes []byte + if !status.DisableConfigUpdate && + time.Since(lastConfigUpdateCheck(product, version)) > configUpdateInterval { + status.maybeWarn() + confBytes = downloadConfig(ctx, product, version, verbose) + } + if err := ctx.Err(); err != nil { + return nil, err + } + if len(confBytes) == 0 { + confBytes, err = readConfigFile(product, version) + if err != nil { + return nil, err + } + } + var conf config.Config + err = json.Unmarshal(confBytes, &conf) + if err != nil { + return nil, fmt.Errorf("parsing config file: %w", err) + } + conf.Product = product + conf.Version = version + if !status.DisableUpload { + status.maybeWarn() + } + return &conf, nil +} + +// DisableAll writes a file which disables telemetry collection for this user. +// +// Errors from this should be displayed visibly to the user to ensure that they +// are aware that telemetry has been disabled. +func Disable(all, upload, update bool) error { + c, err := ConfigDir() + if err != nil { + return fmt.Errorf("could not locate configuration directory: %w", err) + } + if err := os.MkdirAll(c, 0755); err != nil { + return fmt.Errorf("could not create configuration directory: %w", err) + } + if all { + if err := os.WriteFile(path.Join(c, disableFile), nil, 0644); err != nil { + return fmt.Errorf( + "could not write telemetry disable sentinel file: %w", err) + } + return nil + } + var errs []error + if upload { + if err := os.WriteFile(path.Join(c, disableUploadFile), nil, 0644); err != nil { + errs = append(errs, fmt.Errorf( + "could not write telemetry disable sentinel file: %w", err)) + } + } + if update { + if err := os.WriteFile(path.Join(c, disableUpdateFile), nil, 0644); err != nil { + errs = append(errs, fmt.Errorf( + "could not write telemetry disable sentinel file: %w", err)) + } + } + return errors.Join(errs...) +} + +func Enable(all, upload, update bool) error { + c, err := ConfigDir() + if err != nil { + return fmt.Errorf("could not locate configuration directory: %w", err) + } + if _, err := os.Stat(c); errors.Is(err, fs.ErrNotExist) { + return nil + } + var errs []error + if all { + if err := os.Remove(path.Join(c, disableFile)); err != nil && + !errors.Is(err, fs.ErrNotExist) { + errs = append(errs, fmt.Errorf( + "could not remove telemetry disable sentinel file: %w", err)) + } + } + if upload || all { + if err := os.Remove(path.Join(c, disableUploadFile)); err != nil && + !errors.Is(err, fs.ErrNotExist) { + errs = append(errs, fmt.Errorf( + "could not remove telemetry disable sentinel file: %w", err)) + } + } + if update || all { + if err := os.Remove(path.Join(c, disableUpdateFile)); err != nil && + !errors.Is(err, fs.ErrNotExist) { + errs = append(errs, fmt.Errorf( + "could not remove telemetry disable sentinel file: %w", err)) + } + } + return errors.Join(errs...) +} diff --git a/lib/go/telemetry/settings/settings_linux.go b/lib/go/telemetry/settings/settings_linux.go new file mode 100644 index 0000000..ab526d1 --- /dev/null +++ b/lib/go/telemetry/settings/settings_linux.go @@ -0,0 +1,10 @@ +package settings + +import ( + "fmt" + "path/filepath" +) + +func executableForPid(pid int) (string, error) { + return filepath.EvalSymlinks(fmt.Sprint("/proc/", pid, "/exe")) +} diff --git a/lib/go/telemetry/value_context/value_context.go b/lib/go/telemetry/value_context/value_context.go new file mode 100644 index 0000000..b57d9f7 --- /dev/null +++ b/lib/go/telemetry/value_context/value_context.go @@ -0,0 +1,131 @@ +// Package value_context parses the command line for the telemetry tool. +// +// The results are used to provide context for collection of telemetry +// information. +package value_context + +import ( + "flag" + "os" + "strings" + "sync" + "time" + + "github.com/10XDev/cellranger/lib/go/telemetry/collector" + "github.com/martian-lang/martian/martian/util" +) + +type CollectFlags struct { + args []string + mroflags string + walltime float64 + exitCode int + Verbose bool +} + +func ParseFlags(args []string) CollectFlags { + flagset := flag.NewFlagSet("telemetry collect", + flag.ExitOnError) + var f CollectFlags + flagset.Float64Var(&f.walltime, "walltime", 0, + "Wall time for the pipestance run, if any") + flagset.StringVar(&f.mroflags, "mrp_flags", "", + "Flags passed to mrp") + flagset.IntVar(&f.exitCode, "mrp_exit_code", -1, + "Exit code from mrp.") + flagset.BoolVar(&f.Verbose, "verbose", false, + "Log error messages") + if err := flagset.Parse(args); err != nil { + panic(err) + } + f.args = flagset.Args() + return f +} + +type valueContext struct { + eventCounts func() map[string]int + args []string + mroflags []string + pipestance string + runtime time.Duration + success bool + mrpRan bool +} + +func (f CollectFlags) MakeValueContext( + eventCounts func() map[string]int, +) (collector.ValueContext, error) { + vc := new(valueContext) + vc.args = f.args + + vc.mroflags = strings.Fields(f.mroflags) + // Look for the pipestance path. It'll be either the `-psdir` flag or it'll + // be the last argument. + var foundPsdir bool + for _, f := range vc.mroflags { + if after, found := strings.CutPrefix(f, "--psdir="); found { + foundPsdir = true + vc.pipestance = after + break + } else if !strings.HasPrefix(f, "-") && util.ValidateID(f) == nil { + vc.pipestance = f + } + } + if !foundPsdir { + // `--psdir` may be set in `MROFLAGS`, which would override the + // pipestance ID. + for _, f := range strings.Fields(os.Getenv("MROFLAGS")) { + if after, found := strings.CutPrefix(f, "--psdir="); found { + vc.pipestance = after + break + } + } + } + + vc.runtime = time.Duration(float64(time.Second) * f.walltime) + vc.success = f.exitCode == 0 + vc.mrpRan = f.exitCode >= 0 + vc.eventCounts = sync.OnceValue(eventCounts) + return vc, nil +} + +// CommandLine implements collector.ValueContext. +func (v *valueContext) CommandLine() []string { + return v.args +} + +// MroFlags implements collector.ValueContext. +func (v *valueContext) MroFlags() []string { + return v.mroflags +} + +// PipestanceDir implements collector.ValueContext. +func (v *valueContext) PipestanceDir() string { + if v.mrpRan { + return v.pipestance + } else { + // There's nothing useful to be done with the pipestance directory + // in this case. + return "" + } +} + +// Runtime implements collector.ValueContext. +func (v *valueContext) Runtime() time.Duration { + return v.runtime +} + +// Success implements collector.ValueContext. +func (v *valueContext) Success() bool { + return v.success +} + +func (v *valueContext) MrpHasRun() bool { + return v.mrpRan +} + +// RecentCount implements collector.ValueContext. +func (v *valueContext) RecentCount(group string) (int, bool) { + r, ok := v.eventCounts()[group] + return r, ok +} diff --git a/lib/python/cellranger/aggr/preprocessing.py b/lib/python/cellranger/aggr/preprocessing.py index ec52800..8eb6aa1 100644 --- a/lib/python/cellranger/aggr/preprocessing.py +++ b/lib/python/cellranger/aggr/preprocessing.py @@ -36,23 +36,23 @@ def check_molecule_info_version_split(args): mol_h5 = sample_def[cr_constants.AGG_H5_FIELD] if not os.path.exists(mol_h5): - martian.exit("Input molecule file does not exist: %s" % mol_h5) + martian.exit(f"Input molecule file does not exist: {mol_h5}") if not os.access(mol_h5, os.R_OK): martian.exit( - "Input molecule file is not readable, please check file permissions: %s" % mol_h5 + f"Input molecule file is not readable, please check file permissions: {mol_h5}" ) if not cr_h5.is_hdf5(mol_h5): - martian.exit("Input molecule file is not a valid HDF5 file: %s" % mol_h5) + martian.exit(f"Input molecule file is not a valid HDF5 file: {mol_h5}") h5_filetype = cr_h5.get_h5_filetype(mol_h5) if h5_filetype and h5_filetype != cr_mol_counter.MOLECULE_H5_FILETYPE: - martian.exit("Input is a %s file, but a molecule file is required" % h5_filetype) + martian.exit(f"Input is a {h5_filetype} file, but a molecule file is required") if mol_h5 in files_seen: martian.exit( - "Same molecule file is specified in multiple sample definitions: %s" % mol_h5 + f"Same molecule file is specified in multiple sample definitions: {mol_h5}" ) else: files_seen.add(mol_h5) @@ -61,16 +61,15 @@ def check_molecule_info_version_split(args): mc_h5, file_version = cr_mol_counter.get_h5py_file_and_version(mol_h5) if file_version < 3 and is_spatial: # Space ranger runs are all from >= version 3 - martian.exit( - "The molecule info HDF5 file (%s) was not produced by Space Ranger." % mc_h5 - ) + martian.exit(f"The molecule info HDF5 file ({mc_h5}) was not produced by Space Ranger.") elif is_spatial: # Verify it's a spatial whitelist with cr_mol_counter.MoleculeCounter.open(mol_h5, "r") as mol_info: if not mol_info.is_spatial_data(): martian.exit( - "The sample %s is not compatible with spaceranger aggr. Please use a matching pipeline." - % sample_def["library_id"] + "The sample {} is not compatible with spaceranger aggr. Please use a matching pipeline.".format( + sample_def["library_id"] + ) ) elif file_version < 2: martian.exit( @@ -88,8 +87,7 @@ def check_molecule_info_version_split(args): ) if cr_major_version < 2 or not metric_in_all: martian.exit( - "The molecule info HDF5 file (%s) was produced by an older software version. Reading these files is unsupported." - % mol_h5 + f"The molecule info HDF5 file ({mol_h5}) was produced by an older software version. Reading these files is unsupported." ) # pylint: disable=no-member diff --git a/lib/python/cellranger/altair_plot_utils.py b/lib/python/cellranger/altair_plot_utils.py new file mode 100644 index 0000000..2af17b2 --- /dev/null +++ b/lib/python/cellranger/altair_plot_utils.py @@ -0,0 +1,136 @@ +# +# Copyright (c) 2023 10X Genomics, Inc. All rights reserved. +# + +"""Convenience functions for oft used altair plots.""" + +import altair as alt +import pandas as pd + +from cellranger.altair_utils import chart_to_json +from cellranger.spatial.image import WebImage + + +# pylint: disable=too-many-locals +def make_alt_spatial_plot( + tissue_lowres_image: str, + plotting_df: pd.DataFrame, + col_to_plot: str, + col_to_tooltip: str, + tooltip_title: str, + add_color_selector: bool = False, + data_is_continuous: bool = True, + return_chart: bool = False, +) -> alt.Chart | str: + """Generate an Altair spatial plot displaying data from a given DataFrame overlaid on a web image. + + Args: + tissue_lowres_image (str): Path to the low-resolution tissue image. + plotting_df (pd.DataFrame): DataFrame containing data to be plotted. + Typically a tissue_positions.csv joined with other per-barcode info + col_to_plot (str): Column name in plotting_df containing data for coloring the plot. + col_to_tooltip (str): Column name in plotting_df containing data for tooltip information. + tooltip_title (str): Title for the tooltip. + add_color_selector(bool, optional): Should the plot have a color scheme dropdown? + data_is_continuous(bool, optional): Is the data being plotted continuous? Necessary for selecting the color scheme if using the dropdown + return_chart (bool, optional): If True, return the Altair chart object. If False (default), + return the plot as a JSON representation. + + Returns: + final_plot (alt.Chart or str): Altair chart object if return_chart is True, or JSON + representation of the plot if return_chart is False. + """ + img = WebImage(tissue_lowres_image) + encoded_image = img.base64_encoded_str + source = pd.DataFrame.from_records([{"x": img.width, "y": img.height, "img": encoded_image}]) + imgs = alt.Chart(source).mark_image().encode(url="img") + + slider_selector = alt.param( + value=1, bind=alt.binding_range(min=0, max=1, step=0.1, name="Spot Opacity: ") + ) + # Hover tooltip + nearest = alt.selection_point( + fields=[f"{col_to_tooltip}"], + nearest=True, + on="mouseover", + empty="none", + ) + # add cluster tooltip if it exists + cluster_tooltip = ( + alt.Tooltip("clusters", title="Cluster") + if plotting_df.columns.isin(["clusters"]).any() + else None + ) + plot_tooltip = [ + alt.Tooltip("barcode", title="Barcode"), + alt.Tooltip(f"{col_to_tooltip}", title=f"{tooltip_title}"), + ] + # append the cluster tooltip if it exists + if cluster_tooltip is not None: + plot_tooltip.append(cluster_tooltip) + array_plot = ( + alt.Chart(plotting_df) + .encode( + x=alt.X("pixl_col_in_lowres:Q", title="").scale(domain=(0, source["x"][0])), + y=alt.Y("pixl_row_in_lowres:Q", scale=alt.Scale(reverse=True), title="").scale( + domain=(source["y"][0], 0) + ), + color=alt.Color( + f"{col_to_plot}:N", + legend=alt.Legend( + title=f"{tooltip_title}", labelExpr="split(datum.label, '|')", symbolOpacity=1 + ), + ), + tooltip=plot_tooltip, + ) + .mark_circle(size=10 if len(plotting_df) < 5000 else 5, opacity=slider_selector) + .properties( + width=img.width / 1.25, + height=img.height / 1.25, + ) + .add_selection(nearest) + .add_selection(slider_selector) + ) + + final_plot = ( + alt.layer(imgs, array_plot) + .configure_axis(grid=False, domain=False, tickSize=0, labels=False) + .configure_view(strokeWidth=0) + ) + + if add_color_selector: + continuous_colors = [ + "turbo", + "cividis", + "bluegreen", + "yelloworangered", + "viridis", + "magma", + "sinebow", + ] + discrete_colors = [ + "tableau20", + "accent", + "dark2", + "set1", + "category20", + "category20b", + "category20c", + ] + input_dropdown = alt.binding_select( + options=continuous_colors if data_is_continuous else discrete_colors, + name="Color Scheme: ", + ) + color_select = alt.param( + name="schemeselect", + bind=input_dropdown, + value="turbo" if data_is_continuous else "tableau20", + ) + final_plot = final_plot.encode( + color=alt.Color(scale=alt.Scale(scheme={"expr": "schemeselect"})) + ).add_selection(color_select) + if return_chart: + return final_plot + # only write out the plot to json + final_plot = chart_to_json(final_plot) + return final_plot diff --git a/lib/python/cellranger/analysis/analysis_types.py b/lib/python/cellranger/analysis/analysis_types.py index e58cfff..488a9ba 100644 --- a/lib/python/cellranger/analysis/analysis_types.py +++ b/lib/python/cellranger/analysis/analysis_types.py @@ -7,13 +7,24 @@ from __future__ import annotations +import csv +import itertools +from dataclasses import dataclass from typing import TYPE_CHECKING, NamedTuple +import numpy as np +from six import ensure_str +from typing_extensions import Self + if TYPE_CHECKING: - import numpy as np + import cellranger.matrix as cr_matrix # pylint: disable=invalid-name +# Diffexp table keys +DIFFEXP_TABLE_FEATURE_ID_KEY = "Feature ID" +DIFFEXP_TABLE_FEATURE_NAME_KEY = "Feature Name" + class PCA(NamedTuple): """Holds information related to PCA dimensionality reduction.""" @@ -56,6 +67,61 @@ class DifferentialExpression(NamedTuple): data: np.ndarray[tuple[int, int], np.dtype[np.float64]] + @classmethod + def read_diffexp_from_csv(cls, csv_path: str | bytes) -> Self: + """Read differential expression from a CSV.""" + with open(csv_path) as f: + reader = csv.DictReader(f) + field_names = reader.fieldnames + if ( + not field_names + or len(field_names) < 2 + or DIFFEXP_TABLE_FEATURE_ID_KEY != field_names[0] + or DIFFEXP_TABLE_FEATURE_NAME_KEY != field_names[1] + ): + raise ValueError( + f"CSV did not begin with fields {DIFFEXP_TABLE_FEATURE_ID_KEY} and {DIFFEXP_TABLE_FEATURE_NAME_KEY}" + ) + + array_list_of_lists = [] + with open(csv_path) as f: + csvreader = csv.reader(f) + next(csvreader) + for row in csvreader: + array_list_of_lists.append(list(map(float, row[2:]))) + + return cls(data=np.array(array_list_of_lists)) + + +@dataclass +class DifferentialExpressionWithFeatures: + """Class with differential expression and feature stuff.""" + + diffexp: DifferentialExpression + feature_names: list[str] + feature_ids: list[str] + + @classmethod + def from_cmatrix_and_diffexp( + cls, cmatrix: cr_matrix.CountMatrix, diffexp: DifferentialExpression + ) -> Self: + """Get differential expression with features from matrix and diffexp.""" + feature_names = cmatrix.feature_ref.get_feature_names() + feature_ids = [ensure_str(x) for x in cmatrix.feature_ref.get_feature_ids()] + return cls(feature_names=feature_names, feature_ids=feature_ids, diffexp=diffexp) + + @classmethod + def from_diffexp_csv(cls, csv_path: str | bytes) -> Self: + """Get differential expression with features from matrix and diffexp.""" + diffexp = DifferentialExpression.read_diffexp_from_csv(csv_path=csv_path) + with open(csv_path) as f: + feature_ids, feature_names = itertools.tee( + (ensure_str(row[DIFFEXP_TABLE_FEATURE_ID_KEY]), row[DIFFEXP_TABLE_FEATURE_NAME_KEY]) + for row in csv.DictReader(f) + ) + feature_ids, feature_names = [x[0] for x in feature_ids], [x[1] for x in feature_names] + return cls(feature_names=feature_names, feature_ids=feature_ids, diffexp=diffexp) + class PLSA(NamedTuple): """Hold information related to PLSA dimensionality reduction.""" diff --git a/lib/python/cellranger/analysis/batch_correction.py b/lib/python/cellranger/analysis/batch_correction.py index 67bfdba..8335f4d 100644 --- a/lib/python/cellranger/analysis/batch_correction.py +++ b/lib/python/cellranger/analysis/batch_correction.py @@ -19,7 +19,7 @@ def batch_effect_score( dimred_matrix: np.ndarray[tuple[int, int], np.dtype[np.float64]], - batch_ids: np.ndarray[int, np.dtype[np.string_]], + batch_ids: np.ndarray[int, np.dtype[np.bytes_]], knn_neighbors: int | None = None, knn_frac: float | None = 0.01, max_num_bcs: int | None = 10000, diff --git a/lib/python/cellranger/analysis/bhtsne.py b/lib/python/cellranger/analysis/bhtsne.py deleted file mode 100644 index 65c2889..0000000 --- a/lib/python/cellranger/analysis/bhtsne.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2017 10X Genomics, Inc. All rights reserved. -# - -from __future__ import annotations - -import os -import os.path - -import numpy as np -import tsne as tsne_bh - -import cellranger.analysis.constants as analysis_constants -import cellranger.analysis.io as analysis_io -from cellranger.analysis.analysis_types import TSNE - - -def run_tsne( - transformed_pca_matrix, - name: str = "TSNE", - key: str = "TSNE", - tsne_dims=None, - input_pcs=None, - perplexity=None, - theta=None, - max_iter=None, - stop_lying_iter=None, - mom_switch_iter=None, - copy_data=False, - random_state=None, -): - if tsne_dims is None: - tsne_dims = analysis_constants.TSNE_N_COMPONENTS - - if perplexity is None: - perplexity = analysis_constants.TSNE_DEFAULT_PERPLEXITY - - if theta is None: - theta = analysis_constants.TSNE_THETA - - if random_state is None: - random_state = analysis_constants.RANDOM_STATE - - if max_iter is None: - max_iter = analysis_constants.TSNE_MAX_ITER - - if stop_lying_iter is None: - stop_lying_iter = analysis_constants.TSNE_STOP_LYING_ITER - - if mom_switch_iter is None: - mom_switch_iter = analysis_constants.TSNE_MOM_SWITCH_ITER - - if input_pcs is not None: - transformed_pca_matrix = transformed_pca_matrix[:, :input_pcs] - - # Make sure perplexity satisfies 'tsne' requirements - N = transformed_pca_matrix.shape[0] - perplexity = min(perplexity, max(1, -1 + float(N - 1) / 3)) - - # At sufficiently low cell count, we cannot satisfy perplexity >= 1 and this condition below, - # so the projection is defined as all zeros - if N - 1 < 3 * perplexity: - transformed_tsne_matrix = np.zeros((N, tsne_dims)) - else: - transformed_tsne_matrix = tsne_bh.bh_sne( - transformed_pca_matrix, - d=tsne_dims, - theta=theta, - perplexity=perplexity, - max_iter=max_iter, - stop_lying_iter=stop_lying_iter, - mom_switch_iter=mom_switch_iter, - copy_data=copy_data, - random_state=np.random.RandomState(random_state), - ) - - return TSNE(transformed_tsne_matrix, name=name, key=key) - - -def save_tsne_csv(tsne, barcodes, base_dir): - """Save a TSNE object to CSV.""" - # Preserve backward compatibility with pre-3.0 CSV files - # where the CSV directory was named "2_components" and the HDF5 dataset was named "_2" - key = tsne.key + "_components" - - tsne_dir = os.path.join(base_dir, key) - os.makedirs(tsne_dir, exist_ok=True) - - matrix_fn = os.path.join(tsne_dir, "projection.csv") - n_tsne_components = tsne.transformed_tsne_matrix.shape[1] - matrix_header = ["Barcode"] + ["TSNE-%d" % (i + 1) for i in range(n_tsne_components)] - analysis_io.save_matrix_csv(matrix_fn, tsne.transformed_tsne_matrix, matrix_header, barcodes) - - -def save_tsne_h5(tsne, fname): - """Save a TSNE object to HDF5.""" - t_map = {tsne.key: tsne} - analysis_io.save_dimension_reduction_h5(t_map, fname, analysis_constants.ANALYSIS_H5_TSNE_GROUP) diff --git a/lib/python/cellranger/analysis/clustering.py b/lib/python/cellranger/analysis/clustering.py index aa2fead..10ab195 100644 --- a/lib/python/cellranger/analysis/clustering.py +++ b/lib/python/cellranger/analysis/clustering.py @@ -37,9 +37,9 @@ class CLUSTERING(NamedTuple): clusters: np.ndarray[int, np.dtype[np.int64]] num_clusters: np.int64 cluster_score: np.float64 - clustering_type: np.string_ + clustering_type: np.bytes_ global_sort_key: np.float64 - description: np.string_ + description: np.bytes_ def format_legacy_clustering_key(cluster_type: str, cluster_param: int): @@ -64,7 +64,7 @@ def format_clustering_key(cluster_type: str, cluster_param: int): ): return cluster_type else: - raise ValueError("Unsupported cluster type: %s" % cluster_type) + raise ValueError(f"Unsupported cluster type: {cluster_type}") def _parse_number_of_clusters(clustering_key: str): @@ -108,7 +108,7 @@ def parse_clustering_key(clustering_key: str): elif clustering_key == CLUSTER_TYPE_CELLTYPES: return (clustering_key, 0) else: - raise ValueError("Unsupported clustering type for clustering key: %s" % clustering_key) + raise ValueError(f"Unsupported clustering type for clustering key: {clustering_key}") def humanify_clustering_key(clustering_key: str): @@ -185,7 +185,7 @@ def create_legacy_kmeans_nodes( f.create_soft_link(subgroup, field, target=target) else: sys.stderr.write( - "Skipped soft-link of legacy dataset to %s; node doesn't exist\n" % target + f"Skipped soft-link of legacy dataset to {target}; node doesn't exist\n" ) @@ -230,7 +230,7 @@ def create_clustering( clusters=np.asarray(clusters, dtype=np.int64), num_clusters=np.int64(num_clusters), cluster_score=np.float64(cluster_score), - clustering_type=np.string_(clustering_type), + clustering_type=np.bytes_(clustering_type), global_sort_key=np.float64(global_sort_key), - description=np.string_(description), + description=np.bytes_(description), ) diff --git a/lib/python/cellranger/analysis/constants.py b/lib/python/cellranger/analysis/constants.py index e6f23ba..08a2361 100644 --- a/lib/python/cellranger/analysis/constants.py +++ b/lib/python/cellranger/analysis/constants.py @@ -59,7 +59,7 @@ # this upper limit was determined via testing, # larger numbers of cells will require _at least_ memory reservation changes # in CORRECT_CHEMISTRY_BATCH.join, if not substantial algorithmic changes -CBC_MAX_NCELLS = 128000 +CBC_MAX_NCELLS = 800000 CBC_N_COMPONENTS_DEFAULT = 100 CBC_KNN = 10 CBC_ALPHA = 0.1 diff --git a/lib/python/cellranger/analysis/diffexp.py b/lib/python/cellranger/analysis/diffexp.py index 05f637e..f45b1e9 100644 --- a/lib/python/cellranger/analysis/diffexp.py +++ b/lib/python/cellranger/analysis/diffexp.py @@ -179,6 +179,7 @@ def save_differential_expression_csv( base_dir, cluster_names=None, file_name="differential_expression", + cell_types=None, ): """Write diffexp results to CSV.""" out_dir = base_dir @@ -191,7 +192,13 @@ def save_differential_expression_csv( n_clusters = de.data.shape[1] // 3 for i in range(n_clusters): - if cluster_names is None: + if cell_types: + diff_expression_header += [ + f"{cell_types[i]}, Mean Counts", + f"{cell_types[i]}, Log2 fold change", + f"{cell_types[i]}, Adjusted p value", + ] + elif cluster_names is None: diff_expression_header += [ "Cluster %d Mean Counts" % (i + 1), "Cluster %d Log2 fold change" % (i + 1), @@ -199,9 +206,9 @@ def save_differential_expression_csv( ] else: diff_expression_header += [ - "Perturbation %s, Mean Counts" % cluster_names[i], - "Perturbation %s, Log2 fold change" % cluster_names[i], - "Perturbation %s, Adjusted p value" % cluster_names[i], + f"Perturbation {cluster_names[i]}, Mean Counts", + f"Perturbation {cluster_names[i]}, Log2 fold change", + f"Perturbation {cluster_names[i]}, Adjusted p value", ] diff_expression_prefixes = [(f.id, f.name) for f in matrix.feature_ref.feature_defs] diff --git a/lib/python/cellranger/analysis/io.py b/lib/python/cellranger/analysis/io.py index 63b0564..13ace80 100644 --- a/lib/python/cellranger/analysis/io.py +++ b/lib/python/cellranger/analysis/io.py @@ -27,9 +27,9 @@ def __encode_h5_arr(f: tables.File, arr, field: str, group: str, key: str, subgroup: tables.Group): # XML encode strings so we can store them as HDF5 ASCII if isinstance(arr, str): - arr = np.string_(arr.encode("ascii", "xmlcharrefreplace")) + arr = np.bytes_(arr.encode("ascii", "xmlcharrefreplace")) elif isinstance(arr, bytes): - arr = np.string_(arr) + arr = np.bytes_(arr) if not hasattr(arr, "dtype"): raise ValueError(f"{group}/{key} must be a numpy array or scalar") @@ -224,13 +224,11 @@ def save_pca2_dimension_reduction_h5( @overload def load_dimension_reduction_from_h5( filename: str, group_name: str, ntuple: type[PCA] -) -> list[PCA]: - ... +) -> list[PCA]: ... @overload -def load_dimension_reduction_from_h5(filename: str, group_name: str, ntuple: type[_T1]) -> _T1: - ... +def load_dimension_reduction_from_h5(filename: str, group_name: str, ntuple: type[_T1]) -> _T1: ... def load_dimension_reduction_from_h5(filename: str, group_name: str, ntuple: type[_T1]): diff --git a/lib/python/cellranger/analysis/jibes.py b/lib/python/cellranger/analysis/jibes.py index ffc0c88..7ba3c07 100644 --- a/lib/python/cellranger/analysis/jibes.py +++ b/lib/python/cellranger/analysis/jibes.py @@ -12,8 +12,6 @@ # pylint: disable=invalid-name from __future__ import annotations -import os - import numpy as np import pandas as pd from six import ensure_binary @@ -50,29 +48,6 @@ _COUNT = "count" -def load_tag_counts_from_matrix(filtered_matrix, library_type=rna_library.ANTIGEN_LIBRARY_TYPE): - """Load all the read counts for a multiplexing library. - - Given a filtered matrix H5 file, load all the read counts for the multiplexing library type - each cell-associated barcode and return as a data frame following log10 transformation - along with a description of the features loaded. - - :param filtered_matrix: A path to a molecule info file or a CountMatrix. - :param library_type: string specifying library type - :return: A tuple with a Pandas DataFrame and a Dictionary with Feature info. - """ - is_cm = isinstance(filtered_matrix, CountMatrix) - if not is_cm and os.path.exists(filtered_matrix): - mat = CountMatrix.load_h5_file(filtered_matrix) - elif is_cm: - mat = filtered_matrix - else: - raise ReferenceError("Invalid filtered_matrix argument.") - # Older feature references have "Multiplexing Tag Capture" - cmo_tags = mat.select_features_by_type(library_type) - return cmo_tags - - def get_valid_tags(tag_calls_per_cell_fn): """Loads the list of. diff --git a/lib/python/cellranger/analysis/jibes_py.py b/lib/python/cellranger/analysis/jibes_py.py index 4ea3447..4b99e50 100644 --- a/lib/python/cellranger/analysis/jibes_py.py +++ b/lib/python/cellranger/analysis/jibes_py.py @@ -150,7 +150,7 @@ def __init__( # pylint: disable=invalid-name self.data_full, self.X_full = self._reshape_for_regression() self.posterior = None - self.LL = np.NINF + self.LL = -np.inf self.converged = False self.iterations = 0 diff --git a/lib/python/cellranger/analysis/multigenome.py b/lib/python/cellranger/analysis/multigenome.py index 8609bbb..303c486 100644 --- a/lib/python/cellranger/analysis/multigenome.py +++ b/lib/python/cellranger/analysis/multigenome.py @@ -234,7 +234,7 @@ def _infer_multiplets( # Fix random seed np.random.seed(0) - n_multiplet_boot: np.ndarray[int, np.dtype[np.float_]] = np.zeros(bootstraps) + n_multiplet_boot: np.ndarray[int, np.dtype[np.float64]] = np.zeros(bootstraps) for i in range(bootstraps): boot_idx = np.random.choice(len(counts0), len(counts0)) counts0_boot = counts0[boot_idx] @@ -313,14 +313,14 @@ def run_all(self): ) = compute_count_purity( top_txome_reads_per_bc[0, :], top_txome_reads_per_bc[1, :], gem_class_call ) - d["%s_filtered_bcs_mean_count_purity" % top_two_txomes[0]] = purity0 - d["%s_filtered_bcs_mean_count_purity" % top_two_txomes[1]] = purity1 - d["%s_filtered_bcs_mean_count_purity" % lib_constants.MULTI_REFS_PREFIX] = overall_purity - d["%s_filtered_bcs_purity_outliers" % top_two_txomes[0]] = n_purity_outlier0 - d["%s_filtered_bcs_purity_outliers" % top_two_txomes[1]] = n_purity_outlier1 - d["%s_filtered_bcs_frac_purity_outlier" % top_two_txomes[0]] = frac_purity_outlier0 - d["%s_filtered_bcs_frac_purity_outlier" % top_two_txomes[1]] = frac_purity_outlier1 - d["%s_filtered_bcs_frac_purity_outlier" % lib_constants.MULTI_REFS_PREFIX] = ( + d[f"{top_two_txomes[0]}_filtered_bcs_mean_count_purity"] = purity0 + d[f"{top_two_txomes[1]}_filtered_bcs_mean_count_purity"] = purity1 + d[f"{lib_constants.MULTI_REFS_PREFIX}_filtered_bcs_mean_count_purity"] = overall_purity + d[f"{top_two_txomes[0]}_filtered_bcs_purity_outliers"] = n_purity_outlier0 + d[f"{top_two_txomes[1]}_filtered_bcs_purity_outliers"] = n_purity_outlier1 + d[f"{top_two_txomes[0]}_filtered_bcs_frac_purity_outlier"] = frac_purity_outlier0 + d[f"{top_two_txomes[1]}_filtered_bcs_frac_purity_outlier"] = frac_purity_outlier1 + d[f"{lib_constants.MULTI_REFS_PREFIX}_filtered_bcs_frac_purity_outlier"] = ( frac_purity_outlier0 + frac_purity_outlier1 ) self.result = { diff --git a/lib/python/cellranger/analysis/pca.py b/lib/python/cellranger/analysis/pca.py index 155c6a3..353234e 100644 --- a/lib/python/cellranger/analysis/pca.py +++ b/lib/python/cellranger/analysis/pca.py @@ -112,9 +112,9 @@ def run_pca( pca_features = thresholded_matrix.features_dim elif pca_features > thresholded_matrix.features_dim: msg = ( - "You requested {} features but the matrix after thresholding only included {} features," + f"You requested {pca_features} features but the matrix after thresholding only included {thresholded_matrix.features_dim} features," "so the smaller amount is being used." - ).format(pca_features, thresholded_matrix.features_dim) + ) print(msg) pca_features = thresholded_matrix.features_dim # Calc mean and variance of counts after normalizing @@ -138,10 +138,8 @@ def run_pca( raise MatrixRankTooSmallException("Matrix rank is too small") else: print( - ( - "There are fewer nonzero features or barcodes ({}) than requested " - "PCA components ({}); reducing the number of components." - ).format(likely_matrix_rank, n_pca_components) + f"There are fewer nonzero features or barcodes ({likely_matrix_rank}) than requested " + f"PCA components ({n_pca_components}); reducing the number of components." ) n_pca_components = likely_matrix_rank diff --git a/lib/python/cellranger/analysis/singlegenome.py b/lib/python/cellranger/analysis/singlegenome.py index 3a03588..a335e2a 100644 --- a/lib/python/cellranger/analysis/singlegenome.py +++ b/lib/python/cellranger/analysis/singlegenome.py @@ -8,6 +8,7 @@ import os.path import re from collections.abc import Sequence +from typing import TypeAlias import h5py as h5 import numpy as np @@ -35,6 +36,9 @@ TSNE_NAME = "tsne" UMAP_NAME = "umap" +PROJECTION_TITLE = {TSNE_NAME: "t-SNE", UMAP_NAME: "UMAP"} + +Projection: TypeAlias = str class SingleGenomeAnalysis: @@ -71,7 +75,6 @@ def __init__( self.n_umap_components = analysis_constants.UMAP_N_COMPONENTS self.umap_min_dist = analysis_constants.UMAP_MIN_DIST self.umap_n_neighbors = analysis_constants.UMAP_DEFAULT_N_NEIGHBORS - # self.dr_bcs = matrix.bcs_dim self.dr_features = matrix.features_dim @@ -314,18 +317,9 @@ def load_clustering_from_h5(filename, clustering_key): ) @staticmethod - def load_bcs_from_matrix_h5(filename): - """Load just the barcodes from a matrix h5.""" - with h5.File(ensure_binary(filename), "r") as f: - # Take the first group, assuming a single-genome matrix - # TODO: fixme when we have a single matrix group - group_name = next(iter(f.keys())) - return cr_matrix.CountMatrix.load_bcs_from_h5_group(f[group_name]) - - @staticmethod - def load_default_format(base_dir, method): + def load_default_format(base_dir, *, method, projections: Sequence[Projection]): h5_file_path = analysis_io.h5_path(base_dir) if os.path.exists(h5_file_path): - return SingleGenomeAnalysis.load_h5(h5_file_path, method) + return SingleGenomeAnalysis.load_h5(h5_file_path, method, projections) else: return None diff --git a/lib/python/cellranger/barcodes/utils.py b/lib/python/cellranger/barcodes/utils.py index 8b3d504..5e513cc 100644 --- a/lib/python/cellranger/barcodes/utils.py +++ b/lib/python/cellranger/barcodes/utils.py @@ -54,18 +54,15 @@ def is_whitelist_spatial(whitelist_name: str): @overload -def load_barcode_tsv(filename: str | bytes, as_set: Literal[False] = False) -> list[bytes]: - ... +def load_barcode_tsv(filename: str | bytes, as_set: Literal[False] = False) -> list[bytes]: ... @overload -def load_barcode_tsv(filename: str | bytes, as_set: Literal[True] = ...) -> set[bytes]: - ... +def load_barcode_tsv(filename: str | bytes, as_set: Literal[True] = ...) -> set[bytes]: ... @overload -def load_barcode_tsv(filename: str | bytes, as_set: bool = False) -> set[bytes] | list[bytes]: - ... +def load_barcode_tsv(filename: str | bytes, as_set: bool = False) -> set[bytes] | list[bytes]: ... def load_barcode_tsv(filename: str | bytes, as_set=False) -> set[bytes] | list[bytes]: @@ -79,27 +76,29 @@ def load_barcode_tsv(filename: str | bytes, as_set=False) -> set[bytes] | list[b @overload -def get_barcode_whitelist_path(filename: None) -> None: - ... +def get_barcode_whitelist_path(filename: None, translation: bool = False) -> None: ... @overload -def get_barcode_whitelist_path(filename: str) -> str: - ... +def get_barcode_whitelist_path(filename: str, translation: bool = False) -> str: ... -def get_barcode_whitelist_path(filename: str | None) -> str | None: +def get_barcode_whitelist_path(filename: str | None, translation: bool = False) -> str | None: # Look for exact path, .txt.gz, or .txt if filename is None: return None elif os.path.exists(filename): return filename else: - gz = os.path.join(cr_constants.BARCODE_WHITELIST_PATH, filename + ".txt.gz") + rootdir = cr_constants.BARCODE_WHITELIST_PATH + if translation: + rootdir = os.path.join(rootdir, "translation") + + gz = os.path.join(rootdir, filename + ".txt.gz") if os.path.exists(gz): return gz - txt = os.path.join(cr_constants.BARCODE_WHITELIST_PATH, filename + ".txt") + txt = os.path.join(rootdir, filename + ".txt") return txt @@ -130,67 +129,43 @@ def get_barcode_whitelist_paths(filenames: str): return ",".join([get_barcode_whitelist_path(p) for p in paths]) +class WhitelistNotFound(Exception): + """Raised when a named whitelist is not found.""" + + @overload -def load_barcode_whitelist(filename: None, as_set=False) -> None: - ... +def load_barcode_whitelist(filename: None, as_set=False) -> None: ... @overload -def load_barcode_whitelist(filename: str, as_set: Literal[False] = False) -> list[bytes]: - ... +def load_barcode_whitelist( + filename: str, as_set: Literal[False] = False, translation: bool = False +) -> list[bytes]: ... @overload -def load_barcode_whitelist(filename: str, as_set: Literal[True]) -> set[bytes]: - ... +def load_barcode_whitelist( + filename: str, as_set: Literal[True], translation: bool = False +) -> set[bytes]: ... @overload -def load_barcode_whitelist(filename: str, as_set: bool) -> set[bytes] | list[bytes]: - ... +def load_barcode_whitelist( + filename: str, as_set: bool, translation: bool +) -> set[bytes] | list[bytes]: ... -def load_barcode_whitelist(filename: str | None, as_set: bool = False): - path = get_barcode_whitelist_path(filename) +def load_barcode_whitelist(filename: str | None, as_set: bool = False, translation: bool = False): + path = get_barcode_whitelist_path(filename, translation) if path is None: return None if not os.path.isfile(path): - raise NameError("Unable to find barcode whitelist: %s" % path) + raise WhitelistNotFound(f"Unable to find barcode whitelist: {path}") return load_barcode_tsv(path, as_set) -def load_barcode_translate_map(bc_whitelist: str | None): - """Guide BC to Cell BC translate. - - If the barcode whitelist needs to translate, return the mapping dictionary, - else, return None. - """ - if bc_whitelist is None: - return None - - file_path = None - for extension in [".txt", ".txt.gz"]: - file_ext = os.path.join( - cr_constants.BARCODE_WHITELIST_TRANSLATE_PATH, bc_whitelist + extension - ) - if os.path.exists(file_ext): - file_path = file_ext - break - - if file_path is None: - return None - else: - translate_map: dict[str, str] = {} - for line in cr_io.open_maybe_gzip(file_path, "r"): - if line.startswith("#"): - continue - bcs = line.strip().split() - translate_map[bcs[0]] = bcs[1] - return translate_map - - def load_probe_barcode_map( name: str | None = None, path: str | None = None ) -> dict[str, str] | None: diff --git a/lib/python/cellranger/cell_calling.py b/lib/python/cellranger/cell_calling.py index 9740cb9..2082def 100644 --- a/lib/python/cellranger/cell_calling.py +++ b/lib/python/cellranger/cell_calling.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright (c) 2021 10X Genomics, Inc. All rights reserved. +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. # """Functions for calling cell-associated barcodes.""" @@ -19,13 +19,12 @@ CHEMISTRY_DESCRIPTION_FIELD, CHEMISTRY_SC3P_LT, HT_CHEMISTRIES, + SC3P_V3_CHEMISTRIES, SC3P_V4_CHEMISTRIES, + SC5P_CHEMISTRIES, SC5P_V3_CHEMISTRIES, ) -# Drop this top fraction of the barcodes when estimating ambient. -MAX_OCCUPIED_PARTITIONS_FRAC = 0.5 - # Minimum number of UMIs for a barcode to be called as a cell MIN_GLOBAL_UMIS = 0 @@ -36,7 +35,7 @@ MIN_UMIS = 500 # Default number of background simulations to make -NUM_SIMS = 10000 +NUM_SIMS = 100000 # Minimum number of UMIS per barcode to consider after the initial cell calling for targeted GEX TARGETED_CC_MIN_UMIS_ADDITIONAL_CELLS = 10 @@ -115,9 +114,9 @@ class NonAmbientBarcodeResult(NamedTuple): def get_empty_drops_fdr(chemistry_description: str) -> float: """Gets the maximum adjusted p-value to call a barcode as non-ambient.""" # The chips used with V4 have roughly double the GEMs as the older V3 chips - v4_chemistries = SC3P_V4_CHEMISTRIES + SC5P_V3_CHEMISTRIES - v4_chem_names = [chem[CHEMISTRY_DESCRIPTION_FIELD] for chem in v4_chemistries] - return 0.001 if chemistry_description in v4_chem_names else 0.01 + chemistries = SC3P_V4_CHEMISTRIES + SC3P_V3_CHEMISTRIES + SC5P_CHEMISTRIES + HT_CHEMISTRIES + chem_names = [chem[CHEMISTRY_DESCRIPTION_FIELD] for chem in chemistries] + return 0.001 if chemistry_description in chem_names else 0.01 def get_empty_drops_range(chemistry_description: str, num_probe_bcs: int | None) -> tuple[int, int]: @@ -125,25 +124,28 @@ def get_empty_drops_range(chemistry_description: str, num_probe_bcs: int | None) Args: chemistry_description: A string describing the chemistry + num_probe_bcs: The number of probe or OCM multiplexing barcodes Returns: - low_index: - high_index: + (lower_range, upper_range) """ - # The chips used with V4 have roughly double the GEMs as the older V3 chips - v4_chemistries = SC3P_V4_CHEMISTRIES + SC5P_V3_CHEMISTRIES - v4_chem_names = [chem[CHEMISTRY_DESCRIPTION_FIELD] for chem in v4_chemistries] - ht_chem_names = [chem[CHEMISTRY_DESCRIPTION_FIELD] for chem in HT_CHEMISTRIES] - if chemistry_description == CHEMISTRY_SC3P_LT[CHEMISTRY_DESCRIPTION_FIELD]: - N_PARTITIONS = 9000 - elif chemistry_description in ht_chem_names: - N_PARTITIONS = 160000 - elif chemistry_description in v4_chem_names: - N_PARTITIONS = 80000 * num_probe_bcs if num_probe_bcs and num_probe_bcs > 1 else 160000 + n_partitions = 9000 + elif chemistry_description in [ + chem[CHEMISTRY_DESCRIPTION_FIELD] + for chem in HT_CHEMISTRIES + SC3P_V4_CHEMISTRIES + SC5P_V3_CHEMISTRIES + ]: + if num_probe_bcs is None: + n_partitions = 160000 + else: + # OCM + n_partitions = 40000 * num_probe_bcs + elif num_probe_bcs is not None: + # Flex + n_partitions = 90000 * num_probe_bcs else: - N_PARTITIONS = 45000 * num_probe_bcs if num_probe_bcs and num_probe_bcs > 1 else 90000 - return (N_PARTITIONS // 2, N_PARTITIONS) + n_partitions = 90000 + return (n_partitions // 2, n_partitions) def find_nonambient_barcodes( @@ -154,17 +156,23 @@ def find_nonambient_barcodes( *, emptydrops_minimum_umis=MIN_UMIS, num_sims=NUM_SIMS, -): + method="multinomial", +) -> NonAmbientBarcodeResult | None: """Call barcodes as being sufficiently distinct from the ambient profile. Args: matrix (CountMatrix): Full expression matrix. orig_cell_bcs (iterable of str): Strings of initially-called cell barcodes. chemistry_description: Change ambient RNA estimation for LT chemistry + num_probe_bcs: The number of probe or OCM multiplexing barcodes + emptydrops_minimum_umis: Minimum UMI threshold + num_sims: Number of simulations Returns: NonAmbientBarcodeResult """ + assert method in ["dirichlet", "multinomial"] + # Estimate an ambient RNA profile umis_per_bc = matrix.get_counts_per_bc() bc_order = np.argsort(umis_per_bc) @@ -181,11 +189,16 @@ def find_nonambient_barcodes( nz_bcs = np.flatnonzero(umis_per_bc) nz_bcs.sort() - use_bcs = np.intersect1d(empty_bcs, nz_bcs, assume_unique=True) + ambient_bcs = np.intersect1d(empty_bcs, nz_bcs, assume_unique=True) - if len(use_bcs) > 0: + if len(ambient_bcs) > 0: try: - eval_features, ambient_profile_p = est_background_profile_sgt(matrix.m, use_bcs) + eval_features, ambient_profile_p = est_background_profile_sgt(matrix.m, ambient_bcs) + if method == "dirichlet": + alpha = cr_stats.estimate_dirichlet_overdispersion( + matrix.m, ambient_bcs, ambient_profile_p + ) + except cr_sgt.SimpleGoodTuringError as e: print(str(e)) return None @@ -231,6 +244,8 @@ def find_nonambient_barcodes( assert not np.any(np.isin(eval_bcs, empty_bcs)) print(f"Number of candidate bcs: {len(eval_bcs)}") print(f"Range candidate bc umis: {umis_per_bc[eval_bcs].min()}, {umis_per_bc[eval_bcs].max()}") + print(f"Number of empty bcs: {len(empty_bcs)}") + print(f"Number of original cell calls: {len(orig_cells)}") eval_mat = matrix.m[eval_features, :][:, eval_bcs] @@ -240,13 +255,20 @@ def find_nonambient_barcodes( sim_loglk = np.repeat(np.nan, len(eval_bcs)) return None - # Compute observed log-likelihood of barcodes being generated from ambient RNA - obs_loglk = cr_stats.eval_multinomial_loglikelihoods(eval_mat, ambient_profile_p) - - # Simulate log likelihoods - distinct_ns, sim_loglk = cr_stats.simulate_multinomial_loglikelihoods( - ambient_profile_p, umis_per_bc[eval_bcs], num_sims=num_sims, verbose=True - ) + # Compute observed log-likelihood of barcodes being generated from ambient RNA and + # simulate log-likelihoods + if method == "dirichlet": + obs_loglk = cr_stats.eval_dirichlet_multinomial_loglikelihoods( + eval_mat, alpha * ambient_profile_p + ) + distinct_ns, sim_loglk = cr_stats.simulate_dirichlet_multinomial_loglikelihoods( + alpha * ambient_profile_p, umis_per_bc[eval_bcs], num_sims=num_sims + ) + else: + obs_loglk = cr_stats.eval_multinomial_loglikelihoods(eval_mat, np.log(ambient_profile_p)) + distinct_ns, sim_loglk = cr_stats.simulate_multinomial_loglikelihoods( + ambient_profile_p, umis_per_bc[eval_bcs], num_sims=num_sims + ) # Compute p-values pvalues = cr_stats.compute_ambient_pvalues( @@ -256,8 +278,11 @@ def find_nonambient_barcodes( pvalues_adj = adjust_pvalue_bh(pvalues) print(f"Max adjusted P-value: {max_adj_pvalue}") + print(f"Min observed P-value: {min(pvalues_adj)}") is_nonambient = pvalues_adj <= max_adj_pvalue + print(f"Non-ambient bcs identified by empty drops: {sum(is_nonambient)}") + return NonAmbientBarcodeResult( eval_bcs=eval_bcs, log_likelihood=obs_loglk, diff --git a/lib/python/cellranger/cell_calling_helpers.py b/lib/python/cellranger/cell_calling_helpers.py index 4365cb4..3737967 100644 --- a/lib/python/cellranger/cell_calling_helpers.py +++ b/lib/python/cellranger/cell_calling_helpers.py @@ -172,16 +172,16 @@ def throw_err(msg): # this will throw a ValueError if it's not a recognized error method = get_filter_method_from_string(method_name) - if method == FilterMethod.ORDMAG or method == FilterMethod.ORDMAG_NONAMBIENT: + if method in (FilterMethod.ORDMAG, FilterMethod.ORDMAG_NONAMBIENT): pass elif method == FilterMethod.MANUAL: if cell_barcodes is None: - throw_err("'cell_barcodes' must be specified when method is '%s'" % method_name) + throw_err(f"'cell_barcodes' must be specified when method is '{method_name}'") elif method == FilterMethod.TOP_N_BARCODES: if force_cells is None: - throw_err("'force_cells' must be specified when method is '%s'" % method_name) + throw_err(f"'force_cells' must be specified when method is '{method_name}'") ############################################################################### @@ -512,7 +512,7 @@ def _call_cells_by_gem_group( # counts per barcode gg_bc_counts = gg_matrix.get_counts_per_bc() - if method == FilterMethod.ORDMAG or method == FilterMethod.ORDMAG_NONAMBIENT: + if method in (FilterMethod.ORDMAG, FilterMethod.ORDMAG_NONAMBIENT): gg_filtered_indices, gg_filtered_metrics, msg = filter_cellular_barcodes_ordmag( gg_bc_counts, gg_recovered_cells, @@ -563,7 +563,7 @@ def _call_cells_by_gem_group( gg_filtered_bcs = gg_matrix.ints_to_bcs(gg_filtered_indices) else: - martian.exit("Unsupported BC filtering method: %s" % method) + martian.exit(f"Unsupported BC filtering method: {method}") raise SystemExit() if msg is not None: @@ -579,6 +579,7 @@ def call_additional_cells( filtered_bcs_groups, feature_types, chemistry_description, + probe_barcode_sample_id, *, num_probe_barcodes, emptydrops_minimum_umis: dict[tuple[str, int], int] | int, @@ -600,21 +601,24 @@ def call_additional_cells( pvalue_adj_arrays = [] nonambient_arrays = [] genome_call_arrays = [] + sample_id_arrays = [] emptydrops_threshold = dict() matrix = matrix.select_features_by_types(feature_types) - # Do it by gem group and genome - for genome in genomes: + for gg in unique_gem_groups: + # Do it by gem group and genome + gg_matrix = matrix.select_barcodes_by_gem_group(gg) + # Get all initial cell calls for this gem group. + gg_bcs = set() + for group, bcs in filtered_bcs_groups.items(): + if group[0] == gg: + gg_bcs.update(bcs) + gg_bcs = list(sorted(gg_bcs)) + # All sub-selection of the matrix should happen here & be driven by genome & feature_types - genome_matrix = matrix.select_features_by_genome(genome) - for gg in unique_gem_groups: - gg_matrix = genome_matrix.select_barcodes_by_gem_group(gg) - gg_bcs = set() - for group, bcs in filtered_bcs_groups.items(): - if group[0] == gg: - gg_bcs.update(bcs) - gg_bcs = list(sorted(gg_bcs)) + for genome in genomes: + genome_matrix = gg_matrix.select_features_by_genome(genome) if isinstance(emptydrops_minimum_umis, int): ed_minimum_umis = emptydrops_minimum_umis @@ -622,7 +626,7 @@ def call_additional_cells( ed_minimum_umis = emptydrops_minimum_umis[(genome, gg)] result = cr_cell.find_nonambient_barcodes( - gg_matrix, + genome_matrix, gg_bcs, chemistry_description, num_probe_barcodes, @@ -630,19 +634,21 @@ def call_additional_cells( num_sims=num_sims, ) if result is None: - print("Failed at attempt to call non-ambient barcodes in GEM well %s" % gg) + print(f"Failed at attempt to call non-ambient barcodes in GEM well {gg}") continue umis_per_bc = gg_matrix.get_counts_per_bc() emptydrops_threshold[(genome, gg)] = result.emptydrops_minimum_umis - eval_bcs_arrays.append(np.array(gg_matrix.bcs)[result.eval_bcs]) + eval_bcs = np.array([x.decode() for x in gg_matrix.bcs[result.eval_bcs]]) + eval_bcs_arrays.append(eval_bcs) umis_per_bc_arrays.append(umis_per_bc[result.eval_bcs]) loglk_arrays.append(result.log_likelihood) pvalue_arrays.append(result.pvalues) pvalue_adj_arrays.append(result.pvalues_adj) nonambient_arrays.append(result.is_nonambient) genome_call_arrays.append([genome] * len(result.eval_bcs)) # allow doublet calling + sample_id_arrays.append([probe_barcode_sample_id] * len(result.eval_bcs)) # Update the lists of cell-associated barcodes eval_bc_strs = np.array(gg_matrix.bcs)[result.eval_bcs] @@ -659,6 +665,7 @@ def call_additional_cells( ("pvalue_adj", np.concatenate(pvalue_adj_arrays)), ("nonambient", np.concatenate(nonambient_arrays)), ("genome", np.concatenate(genome_call_arrays)), + ("sample", np.concatenate(sample_id_arrays)), ] ) ) @@ -824,7 +831,7 @@ def combine_initial_metrics( prefix = genome + "_" if genome else "" summary.update({(f"{prefix}{key}"): summary for key, summary in txome_summary.items()}) - summary["%sfiltered_bcs" % prefix] = len(genome_filtered_bcs.get(genome, {})) + summary[f"{prefix}filtered_bcs"] = len(genome_filtered_bcs.get(genome, {})) return summary @@ -1015,7 +1022,7 @@ def filter_cellular_barcodes_gradient( nonzero_bc_counts = np.array(sorted(nonzero_bc_counts)[::-1]) # sort in descending order if len(nonzero_bc_counts) == 0: msg = "WARNING: All barcodes do not have enough reads for gradient, allowing no bcs through" - return [], metrics, msg + return np.array([]), metrics, msg baseline_bc_idx = int(np.round(float(recovered_cells) * (1 - ORDMAG_RECOVERED_CELLS_QUANTILE))) baseline_bc_idx = min(baseline_bc_idx, len(nonzero_bc_counts) - 1) @@ -1205,7 +1212,7 @@ def get_global_minimum_umis(global_minimum_umis: CellCallingParam, sample=None) def get_max_mito_percent( - max_mito_percent: (CellCallingParam | None), sample: (str | None) = None + max_mito_percent: CellCallingParam | None, sample: str | None = None ) -> float: """Extracts a value for maximum mitochondrial percentage from the CellCallingParam struct.""" if max_mito_percent is not None: diff --git a/lib/python/cellranger/cell_typing/cas_metrics.py b/lib/python/cellranger/cell_typing/cas_metrics.py new file mode 100644 index 0000000..7b001d6 --- /dev/null +++ b/lib/python/cellranger/cell_typing/cas_metrics.py @@ -0,0 +1,372 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2023 10X Genomics, Inc. All rights reserved. +# + + +"""Calculate Cell Typing Metrics.""" + +import csv +import json +import os +import textwrap +from collections import defaultdict + +import altair as alt +import h5py +import numpy as np +import pandas as pd + +import cellranger.altair_utils as alt_utils +import cellranger.analysis.constants as cr_analysis_constants +import cellranger.webshim.constants.gex as gex_constants +from cellranger.altair_plot_utils import make_alt_spatial_plot +from cellranger.cell_typing.cas_postprocessing import BARCODE_KEY, COARSE_CELL_TYPES_KEY + +alt.data_transformers.disable_max_rows() + + +def get_cas_cluster_purity(cell_types: str, analysis: str) -> dict: + """Calculate the cluster purity based on cell annotation cell types and analysis data. + + Args: + cell_types (str): Path to the cell annotation cell types CSV file. + analysis (str): Path to the analysis directory. + + Returns: + dict: A dictionary representing the cluster purity. will sum to 1 for each cluster: + """ + with open(cell_types) as cell_types_file: + cell_types = dict( + (row[BARCODE_KEY], row[COARSE_CELL_TYPES_KEY]) + for row in csv.DictReader(cell_types_file) + ) + + # Get clusters + analysis_h5 = h5py.File(os.path.join(analysis, "analysis.h5"), "r") + barcodes = (x.decode("utf-8") for x in analysis_h5["matrix/barcodes"]) + clusters = analysis_h5["/clustering/_gene_expression_graphclust/clusters"] + clusters_data = dict(zip(barcodes, clusters)) + # Join clusters and cell types + joined_data = ( + {"barcode": barcode, "clusters": clusters_data[barcode], COARSE_CELL_TYPES_KEY: cell_type} + for barcode, cell_type in cell_types.items() + if barcode in clusters_data + ) + + # Calculate the cluster "purity" + cluster_break_up = defaultdict(lambda: defaultdict(int)) + for data in joined_data: + cluster = data["clusters"] + cell_type = data[COARSE_CELL_TYPES_KEY] + cluster_break_up[cluster][cell_type] += 1 + + # Calculate the fractions + cluster_purity = {} + for cluster, cluster_cell_types in cluster_break_up.items(): + total_count = sum(cluster_cell_types.values()) + for cell_type, count in cluster_cell_types.items(): + cluster_purity.setdefault(cluster, {})[cell_type] = count / total_count + cluster_purity = {"cas_cluster_purity": dict(sorted(cluster_purity.items()))} + + return cluster_purity + + +def get_df_from_analysis( + analysis: str, + get_umap_coords: bool = False, +) -> pd.DataFrame: + """Get a dataframe of stuff from the analysis.h5. + + Returns barcode and clusters from graph-clust if get_umap_coords is False. + Also includes UMAP coords if get_umap_coords is True. + """ + analysis_h5_path = os.path.join(analysis, "analysis.h5") + analysis_h5 = h5py.File(analysis_h5_path, "r") + cluster_labels = analysis_h5["/clustering/_gene_expression_graphclust/clusters"] + barcodes = (x.decode("utf-8") for x in analysis_h5["matrix/barcodes"]) + dict_of_data = {"barcode": barcodes, "clusters": cluster_labels} + + if get_umap_coords: + umap_results = np.array( + analysis_h5[cr_analysis_constants.ANALYSIS_H5_UMAP_GROUP]["_gene_expression_2"][ + "transformed_umap_matrix" + ] + ) + umap_x, umap_y = zip(*umap_results) + dict_of_data["umap_x"] = umap_x + dict_of_data["umap_y"] = umap_y + + cluster_df = pd.DataFrame(dict_of_data) + return cluster_df + + +def get_df_from_cloupe_projection(cloupe_projection: str) -> pd.DataFrame: + """Get a dataframe of the cloupe projection and rename columns for the umap plot.""" + cloupe_projection_df = pd.read_csv(cloupe_projection) + cloupe_projection_df.rename( + columns={"Barcode": "barcode", "X Coordinate": "umap_x", "Y Coordinate": "umap_y"}, + inplace=True, + ) + return cloupe_projection_df + + +def get_cell_types_df(cell_types: str, analysis=None): + """Process cell type information and optionally merge it with analysis data. + + Args: + cell_types (str): Path to the CSV file containing cell type information. + analysis (optional): Path to the analysis directory. + If provided, the cell type information is merged based on the 'barcode' column. + + Returns: + cell_types (pd.DataFrame): Processed DataFrame containing cell type information. + If 'analysis' is provided, cell type information is merged and wrapped cell type + names are included in the 'cell_type_wrapped' column. + """ + cell_types = pd.read_csv(cell_types) + if analysis: + cluster_df = get_df_from_analysis(analysis) + cell_types = pd.merge(cluster_df, cell_types, on="barcode", how="left") + cell_types = cell_types[[col for col in cell_types.columns if not col.endswith("distance")]] + cell_types = cell_types.dropna() + cell_types["cell_type_wrapped"] = cell_types["coarse_cell_type"].apply( + lambda x: "|".join(textwrap.wrap(x, width=15)) + ) + return cell_types + + +def cell_type_bar_chart( + cell_types: str, + analysis: str, + return_chart: bool = False, + stacked: bool = True, +) -> dict: + """Generate a stacked bar chart representing the cluster purity based on cell annotation cell types and clusters. + + Args: + cell_types (str): Path to the cell annotation cell types CSV file. + analysis (str): Path to the analysis directory. + return_chart(bool): Return the chart for plotting in a notebook or a dict for plotting in the web summary + stacked(bool): Make a stacked bar chart per cluster or a bar chart of cells types as percent of total cells + + Returns: + dict: A JSON representation of the stacked bar chart created using Altair. + """ + if stacked: + cell_types = get_cas_cluster_purity(cell_types=cell_types, analysis=analysis) + cell_types = pd.DataFrame(cell_types["cas_cluster_purity"]).fillna(0) + cell_types = cell_types.reset_index(names=COARSE_CELL_TYPES_KEY) + cell_types = pd.melt(cell_types, id_vars=COARSE_CELL_TYPES_KEY, value_name="Fraction") + cell_types["cluster"] = cell_types["variable"] + cell_types["cell_type_wrapped"] = cell_types[COARSE_CELL_TYPES_KEY].apply( + lambda x: "|".join(textwrap.wrap(x, width=15)) + ) + chart = ( + alt.Chart(cell_types) + .mark_bar() + .encode( + x=alt.X("cluster:N", axis=alt.Axis(title="Cluster", labelAngle=0)), + y=alt.Y("sum(Fraction):Q", axis=alt.Axis(title="Percent Cell Type", format="%")), + color=alt.Color( + "cell_type_wrapped:N", + legend=alt.Legend( + title="Cell Type", + labelExpr="split(datum.label, '|')", + orient="bottom", + columns=4, + ), + ), + tooltip=[ + alt.Tooltip(COARSE_CELL_TYPES_KEY, title="Cell Type"), + alt.Tooltip("Fraction", title="Percent Cell Type", format=".0%"), + ], + ) + .properties(width=320, height=300) + ) + else: + cluster_df = get_df_from_analysis(analysis) + cell_types = pd.read_csv(cell_types) + cell_types = pd.merge(cluster_df, cell_types, on="barcode", how="left") + cell_types = cell_types[[col for col in cell_types.columns if not col.endswith("distance")]] + cell_types = cell_types.dropna() + cell_types["cell_type_wrapped"] = cell_types[COARSE_CELL_TYPES_KEY].apply( + lambda x: "|".join(textwrap.wrap(x, width=15)) + ) + + total_count = len(cell_types) + chart = ( + alt.Chart(cell_types) + .transform_aggregate( + count="count()", groupby=[COARSE_CELL_TYPES_KEY, "cell_type_wrapped"] + ) + .transform_calculate(fraction=f"datum.count / {total_count}") + .mark_bar() + .encode( + x=alt.X( + "fraction:Q", + axis=alt.Axis(title="Percentage", format="%"), + scale=alt.Scale(domain=(0, 1)), + ), + y=alt.Y("cell_type:N", sort="-x", axis=alt.Axis(title="Cell Type")), + color=alt.Color( + "cell_type_wrapped:N", + legend=alt.Legend( + title="Cell Type", + labelExpr="split(datum.label, '|')", + orient="bottom", + columns=8, + ), + ), + tooltip=[ + alt.Tooltip("cell_type:N", title="Cell Type"), + alt.Tooltip("fraction:Q", title="Percentage", format=".2%"), + ], + ) + ) + + if return_chart: + return chart + chart = alt_utils.chart_to_json(chart) + return chart + + +def cell_type_umap( + cell_types: str, analysis: str, cloupe_projection: str, return_chart: bool = False +) -> dict: + """Generate a UMAP scatter plot representing the UMAP projection colored by cell annotation cell types and labeled with cluster. + + Args: + cell_types (str): Path to the cell annotation cell types CSV file. + analysis (str): Path to the analysis directory. + cloupe_projection (str): Path to the cloupe projection CSV file. + return_chart(bool): Return the chart for plotting in a notebook or a dict for plotting in the web summary + + Returns: + dict: A JSON representation of the UMAP scatter plot colored with cell type created using Altair. + """ + if analysis: + cluster_df = get_df_from_analysis(analysis, get_umap_coords=True) + if cloupe_projection: + cluster_df = get_df_from_cloupe_projection(cloupe_projection) + cell_types = get_cell_types_df(cell_types) + cell_types = pd.merge(cluster_df, cell_types, on="barcode", how="left") + cell_types = cell_types.dropna() + if len(cell_types) > gex_constants.MAX_WEBSHIM_BCS_DIM: + cell_types = cell_types.sample(n=gex_constants.MAX_WEBSHIM_BCS_DIM, random_state=1) + # interpolate the umap spot size + num_spots = [1000, 5000] + spot_sizes = [50, 10] + num_barcodes = len(cell_types) + spot_size = np.interp(num_barcodes, num_spots, spot_sizes) + + highlight = alt.selection_multi(fields=["cell_type_wrapped"], bind="legend") + + common_columns = [ + "umap_x", + "umap_y", + "barcode", + "coarse_cell_type", + "cell_type_wrapped", + "fine_cell_type", + ] + tool_tip = [ + alt.Tooltip("coarse_cell_type", title="Cell Type"), + alt.Tooltip("fine_cell_type", title="Sub-type"), + ] + if cloupe_projection: + cell_types = cell_types[common_columns] + else: + cell_types = cell_types[common_columns + ["clusters"]] + tool_tip.append(alt.Tooltip("clusters", title="Cluster")) + # make the chart + chart = ( + alt.Chart(cell_types) + .mark_circle(size=spot_size) + .encode( + x=alt.X("umap_x", axis=alt.Axis(title="UMAP X")), + y=alt.Y("umap_y", axis=alt.Axis(title="UMAP Y")), + color=alt.condition( + highlight, + "cell_type_wrapped:N", + alt.value("lightgray"), + legend=alt.Legend( + title="Cell Type", + labelExpr="split(datum.label, '|')", + orient="bottom", + columns=4, + ), + ), + opacity=alt.condition(highlight, alt.value(1), alt.value(0.2)), + tooltip=tool_tip, + ) + .add_selection(highlight) + .configure_legend(titleFontSize=15, labelFontSize=12) + .interactive() + .properties(width=450) + ) + if return_chart: + return chart + chart = alt_utils.chart_to_json(chart) + return chart + + +def spatial_cell_types_plot( + tissue_positions_path: str, + tissue_lowres_image: str, + cell_types: str, + analysis: str, + scale_factors: str, + return_chart: bool = False, +) -> dict | alt.Chart: + """Generate a spatial plot of cell annotation cell types over tissue. + + Args: + tissue_positions_path (str): Path to the tissue positions file. + tissue_lowres_image (str): Path to the low-resolution tissue image. + cell_types (str): Cell types data for the tissue. + analysis (str): Path to analysis information for the cell types. + scale_factors(str): Path to the scalefactors_json.json. + return_chart (bool, optional): If True, return the Altair chart object. If False (default), + return the plot as a JSON representation. + + Returns: + dict or alt.Chart: The generated spatial plot as a dictionary or an Altair chart object. + If return_chart is True, returns the chart object; otherwise, returns the JSON representation of the chart. + """ + # Make the tissue positions with cell type calls + cell_types = get_cell_types_df(cell_types, analysis) + + with open(scale_factors) as f: + scale_factor_dict = json.load(f) + + def transfer_to_lowres(x: float) -> float: + return float(x) * scale_factor_dict["tissue_lowres_scalef"] + + tissue_positions_df = pd.read_csv( + tissue_positions_path, + usecols=["barcode", "pxl_row_in_fullres", "pxl_col_in_fullres"], + converters={ + "pxl_row_in_fullres": transfer_to_lowres, + "pxl_col_in_fullres": transfer_to_lowres, + }, + ).rename( + columns={ + "pxl_row_in_fullres": "pixl_row_in_lowres", + "pxl_col_in_fullres": "pixl_col_in_lowres", + } + ) + tissue_positions_df = pd.merge(tissue_positions_df, cell_types, on="barcode", how="inner") + tissue_positions_df = tissue_positions_df.dropna() + + final_plot = make_alt_spatial_plot( + tissue_lowres_image=tissue_lowres_image, + plotting_df=tissue_positions_df, + col_to_plot="cell_type_wrapped", + col_to_tooltip=COARSE_CELL_TYPES_KEY, + tooltip_title="Cell Type", + add_color_selector=True, + data_is_continuous=False, + return_chart=return_chart, + ) + return final_plot diff --git a/lib/python/cellranger/cell_typing/cas_postprocessing.py b/lib/python/cellranger/cell_typing/cas_postprocessing.py new file mode 100644 index 0000000..0b1e812 --- /dev/null +++ b/lib/python/cellranger/cell_typing/cas_postprocessing.py @@ -0,0 +1,130 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# +"""Functions and constants for all post processing of CAS.""" + +import csv +import json +from pathlib import Path + +# Key in cell annotation out +BARCODE_KEY = "barcode" +SCORE_KEY = "score" +CELL_TYPES_ID_KEY_IN = "cell_type_ontology_term_id" +MATCHES_KEY_IN = "matches" + +# Keys in Postprocessed cell annotation out +FINE_CELL_TYPES_KEY = "fine_cell_type" +COARSE_CELL_TYPES_KEY = "coarse_cell_type" + + +# Key in consolidated cell typing matrix created +CELL_TYPES_KEY = "cas_cell_type" +GROUND_TRUTH_CELL_TYPES_KEY = "gt_cell_type" +CELL_TYPES_AFTER_MAPPING_KEY = "cas_mapped_cell_type" +GROUND_TRUTH_CELL_TYPES_AFTER_MAPPING_KEY = "gt_mapped_cell_type" + +# Values when no GT and no cell annotation in cell typing matrix created +NO_GROUND_TRUTH_VALUE = "no ground truth" +NO_CAS_VALUE = "no cas annotation" +DEFAULT_CELL_MAPPING = "cell" +DEFAULT_CELL_MAPPING_ID = "CL:0000000" + +# file to get the cell annotation cell map from +CAS_CELL_TYPE_MAP_BASE_DIRECTORY = Path(__file__).parent / "ontology_tree" +CAS_CELL_TYPE_MAP_FILENAME = "V5_mappings.csv" +CAS_CELL_TYPE_MAP_PATH = CAS_CELL_TYPE_MAP_BASE_DIRECTORY / CAS_CELL_TYPE_MAP_FILENAME + +# Keys of the cell type maps +SOURCE_NODE_MAP_KEY = "source_node_name" +TARGET_NODE_MAP_KEY = "target_node_name" + +# file to get the cell annotation display map from +CAS_DISPLAY_MAP_BASE_DIRECTORY = Path(__file__).parent / "display_map" +CAS_DISPLAY_MAP_FILENAME = "celltype_display_mapping_v6.json" +CAS_DISPLAY_MAP_PATH = CAS_DISPLAY_MAP_BASE_DIRECTORY / CAS_DISPLAY_MAP_FILENAME + +# Keys of metrics JSON +AFTER_MAPPING_SUCCESS_RATE_KEY = "after_mapping_success_rate" +BEFORE_MAPPING_SUCCESS_RATE_KEY = "before_mapping_success_rate" +AFTER_MAPPING_SUCCESS_RATE_WITHOUT_DEFAULT_MAPPING_GT_KEY = ( + "after_mapping_success_rate_ignoring_gt_cell" +) +BEFORE_MAPPING_SUCCESS_RATE_WITHOUT_DEFAULT_MAPPING_GT__KEY = ( + "before_mapping_success_rate_ignoring_gt_annotations_mapped_to_cell" +) +SAMPLE_ID_KEY = "sample_id" +SAMPLE_DESCRIPTION_KEY = "sample_desc" +CAS_MODEL_KEY = "cell_annotation_model" +NUM_BCS_SAMPLED_KEY = "number_bcs_to_use" + + +def get_coarse_cell_type_map() -> dict[str, str]: + """Get map between OBO celltypes and cell types we keep.""" + with open(CAS_CELL_TYPE_MAP_PATH) as f: + tree_dct = dict( + ( + row[SOURCE_NODE_MAP_KEY].replace(",", "").lower(), + row[TARGET_NODE_MAP_KEY].replace(",", "").lower(), + ) + for row in csv.DictReader(f) + ) + + with open(CAS_DISPLAY_MAP_PATH) as jsonfile: + display_long_dct = json.load(jsonfile) + + display_dct = {z.replace(",", "").lower(): x for x, y in display_long_dct.items() for z in y} + + dct = {x: display_dct[y] for x, y in tree_dct.items()} + dct[NO_CAS_VALUE] = NO_CAS_VALUE + dct[NO_GROUND_TRUTH_VALUE] = NO_GROUND_TRUTH_VALUE + return dct + + +def get_fine_cell_type_map() -> dict[str, str]: + """Get map between OBO celltypes and fine cell types we keep.""" + with open(CAS_CELL_TYPE_MAP_PATH) as f: + dct = dict( + ( + row[SOURCE_NODE_MAP_KEY].replace(",", "").lower(), + row[TARGET_NODE_MAP_KEY], + ) + for row in csv.DictReader(f) + ) + + dct[NO_CAS_VALUE] = NO_CAS_VALUE + dct[NO_GROUND_TRUTH_VALUE] = NO_GROUND_TRUTH_VALUE + return dct + + +def get_bucket_dict() -> dict[str, int]: + """Get cell type to bucket map.""" + dct = get_coarse_cell_type_map() + level_2_keys = set(x.lower().replace(",", "") for x in dct.values()) - { + NO_CAS_VALUE, + NO_GROUND_TRUTH_VALUE, + DEFAULT_CELL_MAPPING, + } + + bucket_dct = {} + for key, value in dct.items(): + if key in [NO_CAS_VALUE, NO_GROUND_TRUTH_VALUE, DEFAULT_CELL_MAPPING]: + bucket_dct[key] = 0 + elif value in [NO_CAS_VALUE, NO_GROUND_TRUTH_VALUE, DEFAULT_CELL_MAPPING]: + bucket_dct[key] = 1 + elif key in level_2_keys: + bucket_dct[key] = 2 + else: + bucket_dct[key] = 3 + + return bucket_dct + + +def get_tree_version() -> str: + """Get version of tree being used.""" + return CAS_CELL_TYPE_MAP_PATH.stem + + +def get_display_map_version() -> str: + """Get version of tree being used.""" + return CAS_DISPLAY_MAP_PATH.stem diff --git a/lib/python/cellranger/cell_typing/cloud_cas_client.py b/lib/python/cellranger/cell_typing/cloud_cas_client.py new file mode 100644 index 0000000..580ab1c --- /dev/null +++ b/lib/python/cellranger/cell_typing/cloud_cas_client.py @@ -0,0 +1,744 @@ +#!/usr/bin/python3 +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Python Client to run cloud cell annotation.""" + +import base64 +import functools +import hashlib +import logging +import os +import random +import string +import textwrap +import time +from collections import defaultdict +from dataclasses import dataclass +from urllib.parse import urlencode, urljoin + +import requests +from requests.adapters import HTTPAdapter, Retry + +import cellranger.matrix as cr_matrix + +TEST_ENV = "test" +PROD_ENV = "prod" + +cloud_analysis_endpoints = { + "annotation-api": "api/cloud-analysis/annotation-api/v1", + "files-api": "api/cloud-analysis/files-api/v1", + "pipelines-api": "api/cloud-analysis/pipelines-api/v1", + "projects-api": "api/cloud-analysis/projects-api/v1", +} + + +@dataclass +class AnnotationOutput: + """Annotation output. + + file_id: file id + name: file name. + """ + + file_id: str + name: str + + +@dataclass +class AnnotationStatus: + """Annotation status. + + id: the annotation request id + status: the annotation status + outputs: the annotation outputs on successful completion. + """ + + annotation_id: str + status: str + outputs: list[AnnotationOutput] + + +class AnnotationError(Exception): + """Annotation Error.""" + + +class CloudAPIError(Exception): + """API Error.""" + + def __init__(self, status_code: int, *args: object) -> None: + """Create an exception and pass the HTTP error code as a param.""" + super().__init__(*args) + self.status_code = status_code + + +@dataclass +class AnnotationModelDescription: + """Annotation model description.""" + + name: str + displayName: str # pylint: disable=invalid-name + description: str + date: str + genomes: list[str] + + +@dataclass +class AnnotationParams: + """Parameters for invoking the annotation analysis.""" + + pipelineName: str # pylint: disable=invalid-name + pipelineVersion: str # pylint: disable=invalid-name + model: str + + +def _format_headers(headers): + return "\n".join(f"{k}: {v}" for k, v in headers.items()) + + +def print_roundtrip(response, *args, **kwargs): + """Print request and response.""" + reqbody = response.request.body + if reqbody and len(reqbody) > 100: + reqbody = "Request body omitted" + + print(f" kwargs: {kwargs}") + print( + textwrap.dedent( + """ + ---------------- request ---------------- + {req.method} {req.url} + {reqhdrs} + + {req_body} + ---------------- response ---------------- + {res.status_code} {res.reason} {res.url} + {reshdrs} + + {res.text} + """ + ).format( + req=response.request, + req_body=reqbody, + res=response, + reqhdrs=_format_headers(response.request.headers), + reshdrs=_format_headers(response.headers), + ) + ) + + +def md5sum_file(file_path: str, chunk_size: int = 8192) -> str: + """Get file md5 checksum.""" + md5 = hashlib.md5() + with open(file_path, "rb") as f: + while chunk := f.read(chunk_size): + md5.update(chunk) + + return md5.hexdigest() + + +def check_api_errors(r): + """Check for http response error.""" + http_error_msg = "" + reason = r.reason + + if 400 <= r.status_code < 500: + try: + reason = r.json() + except requests.exceptions.JSONDecodeError: + # use default reason if failed to parse error response + pass + + http_error_msg = f"Client Error {r.status_code}: {reason} for url: {r.url}" + elif 500 <= r.status_code < 600: + http_error_msg = f"Server Error {r.status_code}: {reason} for url: {r.url}" + + if http_error_msg: + raise CloudAPIError(r.status_code, http_error_msg) + + +def http_json_response(func): + """Wrapper to return json response.""" + + @functools.wraps(func) + def wrapper(*args, **kwargs): + try: + resp = func(*args, **kwargs) + check_api_errors(resp) + return resp.json() + except requests.exceptions.JSONDecodeError as error: + # could use something like HTTP 417 here but for now zero out the error code + raise CloudAPIError(0, f"Error parsing {func.__name__} response json") from error + + return wrapper + + +class CloudSessionStats: + """Cloud session statistics.""" + + OP_CONNECT = "connect" + OP_UPLOAD = "upload" + OP_ANALYZE = "analyze" + OP_DOWNLOAD = "download" + + operations = (OP_CONNECT, OP_UPLOAD, OP_ANALYZE, OP_DOWNLOAD) + + def __init__(self): + """Initialize operation counters and other base statistics.""" + self._counts = defaultdict(lambda: 0) + self._successes = defaultdict(lambda: False) + self._starts = defaultdict(time.time) + self._times = defaultdict(lambda: 0.0) + self.file_size: int = 0 + self.num_barcodes: int = 0 + self.cell_annotation_model: str = "" + self.server_url: str = "" + self.analysis_id: str | None = None + self._complete_success = False + self._start_time = time.time() + self._total_time = 0 + self._failure_mode = "" + + def __incr(self, operation): + """Indicate that an operation was tried.""" + self._counts[operation] += 1 + + def __succeed(self, operation): + """Indicate that an operation succeeded.""" + self._successes[operation] = True + + def __fail(self, operation): + """Indicate that an operation failed.""" + self._successes[operation] = False + + def __start(self, operation): + """Indicate that an operation started.""" + self._starts[operation] = time.time() + + def __end(self, operation): + """Indicate that an operation ended.""" + self._times[operation] = time.time() - self._starts[operation] + + def start(self, operation): + """Start and count an operation.""" + self.__incr(operation) + self.__start(operation) + + def passed(self, operation): + """End and mark an operation as successful.""" + self.__end(operation) + self.__succeed(operation) + + def failed(self, operation, reason: str | None = None): + """End and mark an operation as failed. Failure mode will be set.""" + self.__end(operation) + self.__fail(operation) + if reason is None: + self._failure_mode = f"Failed {operation}" + else: + self._failure_mode = reason + + def __stat(self, operation): + return { + "tries": self._counts[operation], + "success": self._successes[operation], + "duration": self._times[operation], + } + + def mark_successful(self): + self._complete_success = True + self._total_time = time.time() - self._start_time + + def mark_failure(self, reason: str): + """Set the recorded failure mode to the specified explicit reason. + + This may not pertain to a particular operation. This will also + establish the duration of the stats lifecycle. + """ + self._complete_success = False + self._failure_mode = reason + self._total_time = time.time() - self._start_time + + @property + def stats(self) -> dict: + """Return statistics about cloud operations as a dictionary.""" + base_stats = dict() + # need to flatten the operation-level statistics for metrics consumption + for operation in self.__class__.operations: + op_stat = self.__stat(operation) + base_stats[f"{operation}_tries"] = op_stat["tries"] + base_stats[f"{operation}_duration"] = op_stat["duration"] + base_stats[f"{operation}_success"] = op_stat["success"] + base_stats["barcodes"] = self.num_barcodes + base_stats["file_size"] = self.file_size + base_stats["cell_annotation_model"] = self.cell_annotation_model + base_stats["server_url"] = self.server_url + base_stats["success"] = self._complete_success + base_stats["failure_mode"] = self._failure_mode + base_stats["time_elapsed"] = self._total_time + base_stats["analysis_id"] = self.analysis_id + return base_stats + + +class CloudAPIClient: + """API Client to access 10X Cloud.""" + + def __init__( + self, + server_url: str, + api_token: str, + cfa_tokens: dict | None = None, + headers=None, + verbosity: int = 0, + ): + self._base_url = server_url + self.headers = headers + self.verbosity = verbosity + self.endpoints = cloud_analysis_endpoints + self.session_stats = None + + self.urls = {k: urljoin(self._base_url, v) for (k, v) in cloud_analysis_endpoints.items()} + + if not api_token: + raise ValueError("api_token not provided") + + self.cookies = {"session_id": api_token} + + if cfa_tokens: + self.headers = cfa_tokens + + self._session = requests.Session() + self._session.headers = self.headers + self._session.cookies.update(self.cookies) + + retries = Retry( + total=5, + backoff_factor=0.1, + status_forcelist=[502, 504, 524], + allowed_methods=["GET", "POST", "PUT"], + ) + self._session.mount("http://", HTTPAdapter(max_retries=retries)) + self._session.mount("https://", HTTPAdapter(max_retries=retries)) + if verbosity > 2: + self._session.hooks["response"].append(print_roundtrip) + + def __enter__(self): + self.session_stats = CloudSessionStats() + self.session_stats.server_url = self._base_url + return self + + def __exit__(self, *args): + self.session_stats = None + self._session.close() + + @property + def stats(self) -> CloudSessionStats | None: + return self.session_stats + + @http_json_response + def _get_current_user(self) -> requests.Response: + users_url = urljoin(self._base_url, "api/core/users-api/v1/user") + return self._session.get(users_url) + + @http_json_response + def _create_file_upload( + self, input_file: str, file_name: str, file_size: int, md5: str, metadata=None + ) -> requests.Response: + """Create a file upload.""" + body = { + "filename": file_name, + "md5": md5, + "size": file_size, + "path": input_file, + "fileType": "INPUT", + "metadata": metadata, + } + files_url = self.urls["files-api"] + return self._session.post(f"{files_url}/uploads", json=body) + + @http_json_response + def _start_file_multiupload(self, blob_id: str) -> requests.Response: + """Start File Multipart Upload API.""" + params = urlencode({"blobId": blob_id}) + files_url = self.urls["files-api"] + return self._session.get(f"{files_url}/multipart/start-upload?{params}") + + @http_json_response + def _get_part_upload_url( + self, + blob_id: str, + upload_id: str, + part_num: int, + md5base64: str, + expire_seconds: int, + ) -> requests.Response: + params = { + "blobId": blob_id, + "partNumber": part_num, + "hash": md5base64, + "expirationSeconds": expire_seconds, + "uploadId": upload_id, + } + encode_params = urlencode(params) + files_url = self.urls["files-api"] + return self._session.get( + f"{files_url}/multipart/get-upload-url?{encode_params}", + ) + + @http_json_response + def _complete_file_multiupload( + self, upload_id: str, blob_id: str, parts: dict + ) -> requests.Response: + files_url = self.urls["files-api"] + return self._session.post( + f"{files_url}/multipart/complete-upload", + json={"parts": parts, "blobId": blob_id, "uploadId": upload_id}, + ) + + @http_json_response + def _complete_file_upload(self, file_id: str) -> requests.Response: + files_url = self.urls["files-api"] + return self._session.put( + f"{files_url}/uploads/{file_id}", + json={"status": "DONE"}, + ) + + @http_json_response + def _create_adhoc_analysis(self, req: dict) -> requests.Response: + pipelines_url = self.urls["pipelines-api"] + return self._session.post( + f"{pipelines_url}/adhoc-analyses", + json=req, + ) + + @http_json_response + def _get_analysis(self, analysis_id: str) -> requests.Response: + projects_url = self.urls["projects-api"] + return self._session.get( + f"{projects_url}/analyses/{analysis_id}", + ) + + @http_json_response + def _get_analysis_output(self, project_id: str, analysis_id: str) -> requests.Response: + projects_url = self.urls["files-api"] + return self._session.get( + f"{projects_url}/projects/{project_id}/analyses/{analysis_id}", + ) + + @http_json_response + def _create_file_download(self, file_id: str) -> requests.Response: + files_url = self.urls["files-api"] + return self._session.post( + f"{files_url}/files/{file_id}/download", + ) + + @http_json_response + def _get_model_list(self) -> requests.Response: + annotation_url = self.urls["annotation-api"] + return self._session.get( + f"{annotation_url}/models", + ) + + @http_json_response + def _get_annotation_params( + self, + pipestance_type: str, + genome_name: str, + requires: list[str] | None = None, + cell_annotation_model: str | None = None, + ) -> requests.Response: + annotation_url = self.urls["annotation-api"] + args = { + "pipelineName": pipestance_type, + "genomes": [genome_name], + } + if requires is None: + args["requires"] = [] + else: + args["requires"] = requires + + if cell_annotation_model is not None and cell_annotation_model != "auto": + args["modelName"] = cell_annotation_model + return self._session.post(f"{annotation_url}/defaults", json=args) + + def _part_upload(self, upload_id: str, file_id: str, part: str, chunk_data: bytes): + md5 = hashlib.md5(chunk_data) + md5base64 = base64.b64encode(md5.digest()).decode("utf-8") + if self.verbosity: + logging.debug( + "md5base64: %s, hex: %s, size: %d", + md5base64, + md5.hexdigest(), + len(chunk_data), + ) + + part_response = self._get_part_upload_url( + file_id, upload_id, part_num=part, md5base64=md5base64, expire_seconds=600 + ) + presigned_url = part_response["presignedUrl"] + + headers = { + "Content-MD5": md5base64, + "Content-Type": "application/octet-stream", + "Accept": "application/json", + } + response = requests.put(presigned_url, data=chunk_data, headers=headers, timeout=15) + if self.verbosity > 2: + print_roundtrip(response) + + response.raise_for_status() + + if self.verbosity > 1: + logging.debug("part upload: partNumber %d, Etag: %s", part, response.headers["ETag"]) + return response.headers["ETag"] + + def get_annotation_params( + self, + pipestance_type: str, + genome_name: str, + requires: list[str] | None = None, + cell_annotation_model: str | None = None, + ) -> tuple[bool, AnnotationParams | None]: + """Get the default parameters (pipeline name, pipeline version, model name) for the supplied pipestance type, genome, and required pipeline capabilities. + + If no pipeline matches the supplied parameters, the return value will be + false, with a null AnnotationParams object. + """ + try: + resp = self._get_annotation_params( + pipestance_type, + genome_name, + requires=requires, + cell_annotation_model=cell_annotation_model, + ) + return True, AnnotationParams(**resp) + except CloudAPIError as cloud_err: + # if the server returns HTTP 400, that means there is no model/pipeline + # available for the supplied inputs. + if cloud_err.status_code == 400: + return False, None + else: + raise AnnotationError( + "API error while looking up annotation pipeline defaults" + ) from cloud_err + # probably won't hit this error case, but to cover the bases... + except requests.HTTPError as error: + if error.response.status_code == 400: + return False, None + else: + raise AnnotationError( + "HTTP error while looking up annotation pipeline defaults" + ) from error + + def upload_input_file( + self, + input_file: str, + file_name: str, + metadata: dict, + chunk_size: int = 5 * 1024 * 1024, + ) -> str: + """Upload Input File to 10x Cloud using aws presigned multipart upload. + + Args: + input_file: path to input file + file_name: name of the input file + metadata: metadata to be stored with file + chunk_size: chunk size for multipart upload + Returns: + file id. + """ + md5 = md5sum_file(input_file) + file_size = os.path.getsize(input_file) + self.session_stats.file_size = file_size + response = self._create_file_upload(input_file, file_name, file_size, md5, metadata) + file_id, blob_id, status = ( + response["id"], + response["blobId"], + response["status"], + ) + if status == "SKIP": + return file_id + if status != "READY": + raise AnnotationError(f"input file is in unexpected cloud state: {status}") + + upload = self._start_file_multiupload( + blob_id=blob_id, + ) + + upload_id = upload["uploadId"] + parts = [] + with open(input_file, "rb") as f: + part_num = 1 + while chunk_data := f.read(chunk_size): + etag = self._part_upload(upload_id, blob_id, part_num, chunk_data) + parts.append({"partNumber": part_num, "etag": etag}) + part_num = part_num + 1 + + self._complete_file_multiupload(upload_id, blob_id, parts) + self._complete_file_upload(file_id) + return file_id + + def is_annotation_completed(self, annotation_id: str) -> bool: + """Check if annotation is finished. + + Args: + annotation_id: the annotation request id + returns: + boolean to indicate whether the annotation is finished or not. + """ + resp = self._get_analysis(annotation_id) + runs = resp["analysisRuns"] + if len(runs) == 0: + raise AnnotationError(f"analysis {annotation_id} has no runs") + + run = runs[0] + state = run["status"] + return not state in ("INPROGRESS", "NEW") + + def get_available_models(self) -> list[AnnotationModelDescription]: + """Return the list of available models. + + Returns: + An array of model description dictionaries. + """ + resp = self._get_model_list() + models: list[AnnotationModelDescription] = [ + AnnotationModelDescription(**model) for model in resp + ] + return models + + def annotate_file( + self, + h5_filepath: str, + pipestance_type: str, + genome_name: str, + pipeline_params: AnnotationParams, + with_distance_info: bool = False, + with_dataset_info: bool = True, + upload_chunk_size: int = 5 * 1024 * 1024, + ) -> str: + """Annotate h5 file. + + Args: + h5_filepath: file path to h5 file + pipestance_type: pipestance type + genome_name: the name of the genome from the source h5 + pipeline_params: The invocation parameters returned from the server. + with_distance_info: whether to include neighbor distances in the result output + with_dataset_info: whether to include dataset source info in the result output + upload_chunk_size: the chunk size used for multipart upload + + Raises: + May raise an AnnotationError if any upload/initialize operation fails. + + Returns: + str: unique annotation request id. + """ + if not os.path.exists(h5_filepath): + raise AnnotationError(f"input file {h5_filepath} does not exist") + + _, num_bcs, _ = cr_matrix.CountMatrix.load_dims_from_h5(h5_filepath) + + try: + self.session_stats.start(CloudSessionStats.OP_UPLOAD) + self.session_stats.num_barcodes = num_bcs + self.session_stats.cell_annotation_model = pipeline_params.model + file_id = self.upload_input_file( + input_file=h5_filepath, + file_name=os.path.basename(h5_filepath), + metadata={"source": "cellranger"}, + chunk_size=upload_chunk_size, + ) + self.session_stats.passed(CloudSessionStats.OP_UPLOAD) + except requests.HTTPError as error: + err_msg = "HTTP error while uploading input file" + self.session_stats.failed(CloudSessionStats.OP_UPLOAD, reason=err_msg) + raise AnnotationError(err_msg) from error + except OSError as error: + err_msg = f"OSError uploading input file: {error}" + self.session_stats.failed(CloudSessionStats.OP_UPLOAD, reason=err_msg) + raise AnnotationError(err_msg) from error + + alphabet = string.ascii_lowercase + string.digits + analysis_name = "".join(random.choices(alphabet, k=8)) + + if os.environ.get("TENX_CLOUD_ENV", "") == "true": + analysis_source = "cloud" + else: + analysis_source = "local" + + req = { + "analysisName": analysis_name, + "description": f"cell annotation ({analysis_source})", + "pipelineName": pipeline_params.pipelineName, + "productVersion": pipeline_params.pipelineVersion, + "productVariant": "default", + "params": { + "pipelineName": pipestance_type, + "id": analysis_name, + "modelName": pipeline_params.model, + "filteredMatricesH5": file_id, + "genomeName": genome_name, + "withDistances": with_distance_info, + "withDatasetInfo": with_dataset_info, + }, + } + + analysis = self._create_adhoc_analysis(req) + analysis_id = analysis["analysisID"] + + self.session_stats.analysis_id = analysis_id + self.session_stats.start(CloudSessionStats.OP_ANALYZE) + + return analysis_id + + def get_annotate_status(self, annotation_id: str) -> AnnotationStatus: + """Get Annotation Status. + + Args: + annotation_id: the annotation id returned from annotation_file call + Returns: + AnnotationStatus: the status of annotation. + """ + resp = self._get_analysis(annotation_id) + runs = resp["analysisRuns"] + if len(runs) > 0: + run = runs[0] + state = run["status"] + if state == "COMPLETED": + self.session_stats.passed(CloudSessionStats.OP_ANALYZE) + project_id = resp["projectId"] + res = self._get_analysis_output(project_id=project_id, analysis_id=annotation_id) + outs = [AnnotationOutput(k["id"], k["filename"]) for k in res["files"]] + if len(outs) == 0: + err_msg = "completed analysis has no output" + self.session_stats.failed(CloudSessionStats.OP_ANALYZE, reason=err_msg) + raise AnnotationError(err_msg) + return AnnotationStatus(annotation_id, state, outs) + elif state == "FAILED": + self.session_stats.failed( + CloudSessionStats.OP_ANALYZE, reason="analysis pipeline failure" + ) + return AnnotationStatus(annotation_id, state, None) + else: + return AnnotationStatus(annotation_id, state, None) + + else: + raise AnnotationError("analysis has no runs") + + def get_output_download_url(self, file: AnnotationOutput) -> str: + """Retrieve Presigned URL to download file. + + Args: + file (AnnotationOutput): the output object returned from AnnotationStatus + Returns: + str: presigned download URL. + """ + download = self._create_file_download(file.file_id) + return download["downloadURL"] + + def preflight_check(self): + """Preflight check.""" + # TODO to update + self._get_current_user() diff --git a/lib/python/cellranger/cell_typing/cloud_cas_utils.py b/lib/python/cellranger/cell_typing/cloud_cas_utils.py new file mode 100644 index 0000000..2427e55 --- /dev/null +++ b/lib/python/cellranger/cell_typing/cloud_cas_utils.py @@ -0,0 +1,508 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Utilities to run cell annotation on the cloud.""" + +import os +import pathlib +import time +from dataclasses import dataclass +from urllib.parse import urlparse + +import martian +import requests + +import cellranger.cell_typing.cloud_cas_client as cloud_client_lib +import cellranger.cell_typing.common as ct_common +from cellranger.cell_typing.cloud_cas_client import CloudSessionStats + +# wait max 3 hours for completion +MAX_CLOUD_TIMEOUT_SECONDS = 60 * 60 * 3 + +# wait max 12 hours if annotation-only pipeline +MAX_CLOUD_TIMEOUT_SECONDS_ANNOTATION_ONLY = 60 * 60 * 12 + +# file names of cloud results +CLOUD_RESULTS_FILENAME = "cas_results.json.gz" +CLOUD_CELL_TYPES_FILENAME = "cas_cell_types.csv" +CLOUD_METADATA_FILENAME = "metadata.json" + +# path to the token in the tarball +LOCAL_TOKEN_PATH = pathlib.Path(__file__).parent / "tokens" / "10xcloud_token.json" + +# try 3 times max +MAX_RETRIES = 3 +RETRY_INTERVAL = 180 + +# SAP-38/39 +MIN_BARCODE_THRESHOLD = 100 + +MAX_BARCODE_THRESHOLD = 800_000 + +DEFAULT_HUMAN_MODEL = "human_pca_v1_beta" +DEFAULT_MOUSE_MODEL = "mouse-pca-512-log1p-zscore-v1" + + +@dataclass +class CasResults: + """Stores results from CAS.""" + + cell_annotation_results_json_gz: bytes | None = None + cell_types: bytes | None = None + cas_metadata: bytes | None = None + + def is_complete(self) -> bool: + return all( + ( + self.cell_annotation_results_json_gz is not None, + self.cell_types is not None, + self.cas_metadata is not None, + ) + ) + + def outputs_not_found(self) -> list: + """Returns a list of outputs not found.""" + outputs_not_found = [] + if self.cell_annotation_results_json_gz is None: + outputs_not_found.append(CLOUD_RESULTS_FILENAME) + if self.cell_types is None: + outputs_not_found.append(CLOUD_CELL_TYPES_FILENAME) + if self.cas_metadata is None: + outputs_not_found.append(CLOUD_METADATA_FILENAME) + return outputs_not_found + + +@dataclass +class TokenInfo: + """Stores token info.""" + + successful: bool + server_url: str | None = None + cli_token: str | None = None + cfa_tokens: dict | None = None + + +class CloudCellAnnotationException(Exception): + """Non-fatal exceptions for cell annotation.""" + + def __init__(self, session_stats: CloudSessionStats, *args): + self.stats = session_stats + super().__init__(*args) + self.stats.mark_failure(str(self)) + + +def extract_token_info(token_path_in) -> TokenInfo: + """Extract CLI and (if applicable) CFA tokens from the supplied args. + + Returns (server_url, cli_token, cfa_token) + """ + if not token_path_in: + # look for a token in the tokens directory, use if present + if not LOCAL_TOKEN_PATH.exists(): + raise ValueError("No token supplied") + tenx_cloud_token_path = LOCAL_TOKEN_PATH.absolute() + else: + # presence of the token should also have been validated by a preflight + if not os.path.exists(token_path_in): + raise ValueError(f"no token exists at {token_path_in}") + tenx_cloud_token_path = token_path_in + + # check for explicit use local token arg for additional header content + use_local_token = os.environ.get("TENX_CLOUD_USE_LOCAL_TOKEN") + args_cli_token: str | None = None + if use_local_token is not None: + # if env variable set, use CLI token from passed in path if + # available; get other settings from embedded local token + _, args_cli_token = ct_common.read_cli_token(tenx_cloud_token_path) + tenx_cloud_token_path = LOCAL_TOKEN_PATH.absolute() + + server_url, token_info = ct_common.read_full_token(tenx_cloud_token_path) + if server_url is not None and token_info is not None: + # if the full token is valid JSON, parse it + parse_result = urlparse(server_url) + if not parse_result.scheme: + server_url = f"https://{server_url}" + cf_dict = token_info.get("cloudflare_token", None) + if cf_dict: + cfa_tokens = cf_dict + else: + cfa_tokens = None + cli_token = token_info["cli_token"] + else: + # if the path contains a token only, return it + server_url, cli_token = ct_common.read_cli_token(tenx_cloud_token_path) + cfa_tokens = None + + # CLI token from passed in arg takes precedence over env token + if args_cli_token is not None: + cli_token = args_cli_token + if server_url is None or cli_token is None: + raise ValueError(f"Unable to read a valid token from {token_path_in}") + return TokenInfo( + server_url=server_url, cli_token=cli_token, cfa_tokens=cfa_tokens, successful=True + ) + + +def get_valid_models(models: list, ref: str) -> list: + """Returns valid cell annotation models. + + Given a reference string and a list of class AnnotationModelDescription return the model names that can be used with the given reference. + + Args: + models (list): List of class AnnotationModelDescription. Typically retrieved using `get_available_models` + ref (string): Reference name as a string + + Returns: + valid_models (list): List of valid models that can be used with the reference + """ + valid_models = [ + model.name for model in models if any(genome in ref for genome in model.genomes) + ] + return valid_models + + +def test_cloud_connection(cloud_client: cloud_client_lib.CloudAPIClient) -> tuple[bool, bool]: + """Test cloud connections. + + Returns (connected, valid_user). Connected will be false if a connection could not be made; + valid_user will be false if the user token is invalid. + """ + cloud_client.session_stats.start(CloudSessionStats.OP_CONNECT) + try: + cloud_client.preflight_check() + cloud_client.session_stats.passed(CloudSessionStats.OP_CONNECT) + martian.log_info("cloud preflight check succeeded") + return True, True + except cloud_client_lib.CloudAPIError as exc: + cloud_client.session_stats.failed(CloudSessionStats.OP_CONNECT, reason=str(exc)) + if exc.status_code == 403: + martian.alarm(f"cloud preflight check had invalid user credentials: {exc}") + return True, False + else: + martian.alarm(f"cloud preflight check failed: {exc}") + return False, False + + +def run_analysis( + filtered_matrix_path: str, + cloud_client: cloud_client_lib.CloudAPIClient, + pipestance_type: str, + genome_name: str, + pipeline_params: cloud_client_lib.AnnotationParams, + max_timeout: float = MAX_CLOUD_TIMEOUT_SECONDS, +) -> tuple[bool, list[cloud_client_lib.AnnotationOutput] | None]: + """Invoke the celltyper analysis and wait until a result. + + Args: + filtered_matrix_path (str): Filtered matrix path. + cloud_client (cloud_client_lib.CloudAPIClient): The client to use to communicate with the cloud. + pipestance_type (str | None): The pipestance type. + genome_name: The name of the genome to pass to the API (should agree with the H5) + pipeline_params: The invocation parameters (model/pipeline version) + max_timeout (float): the maximum timeout. + + Raises: + AnnotationError: if any unexpected failure occurs. + + Returns: + bool: If the upload and pipeline execution completed successfully. + list[AnnotationOutputs]: The list of files to download from the completed analysis. + """ + # upload H5 to cloud and kick off analysis + # TODO: pass distance, dataset info vars in a "dev mode" + martian.log_info("Uploading and invoking analysis") + try: + pending_analysis_id = cloud_client.annotate_file( + filtered_matrix_path, + pipestance_type=pipestance_type, + genome_name=genome_name, + pipeline_params=pipeline_params, + ) # throws AnnotationError + except cloud_client_lib.AnnotationError as error: + cloud_client.session_stats.failed(CloudSessionStats.OP_UPLOAD, reason=str(error)) + return False, None + + # wait until max timeout for the analysis to complete + # if it does not complete within the timeout time allotted, raise exception + # and do not permit restart + martian.log_info(f"Polling for analysis {pending_analysis_id}") + start_time = time.time() + + analysis_complete = False + while time.time() - start_time < max_timeout: + annotation_completed = False + try: + annotation_completed = cloud_client.is_annotation_completed(pending_analysis_id) + except cloud_client_lib.CloudAPIError: + # API error might be transient, maintain previous sleep schedule + time.sleep(10) + + if annotation_completed: + analysis_complete = True + time_taken_for_analysis = time.time() - start_time + martian.log_info(f"Annotation done. Took {time_taken_for_analysis} sec.") + try: + martian.log_info("Checking if annotating was successful.") + status = cloud_client.get_annotate_status(pending_analysis_id) + if status.status == "COMPLETED": + # happy path + martian.log_info("Annotation successful.") + return True, status.outputs + else: + # failed path -- can attempt to retry (could be transient) + martian.log_info("Annotation failed.") + return False, None + except cloud_client_lib.AnnotationError: + # this happens if a pipeline executes with no outs, or there + # has been no runs associated with the analysis + # assume pipeline will rerun in this manner when re-invoked; + # do not attempt to repeat. + return True, None + else: + # try every 10 sec + time.sleep(10) + + # CELLRANGER-8729: if the operation times out, fail, do not permit restart + if not analysis_complete: + raise cloud_client_lib.AnnotationError("analysis timeout exceeded") + + +def download_analysis_results( + cloud_client: cloud_client_lib.CloudAPIClient, + outputs_to_download: list[cloud_client_lib.AnnotationOutput], +) -> CasResults: + """Download the cell_annotation_results.json.gz file from the celltyper outs. + + Returns: + None if the download was unsuccessful, a trio of byte arrays of the content if so. + """ + download_url_pairs = [ + (output.name, cloud_client.get_output_download_url(output)) + for output in outputs_to_download + ] + if not outputs_to_download: + martian.log_info("No files received to download") + else: + martian.log_info("Download requests for the following files received:") + for output in outputs_to_download: + martian.log_info(f"{output.name} with file-id {output.file_id}") + + cell_annotation_results = CasResults() + for filename, download_url in download_url_pairs: + # exclusively pull cell_annotation_results.json.gz + if filename == CLOUD_RESULTS_FILENAME: + martian.log_info(f"Downloading results file {filename} from url {download_url}") + r = requests.get(download_url, allow_redirects=True, timeout=60) + if r.status_code == 200: + # the reason for the memory estimation in split + cell_annotation_results.cell_annotation_results_json_gz = r.content + + if filename == CLOUD_CELL_TYPES_FILENAME: + martian.log_info(f"Downloading cell types file {filename} from url {download_url}") + r = requests.get(download_url, allow_redirects=True, timeout=60) + if r.status_code == 200: + cell_annotation_results.cell_types = r.content + + if filename == CLOUD_METADATA_FILENAME: + martian.log_info(f"Downloading metadata file {filename} from url {download_url}") + r = requests.get(download_url, allow_redirects=True, timeout=60) + if r.status_code == 200: + cell_annotation_results.cas_metadata = r.content + + if not cell_annotation_results.is_complete(): + outputs_not_found = cell_annotation_results.outputs_not_found() + martian.alarm(f"No outputs with name {','.join(outputs_not_found)} found") + return cell_annotation_results + + +def write_results(results_list_gz_bytes, results_json_gz_path) -> None: + """Write results files.""" + # Write out the results with the barcode info, formatted as desired + # (this may not be strictly necessary as celltyper outputs in this format) + with open(results_json_gz_path, "wb") as f: + f.write(results_list_gz_bytes) + + +def run_get_annotation_defaults( # pylint: disable=too-many-arguments + server_url: str, + cli_token: str, + cfa_tokens: dict | None, + pipestance_type: str, + genome_name: str, + pipeline_requirements: list[str] | None, + cell_annotation_model: str | None, + max_retries: int = MAX_RETRIES, + retry_interval: int = RETRY_INTERVAL, +) -> cloud_client_lib.AnnotationParams | None: + """Get the appropriate defaults to invoke the cell annotation service.""" + with cloud_client_lib.CloudAPIClient( + server_url, + cli_token, + cfa_tokens=cfa_tokens, + ) as cloud_client: + num_tries = 0 + + # try connecting to server + preflight_succeeded = False + while num_tries < max_retries: + num_tries += 1 + connected, valid_user = test_cloud_connection(cloud_client) + if connected and valid_user: + preflight_succeeded = True + break + elif connected and not valid_user: + raise CloudCellAnnotationException( + cloud_client.session_stats, "Invalid cloud access token" + ) + # if not connected, try again + martian.log_info(f"Waiting {retry_interval} seconds to restart") + time.sleep(retry_interval) + + if not preflight_succeeded: + raise CloudCellAnnotationException( + cloud_client.session_stats, "Could not connect to cloud server; skipping annotation" + ) + + num_tries = 0 + while num_tries < max_retries: + num_tries += 1 + martian.log_info(f"Getting default model/pipeline params: attempt {num_tries}...") + try: + valid, params = cloud_client.get_annotation_params( + pipestance_type=pipestance_type, + genome_name=genome_name, + requires=pipeline_requirements, + cell_annotation_model=cell_annotation_model, + ) + if valid: + return params + else: + # no model-pipeline combination that meets requirements supplied; + # return None (calling stage should handle error behavior) + return None + + # if http 500, attempt to retry later + except cloud_client_lib.AnnotationError: + time.sleep(retry_interval) + + martian.log_info("Annotation parameter lookup failed.") + raise CloudCellAnnotationException( + cloud_client.session_stats, + "Failed annotation parameter lookup after max retries", + ) + + +def run_cloud_query( # pylint: disable=too-many-arguments + server_url: str, + cli_token: str, + cfa_tokens: dict | None, + filtered_matrix_path: str, + pipestance_type: str, + genome_name: str, + pipeline_params: cloud_client_lib.AnnotationParams, + max_retries=MAX_RETRIES, + retry_interval=RETRY_INTERVAL, + max_timeout=MAX_CLOUD_TIMEOUT_SECONDS, +) -> tuple[CasResults, CloudSessionStats]: + """Run the cell annotation service and get results from the proxy server.""" + with cloud_client_lib.CloudAPIClient( + server_url, + cli_token, + cfa_tokens=cfa_tokens, + ) as cloud_client: + # do a preflight check to fail fast (while allowing for transient cloud down-ness) + num_tries = 0 + preflight_succeeded = False + + cloud_client.session_stats.cell_annotation_model = pipeline_params.model + while num_tries < max_retries: + num_tries += 1 + connected, valid_user = test_cloud_connection(cloud_client) + if connected and valid_user: + preflight_succeeded = True + break + elif connected and not valid_user: + raise CloudCellAnnotationException( + cloud_client.session_stats, "Invalid cloud access token" + ) + # if not connected, try again + martian.log_info(f"Waiting {retry_interval} seconds to restart") + time.sleep(retry_interval) + + if not preflight_succeeded: + raise CloudCellAnnotationException( + cloud_client.session_stats, "Could not connect to cloud server; skipping annotation" + ) + + # try upload/analysis up to MAX_RETRIES + num_tries = 0 + annotation_succeeded = False + while num_tries < max_retries: + num_tries += 1 + try: + annotation_succeeded, outputs_to_download = run_analysis( + filtered_matrix_path=filtered_matrix_path, + cloud_client=cloud_client, + pipestance_type=pipestance_type, + genome_name=genome_name, + pipeline_params=pipeline_params, + max_timeout=max_timeout, + ) + if annotation_succeeded: + break + except cloud_client_lib.AnnotationError as error: + # bail on unexpected analysis condition + cloud_client.session_stats.failed(CloudSessionStats.OP_ANALYZE, str(error)) + raise CloudCellAnnotationException( + cloud_client.session_stats, "Unexpected server-side analysis failure" + ) from error + # don't immediately retry -- give it 3 minutes to change transient condition + martian.log_info("Waiting 3 minutes to retry analysis invocation") + time.sleep(retry_interval) + + # if the pipeline did not succeed, + if not annotation_succeeded: + martian.log_info("Annotation failed.") + raise CloudCellAnnotationException( + cloud_client.session_stats, + "Failed annotation after max retries", + ) + + # if the pipeline completed but there's no information, skip + if not outputs_to_download: + martian.log_info("The pipeline completed but there is no output to download.") + raise CloudCellAnnotationException( + cloud_client.session_stats, + "Annotation run yielded no outputs", + ) + + num_tries = 0 + martian.log_info("Preparing to download results") + while num_tries < max_retries: + num_tries += 1 + cloud_client.session_stats.start(CloudSessionStats.OP_DOWNLOAD) + try: + martian.log_info(f"Attempting to download results the {num_tries}-th time.") + results_content = download_analysis_results(cloud_client, outputs_to_download) + if results_content.is_complete(): + martian.log_info(f"Download of results successful on the {num_tries}-th try.") + cloud_client.session_stats.passed(CloudSessionStats.OP_DOWNLOAD) + break + except requests.HTTPError as exc: + martian.log_info(f"Download of results failed on the {num_tries}-th try.") + cloud_client.session_stats.failed(CloudSessionStats.OP_DOWNLOAD, reason=str(exc)) + + # don't immediately retry -- give it 3 minute to change download condition + # (and allow for a cloud restart) + martian.log_info("Waiting 3 minutes to retry failed download") + time.sleep(retry_interval) + + if not results_content.is_complete(): + cloud_client.session_stats.failed(CloudSessionStats.OP_DOWNLOAD) + raise CloudCellAnnotationException( + cloud_client.session_stats, "Could not download results from cloud endpoint" + ) + + cloud_client.session_stats.mark_successful() + return results_content, cloud_client.session_stats diff --git a/lib/python/cellranger/cell_typing/common.py b/lib/python/cellranger/cell_typing/common.py new file mode 100644 index 0000000..abd3761 --- /dev/null +++ b/lib/python/cellranger/cell_typing/common.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2023 10X Genomics, Inc. All rights reserved. +# +"""Cell Typing utility functions.""" +import json +import os +import pathlib +from dataclasses import asdict, dataclass + +import cellranger.matrix as cr_matrix +from cellranger.rna.library import GENE_EXPRESSION_LIBRARY_TYPE + +ALLOWED_GENOMES = ["GRCh38", "hg19", "mm10", "GRCm39"] +SCORE_THRESHOLD = 0.8 + +CAS_GENOME_REF_BASE_PATHS = pathlib.Path(__file__).parent / "cas_genome_references" +CAS_CSV_PATHS = { + "GRCh38": CAS_GENOME_REF_BASE_PATHS / "cellarium_cas_tx_pca_002_grch38_2020_a.csv", + "mm10": CAS_GENOME_REF_BASE_PATHS / "refdata-gex-mm10-2020-A.csv", +} + +# pipeline requirements +CELL_ANNOTATION_REQUIRES_JSON_RESULTS = "results:json" + + +@dataclass +class CellTypeResults: + """Common structure for results from remote cell annotation stages.""" + + cell_types: str | None = None + results: str | None = None + metadata: str | None = None + frac_returned_bcs: float = 0.0 + model_used: str | None = None + skip_downstream: bool = False + + def to_outs(self): + """Return the value this form needs to take to be in stage outs.""" + return asdict(self) + + +def check_h5_type(filtered_matrix_path: str) -> str: + """Checks the matrix filetype by investigating the suffix. + + Args: + filtered_matrix_path (str): The path to the matrix file. + + Returns: + str: The type of the matrix file ('h5' or 'h5ad'). + """ + matrix_type = pathlib.Path(filtered_matrix_path).suffix + if matrix_type not in [".h5", ".h5ad"]: + raise ValueError(f"Unsupported matrix type: {matrix_type}") + return matrix_type.replace(".", "") + + +def check_valid_genome_and_library(matrix: str) -> tuple[bool, bool, str | None]: + """Checks if the given matrix contains valid genome/species and library type. + + Args: + matrix (str): Path to the matrix to be checked. + + Returns: + tuple[bool, bool, str]: True if the matrix meets the criteria for valid genome and library information. + True if the genome is determined to be human. Genome name if there is a single genome. + """ + genomes = cr_matrix.CountMatrix.get_genomes_from_h5(matrix) + has_grch38_mm10 = any( + any(allowed_genome in genome for genome in genomes) for allowed_genome in ALLOWED_GENOMES + ) + library_types = cr_matrix.CountMatrix.load_library_types_from_h5_file(matrix) + is_human = any("GRCh38" in item or "hg19" in item for item in genomes) + return ( + (len(genomes) == 1 and has_grch38_mm10 and GENE_EXPRESSION_LIBRARY_TYPE in library_types), + is_human, + genomes[0] if len(genomes) == 1 else None, + ) + + +def read_cli_token(path) -> tuple[str | None, str | None]: + """Returns the server URL and CLI token at the specified path.""" + url = os.environ.get("TENX_CLOUD_URL", "https://cloud.10xgenomics.com") + try: + with open(path) as infile: + cli_token = infile.read() + cli_token = cli_token.strip() + return url, cli_token + except Exception as err: # pylint: disable=broad-except + # could not read the token + print(f"Error while reading the token at {path}.\nError {err}") + return None, None + + +def read_full_token(path) -> tuple[str | None, dict | None]: + """Returns the server URL and token info contained in the full token JSON at the specified path. + + If the token at the specified path isn't JSON, return None. + """ + try: + with open(path) as infile: + token_info: dict = json.load(infile) + # should only be one key -- the server url + url = next(iter(token_info.keys())) + return url, token_info[url] + except json.JSONDecodeError as err: + print(f"Error decoding token JSON at {path}.\n error seen {err}") + return None, None diff --git a/lib/python/cellranger/chemistry.py b/lib/python/cellranger/chemistry.py index 77e5f60..c79511b 100644 --- a/lib/python/cellranger/chemistry.py +++ b/lib/python/cellranger/chemistry.py @@ -21,7 +21,11 @@ ) # HT chemistries -HT_CHEMISTRIES = [CHEMISTRY_DEFS["SC3Pv3HT"], CHEMISTRY_DEFS["SC5PHT"]] +HT_CHEMISTRIES = [ + CHEMISTRY_DEFS["SC3Pv3HT-polyA"], + CHEMISTRY_DEFS["SC3Pv3HT-CS1"], + CHEMISTRY_DEFS["SC5PHT"], +] # LT v3 Chemistry CHEMISTRY_SC3P_LT = CHEMISTRY_DEFS["SC3Pv3LT"] @@ -36,15 +40,27 @@ CHEMISTRY_ARC_V1 = CHEMISTRY_DEFS["ARC-v1"] # Single Cell 3' chemistries -CHEMISTRY_SC3P_V3 = CHEMISTRY_DEFS["SC3Pv3"] +CHEMISTRY_SC3P_V3_POLYA = CHEMISTRY_DEFS["SC3Pv3-polyA"] +CHEMISTRY_SC3P_V3_CS1 = CHEMISTRY_DEFS["SC3Pv3-CS1"] + +SC3P_V3_CHEMISTRIES = [ + CHEMISTRY_SC3P_V3_POLYA, + CHEMISTRY_SC3P_V3_CS1, +] + +SC3P_V4_PREFIX = "SC3Pv4" + SC3P_V4_CHEMISTRIES = [ - CHEMISTRY_DEFS["SC3Pv4"], - CHEMISTRY_DEFS["SC3Pv4-OH"], + CHEMISTRY_DEFS["SC3Pv4-polyA"], + CHEMISTRY_DEFS["SC3Pv4-CS1"], + CHEMISTRY_DEFS["SC3Pv4-polyA-OCM"], + CHEMISTRY_DEFS["SC3Pv4-CS1-OCM"], ] SC3P_CHEMISTRIES = [ CHEMISTRY_DEFS["SC3Pv1"], CHEMISTRY_DEFS["SC3Pv2"], - CHEMISTRY_SC3P_V3, + CHEMISTRY_SC3P_V3_POLYA, + CHEMISTRY_SC3P_V3_CS1, ] + SC3P_V4_CHEMISTRIES @@ -52,7 +68,7 @@ # v3 versions, with a 3.6M whitelist and 12bp UMI CHEMISTRY_DEFS["SC5P-PE-v3"], CHEMISTRY_DEFS["SC5P-R2-v3"], - CHEMISTRY_DEFS["SC5P-R2-OH-v3"], + CHEMISTRY_DEFS["SC5P-R2-OCM-v3"], CHEMISTRY_DEFS["SC5P-R1-v3"], ] @@ -64,6 +80,8 @@ CHEMISTRY_DEFS["SC5P-R1"], ] + SC5P_V3_CHEMISTRIES +SC_GEMX_CHEMISTRIES = SC3P_V4_CHEMISTRIES + SC5P_V3_CHEMISTRIES + # Single Cell V(D)J (5-prime) chemistries SCVDJ_CHEMISTRIES = [ CHEMISTRY_DEFS["SCVDJ"], @@ -73,12 +91,11 @@ CHEMISTRY_DEFS["SCVDJ-R2-v3"], ] - -DEFINED_CHEMISTRIES = list(CHEMISTRY_DEFS.values()) - # Aliases for human usage CHEMISTRY_ALIASES = OrderedDict([("threeprime", "SC3P_auto"), ("fiveprime", "SC5P_auto")]) +DEFINED_CHEMISTRIES = list(CHEMISTRY_DEFS.values()) + # User-defined chemistry (use the various read_type/offset/length arguments passed to the pipeline) CUSTOM_CHEMISTRY_NAME = "custom" @@ -93,9 +110,9 @@ def get_chemistry(name) -> ChemistryDef: chemistries = [n for n in DEFINED_CHEMISTRIES if n["name"] == name] if len(chemistries) == 0: - raise ValueError("Could not find chemistry named %s" % name) + raise ValueError(f"Could not find chemistry named {name}") if len(chemistries) > 1: - raise ValueError("Found multiple chemistries with name %s" % name) + raise ValueError(f"Found multiple chemistries with name {name}") return chemistries[0] @@ -159,3 +176,15 @@ def get_primary_chemistry_def(chemistry_defs: ChemistryDefs) -> ChemistryDef: return chemistry_defs[GENE_EXPRESSION_LIBRARY_TYPE] except KeyError as exc: raise ValueError("no gene expression chemistry found") from exc + + +def get_whitelists_from_chemistry_defs(defs: ChemistryDefs) -> set[str]: + """Get all gel bead whitelists from the provided dict of chemistry defs.""" + whitelists = set() + for chem in defs.values(): + barcode_read_component = chem["barcode"][0] + assert barcode_read_component["kind"] == "gel_bead" + whitelist = barcode_read_component["whitelist"]["name"] + assert isinstance(whitelist, str) + whitelists.add(whitelist) + return whitelists diff --git a/lib/python/cellranger/chemistry_defs.json b/lib/python/cellranger/chemistry_defs.json index e968f72..920e323 100644 --- a/lib/python/cellranger/chemistry_defs.json +++ b/lib/python/cellranger/chemistry_defs.json @@ -61,7 +61,7 @@ } ] }, - "SC3Pv3": { + "SC3Pv3-polyA": { "barcode": [ { "kind": "gel_bead", @@ -69,13 +69,13 @@ "offset": 0, "read_type": "R1", "whitelist": { - "name": "3M-february-2018" + "name": "3M-february-2018_TRU" } } ], - "description": "Single Cell 3' v3", + "description": "Single Cell 3' v3 (polyA)", "endedness": "three_prime", - "name": "SC3Pv3", + "name": "SC3Pv3-polyA", "rna": { "length": null, "offset": 0, @@ -92,7 +92,7 @@ } ] }, - "SC3Pv4": { + "SC3Pv3-CS1": { "barcode": [ { "kind": "gel_bead", @@ -100,13 +100,14 @@ "offset": 0, "read_type": "R1", "whitelist": { - "name": "3M-3pgex-may-2023" + "name": "3M-february-2018_NXT", + "translation": true } } ], - "description": "Single Cell 3' v4", + "description": "Single Cell 3' v3 (CS1)", "endedness": "three_prime", - "name": "SC3Pv4", + "name": "SC3Pv3-CS1", "rna": { "length": null, "offset": 0, @@ -123,7 +124,7 @@ } ] }, - "SC3Pv3-OH": { + "SC3Pv4-polyA": { "barcode": [ { "kind": "gel_bead", @@ -131,7 +132,70 @@ "offset": 0, "read_type": "R1", "whitelist": { - "name": "3M-february-2018" + "name": "3M-3pgex-may-2023_TRU" + } + } + ], + "description": "Single Cell 3' v4 (polyA)", + "endedness": "three_prime", + "name": "SC3Pv4-polyA", + "rna": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "rna2": null, + "strandedness": "+", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, + "SC3Pv4-CS1": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-3pgex-may-2023_NXT", + "translation": true + } + } + ], + "description": "Single Cell 3' v4 (CS1)", + "endedness": "three_prime", + "name": "SC3Pv4-CS1", + "rna": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "rna2": null, + "strandedness": "+", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, + "SC3Pv3-polyA-OCM": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-february-2018_TRU" } }, { @@ -140,13 +204,14 @@ "offset": 7, "read_type": "R1", "whitelist": { - "name": "overhang" + "name": "overhang", + "translation": true } } ], - "description": "Single Cell 3' v3 OH", + "description": "Single Cell 3' v3 (polyA) OCM", "endedness": "three_prime", - "name": "SC3Pv3-OH", + "name": "SC3Pv3-polyA-OCM", "rna": { "length": null, "offset": 0, @@ -163,7 +228,7 @@ } ] }, - "SC3Pv4-OH": { + "SC3Pv3-CS1-OCM": { "barcode": [ { "kind": "gel_bead", @@ -171,7 +236,8 @@ "offset": 0, "read_type": "R1", "whitelist": { - "name": "3M-3pgex-may-2023" + "name": "3M-february-2018_NXT", + "translation": true } }, { @@ -180,13 +246,14 @@ "offset": 7, "read_type": "R1", "whitelist": { - "name": "overhang" + "name": "overhang", + "translation": true } } ], - "description": "Single Cell 3' v4 OH", + "description": "Single Cell 3' v3 (CS1) OCM", "endedness": "three_prime", - "name": "SC3Pv4-OH", + "name": "SC3Pv3-CS1-OCM", "rna": { "length": null, "offset": 0, @@ -203,7 +270,7 @@ } ] }, - "SC3Pv3HT": { + "SC3Pv4-polyA-OCM": { "barcode": [ { "kind": "gel_bead", @@ -211,13 +278,128 @@ "offset": 0, "read_type": "R1", "whitelist": { - "name": "3M-february-2018" + "name": "3M-3pgex-may-2023_TRU" + } + }, + { + "kind": "overhang", + "length": 2, + "offset": 7, + "read_type": "R1", + "whitelist": { + "name": "overhang", + "translation": true } } ], - "description": "Single Cell 3' v3 HT", + "description": "Single Cell 3' v4 (polyA) OCM", "endedness": "three_prime", - "name": "SC3Pv3HT", + "name": "SC3Pv4-polyA-OCM", + "rna": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "rna2": null, + "strandedness": "+", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, + "SC3Pv4-CS1-OCM": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-3pgex-may-2023_NXT", + "translation": true + } + }, + { + "kind": "overhang", + "length": 2, + "offset": 7, + "read_type": "R1", + "whitelist": { + "name": "overhang", + "translation": true + } + } + ], + "description": "Single Cell 3' v4 (CS1) OCM", + "endedness": "three_prime", + "name": "SC3Pv4-CS1-OCM", + "rna": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "rna2": null, + "strandedness": "+", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, + "SC3Pv3HT-polyA": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-february-2018_TRU" + } + } + ], + "description": "Single Cell 3' v3 HT (polyA)", + "endedness": "three_prime", + "name": "SC3Pv3HT-polyA", + "rna": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "rna2": null, + "strandedness": "+", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, + "SC3Pv3HT-CS1": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-february-2018_NXT", + "translation": true + } + } + ], + "description": "Single Cell 3' v3 HT (CS1)", + "endedness": "three_prime", + "name": "SC3Pv3HT-CS1", "rna": { "length": null, "offset": 0, @@ -327,6 +509,47 @@ } ] }, + "SC5P-R1-OCM-v3": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-5pgex-jan-2023" + } + }, + { + "kind": "overhang", + "length": 2, + "offset": 7, + "read_type": "R1", + "whitelist": { + "name": "overhang", + "translation": true + } + } + ], + "description": "Single Cell 5' R1-only OCM v3", + "endedness": "five_prime", + "name": "SC5P-R1-OCM-v3", + "rna": { + "length": null, + "offset": 43, + "read_type": "R1" + }, + "rna2": null, + "strandedness": "+", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, "SC5P-R2": { "barcode": [ { @@ -389,7 +612,7 @@ } ] }, - "SC5P-R2-OH": { + "SC5P-R2-OCM": { "barcode": [ { "kind": "gel_bead", @@ -406,13 +629,14 @@ "offset": 7, "read_type": "R1", "whitelist": { - "name": "overhang" + "name": "overhang", + "translation": true } } ], - "description": "Single Cell 5' R2-only OH", + "description": "Single Cell 5' R2-only OCM", "endedness": "five_prime", - "name": "SC5P-R2-OH", + "name": "SC5P-R2-OCM", "rna": { "length": null, "offset": 0, @@ -429,7 +653,7 @@ } ] }, - "SC5P-R2-OH-v3": { + "SC5P-R2-OCM-v3": { "barcode": [ { "kind": "gel_bead", @@ -446,13 +670,14 @@ "offset": 7, "read_type": "R1", "whitelist": { - "name": "overhang" + "name": "overhang", + "translation": true } } ], - "description": "Single Cell 5' R2-only OH v3", + "description": "Single Cell 5' R2-only OCM v3", "endedness": "five_prime", - "name": "SC5P-R2-OH-v3", + "name": "SC5P-R2-OCM-v3", "rna": { "length": null, "offset": 0, @@ -570,6 +795,51 @@ } ] }, + "SC5P-PE-OCM-v3": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-5pgex-jan-2023" + } + }, + { + "kind": "overhang", + "length": 2, + "offset": 7, + "read_type": "R1", + "whitelist": { + "name": "overhang", + "translation": true + } + } + ], + "description": "Single Cell 5' PE OCM v3", + "endedness": "five_prime", + "name": "SC5P-PE-OCM-v3", + "rna": { + "length": null, + "offset": 28, + "read_type": "R1" + }, + "rna2": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "strandedness": "+", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, "SCVDJ": { "barcode": [ { @@ -640,6 +910,51 @@ } ] }, + "SCVDJ-v3-OCM": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-5pgex-jan-2023" + } + }, + { + "kind": "overhang", + "length": 2, + "offset": 7, + "read_type": "R1", + "whitelist": { + "name": "overhang", + "translation": true + } + } + ], + "description": "Single Cell V(D)J OCM v3", + "endedness": "five_prime", + "name": "SCVDJ-v3-OCM", + "rna": { + "length": null, + "offset": 43, + "read_type": "R1" + }, + "rna2": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "strandedness": "+", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, "SCVDJ-R2": { "barcode": [ { @@ -702,6 +1017,47 @@ } ] }, + "SCVDJ-R2-OCM-v3": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "3M-5pgex-jan-2023" + } + }, + { + "kind": "overhang", + "length": 2, + "offset": 7, + "read_type": "R1", + "whitelist": { + "name": "overhang", + "translation": true + } + } + ], + "description": "Single Cell V(D)J R2-only OCM v3", + "endedness": "five_prime", + "name": "SCVDJ-R2-OCM-v3", + "rna": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "rna2": null, + "strandedness": "-", + "umi": [ + { + "length": 12, + "min_length": 10, + "offset": 16, + "read_type": "R1" + } + ] + }, "SCVDJ-Splint-R2-FRP": { "barcode": [ { @@ -776,7 +1132,7 @@ } } ], - "description": "Fixed RNA Profiling (Singleplex)", + "description": "Flex Gene Expression", "endedness": "three_prime", "name": "SFRP", "rna": { @@ -813,11 +1169,12 @@ "offset": 68, "read_type": "R2", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-rna" + "name": "probe-barcodes-fixed-rna-profiling-rna", + "translation": true } } ], - "description": "Fixed RNA Profiling", + "description": "Flex Gene Expression", "endedness": "three_prime", "name": "MFRP-RNA", "rna": { @@ -854,11 +1211,12 @@ "offset": 68, "read_type": "R2", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-ab" + "name": "probe-barcodes-fixed-rna-profiling-ab", + "translation": true } } ], - "description": "Fixed RNA Profiling (Antibody)", + "description": "Flex Antibody", "endedness": "three_prime", "name": "MFRP-Ab", "rna": { @@ -895,11 +1253,12 @@ "offset": 40, "read_type": "R1", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-rna-r1" + "name": "probe-barcodes-fixed-rna-profiling-rna-r1", + "translation": true } } ], - "description": "Fixed RNA Profiling (probe barcode on R1)", + "description": "Flex Gene Expression (probe barcode on R1)", "endedness": "three_prime", "name": "MFRP-RNA-R1", "rna": { @@ -935,11 +1294,12 @@ "offset": 40, "read_type": "R1", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-ab-r1" + "name": "probe-barcodes-fixed-rna-profiling-ab-r1", + "translation": true } } ], - "description": "Fixed RNA Profiling (Antibody, probe barcode on R1)", + "description": "Flex Antibody (probe barcode on R1)", "endedness": "three_prime", "name": "MFRP-Ab-R1", "rna": { @@ -975,7 +1335,8 @@ "offset": 40, "read_type": "R1", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-r1-48-uncollapsed" + "name": "probe-barcodes-fixed-rna-profiling-r1-48-uncollapsed", + "translation": true } } ], @@ -1015,7 +1376,8 @@ "offset": 68, "read_type": "R2", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-47" + "name": "probe-barcodes-fixed-rna-profiling-47", + "translation": true } } ], @@ -1056,7 +1418,8 @@ "offset": 68, "read_type": "R2", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-uncollapsed" + "name": "probe-barcodes-fixed-rna-profiling-uncollapsed", + "translation": true } } ], @@ -1097,11 +1460,12 @@ "offset": 49, "read_type": "R2", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-ab" + "name": "probe-barcodes-fixed-rna-profiling-ab", + "translation": true } } ], - "description": "Fixed RNA Profiling (Antibody, probe barcode at R2:50)", + "description": "Flex Antibody (probe barcode at R2:50)", "endedness": "three_prime", "name": "MFRP-Ab-R2pos50", "rna": { @@ -1138,11 +1502,12 @@ "offset": 0, "read_type": "R2", "whitelist": { - "name": "probe-barcodes-fixed-rna-profiling-crispr" + "name": "probe-barcodes-fixed-rna-profiling-crispr", + "translation": true } } ], - "description": "Fixed RNA Profiling (CRISPR)", + "description": "Flex CRISPR", "endedness": "three_prime", "name": "MFRP-CRISPR", "rna": { @@ -1325,10 +1690,8 @@ "offset": 11, "read_type": "R1", "whitelist": { - "name": null, "part": "bc1", - "slide": "visium_hd_v1", - "translation_whitelist_path": null + "slide": "visium_hd_v1" } }, { @@ -1337,18 +1700,16 @@ "offset": 25, "read_type": "R1", "whitelist": { - "name": null, "part": "bc2", - "slide": "visium_hd_v1", - "translation_whitelist_path": null + "slide": "visium_hd_v1" } } ], "barcode_extraction": { "method": "joint_bc1_bc2", "params": { - "max_offset": 13, - "min_offset": 9 + "max_offset": 12, + "min_offset": 8 } }, "description": "Visium HD v1", @@ -1402,5 +1763,75 @@ "read_type": "R1" } ] + }, + "SFRP-no-trim-R2": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "737K-fixed-rna-profiling" + } + } + ], + "description": "SFRP with untrimmed R2", + "endedness": "three_prime", + "name": "SFRP-no-trim-R2", + "rna": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "rna2": null, + "strandedness": "-", + "umi": [ + { + "length": 12, + "offset": 16, + "read_type": "R1" + } + ] + }, + "MFRP-R1-no-trim-R2": { + "barcode": [ + { + "kind": "gel_bead", + "length": 16, + "offset": 0, + "read_type": "R1", + "whitelist": { + "name": "737K-fixed-rna-profiling" + } + }, + { + "kind": "right_probe", + "length": 8, + "offset": 40, + "read_type": "R1", + "whitelist": { + "name": "probe-barcodes-fixed-rna-profiling-rna-r1", + "translation": true + } + } + ], + "description": "MFRP with probe bc on R1 and untrimmed R2", + "endedness": "three_prime", + "name": "MFRP-R1-no-trim-R2", + "rna": { + "length": null, + "offset": 0, + "read_type": "R2" + }, + "rna2": null, + "strandedness": "-", + "umi": [ + { + "length": 12, + "offset": 16, + "read_type": "R1" + } + ] } } diff --git a/lib/python/cellranger/cr_io.py b/lib/python/cellranger/cr_io.py index 50c3e65..75c0537 100644 --- a/lib/python/cellranger/cr_io.py +++ b/lib/python/cellranger/cr_io.py @@ -32,15 +32,14 @@ def get_input_path(oldpath: AnyStr, is_dir: bool = False) -> AnyStr: sys.exit(f"'{oldpath}' is not a valid string type and is an invalid path") path = fixpath(oldpath) if not os.path.exists(path): - sys.exit("Input file does not exist: %s" % path) + sys.exit(f"Input file does not exist: {path}") if not os.access(path, os.R_OK): sys.exit(f"Input file path {path} does not have read permissions") if is_dir: if not os.path.isdir(path): - sys.exit("Please provide a directory, not a file: %s" % path) - else: - if not os.path.isfile(path): - sys.exit("Please provide a file, not a directory: %s" % path) + sys.exit(f"Please provide a directory, not a file: {path}") + elif not os.path.isfile(path): + sys.exit(f"Please provide a file, not a directory: {path}") return path @@ -61,23 +60,19 @@ def get_output_path(oldpath: AnyStr) -> AnyStr: @overload -def open_maybe_gzip(filename: str | bytes, mode: Literal["r"] = "r") -> TextIO: - ... +def open_maybe_gzip(filename: str | bytes, mode: Literal["r"] = "r") -> TextIO: ... @overload -def open_maybe_gzip(filename: str | bytes, mode: Literal["w"] = ...) -> TextIO: - ... +def open_maybe_gzip(filename: str | bytes, mode: Literal["w"] = ...) -> TextIO: ... @overload -def open_maybe_gzip(filename: str | bytes, mode: Literal["rb"] = ...) -> io.BufferedReader: - ... +def open_maybe_gzip(filename: str | bytes, mode: Literal["rb"] = ...) -> io.BufferedReader: ... @overload -def open_maybe_gzip(filename: str | bytes, mode: Literal["wb"] = ...) -> io.BufferedReader: - ... +def open_maybe_gzip(filename: str | bytes, mode: Literal["wb"] = ...) -> io.BufferedReader: ... def open_maybe_gzip(filename: str | bytes, mode: str = "r") -> IO[Any]: @@ -102,7 +97,7 @@ def open_maybe_gzip(filename: str | bytes, mode: str = "r") -> IO[Any]: return io.BufferedWriter(raw, buffer_size=bufsize) else: - raise ValueError("Unsupported mode for compression: %s" % mode) + raise ValueError(f"Unsupported mode for compression: {mode}") class CRCalledProcessError(Exception): @@ -125,7 +120,7 @@ def check_completed_process(p: subprocess.CompletedProcess, cmd: str) -> None: CRCalledProcessError """ if p.returncode is None: - raise CRCalledProcessError("Process did not finish: %s ." % cmd) + raise CRCalledProcessError(f"Process did not finish: {cmd} .") elif p.returncode != 0: raise CRCalledProcessError("Process returned error code %d: %s ." % (p.returncode, cmd)) @@ -307,20 +302,18 @@ def recursive_hard_link_dict(in_files, prefixes=None): for k, path_or_dict in in_files.items(): if path_or_dict is None: out_files[k] = None + elif isinstance(path_or_dict, dict): + out_files[k] = recursive_hard_link_dict(in_files[k], prefixes + [k]) + elif isinstance(path_or_dict, (str)): + final_prefixes = prefixes + [k] + old_path = path_or_dict + new_path = martian.make_path( + "_".join(final_prefixes) + "_" + os.path.basename(old_path) + ).decode("utf8") + hardlink_with_fallback(old_path, new_path) + out_files[k] = new_path else: - if isinstance(path_or_dict, dict): - out_files[k] = recursive_hard_link_dict(in_files[k], prefixes + [k]) - elif isinstance(path_or_dict, (str)): - final_prefixes = prefixes + [k] - old_path = path_or_dict - new_path = martian.make_path( - "_".join(final_prefixes) + "_" + os.path.basename(old_path) - ).decode("utf8") - hardlink_with_fallback(old_path, new_path) - out_files[k] = new_path - else: - raise ValueError( - "Input dictionary may not contain any elements other than dict and string: %s" - % path_or_dict - ) + raise ValueError( + f"Input dictionary may not contain any elements other than dict and string: {path_or_dict}" + ) return out_files diff --git a/lib/python/cellranger/csv_utils.py b/lib/python/cellranger/csv_utils.py index 918540f..98f2bcd 100644 --- a/lib/python/cellranger/csv_utils.py +++ b/lib/python/cellranger/csv_utils.py @@ -36,26 +36,44 @@ def _iter_file_rows(filename_bytes, filename, descriptive_name): has_data = False # First non-comment row is treated specially, because it is the header. first = True - for row in f: - row = row.strip() - if not row: - # Skip blank rows. The csv reader does this anyway, but doing - # it here saves us the trouble of decoding from ascii. - continue - if not row.startswith("#"): - has_data = True - if first: - # Remove whitespace around column headers - row = ",".join(x.strip() for x in row.split(",")) - first = False - # Verify is ASCII Compatible - if not row.isascii(): - raise CSVParseException( - "The {} csv file {} contains non-ascii characters.\n\nRow:\n{}".format( - descriptive_name, filename, row + try: + for row in f: + row = row.strip() + if not row: + # Skip blank rows. The csv reader does this anyway, but doing + # it here saves us the trouble of decoding from ascii. + continue + if not row.startswith("#"): + has_data = True + if first: + # Remove whitespace around column headers + row = ",".join(x.strip() for x in row.split(",")) + first = False + # Verify is ASCII Compatible + if not row.isascii(): + raise CSVParseException( + f"The {descriptive_name} csv file {filename} contains non-ascii characters.\n\nRow:\n{row}" ) - ) - yield row + yield row + # We could encounter invalid unicode when decoding any row, which has + # some behind-the-scenes buffering. Provide an error message that + # attempts to provide better context, showing the surrounding ~60 characters. + except UnicodeDecodeError as err: + context_start = max(err.start - 30, 0) + badchar_offset = err.start - context_start + snippet = ( + err.object[context_start : err.start + 30] + .decode("utf-8", errors="replace") + .replace("\r", " ") + .replace("\n", " ") + ) + caret = (" " * badchar_offset) + "^" + raise CSVParseException( + f"The {descriptive_name} csv file {filename} has one or more invalid utf-8 characters: {err.reason}. " + f"The first bad character is at absolute position {err.start}.\n" + "This snippet shows the offending character in context:\n" + f"{snippet}\n{caret}" + ) from err if not has_data: raise CSVEmptyException(f"The {descriptive_name} csv file {filename} has no data.") @@ -89,10 +107,8 @@ def _validate_columns(reader, descriptive_name, required_cols, valid_cols): ", ".join(required_cols) ) - msg += """ -Please check that you have formatted the {} file correctly and included the appropriate column headers.""".format( - descriptive_name - ) + msg += f""" +Please check that you have formatted the {descriptive_name} file correctly and included the appropriate column headers.""" raise CSVParseException(msg) @@ -104,13 +120,15 @@ def _validate_columns(reader, descriptive_name, required_cols, valid_cols): raise CSVParseException(msg) -def load_csv_filter_comments(filename, descriptive_name, required_cols, valid_cols=None): +def load_csv_filter_comments( + filename: os.PathLike, descriptive_name, required_cols, valid_cols=None +): """Returns non-comment lines from the csv files. Verifies ASCII encoding and no duplicate columns. Args: - filename (str): The csv file to open. + filename: The csv file to open. descriptive_name (str): The description of the file, to use in error messages. required_cols (sequence of str): columns which must be present. valid_cols (sequence of str): columns which may be present. If provided, @@ -122,13 +140,13 @@ def load_csv_filter_comments(filename, descriptive_name, required_cols, valid_co Raises: CSVParseException """ - filename_bytes = ensure_binary(filename) + filename_bytes = ensure_binary(os.fspath(filename)) if not os.path.isfile(filename_bytes): raise CSVParseException(f"Could not find the {descriptive_name} csv file {filename}") if not os.access(filename_bytes, os.R_OK): - msg = "The {} csv is not readable, please check file permissions: {}".format( - descriptive_name, filename + msg = ( + f"The {descriptive_name} csv is not readable, please check file permissions: {filename}" ) raise CSVParseException(msg) diff --git a/lib/python/cellranger/fast_utils.lds b/lib/python/cellranger/fast_utils.lds new file mode 100644 index 0000000..33ae552 --- /dev/null +++ b/lib/python/cellranger/fast_utils.lds @@ -0,0 +1,6 @@ +{ +global: + "PyInit_fast_utils"; +local: + *; +}; diff --git a/lib/python/cellranger/feature/antigen/specificity.py b/lib/python/cellranger/feature/antigen/specificity.py index cddf64f..e30868b 100644 --- a/lib/python/cellranger/feature/antigen/specificity.py +++ b/lib/python/cellranger/feature/antigen/specificity.py @@ -106,23 +106,18 @@ def build_clonotype_maps(filtered_contig_annotations): bc_clonotype_map = {} bc_exact_subclonotype_map = {} with open(filtered_contig_annotations) as csvfile: - csvreader = csv.reader(csvfile) - seen_header = False - for row in csvreader: - if not seen_header: - assert row[0] == "barcode" - assert row[28] == "raw_clonotype_id" - assert row[30] == "exact_subclonotype_id" - seen_header = True + for row in csv.DictReader(csvfile): + barcode = row["barcode"] + raw_clonotype_id = row["raw_clonotype_id"] + exact_subclonotype_id = row["exact_subclonotype_id"] + if raw_clonotype_id == "": continue - if row[28] is None or row[28] == "": - continue - elif row[0] in bc_clonotype_map: - assert bc_clonotype_map[row[0]] == row[28] - assert bc_exact_subclonotype_map[row[0]] == row[30] + elif barcode in bc_clonotype_map: + assert bc_clonotype_map[barcode] == raw_clonotype_id + assert bc_exact_subclonotype_map[barcode] == exact_subclonotype_id else: - bc_clonotype_map[row[0]] = row[28] - bc_exact_subclonotype_map[row[0]] = row[30] + bc_clonotype_map[barcode] = raw_clonotype_id + bc_exact_subclonotype_map[barcode] = exact_subclonotype_id return bc_clonotype_map, bc_exact_subclonotype_map @@ -297,8 +292,8 @@ def get_antigen_assignment_metrics( name_fr_ce_w_sg_features = report_prefix + f"frac_{cells_name.value}_with_single_antigen" frac_cells_with_single_features = assignment_metadata.frac_singlets - name_fr_ce_w_mult_features = report_prefix + "frac_{}_with_multiple_antigen".format( - cells_name.value + name_fr_ce_w_mult_features = ( + report_prefix + f"frac_{cells_name.value}_with_multiple_antigen" ) frac_cells_multiple_features = assignment_metadata.frac_multiplets @@ -544,7 +539,6 @@ class BarcodeAS: # "sample_id", ) - # pylint:disable=too-many-arguments def __init__( self, barcode: bytes, @@ -738,11 +732,11 @@ def get_clonotype_concordance_metrics(self, antigen_to_control): """Compute summary metrics on clonotype (or exact_subclonotype) concordance.""" report_prefix = rna_library.get_library_type_metric_prefix(rna_library.ANTIGEN_LIBRARY_TYPE) - name_median_concordance_gt9 = report_prefix + "median_concordance_of_{}_size_gt9".format( - self.grouped_by.value + name_median_concordance_gt9 = ( + report_prefix + f"median_concordance_of_{self.grouped_by.value}_size_gt9" ) - name_min_concordance_gt9 = report_prefix + "lowest_concordance_of_{}_size_gt9".format( - self.grouped_by.value + name_min_concordance_gt9 = ( + report_prefix + f"lowest_concordance_of_{self.grouped_by.value}_size_gt9" ) concordance_gt9 = [ v.concordance @@ -762,8 +756,8 @@ def get_clonotype_concordance_metrics(self, antigen_to_control): if v.size > 9 and k != "None" and v.canonical_pair ] - name_aggregate_concordance = report_prefix + "aggregate_concordance_of_{}".format( - self.grouped_by.value + name_aggregate_concordance = ( + report_prefix + f"aggregate_concordance_of_{self.grouped_by.value}" ) name_aggregate_concordance_canonical_pair = ( @@ -783,12 +777,14 @@ def get_clonotype_concordance_metrics(self, antigen_to_control): return { name_median_concordance_gt9: np.median(concordance_gt9) if concordance_gt9 else np.nan, name_min_concordance_gt9: np.min(concordance_gt9) if concordance_gt9 else np.nan, - name_median_concordance_gt9_canonical_pair: np.median(concordance_gt9_canonical_pair) - if concordance_gt9_canonical_pair - else np.nan, - name_min_concordance_gt9_canonical_pair: np.min(concordance_gt9_canonical_pair) - if concordance_gt9_canonical_pair - else np.nan, + name_median_concordance_gt9_canonical_pair: ( + np.median(concordance_gt9_canonical_pair) + if concordance_gt9_canonical_pair + else np.nan + ), + name_min_concordance_gt9_canonical_pair: ( + np.min(concordance_gt9_canonical_pair) if concordance_gt9_canonical_pair else np.nan + ), name_aggregate_concordance: aggregate_concordance.report(), name_aggregate_concordance_canonical_pair: aggregate_concordance_canonical_pair.report(), } diff --git a/lib/python/cellranger/feature/feature_assigner.py b/lib/python/cellranger/feature/feature_assigner.py index 92fe68a..186b608 100644 --- a/lib/python/cellranger/feature/feature_assigner.py +++ b/lib/python/cellranger/feature/feature_assigner.py @@ -24,10 +24,7 @@ import cellranger.rna.library as rna_library import tenkit.stats as tk_stats from cellranger.analysis.combinatorics import generate_solutions, multinomial_comb -from cellranger.feature.feature_assignments import ( - CellsPerFeature, - FeatureAssignmentsMatrix, -) +from cellranger.feature.feature_assignments import CellsPerFeature, FeatureAssignmentsMatrix from cellranger.feature.throughputs import CORR_FACTOR, N_G from cellranger.pandas_utils import sanitize_dataframe @@ -275,10 +272,7 @@ class FeatureAssigner: def __init__( self, - # TODO: makes more sense to just use the specific feature sub-matrix - matrix: cr_matrix.CountMatrix, - # TODO: no need for this if using the specific feature sub-matrix - feature_type: str, + sub_matrix: cr_matrix.CountMatrix, assignments: OrderedDict[bytes, FeatureAssignments] | None = None, features_per_cell: dict[bytes, list[bytes]] | None = None, features_per_cell_table: pd.DataFrame | None = None, @@ -291,12 +285,7 @@ def __init__( sub-classes such as `GuideAssigner`, `AntibodyOrAntigenAssigner` and `TagAssigner`. Args: - matrix (CountMatrix): filtered feature counts matrix. - For CRISPR and Antibody libraries, the get_feature_assignments() - method sub-selects this matrix for the appropriate feature_type - and for each feature_id of that type while assigning barcodes to - each feature_id. - feature_type (str): one of those in `SUPPORTED_FEATURE_TYPES` + sub_matrix (CountMatrix): filtered count matrix subset to features of interest. assignments (dict): initialized in child classes features_per_cell (dict): contains (barcode: [feature_assigned]) pairs features_per_cell_table (pd.DataFrame): indexed by bc, provides @@ -306,12 +295,14 @@ def __init__( feature assignments, such as the fraction with 1 feature, multiple features, etc. """ - assert isinstance(matrix, cr_matrix.CountMatrix), "matrix should be a CountMatrix object" - self.matrix = matrix - self.feature_type = feature_type - assert self.feature_type in SUPPORTED_FEATURE_TYPES, "feature_type {} not supported".format( - self.feature_type - ) + assert isinstance( + sub_matrix, cr_matrix.CountMatrix + ), "matrix should be a CountMatrix object" + self.sub_matrix = sub_matrix + feature_types = self.sub_matrix.get_library_types() + assert len(feature_types) == 1 + feature_type = next(iter(feature_types)) + assert feature_type in SUPPORTED_FEATURE_TYPES, f"feature_type {feature_type} not supported" self.assignments = assignments self.features_per_cell = features_per_cell @@ -339,7 +330,7 @@ def get_features_per_cell(self) -> defaultdict[bytes, list[bytes]]: if asst.is_contaminant: continue for i in asst.bc_indices: - features_per_cell[self.matrix.bcs[i]].append(feature_id) + features_per_cell[self.sub_matrix.bcs[i]].append(feature_id) return features_per_cell @@ -355,7 +346,7 @@ def get_cells_per_feature(self): # check for contaminat tags in tag librares if asst.is_contaminant: continue - cells_per_feature[f_id] = [self.matrix.bcs[i] for i in asst.bc_indices] + cells_per_feature[f_id] = [self.sub_matrix.bcs[i] for i in asst.bc_indices] return cells_per_feature # TODO: this can now be replaced with the same function from TagAssignmentsMatrix @@ -379,12 +370,12 @@ def get_features_per_cell_table(self, sep: bytes = FEATURE_SEPARATOR) -> pd.Data features = sep.join(calls) # These three lines represent a fast way of populating the UMIS - cell_bc_index = self.matrix.bc_to_int(cell) + cell_bc_index = self.sub_matrix.bc_to_int(cell) bc_data = np.ravel( - self.matrix.m.getcol(cell_bc_index).toarray() + self.sub_matrix.m.getcol(cell_bc_index).toarray() ) # get data for a single bc, densify it, then flatten it umis = sep.join( - str(bc_data[self.matrix.feature_id_to_int(f_id)]).encode() for f_id in calls + str(bc_data[self.sub_matrix.feature_id_to_int(f_id)]).encode() for f_id in calls ) features_per_cell_table.loc[cell] = (num_features, features, umis) @@ -399,7 +390,7 @@ def compute_generic_assignment_metadata(self): self.features_per_cell_table = self.get_features_per_cell_table() return AssignmentMetadata( - num_cells=self.matrix.bcs_dim, + num_cells=self.sub_matrix.bcs_dim, num_cells_with_features=self.features_per_cell_table.shape[0], num_cells_without_feature_umis=self.get_num_cells_without_molecules(), num_singlets=self.features_per_cell_table[ @@ -528,13 +519,13 @@ def get_generic_feature_assignment_metrics( assignment_metadata.frac_singlets + assignment_metadata.frac_multiplets ) - name_fr_ce_w_sg_features = report_prefix + "frac_cells_with_single_{}{}".format( - feature_bc_name, depth_suffix + name_fr_ce_w_sg_features = ( + report_prefix + f"frac_cells_with_single_{feature_bc_name}{depth_suffix}" ) frac_cells_with_single_features = assignment_metadata.frac_singlets - name_fr_ce_w_mult_features = report_prefix + "frac_cells_with_multiple_{}{}".format( - feature_bc_name, depth_suffix + name_fr_ce_w_mult_features = ( + report_prefix + f"frac_cells_with_multiple_{feature_bc_name}{depth_suffix}" ) frac_cells_multiple_features = assignment_metadata.frac_multiplets @@ -617,9 +608,7 @@ def get_num_cells_without_molecules(self) -> int: Returns: int32: number of barcodes that do not have any feature umis """ - counts = self.matrix.get_subselected_counts( - log_transform=False, library_type=self.feature_type - ) + counts = self.sub_matrix.get_subselected_counts(log_transform=False, library_type=None) return np.sum(counts == 0) @staticmethod @@ -647,7 +636,7 @@ def create_feature_assignments_matrix(self) -> FeatureAssignmentsMatrix: if asst.is_contaminant: # only relevant for multiplexing library continue - mask = np.zeros(len(self.matrix.bcs)) + mask = np.zeros(len(self.sub_matrix.bcs)) if len(asst.bc_indices) > 0: # Put 1 for barcodes that were assigned to this feature. Basically, if # bc_indices = [1, 4], go from [0, 0, 0, 0, 0] -> [0, 1, 0, 0, 1] @@ -661,12 +650,12 @@ def create_feature_assignments_matrix(self) -> FeatureAssignmentsMatrix: del feature_assignments_dict # when no assignments for whatever reason, simply return the object with empty df if len(feature_assignments_df) == 0: - return FeatureAssignmentsMatrix(feature_assignments_df, self.matrix, self.feature_type) + return FeatureAssignmentsMatrix(feature_assignments_df, self.sub_matrix) - feature_assignments_df.index = self.matrix.bcs + feature_assignments_df.index = self.sub_matrix.bcs feature_assignments_df = feature_assignments_df.T feature_assignments_matrix = FeatureAssignmentsMatrix( - feature_assignments_df, self.matrix, self.feature_type + feature_assignments_df, self.sub_matrix ) return feature_assignments_matrix @@ -678,18 +667,18 @@ def __init__( self, matrix: cr_matrix.CountMatrix, *, - feature_type: str = rna_library.CRISPR_LIBRARY_TYPE, min_crispr_umi_threshold: int, ): super().__init__( matrix, - feature_type, assignments=None, features_per_cell=None, features_per_cell_table=None, assignment_metadata=None, ) - + self.report_prefix = rna_library.get_library_type_metric_prefix( + rna_library.CRISPR_LIBRARY_TYPE + ) self.feature_mol_name = "guide" self.feature_bc_name = "protospacer" self.min_crispr_umi_threshold = min_crispr_umi_threshold @@ -702,18 +691,15 @@ def get_feature_assignments(self) -> dict[bytes, FeatureAssignments]: def get_guide_assignments(self) -> dict[bytes, FeatureAssignments]: """Get feature assignments for CRISPR library.""" - if self.feature_type not in SUPPORTED_FEATURE_TYPES: - raise ValueError(f"Feature type {self.feature_type} is not supported") - assignments: dict[bytes, FeatureAssignments] = OrderedDict() - feature_ids_this_type = self.matrix.get_feature_ids_by_type(self.feature_type) - self.matrix.tocsr() - for feature_id in feature_ids_this_type: + feature_ids = [f.id for f in self.sub_matrix.feature_ref.feature_defs] + self.sub_matrix.tocsr() + for feature_id in feature_ids: if not isinstance(feature_id, bytes): raise ValueError( f"Feature ID {feature_id} must be bytes but was {type(feature_id)}" ) - umi_counts = self.matrix.get_subselected_counts( + umi_counts = self.sub_matrix.get_subselected_counts( log_transform=False, list_feature_ids=[feature_id] ) @@ -760,7 +746,7 @@ def compute_assignment_metadata(self) -> AssignmentMetadata: assignment_metadata = self.compute_generic_assignment_metadata() assert self.assignments is not None - umi_thresholds = self._compute_umi_thresholds(self.matrix, self.assignments) + umi_thresholds = self._compute_umi_thresholds(self.sub_matrix, self.assignments) # keep the crispr output unchanged assignment_metadata.umi_thresholds = umi_thresholds["umi_threshold"].to_dict() return assignment_metadata @@ -769,9 +755,8 @@ def get_feature_assignment_metrics(self, depth_suffix: str = ""): """Feature assignment metrics for CRISPR library.""" if self.assignment_metadata is None: self.assignment_metadata = self.compute_assignment_metadata() - report_prefix = rna_library.get_library_type_metric_prefix(self.feature_type) return self.get_generic_feature_assignment_metrics( - self.assignment_metadata, self.feature_bc_name, report_prefix, depth_suffix + self.assignment_metadata, self.feature_bc_name, self.report_prefix, depth_suffix ) def get_feature_calls_summary(self) -> pd.DataFrame: @@ -787,14 +772,15 @@ class AntibodyOrAntigenAssigner(FeatureAssigner): """Sub-class of FeatureAssigner specific to Antibody or Antigen Library features.""" def __init__(self, matrix: cr_matrix.CountMatrix, feature_type: str): + super().__init__( - matrix, - feature_type, + matrix.select_features_by_type(feature_type), assignments=None, features_per_cell=None, features_per_cell_table=None, assignment_metadata=None, ) + self.report_prefix = rna_library.get_library_type_metric_prefix(feature_type) if feature_type == rna_library.ANTIGEN_LIBRARY_TYPE: self.feature_mol_name = self.feature_bc_name = "antigen" @@ -809,18 +795,15 @@ def get_feature_assignments(self): def get_antibody_assignments(self) -> dict[bytes, FeatureAssignments]: """Get feature assignments for Antibody library.""" - if self.feature_type not in SUPPORTED_FEATURE_TYPES: - raise ValueError(f"Feature type {self.feature_type} is not supported") - assignments: OrderedDict[bytes, FeatureAssignments] = OrderedDict() - feature_ids_this_type = self.matrix.get_feature_ids_by_type(self.feature_type) + feature_ids = [f.id for f in self.sub_matrix.feature_ref.feature_defs] - for feature_id in feature_ids_this_type: + for feature_id in feature_ids: assert isinstance(feature_id, bytes) if feature_id not in self.assignment_list: continue - umi_counts = self.matrix.get_subselected_counts( - log_transform=False, library_type=self.feature_type, list_feature_ids=[feature_id] + umi_counts = self.sub_matrix.get_subselected_counts( + log_transform=False, list_feature_ids=[feature_id] ) total_count = umi_counts.sum() if total_count < MIN_COUNTS_PER_ANTIBODY: @@ -857,7 +840,7 @@ def compute_assignment_metadata(self): """Compute assignment metadata for Antibody library.""" assignment_metadata = self.compute_generic_assignment_metadata() - umi_thresholds = self._compute_umi_thresholds(self.matrix, self.assignments) + umi_thresholds = self._compute_umi_thresholds(self.sub_matrix, self.assignments) # keep the antibody output unchanged assignment_metadata.umi_thresholds = umi_thresholds["umi_threshold"].to_dict() return assignment_metadata @@ -866,9 +849,8 @@ def get_feature_assignment_metrics(self, depth_suffix: str = "") -> dict[str, fl """Feature assignment metrics for Antibody library.""" if self.assignment_metadata is None: self.assignment_metadata = self.compute_assignment_metadata() - report_prefix = rna_library.get_library_type_metric_prefix(self.feature_type) return self.get_generic_feature_assignment_metrics( - self.assignment_metadata, self.feature_bc_name, report_prefix, depth_suffix + self.assignment_metadata, self.feature_bc_name, self.report_prefix, depth_suffix ) @@ -888,13 +870,12 @@ def __init__(self, matrix: cr_matrix.CountMatrix, feature_type: str, n_gems: int FeatureAssigner.__init__( self, matrix, - feature_type, assignments=None, features_per_cell=None, features_per_cell_table=None, assignment_metadata=None, ) - + self.report_prefix = rna_library.get_library_type_metric_prefix(feature_type) self.feature_mol_name = self.feature_bc_name = "tag" self.method = "GMM" self.n_gems = n_gems @@ -905,16 +886,13 @@ def get_feature_assignments(self) -> dict[bytes, FeatureAssignments]: def get_tag_assignments(self) -> dict[bytes, FeatureAssignments]: """Get feature assignments for Tag library.""" - if self.feature_type not in SUPPORTED_FEATURE_TYPES: - raise ValueError(f"Feature type {self.feature_type} is not supported") - assignments: OrderedDict[bytes, FeatureAssignments] = OrderedDict() - feature_ids_this_type = self.matrix.get_feature_ids_by_type(self.feature_type) + feature_ids = [f.id for f in self.sub_matrix.feature_ref.feature_defs] - for feature_id in feature_ids_this_type: + for feature_id in feature_ids: assert isinstance(feature_id, bytes) - umi_counts = self.matrix.get_subselected_counts( - log_transform=False, library_type=self.feature_type, list_feature_ids=[feature_id] + umi_counts = self.sub_matrix.get_subselected_counts( + log_transform=False, list_feature_ids=[feature_id] ) in_high_umi_component = TagAssigner._call_presence(umi_counts, self.method) @@ -951,7 +929,7 @@ def compute_assignment_metadata(self) -> AssignmentMetadata: assignment_metadata.freq_counts = freqs_df umi_thresholds = self._compute_umi_thresholds( - self.matrix, self.assignments, multiplexing=True + self.sub_matrix, self.assignments, multiplexing=True ) assignment_metadata.umi_thresholds = umi_thresholds @@ -965,9 +943,8 @@ def get_feature_assignment_metrics( if self.assignment_metadata is None: self.assignment_metadata = self.compute_assignment_metadata() - report_prefix = rna_library.get_library_type_metric_prefix(self.feature_type) res = self.get_generic_feature_assignment_metrics( - self.assignment_metadata, self.feature_bc_name, report_prefix, depth_suffix + self.assignment_metadata, self.feature_bc_name, self.report_prefix, depth_suffix ) freqs_df = self.assignment_metadata.freq_counts.drop( @@ -977,11 +954,11 @@ def get_feature_assignment_metrics( TagAssigner._compute_efficiency_metrics( freqs_df[MEASURABLE_COL].values, freqs_df[OBSERVED_COL].values, - report_prefix, + self.report_prefix, depth_suffix, ) ) - res.update(self._compute_no_tag_metric(report_prefix, depth_suffix)) + res.update(self._compute_no_tag_metric(self.report_prefix, depth_suffix)) return res def _compute_no_tag_metric(self, report_prefix: str = "", depth_suffix: str = ""): @@ -1063,7 +1040,7 @@ def compute_assignment_freqs( # Calculate observed frequencies (note this does not include an entry for i = 0) obs_freqs = np.array([self._get_freq_num_features(i) for i in range(1, num_total_tags + 1)]) - num_cells_called = len(self.matrix.bcs) + num_cells_called = len(self.sub_matrix.bcs) estimated_cells = calculate_expected_total_cells(num_cells_called, self.n_gems) # estimate of total cells actually present, while accounting for the fact that # a k-let probably contains k-cells in a single partition @@ -1152,11 +1129,10 @@ def identify_contaminant_tags( all_features = sorted(assignments.keys()) # correlation check - tag_counts_matrix = self.matrix.select_features_by_type(self.feature_type) df = pd.DataFrame( - tag_counts_matrix.m.toarray(), - index=[f.id for f in tag_counts_matrix.feature_ref.feature_defs], - columns=tag_counts_matrix.bcs, + self.sub_matrix.m.toarray(), + index=[f.id for f in self.sub_matrix.feature_ref.feature_defs], + columns=self.sub_matrix.bcs, ).T df = df.loc[:, all_features] cor_df = df.corr() diff --git a/lib/python/cellranger/feature/feature_assignments.py b/lib/python/cellranger/feature/feature_assignments.py index 4a186a3..f159f1b 100644 --- a/lib/python/cellranger/feature/feature_assignments.py +++ b/lib/python/cellranger/feature/feature_assignments.py @@ -185,11 +185,10 @@ class FeatureAssignmentsMatrix: # Dataype used for the dataframe FEATURE_ASSIGNMENT_DTYPE = "uint8" - def __init__(self, df: pd.DataFrame, matrix: CountMatrix, library_type: str): + def __init__(self, df: pd.DataFrame, matrix: CountMatrix): """Constructor for children classes.""" self.df = df self.matrix = matrix - self.library_type = library_type self.features_per_cell_table = None def get_shape(self): @@ -390,9 +389,7 @@ def get_num_cells_without_molecules(self) -> int: Returns: int32: number of barcodes that do not have any feature umis """ - counts = self.matrix.get_subselected_counts( - log_transform=False, library_type=self.library_type - ) + counts = self.matrix.get_subselected_counts(log_transform=False) return np.sum(counts == 0) diff --git a/lib/python/cellranger/feature/jibes_tag_assigner.py b/lib/python/cellranger/feature/jibes_tag_assigner.py index d69a83c..0d4d877 100644 --- a/lib/python/cellranger/feature/jibes_tag_assigner.py +++ b/lib/python/cellranger/feature/jibes_tag_assigner.py @@ -1,4 +1,5 @@ """A TagAssigner class based on the JIBES model.""" + # Copyright (c) 2020 10X Genomics, Inc. All rights reserved. from __future__ import annotations @@ -73,7 +74,7 @@ def make_model_results_list(name, samp_id, assigner): max_rss = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss fitter = assigner.fitter metrics = assigner.get_feature_assignment_metrics() - report_prefix = rna_library.get_library_type_metric_prefix(assigner.feature_type) + report_prefix = assigner.report_prefix results += [ [ name, @@ -197,8 +198,7 @@ def __init__( assert isinstance(next(iter(self.valid_tags)), bytes) # TODO: Remove dependence on upstream tag_calls file - cmo_matrix = jibes.load_tag_counts_from_matrix(matrix, library_type) - dense_matrix = cmo_matrix.m.toarray().astype(np.float64).T + dense_matrix = self.sub_matrix.m.toarray().astype(np.float64).T # With customer data we've occasionally seen barcodes with near 0 counts, # we plan to exclude these from fitting and just call them blank with prob = 1 row_sums = np.sum(dense_matrix, axis=1) @@ -208,7 +208,7 @@ def __init__( # Note: The reverse transform is applied inside dense_matrix[:, i] = np.log10(dense_matrix[:, i] + 1.0) - self.all_tags: list[bytes] = [x.id for x in cmo_matrix.feature_ref.feature_defs] + self.all_tags: list[bytes] = [x.id for x in self.sub_matrix.feature_ref.feature_defs] assert isinstance(self.all_tags[0], bytes) self.dropped_tags = set(self.all_tags) - self.valid_tags good_indices = [(i, x) for i, x in enumerate(self.all_tags) if x not in self.dropped_tags] @@ -217,10 +217,10 @@ def __init__( col_names = [x[1] for x in good_indices] data = jibes_data.JibesData( - dense_matrix[~near_zero_indices, :], col_names, cmo_matrix.bcs[~near_zero_indices] + dense_matrix[~near_zero_indices, :], col_names, self.sub_matrix.bcs[~near_zero_indices] ) self.near_zero_data = jibes_data.JibesData( - dense_matrix[near_zero_indices, :], col_names, cmo_matrix.bcs[near_zero_indices] + dense_matrix[near_zero_indices, :], col_names, self.sub_matrix.bcs[near_zero_indices] ) self.fitter = self._load_preliminary_assignments(tag_calls_fn, data, n_gems) @@ -321,7 +321,7 @@ def get_most_likely_multiplet_state(row_index): # as when the data was loaded, so we want to check that it matches still bc = self.jibes_assignments[BARCODE_COL][i] assert bc == self.fitter.data.barcodes[i], "Dataframe is out of order!" - bc_index = self.matrix.bc_to_int(self.jibes_assignments[BARCODE_COL][i]) + bc_index = self.sub_matrix.bc_to_int(self.jibes_assignments[BARCODE_COL][i]) if asn in non_singlet_barcodes: non_singlet_barcodes[asn].append(bc_index) if asn == MULTIPLETS_FACTOR_NAME: @@ -335,15 +335,15 @@ def get_most_likely_multiplet_state(row_index): blanks = non_singlet_barcodes[BLANK_FACTOR_NAME] for bc in self.near_zero_data.barcodes: - bc_index = self.matrix.bc_to_int(bc) + bc_index = self.sub_matrix.bc_to_int(bc) blanks.append(bc_index) self.non_singlet_barcodes = non_singlet_barcodes assignments = {} for j, c_name in enumerate(col_names): - umi_counts = self.matrix.get_subselected_counts( - log_transform=False, library_type=self.feature_type, list_feature_ids=[c_name] + umi_counts = self.sub_matrix.get_subselected_counts( + log_transform=False, list_feature_ids=[c_name] ) assignments[c_name] = cr_fa.FeatureAssignments( indices[j], @@ -361,7 +361,7 @@ def compute_assignment_metadata(self): freqs_df = self.compute_assignment_freqs(assignment_metadata.num_cells_without_features) assignment_metadata.freq_counts = freqs_df umi_thresholds = self._compute_umi_thresholds( - self.matrix, self.assignments, multiplexing=True + self.sub_matrix, self.assignments, multiplexing=True ) assignment_metadata.umi_thresholds = umi_thresholds assignment_metadata.num_cells_blanks = len(self.non_singlet_barcodes[BLANK_FACTOR_NAME]) diff --git a/lib/python/cellranger/feature/multiplexing/infer_throughput.py b/lib/python/cellranger/feature/multiplexing/infer_throughput.py index b6acc29..8c38b94 100644 --- a/lib/python/cellranger/feature/multiplexing/infer_throughput.py +++ b/lib/python/cellranger/feature/multiplexing/infer_throughput.py @@ -46,7 +46,7 @@ def infer_throughput_from_rankplot_gradient(counts_per_bc: list[int]) -> str: recovered_cells=None, infer_throughput=True, ) - if outs[0] == [] or not outs[0].any(): # usually indicates atypical rank plots (low depth) + if not outs[0].size or not outs[0].any(): # usually indicates atypical rank plots (low depth) return None, MT_THROUGHPUT slope_bc_idx = FIRST_BC_IDX_ON_RANKPLOT + outs[0][-1] diff --git a/lib/python/cellranger/feature/throughputs.py b/lib/python/cellranger/feature/throughputs.py index 9df80c4..3573ef2 100644 --- a/lib/python/cellranger/feature/throughputs.py +++ b/lib/python/cellranger/feature/throughputs.py @@ -9,8 +9,14 @@ MT_THROUGHPUT = "MT" LT_THROUGHPUT = "LT" HT_THROUGHPUT = "HT" +GEMX_THROUGHPUT = "GEMX" THROUGHPUT_INFERRED_METRIC = "throughput_inferred" INCONSISTENT_THROUGHPUT_METRIC = "inconsistent_throughput" # keep in sync with name in metrics.csv N_G = 95000 # Number of GEMs in a single NextGem gem-well CORR_FACTOR = 1.54 # correction factor - if N_L = cells loaded, we recover N_L/C cells -G19_N_GEMS = {MT_THROUGHPUT: N_G, LT_THROUGHPUT: 9500, HT_THROUGHPUT: 190000} +G19_N_GEMS = { + MT_THROUGHPUT: N_G, + LT_THROUGHPUT: 9500, + HT_THROUGHPUT: 190000, + GEMX_THROUGHPUT: 190000, +} diff --git a/lib/python/cellranger/feature_ref.py b/lib/python/cellranger/feature_ref.py index f4fa566..82d1b2b 100644 --- a/lib/python/cellranger/feature_ref.py +++ b/lib/python/cellranger/feature_ref.py @@ -57,6 +57,9 @@ def get_attr_list(self, headers: Iterable[str]) -> list[str]: DEFAULT_FEATURE_TAGS = [GENOME_FEATURE_TAG] RESERVED_TAGS = DEFAULT_FEATURE_TAGS +# Defined here lib/rust/cr_types/src/reference/feature_reference.rs +HASHTAG_TAG = "hashtag" + class FeatureDefException(Exception): """Exception type for trying to create a `FeatureReference` with non-distinct IDs.""" @@ -186,11 +189,7 @@ def __init__( for fdef in self.feature_defs: if fdef.id in id_map: this_fd_str = f"ID: {fdef.id}; name: {fdef.name}; type: {fdef.feature_type}" - seen_fd_str = "ID: {}; name: {}; type: {}".format( - id_map[fdef.id].id, - id_map[fdef.id].name, - id_map[fdef.id].feature_type, - ) + seen_fd_str = f"ID: {id_map[fdef.id].id}; name: {id_map[fdef.id].name}; type: {id_map[fdef.id].feature_type}" raise FeatureDefException( "Found two feature definitions with the same ID: " f"({this_fd_str}) and ({seen_fd_str}). All feature IDs must be distinct." @@ -298,13 +297,17 @@ def equals_antigen_capture_content( if sorted_antigen_content_1[i][3] != sorted_antigen_content_2[i][3]: return ( False, - "The datasets you are trying to aggregate have incompatible MHC alleles for the same control feature id. Please re-run the original multi pipelines with uniform [antigen-specificity] sections.", + "The datasets you are trying to aggregate have incompatible " + "MHC alleles for the same control feature id. Please re-run the original " + "multi pipelines with uniform [antigen-specificity] sections.", ) # check matching control if (sorted_antigen_content_1[i][4] != sorted_antigen_content_2[i][4]) and not is_pd: return ( False, - "The datasets you are trying to aggregate have incompatible control feature ids. Please re-run the original multi pipelines with uniform [antigen-specificity] sections.", + "The datasets you are trying to aggregate have incompatible " + "control feature ids. Please re-run the original multi pipelines with " + "uniform [antigen-specificity] sections.", ) return True, None @@ -320,12 +323,16 @@ def equals_ignore_target_set(self, other: FeatureReference) -> bool: compatible_target_sets = ignore_target_set or ( self.get_target_feature_indices() == other.get_target_feature_indices() ) + # exclude hashtag + self_all_tags = [tag for tag in self.all_tag_keys if tag != HASHTAG_TAG] + other_all_tags = [tag for tag in other.all_tag_keys if tag != HASHTAG_TAG] + return ( self.get_feature_types_excluding_deprecated_probes() == other.get_feature_types_excluding_deprecated_probes() and self.get_feature_ids_excluding_deprecated_probes() == other.get_feature_ids_excluding_deprecated_probes() - and self.all_tag_keys == other.all_tag_keys + and self_all_tags == other_all_tags and compatible_target_sets ) @@ -540,6 +547,26 @@ def select_features_by_type(self, feature_type: str) -> FeatureReference: indices = [i for i, fd in enumerate(self.feature_defs) if fd.feature_type == feature_type] return self.select_features(indices) + def get_feature_indices_by_genome(self, genome: str) -> list[int]: + """Returns the indices of features within the FeatureReference with genome. + + Args: + genome: Genome name + """ + return [ + i + for i, fd in enumerate(self.feature_defs) + if fd.tags.get(GENOME_FEATURE_TAG, "") == genome + ] + + def select_features_by_genome(self, genome: str) -> FeatureReference: + """Returns all features that match a given genome. + + Args: + genome: Genome name + """ + return self.select_features(self.get_feature_indices_by_genome(genome)) + def has_feature_type(self, feature_type: str) -> bool: """Determines if a feature type is present in the FeatureRef. diff --git a/lib/python/cellranger/h5_constants.py b/lib/python/cellranger/h5_constants.py index 78be32e..d9be272 100644 --- a/lib/python/cellranger/h5_constants.py +++ b/lib/python/cellranger/h5_constants.py @@ -13,8 +13,8 @@ MIN_MEM_GB_NOWHITELIST = 64 # Empirical obs of mem usage with anndatas created for running CAS -MEM_BYTES_PER_MATRIX_NNZ_H5AD = 16 # 2^4 -MEM_BYTES_PER_MATRIX_BARCODE_H5AD = 256 # 2^8 +MEM_BYTES_PER_MATRIX_NNZ_H5AD = 32 # 2^5 +MEM_BYTES_PER_MATRIX_BARCODE_H5AD = 512 # 2^9 MEM_BYTES_PER_MATRIX_FEATURE_H5AD = 1024 # 2^10 MEM_BYTES_CONSTANT_H5AD = 8_388_608 # 2^23 diff --git a/lib/python/cellranger/hdf5.py b/lib/python/cellranger/hdf5.py index 40b54da..27b90aa 100644 --- a/lib/python/cellranger/hdf5.py +++ b/lib/python/cellranger/hdf5.py @@ -17,7 +17,7 @@ from cellranger.wrapped_tables import tables STR_DTYPE_CHAR = np.dtype(np.bytes_).char -UNICODE_DTYPE_CHAR = np.dtype(np.unicode_).char +UNICODE_DTYPE_CHAR = np.dtype(np.str_).char STRING_DTYPE_CHARS = (STR_DTYPE_CHAR, UNICODE_DTYPE_CHAR) @@ -112,7 +112,7 @@ def decode_ascii_xml(x: str | bytes) -> str: elif isinstance(x, bytes): return unescape(x.decode()) else: - raise ValueError("Expected string type, got type %s" % str(type(x))) + raise ValueError(f"Expected string type, got type {type(x)!s}") def decode_ascii_xml_array(data): @@ -127,7 +127,7 @@ def decode_ascii_xml_array(data): fixed_len = max(len(s) for s in unicode_data) # 0 length string type is Ok - dtype = np.dtype((np.unicode_, fixed_len)) + dtype = np.dtype((np.str_, fixed_len)) # note: python3 would require no.fromiter return np.array(unicode_data, dtype=dtype) @@ -145,7 +145,7 @@ def encode_ascii_xml(x: str | bytes): elif isinstance(x, bytes): return x else: - raise ValueError("Expected string type, got type %s" % str(type(x))) + raise ValueError(f"Expected string type, got type {type(x)!s}") def encode_ascii_xml_array( diff --git a/lib/python/cellranger/matrix.py b/lib/python/cellranger/matrix.py index 78658e5..5f95b1d 100644 --- a/lib/python/cellranger/matrix.py +++ b/lib/python/cellranger/matrix.py @@ -7,8 +7,10 @@ import copy import os.path import pathlib +import shutil from collections import OrderedDict from collections.abc import Callable, Collection, Container, Iterable, Mapping, Sequence +from io import BufferedIOBase from typing import Any, TypeVar, overload import h5py as h5 @@ -103,6 +105,20 @@ def _ensure_types_match( return subset +def _save_extra_attrs( + file: h5.File, extra_attrs: None | (Mapping[str | bytes, str | bytes | Iterable[str | bytes]]) +) -> None: + """Set optional top level attributes.""" + if extra_attrs: + for k, v in extra_attrs.items(): + cr_h5.set_hdf5_attr(file, k, v) + + +def _save_sw_version(file: h5.File, sw_version: None | str | bytes) -> None: + if sw_version: + file.attrs[SOFTWARE_H5_VERSION_KEY] = sw_version + + class CountMatrixView: """Supports summing a sliced CountMatrix w/o copying the whole thing.""" @@ -150,12 +166,10 @@ def sum(self, axis: int | None = None): return cr_sparse.sum_masked(self.matrix.m, self.feature_mask, self.bc_mask, axis=axis) @overload - def count_ge(self, axis: None, threshold: int) -> np.uint64: - ... + def count_ge(self, axis: None, threshold: int) -> np.uint64: ... @overload - def count_ge(self, axis: int, threshold: int) -> np.ndarray[int, np.dtype[np.uint64]]: - ... + def count_ge(self, axis: int, threshold: int) -> np.ndarray[int, np.dtype[np.uint64]]: ... def count_ge( self, axis: int | None, threshold: int @@ -477,8 +491,12 @@ def get(self, feature_id: bytes, bc: bytes) -> None: return self.m[i, j] def merge(self, other: CountMatrix) -> None: - """Merge this matrix with another CountMatrix.""" + """Merge this matrix with another CountMatrix. + + Works by addition, dimensions must be the same. + """ assert self.features_dim == other.features_dim + # Also requires nrows to be the same self.m += other.m def sort_indices(self) -> None: @@ -497,13 +515,8 @@ def save_h5_file( f.attrs[h5_constants.H5_FILETYPE_KEY] = MATRIX_H5_FILETYPE f.attrs[MATRIX_H5_VERSION_KEY] = MATRIX_H5_VERSION # set the software version key only if it is supplied - if sw_version: - f.attrs[SOFTWARE_H5_VERSION_KEY] = sw_version - - # Set optional top-level attributes - if extra_attrs: - for k, v in extra_attrs.items(): - cr_h5.set_hdf5_attr(f, k, v) + _save_sw_version(f, sw_version) + _save_extra_attrs(f, extra_attrs) group = f.create_group(MATRIX) self.save_h5_group(group) @@ -542,13 +555,7 @@ def load_dims(group: h5.Group) -> tuple[int, int, int]: @staticmethod def load_dims_from_h5(filename) -> tuple[int, int, int]: """Load the matrix shape from an HDF5 file.""" - filename = ensure_binary(filename) - h5_version = CountMatrix.get_format_version_from_h5(filename) - if h5_version == 1: - return CountMatrix._load_dims_from_legacy_v1_h5(filename) - else: - with h5.File(filename, "r") as f: - return CountMatrix.load_dims(f[MATRIX]) + return CountMatrix.load_dims_from_h5_file_handle(ensure_binary(filename)) @staticmethod def _load_dims_from_legacy_v1_h5_handle(f: h5.File) -> tuple[int, int, int]: @@ -613,9 +620,58 @@ def get_mem_gb_from_matrix_h5( ceil: bool = True, ) -> float: """Estimate memory usage from an HDF5 file.""" - _, num_bcs, nonzero_entries = CountMatrix.load_dims_from_h5(filename) + return CountMatrix.get_mem_gb_from_matrix_h5_file_handle( + ensure_binary(filename), scale, ceil + ) + + @staticmethod + def get_mem_gb_from_matrix_h5_file_handle( + file_handle: str | bytes | BufferedIOBase, + scale: float = h5_constants.MATRIX_MEM_GB_MULTIPLIER, + ceil: bool = True, + ) -> float: + """Estimate memory usage from an HDF5 file.""" + _, num_bcs, nonzero_entries = CountMatrix.load_dims_from_h5_file_handle(file_handle) return CountMatrix.get_mem_gb_from_matrix_dim(num_bcs, nonzero_entries, scale, ceil) + @staticmethod + def load_dims_from_h5_file_handle( + file_handle: str | bytes | BufferedIOBase, + ) -> tuple[int, int, int]: + """Load the matrix shape from an HDF5 file.""" + with h5.File(file_handle, "r") as f: + h5_version = CountMatrix._get_format_version_from_handle(f) + if h5_version == 1: + return CountMatrix._load_dims_from_legacy_v1_h5_handle(f) + else: + return CountMatrix.load_dims(f[MATRIX]) + + @staticmethod + def load_bcs_from_h5_file_handle(file_handle) -> list[bytes]: + """Load just the barcode sequences from an HDF5 file hadle.""" + with h5.File(file_handle, "r") as f: + h5_version = CountMatrix._get_format_version_from_handle(f) + if h5_version == 1: + return CountMatrix._load_bcs_from_legacy_v1_h5_file_handle(f) + else: + return CountMatrix.load_bcs_from_h5_group(f[MATRIX]) + + @staticmethod + def _load_indptr_from_matrix_group(group: h5.Group): + return group[h5_constants.H5_MATRIX_INDPTR_ATTR][:] + + @staticmethod + def load_indptr_from_file(filename): + fn, version = CountMatrix._validate_h5_file(filename) + if version < MATRIX_H5_VERSION: + raise ValueError( + "Matrix HDF5 file format version (%d) is an older version that is no longer supported." + % version + ) + with h5.File(fn, "r") as f: + mat_group = f[MATRIX] + return CountMatrix._load_indptr_from_matrix_group(mat_group) + @classmethod def load(cls, group: h5.Group) -> CountMatrix: """Load from an HDF5 group.""" @@ -625,7 +681,7 @@ def load(cls, group: h5.Group) -> CountMatrix: shape = group[h5_constants.H5_MATRIX_SHAPE_ATTR][:] data = group[h5_constants.H5_MATRIX_DATA_ATTR][:] indices = group[h5_constants.H5_MATRIX_INDICES_ATTR][:] - indptr = group[h5_constants.H5_MATRIX_INDPTR_ATTR][:] + indptr = CountMatrix._load_indptr_from_matrix_group(group) # Check to make sure indptr increases monotonically (to catch overflow bugs) assert np.all(np.diff(indptr) >= 0) @@ -689,12 +745,17 @@ def load_bcs_from_h5(filename) -> list[bytes]: def _load_bcs_from_legacy_v1_h5(filename) -> list[bytes]: """Load just the barcode sequences from a legacy h5py.File (format version 1).""" with h5.File(ensure_binary(filename), "r") as f: - genomes = f.keys() - barcodes: set[bytes] = set() - for genome in genomes: - group = f[genome] - barcodes.update(group["barcodes"]) - return list(barcodes) + return CountMatrix._load_bcs_from_legacy_v1_h5_file_handle(f) + + @staticmethod + def _load_bcs_from_legacy_v1_h5_file_handle(file_handle) -> list[bytes]: + """Load just the barcode sequences from a legacy h5py.File (format version 1).""" + genomes = file_handle.keys() + barcodes: set[bytes] = set() + for genome in genomes: + group = file_handle[genome] + barcodes.update(group["barcodes"]) + return list(barcodes) @staticmethod def load_bcs_from_h5_file(filename) -> list[bytes]: @@ -939,6 +1000,14 @@ def select_features_by_type(self, feature_type: str) -> CountMatrix: indices.append(feature.index) return self.select_features(indices) + def select_features_by_type_and_tag(self, feature_type: str, tag_type: str) -> CountMatrix: + """Select the subset of features with a particular feature type (e.g. "Antibody Capture") and tag (e.g. "Hashtag").""" + indices = [] + for feature in self.feature_ref.feature_defs: + if feature.feature_type == feature_type and tag_type in feature.tags: + indices.append(feature.index) + return self.select_features(indices) + def get_feature_ids_by_type(self, feature_type: str) -> list[bytes]: """Return a list of feature ids of a particular feature type (e.g. "Gene Expression").""" return self.feature_ref.get_feature_ids_by_type(feature_type) @@ -1023,7 +1092,7 @@ def get_frac_counts_per_feature(self) -> np.ndarray[int, np.dtype[np.int_]]: def get_mean_and_var_per_feature( self, - ) -> tuple[np.ndarray[int, np.dtype[np.float_]], np.ndarray[int, np.dtype[np.float_]]]: + ) -> tuple[np.ndarray[int, np.dtype[np.float64]], np.ndarray[int, np.dtype[np.float64]]]: """Calculate the mean and variance on the sparse matrix efficiently. :return: a tuple with numpy arrays for mean and var @@ -1165,23 +1234,11 @@ def get_format_version_from_h5(filename: bytes | str): return CountMatrix._get_format_version_from_handle(f) @staticmethod - def load_h5_file(filename, col_start: int | None = None, col_end: int | None = None): - """Load a matrix H5 file, optionally subsetting down to a particular range of columns if requests. - - Args: - filename: The name of the H5 file - col_start: (Optional) The column to select - col_end: (Optional) End of column select range - - Returns: - Instance of a CountMatrix - - """ + def _validate_h5_file(filename): if isinstance(filename, pathlib.PosixPath): fn = filename else: fn = ensure_binary(filename) - with h5.File(fn, "r") as f: if ( h5_constants.H5_FILETYPE_KEY not in f.attrs @@ -1194,12 +1251,33 @@ def load_h5_file(filename, col_start: int | None = None, col_end: int | None = N "Matrix HDF5 file format version (%d) is a newer version that is not supported by this version of the software." % version ) + if version >= MATRIX_H5_VERSION and MATRIX not in f.keys(): + raise ValueError('Could not find the "matrix" group inside the matrix HDF5 file.') + return fn, version + + @staticmethod + def load_h5_file(filename, col_start: int | None = None, col_end: int | None = None): + """Load a matrix H5 file, optionally subsetting down to a particular range of columns if requests. + + Args: + filename: The name of the H5 file + col_start: (Optional) The column to select + col_end: (Optional) End of column select range + + Returns: + Instance of a CountMatrix + + """ + fn, version = CountMatrix._validate_h5_file(filename) + + with h5.File(fn, "r") as f: if version < MATRIX_H5_VERSION: + if col_start is not None or col_end is not None: + raise ValueError( + "Subsetting columns when loading legacy H5 files is not supported." + ) # raise ValueError('Matrix HDF5 file format version (%d) is an older version that is no longer supported.' % version) return CountMatrix.from_legacy_v1_h5(f) - - if MATRIX not in f.keys(): - raise ValueError('Could not find the "matrix" group inside the matrix HDF5 file.') if col_start is not None or col_end is not None: if col_start is None or col_end is None: raise ValueError("Both or neither argument col_start/col_end must be provided.") @@ -1316,19 +1394,104 @@ def normalise_library_type_by_control_features( return number_of_overflow_entries -def merge_matrices(h5_filenames): +def merge_matrices(h5_filenames: list[str]) -> CountMatrix | None: + """Merge multiple matrices into a single matrix.""" matrix = None for h5_filename in h5_filenames: if matrix is None: matrix = CountMatrix.load_h5_file(h5_filename) else: - other = CountMatrix.load_h5_file(h5_filename) - matrix.merge(other) + matrix.merge(CountMatrix.load_h5_file(h5_filename)) if matrix is not None: matrix.tocsc() return matrix +def create_merged_matrix_from_col_concat( + in_h5_filenames, out_h5_filename, extra_attrs=None, sw_version=None +): + """Merge several h5 files into one larger matrix file. + + An efficient method for doing column concatenation of H5 files. Assumes the input files all have the same + features/barcodes in their matrix, and that each only contains a non-overlapping subset of the columns. Strategy + is to append the column data directly, rather than merging arbitrary non-distinct columns (As is done in + merge_matrices). + + Args: + in_h5_filenames: A list of filenames to column distinct sets of a larger matrix + out_h5_filename: The desired output filename + extra_attrs: Similar to the argument to save_h5_file + sw_version: A version of the software to add into the attributes. + + Returns: + Nothing + """ + # Quick sanity check that the dimensions are the same (and hope that implies barcodes/features are the same) + # Dimensions are tuple of row/column/nnz + dimensions = [CountMatrix.load_dims_from_h5(f) for f in in_h5_filenames] + total_nnz = sum(x[2] for x in dimensions) + assert np.all( + x[0] == dimensions[0][0] for x in dimensions + ), "Not all row dimensions were the same" + assert np.all( + x[1] == dimensions[0][1] for x in dimensions + ), "Not all col dimensions were the same" + + # Load the indptrs and figure out which columns each file has + fn_start_ends = [] + for fn in in_h5_filenames: + indptr = CountMatrix.load_indptr_from_file(fn) + col_spans = indptr[1:] - indptr[:-1] + active_cols = np.nonzero(col_spans) + # TODO: Double pass a bit annoying here, get min/max at once + start = np.min(active_cols) + end = np.max(active_cols) + fn_start_ends.append((fn, start, end)) + fn_start_ends.sort(key=lambda x: x[1]) + # Now check they don't overlap and that we have independent blocks of cols + last_end = -1 + last_start = -1 + for _, start, end in fn_start_ends: + if start < last_end or end <= last_end or start < last_start: + raise ValueError("H5 files to be concatenated were not unique sets of columns") + last_end = end + last_start = start + + # Columnwise concatenate into a new file + start_file = fn_start_ends[0][0] + shutil.copyfile(start_file, out_h5_filename) + to_append = (h5_constants.H5_MATRIX_DATA_ATTR, h5_constants.H5_MATRIX_INDICES_ATTR) + with h5.File(out_h5_filename, "a") as outfile: + if sw_version: + _save_sw_version(outfile, sw_version) + if extra_attrs: + _save_extra_attrs(outfile, extra_attrs) + matrix = outfile[MATRIX] + ind_ptr = CountMatrix._load_indptr_from_matrix_group(matrix).astype(np.uint64) + end = len(matrix[to_append[0]]) + # Resize everything to expected total size + for dset_name in to_append: + dset = matrix[dset_name] + dset.resize((total_nnz,)) + # Now append new data to this + for small_file, s_start, s_end in fn_start_ends[1:]: + new_mat = CountMatrix.load_h5_file(small_file) + start = end + end = len(new_mat.m.data) + end + matrix[h5_constants.H5_MATRIX_DATA_ATTR][start:end] = new_mat.m.data + matrix[h5_constants.H5_MATRIX_INDICES_ATTR][start:end] = new_mat.m.indices + # Update the column index as well, by adding an offset to account for the data we're appending. + cur_indptr = new_mat.m.indptr.astype(np.uint64) + cur_indptr += start + num_entries_before = ( # suspect is zero most of the time as we grouped by columns + ind_ptr[s_end + 1] - ind_ptr[s_end] + ) + assert num_entries_before == 0, "Data was not cleanly separated into distinct columns" + ind_ptr[s_start:] = cur_indptr[s_start:] # +num_entries_before + del new_mat + matrix[h5_constants.H5_MATRIX_INDPTR_ATTR][:] = ind_ptr + + def make_matrix_attrs_count(sample_id, gem_groups, chemistry): matrix_attrs = make_library_map_count(sample_id, gem_groups) matrix_attrs[h5_constants.H5_CHEMISTRY_DESC_KEY] = chemistry diff --git a/lib/python/cellranger/molecule_counter.py b/lib/python/cellranger/molecule_counter.py index 5d6a412..d7b939b 100644 --- a/lib/python/cellranger/molecule_counter.py +++ b/lib/python/cellranger/molecule_counter.py @@ -116,7 +116,6 @@ TARGETING_METHOD_METRIC = "targeting_method" MOLECULE_INFO_TYPE_METRIC = "molecule_info_type" MOLECULE_INFO_TYPE_RAW = "raw" -MOLECULE_INFO_TYPE_PERSAMPLE = "per_sample" MOLECULE_INFO_TYPE_COUNT = "count" ANALYSIS_PARAMETERS_METRIC = "analysis_parameters" @@ -146,10 +145,13 @@ # Per-barcode metadata. Sparse (not every barcode is listed) class BarcodeInfo(NamedTuple): # Array-ized list of (barcode_idx, library_idx, genome_idx) + PASS_FILTER_BARCODE_IDX = 0 + PASS_FILTER_LIBRARY_IDX = 1 + PASS_FILTER_GENOME_IDX = 2 pass_filter: np.ndarray # tuples where presence indicates passing filter. # This is a binary 3-d sparse matrix in COO format. - genomes: str # Genome strings for genome 0..j + genomes: list[str] # Genome strings for genome 0..j BARCODE_INFO_DTYPES = { @@ -165,7 +167,7 @@ def _write_barcodes(mc: MoleculeCounter, barcodes): mc: MoleculeCounter instance barcodes: a numpy array of strings or iterable of strings """ - if isinstance(barcodes, np.ndarray) and barcodes.dtype.type is np.string_: + if isinstance(barcodes, np.ndarray) and barcodes.dtype.type is np.bytes_: mc.h5.create_dataset(BARCODE_DS_NAME, data=barcodes) elif len(barcodes) == 0: bc_array = np.array([], dtype="S", copy=False) @@ -200,7 +202,7 @@ def create_dataset(mc: MoleculeCounter, name: str): def get_barcode_index_to_retain(mc: MoleculeCounter, tgt_chunk_len=2000000) -> np.ndarray: """Get barcode indices which have nonzero counts or pass the filter.""" barcode_info = mc.get_barcode_info() - unique_bc_idx = barcode_info.pass_filter[:, 0] + unique_bc_idx = barcode_info.pass_filter[:, BarcodeInfo.PASS_FILTER_BARCODE_IDX] for chunk_start, chunk_len in mc.get_chunks(tgt_chunk_len, preserve_boundaries=False): unique_bc_idx = np.union1d( unique_bc_idx, @@ -238,10 +240,10 @@ def default(self, o): ): return int(o) - elif isinstance(o, np.float_ | np.float16 | np.float32 | np.float64): + elif isinstance(o, np.float16 | np.float32 | np.float64): return float(o) - elif isinstance(o, np.complex_ | np.complex64 | np.complex128): + elif isinstance(o, np.complex64 | np.complex128): return {"real": o.real, "imag": o.imag} elif isinstance(o, np.ndarray): @@ -364,13 +366,11 @@ def get_h5py_file_and_version(mol_info_fname, mode="r") -> tuple[h5py.File, int] mc_h5 = h5py.File(mol_info_fname, mode=mode) except OSError as ex: raise OSError( - "The molecule info HDF5 file (%s) is invalid. Please provide a valid HDF5 file." - % mol_info_fname + f"The molecule info HDF5 file ({mol_info_fname}) is invalid. Please provide a valid HDF5 file." ) from ex if not is_valid_mol_info_h5(mc_h5): raise ValueError( - "The input molecule info HDF5 file (%s) does not appear to be properly formatted. Please provide a valid file." - % (mol_info_fname) + f"The input molecule info HDF5 file ({mol_info_fname}) does not appear to be properly formatted. Please provide a valid file." ) elif FILE_VERSION_KEY in mc_h5.attrs: file_version = int(mc_h5.attrs[FILE_VERSION_KEY]) @@ -549,9 +549,9 @@ def get_filtered_barcodes( pass_filter = barcode_info.pass_filter - pf_barcode_idx = pass_filter[:, 0] - pf_library_idx = pass_filter[:, 1] - pf_genome_idx = pass_filter[:, 2] + pf_barcode_idx = pass_filter[:, BarcodeInfo.PASS_FILTER_BARCODE_IDX] + pf_library_idx = pass_filter[:, BarcodeInfo.PASS_FILTER_LIBRARY_IDX] + pf_genome_idx = pass_filter[:, BarcodeInfo.PASS_FILTER_GENOME_IDX] mask = np.ones(pass_filter.shape[0], dtype=bool) if genome_idx is not None: @@ -714,7 +714,7 @@ def open( ): pass else: - raise AttributeError("Unrecognized dataset key: %s" % key) + raise AttributeError(f"Unrecognized dataset key: {key}") # Load library info mc.library_info = json.loads(cr_h5.read_hdf5_string_dataset(mc.h5["library_info"])[0]) @@ -849,7 +849,9 @@ def trim_barcodes(self): future ] - new_pass_filter[:, 0] = [new_positions[x] for x in new_pass_filter[:, 0]] + new_pass_filter[:, BarcodeInfo.PASS_FILTER_BARCODE_IDX] = [ + new_positions[x] for x in new_pass_filter[:, BarcodeInfo.PASS_FILTER_BARCODE_IDX] + ] new_barcode_info = BarcodeInfo( pass_filter=new_pass_filter, genomes=old_barcode_info.genomes, diff --git a/lib/python/cellranger/mtx_to_matrix_converter.py b/lib/python/cellranger/mtx_to_matrix_converter.py index d89e02c..8daf9cd 100644 --- a/lib/python/cellranger/mtx_to_matrix_converter.py +++ b/lib/python/cellranger/mtx_to_matrix_converter.py @@ -22,7 +22,7 @@ def load_mtx(mtx_dir): if os.path.exists(v3_fn): return from_v3_mtx(mtx_dir) - raise OSError("Not a valid path to a feature-barcode mtx directory: '%s'" % str(mtx_dir)) + raise OSError(f"Not a valid path to a feature-barcode mtx directory: '{mtx_dir!s}'") def save_dense_csv(mat: CountMatrix, filename): @@ -41,7 +41,7 @@ def from_legacy_mtx(genome_dir): matrix_mtx = ensure_binary(os.path.join(genome_dir, "matrix.mtx")) for filepath in [barcodes_tsv, genes_tsv, matrix_mtx]: if not os.path.exists(filepath): - raise OSError("Required file not found: %s" % filepath) + raise OSError(f"Required file not found: {filepath}") barcodes = pd.read_csv( barcodes_tsv.encode(), delimiter="\t", diff --git a/lib/python/cellranger/multi/build_per_sample_outs.py b/lib/python/cellranger/multi/build_per_sample_outs.py index 65e8c3e..9a67793 100644 --- a/lib/python/cellranger/multi/build_per_sample_outs.py +++ b/lib/python/cellranger/multi/build_per_sample_outs.py @@ -20,24 +20,12 @@ def build_sample_outs(args, outs, is_pd: bool): count["analysis"] = hard_link(args.analysis) # Add cell_types if available - count["cell_types"] = {} - if hasattr(args, "cell_types"): - - def hard_link_sample_cell_types_out(in_key: str, out_key: str, include_if: bool = True): - in_path = (args.cell_types or {}).get(in_key, None) - if in_path is None or not include_if: - count["cell_types"][out_key] = None - return - count["cell_types"][out_key] = hard_link(in_path) - - hard_link_sample_cell_types_out("cas_cell_types", "cas_cell_types") - hard_link_sample_cell_types_out( - "cas_deconvolution_cell_types", "cas_deconvolution_cell_types" - ) - hard_link_sample_cell_types_out("cas_deconvolution_results", "cas_deconvolution_results") - hard_link_sample_cell_types_out("cas_results", "cas_results") - hard_link_sample_cell_types_out("web_summary_cell_types_pd", "web_summary_cell_types_pd") - hard_link_sample_cell_types_out("minimal_cas_web_summary", "minimal_cas_web_summary") + if hasattr(args, "cell_types") and args.cell_types is not None: + count["cell_types"] = {} + for key, in_path in args.cell_types.items(): + count["cell_types"][key] = hard_link(in_path) + else: + count["cell_types"] = None def hard_link_sample_slfe_out(in_key: str, out_key: str, include_if: bool = True): in_path = (args.sample_slfe_outs or {}).get(in_key, None) diff --git a/lib/python/cellranger/pandas_utils.py b/lib/python/cellranger/pandas_utils.py index 89c4230..2199682 100644 --- a/lib/python/cellranger/pandas_utils.py +++ b/lib/python/cellranger/pandas_utils.py @@ -27,6 +27,7 @@ MOLECULE_INFO_COLUMNS, UMI_COL_NAME, UMI_TYPE_COL_NAME, + BarcodeInfo, MoleculeCounter, ) @@ -52,7 +53,7 @@ ] # mol_info chunk size used in collapse_feature_counts and collapse_barcode_chunks -CHUNK_SIZE = 20000000 +CHUNK_SIZE = 20_000_000 # pylint: disable=invalid-name @@ -177,9 +178,11 @@ def _get_is_cell( elif exclude_cells or exclude_noncells or with_cell_call: pass_filter = mc.get_barcode_info().pass_filter is_cell = np.zeros(np.sum(idx_mol), dtype=bool) - for library_idx in set(pass_filter[:, 1]): + for library_idx in set(pass_filter[:, BarcodeInfo.PASS_FILTER_LIBRARY_IDX]): # which are the cell-associated barcodes from this library? - which_barcodes = pass_filter[pass_filter[:, 1] == library_idx, 0] + which_barcodes = pass_filter[ + pass_filter[:, BarcodeInfo.PASS_FILTER_LIBRARY_IDX] == library_idx, 0 + ] is_bc_and_lib = cr_mce.get_indices_for_values( mc, [LIBRARY_IDX_COL_NAME], [(library_idx,)] )[idx_mol] @@ -571,6 +574,7 @@ def _barcode_summary(df: pd.DataFrame): def collapse_feature_counts( mc: MoleculeCounter, filter_library_idx: list[int] | None = None, + barcode_genome: str | None = None, tgt_chunk_len: int = CHUNK_SIZE, downsample: float | None = None, ): @@ -581,13 +585,20 @@ def collapse_feature_counts( Args: mc (MoleculeCounter): instance of MoleculeCounter object filter_library_idx (list of ints or None): specifies whether to restrict counts to only certain libraries + barcode_genome (str | None): Use only barcodes from this genome. If None, use all barcodes. tgt_chunk_len (int): number of rows by which to chunk mol_info downsample (float): downsample fraction Returns: pandas.DataFrame containing per-feature summary statistics (UMIs, reads, dup_rate, and feature metadata) """ - barcode_indices_passing_filter = mc.get_barcode_info().pass_filter + barcode_info = mc.get_barcode_info() + barcode_passing_filter = barcode_info.pass_filter + if barcode_genome is not None: + genome_idx = barcode_info.genomes.index(barcode_genome) + barcode_passing_filter = barcode_passing_filter[ + barcode_passing_filter[:, BarcodeInfo.PASS_FILTER_GENOME_IDX] == genome_idx + ] if filter_library_idx is None: filter_library_idx = [int(lib["library_id"]) for lib in mc.get_library_info()] @@ -608,8 +619,8 @@ def collapse_chunk(chunk_start: int, chunk_len: int, filter_library_idx: list[in is_cell = np.zeros(idx_mol.shape, dtype="bool") for library_idx in filter_library_idx: - cell_barcode_indices = barcode_indices_passing_filter[ - barcode_indices_passing_filter[:, 1] == library_idx, 0 + cell_barcode_indices = barcode_passing_filter[ + barcode_passing_filter[:, BarcodeInfo.PASS_FILTER_LIBRARY_IDX] == library_idx, 0 ] is_cell |= np.isin( mc.get_column_lazy(BARCODE_IDX_COL_NAME)[chunk_start:chunk_stop], @@ -654,7 +665,7 @@ def collapse_chunk(chunk_start: int, chunk_len: int, filter_library_idx: list[in / result[FEATURE_DF_COUNT_COL + suffix].clip(lower=1) ) - feature_ref_df = feature_ref_from_h5(mc) + feature_ref_df = feature_ref_from_h5(mc, genome_col=True) feature_ref_df.rename(columns={"index": FEATURE_IDX_COL_NAME}, inplace=True) feature_ref_df = feature_ref_df.merge(result, how="left", on=FEATURE_IDX_COL_NAME) diff --git a/lib/python/cellranger/preflight.py b/lib/python/cellranger/preflight.py index 0509081..fbd7084 100644 --- a/lib/python/cellranger/preflight.py +++ b/lib/python/cellranger/preflight.py @@ -7,7 +7,7 @@ import os import socket import sys -from typing import Any, NamedTuple +from typing import NamedTuple import martian @@ -16,21 +16,14 @@ import cellranger.reference as cr_reference import cellranger.rna.feature_ref as rna_feature_ref import cellranger.rna.library as rna_library -import cellranger.sample_def as cr_sample_def import cellranger.targeted.simple_utils as tgt_simple_utils import tenkit.log_subprocess as tk_subproc import tenkit.preflight as tk_preflight from cellranger import csv_utils -from cellranger.chemistry import ( - CHEMISTRY_DESCRIPTION_FIELD, - CHEMISTRY_NAME_FIELD, - SC3P_V4_CHEMISTRIES, -) from cellranger.fast_utils import validate_reference from cellranger.feature_ref import FeatureDefException from cellranger.molecule_counter import ( LIBRARIES_METRIC, - MOLECULE_INFO_TYPE_PERSAMPLE, MoleculeCounter, ) from cellranger.reference_paths import get_ref_name_from_genomes, get_reference_genomes @@ -105,9 +98,7 @@ def check_gex_or_ab_present(sample_def): for x in sample_def ): raise PreflightException( - "You must specify >= 1 input library with either library_type == '%s' or library_type == '%s' to run '{} count'".format( - cr_env.product() - ) + f"You must specify >= 1 input library with either library_type == '%s' or library_type == '%s' to run '{cr_env.product()} count'" % (rna_library.GENE_EXPRESSION_LIBRARY_TYPE, rna_library.ANTIBODY_LIBRARY_TYPE) ) @@ -131,7 +122,7 @@ def check_sample_def(sample_defs, feature_ref=None, pipeline=None, is_spatial=Fa for i in range(len(sd_entries) - 1): if sd_entries[i] == sd_entries[i + 1]: msg = "Duplicated entry in the input FASTQ data. Please use a unique combination of fastq path and sample name." - msg += "\nPath: %s" % sd_entries[i][0] + msg += f"\nPath: {sd_entries[i][0]}" msg += "\nNote in demux mode, a unique combination fastq path, sample indices, and lanes is required." raise PreflightException(msg) @@ -142,7 +133,7 @@ def check_sample_def(sample_defs, feature_ref=None, pipeline=None, is_spatial=Fa raise PreflightException("Empty fastq path specifed. Please specify an absolute path.") if not read_path.startswith("/"): raise PreflightException( - "Specified FASTQ folder must be an absolute path: %s" % read_path + f"Specified FASTQ folder must be an absolute path: {read_path}" ) if not os.path.exists(read_path): raise PreflightException( @@ -150,15 +141,11 @@ def check_sample_def(sample_defs, feature_ref=None, pipeline=None, is_spatial=Fa ) if os.path.isfile(read_path): raise PreflightException( - "Specified FASTQ path {} is a file. The path is expected to be a directory.".format( - read_path - ) + f"Specified FASTQ path {read_path} is a file. The path is expected to be a directory." ) if not os.access(read_path, os.X_OK): raise PreflightException( - "On machine: {}, {} does not have permission to open FASTQ folder: {}".format( - hostname, cr_env.product(), read_path - ) + f"On machine: {hostname}, {cr_env.product()} does not have permission to open FASTQ folder: {read_path}" ) if not os.listdir(read_path): raise PreflightException("Specified FASTQ folder is empty: " + read_path) @@ -173,9 +160,9 @@ def check_sample_def(sample_defs, feature_ref=None, pipeline=None, is_spatial=Fa if pipeline == cr_constants.PIPELINE_COUNT: if is_spatial: - options = ", ".join("'%s'" % x for x in SPATIAL_ALLOWED_LIBRARY_TYPES) + options = ", ".join(f"'{x}'" for x in SPATIAL_ALLOWED_LIBRARY_TYPES) else: - options = ", ".join("'%s'" % x for x in PUBLIC_LIBRARY_TYPES) + options = ", ".join(f"'{x}'" for x in PUBLIC_LIBRARY_TYPES) library_type = sample_def.get(rna_library.LIBRARY_TYPE, None) # Check for empty library_type @@ -183,8 +170,8 @@ def check_sample_def(sample_defs, feature_ref=None, pipeline=None, is_spatial=Fa msg = ( "library_type field may not be an empty string." "\nThe 'library_type' field in the libraries csv" - " must be one of %s" - ) % options + f" must be one of {options}" + ) raise PreflightException(msg) # Check for a valid library_type @@ -205,19 +192,23 @@ def check_sample_def(sample_defs, feature_ref=None, pipeline=None, is_spatial=Fa and library_type != rna_library.GENE_EXPRESSION_LIBRARY_TYPE ): if not any(x.feature_type == library_type for x in feature_ref.feature_defs): - msg = ( - "You declared a library with library_type = '%s', but there are no features declared with that feature_type in the feature reference." - % library_type + raise PreflightException( + "You declared a library with " + f"library_type = '{library_type}', but there are no features declared " + "with that feature_type in the feature reference.\n" + "Check that the 'library_type' field in the libraries csv matches at least " + "1 entry in the 'feature_type' field in the feature reference CSV" ) - msg += "\nCheck that the 'library_type' field in the libraries csv matches at least 1 entry in the 'feature_type' field in the feature reference csv" - raise PreflightException(msg) elif pipeline == cr_constants.PIPELINE_VDJ: # library type can be missing, or VDJ library_type = sample_def.get(rna_library.LIBRARY_TYPE, None) if library_type not in (None, rna_library.VDJ_LIBRARY_TYPE): - msg = f"You declared a library with library_type = '{library_type}'. For the vdj pipeline, the library_type field in sample_def must be missing or '{rna_library.VDJ_LIBRARY_TYPE}'" - raise PreflightException(msg) + raise PreflightException( + f"You declared a library with library_type = '{library_type}'. " + "For the VDJ pipeline, the library_type field in sample_def must be missing " + f"or '{rna_library.VDJ_LIBRARY_TYPE}'" + ) STAR_REQUIRED_FILES = [ @@ -232,12 +223,9 @@ def check_sample_def(sample_defs, feature_ref=None, pipeline=None, is_spatial=Fa ] -def check_refdata(reference_path): +def check_refdata(reference_path: str): + assert reference_path is not None hostname = socket.gethostname() - - if reference_path is None: - raise PreflightException("Must specify a transcriptome reference path.") - print(f"Checking reference_path ({reference_path}) on {hostname}...", flush=True) required_files = [cr_constants.REFERENCE_METADATA_FILE, cr_constants.REFERENCE_FASTA_PATH] @@ -245,8 +233,7 @@ def check_refdata(reference_path): p = os.path.join(reference_path, filename) if not os.path.isfile(p): raise PreflightException( - "Your reference does not contain the expected files, or they are not readable. Please check your reference folder on %s." - % hostname + f"Your reference does not contain the expected files, or they are not readable. Please check your reference folder on {hostname}." ) # check for genes/genes.gtf or genes/getes.gtf.gz @@ -255,11 +242,7 @@ def check_refdata(reference_path): if not os.path.isfile(p_gtf) and not os.path.isfile(p_gtf_gz): raise PreflightException( - "Your reference is missing gene annotations that should be present at {reference_path}/{gtf_path}[.gz], or they are not readable. Please check your reference folder on {hostname}.".format( - reference_path=reference_path, - gtf_path=cr_constants.REFERENCE_GENES_GTF_PATH, - hostname=hostname, - ) + f"Your reference is missing gene annotations that should be present at {reference_path}/{cr_constants.REFERENCE_GENES_GTF_PATH}[.gz], or they are not readable. Please check your reference folder on {hostname}." ) for filename in STAR_REQUIRED_FILES: @@ -313,7 +296,7 @@ def expand_libraries_csv(csv_path): return libraries -def check_file_properties(path, file_desc="input"): +def check_file_properties(path: str, *, file_desc: str = "input"): """Check that the input file exists and is readable.""" if not os.access(path, os.R_OK): raise PreflightException( @@ -434,20 +417,20 @@ def is_antigen_capture(sample): def check_targeting_preflights( - sample_def: dict[str, Any], - reference_path: str, + target_panel: str | None, + reference_path: str | None, feature_reference_path: str | None, *, parse_files: bool, expected_targeting_method: str, is_spatial: bool, ): - """_summary_. + """Check preflights for the target panel. Args: - sample_def (dict[str, Any]): Sample definition list - reference_path (str): Location of the reference - feature_reference_path (Optional[str]): Location of the feature reference path + target_panel (str | None): Target panel csv + reference_path (str | None): Location of the reference + feature_reference_path (str | None): Location of the feature reference path parse_files (bool): Flag to parse the GTF to verify that the gene is present expected_targeting_method (str): Type of targeting method used (Need more details) is_spatial (bool): Is this a spatial sample or not? @@ -455,22 +438,14 @@ def check_targeting_preflights( Raises: PreflightException: Any Preflight specific Exception """ - # Get distinct, non-null target panel files - target_panel_files = list( - {cr_sample_def.get_target_set(sd) for sd in sample_def}.difference({None}) - ) - - if len(target_panel_files) == 0: - # Nothing to check - return - elif len(target_panel_files) > 1: - # Should not be possible, except with an edited MRO file + if reference_path is None and target_panel is None and feature_reference_path is None: raise PreflightException( - "Found multiple distinct non-null target panels in the sample_def." + "Must specify a transcriptome or probe set or feature reference path." ) - target_panel = target_panel_files.pop() # single-element set - check_file_properties(target_panel, file_desc="The target panel or probe set csv") + if target_panel is None: + return + check_file_properties(target_panel, file_desc="The probe set CSV") try: csv_utils.load_csv_filter_comments( @@ -487,8 +462,12 @@ def check_targeting_preflights( check_targeting_method(expected_targeting_method, [target_panel]) if parse_files: - gene_index = cr_reference.NewGeneIndex.load_from_reference(reference_path) - gene_name_to_id = {gene.name: gene.id for gene in gene_index.genes} + if reference_path is None: + gene_index = None + gene_name_to_id = None + else: + gene_index = cr_reference.NewGeneIndex.load_from_reference(reference_path) + gene_name_to_id = {gene.name: gene.id for gene in gene_index.genes} try: target_panel_metadata, target_panel_genes, _ = tgt_simple_utils.parse_target_csv( @@ -507,42 +486,35 @@ def check_targeting_preflights( ) if len(target_panel_genes) < MINIMUM_TARGET_PANEL_GENES_PREFLIGHT: raise PreflightException( - "Ten or more genes must be specified in the {} file for compatibility with downstream analysis. Number of genes found: {}.".format( - descriptive_name, - len(target_panel_genes), - ) + f"Ten or more genes must be specified in the {descriptive_name} file for compatibility with downstream analysis. Number of genes found: {len(target_panel_genes)}." ) # Ensure that the reference genome of the transcriptome and probe set are identical for RTL only. if TARGETING_METHOD_TL_FILE_FORMAT in target_panel_metadata: transcriptome_reference_genome = get_ref_name_from_genomes( - get_reference_genomes(reference_path) + get_reference_genomes(reference_path, target_panel) ) probe_set_reference_genome = target_panel_metadata["reference_genome"] if not transcriptome_reference_genome == probe_set_reference_genome: raise PreflightException( - "The reference genome of the transcriptome '{}' and probe set '{}' must be identical.".format( - transcriptome_reference_genome, probe_set_reference_genome - ) + f"The reference genome of the transcriptome '{transcriptome_reference_genome}' and probe set '{probe_set_reference_genome}' must be identical." ) # Ensure that the reference transcriptome and probe set have at least one gene in common. - if all(gene_index.gene_id_to_int(gene_id) is None for gene_id in target_panel_genes): + if gene_index is not None and all( + gene_index.gene_id_to_int(gene_id) is None for gene_id in target_panel_genes + ): raise PreflightException( - "There are no gene IDs in common between the reference transcriptome and the {}.".format( - descriptive_name - ), + f"There are no gene IDs in common between the reference transcriptome and the {descriptive_name}.", ) panel_type = target_panel_metadata.get("panel_type", None) if is_spatial and panel_type in SPATIAL_TARGET_DISALLOWED_PANEL_TYPES: martian.alarm( - 'The provided targeted panel type "{}" is UNSUPPORTED in this product and results may be incorrect.'.format( - panel_type - ) + f'The provided targeted panel type "{panel_type}" is UNSUPPORTED in this product and results may be incorrect.' ) - if feature_reference_path is not None: + if gene_index is not None and feature_reference_path is not None: gene_id_to_index = {gene.id: id(gene) for gene in gene_index.genes} target_set_gene_indices = [ gene_id_to_index[gene_id] @@ -561,90 +533,12 @@ def check_targeting_preflights( raise PreflightException(str(e)) from e -def validate_targeted_compare_mol_info( - mol_info_fn, expecting_targeted, required_metrics=[], required_library_metrics=[] -): - if not os.path.exists(mol_info_fn): - raise PreflightException("The molecule info file %s does not exist" % mol_info_fn) - if not os.access(mol_info_fn, os.R_OK): - raise PreflightException("The molecule info file %s is not readable" % mol_info_fn) - try: - mc = MoleculeCounter.open(mol_info_fn, "r") - - molecule_info_type = mc.get_molecule_info_type() - if molecule_info_type == MOLECULE_INFO_TYPE_PERSAMPLE: - raise PreflightException( - "The multiplexed sample molecule info file %s cannot be used with targeted-compare" - % mol_info_fn - ) - - library_info = mc.get_library_info() - gex_lib_is_targeted = [ - rna_library.has_target_set(lib) - for lib in library_info - if lib["library_type"] == rna_library.GENE_EXPRESSION_LIBRARY_TYPE - ] - if len(gex_lib_is_targeted) == 0: - raise PreflightException( - "The molecule info file %s does not have any gene expression libraries." - % mol_info_fn - ) - - library_metrics = next(iter(mc.get_all_metrics()[LIBRARIES_METRIC].values())) - for metric in required_library_metrics: - if metric not in library_metrics.keys(): - raise PreflightException( - f"The molecule info file {mol_info_fn} is too old and is missing the metric {metric}. Please rerun." - ) - - for metric_key in required_metrics: - if mc.get_metric(metric_key) is None: - msg = ( - "The molecule info HDF5 file (%s) was produced by an older software version." - % mol_info_fn - ) - msg += "\nReading these files is unsupported." - raise PreflightException(msg) - - if expecting_targeted and ( - not all(gex_lib_is_targeted) or mc.get_metric("target_panel_hash") is None - ): - msg = ( - "The input targeted molecule info file %s does not come from a targeted analysis run. " - % (mol_info_fn) - ) - msg += ( - "Please rerun your targeted analysis run using '{} count --target-panel'.".format( - cr_env.product() - ) - ) - raise PreflightException(msg) - if not expecting_targeted and any(gex_lib_is_targeted): - msg = ( - "The input parent molecule info file %s does not come from a whole transcriptome analysis run. " - % (mol_info_fn) - ) - msg += "Please rerun your parent analysis run using '{} count' without a target-panel.".format( - cr_env.product() - ) - raise PreflightException(msg) - - mc.close() - - except OSError as err: - raise PreflightException( - "Molecule info file %s cannot be loaded (may be corrupt)." % mol_info_fn - ) from err - except ValueError as err: - raise PreflightException(str(err)) from err - - def check_molecule_info_contains_library_metrics(mol_info_fn, metrics_expected=[]): with MoleculeCounter.open(mol_info_fn, "r") as mc: num_libraries = mc.get_library_info() if num_libraries == 0: raise PreflightException( - "The molecule info file %s has no associated libraries." % mol_info_fn + f"The molecule info file {mol_info_fn} has no associated libraries." ) # just check the any single library since it'll be the same for all for metric in metrics_expected: @@ -669,33 +563,11 @@ def check_target_features_same(target_sets): inconsistent_genes.update(target_set.difference(global_target_set)) inconsistent_genes.update(global_target_set.difference(target_set)) raise PreflightException( - "Target sets are not the same. Found inconsistent genes: %s" % (inconsistent_genes) + f"Target sets are not the same. Found inconsistent genes: {inconsistent_genes}" ) counter += 1 -def check_chemistry(chemistry_desc, sample_def): - """Checks that the provided chemistry is compatible with features. - - The v4 3-prime chemistry no longer has the CRISPR oligo and so is not compatible. - """ - v4_chem_names = [] - for chem in SC3P_V4_CHEMISTRIES: - v4_chem_names.append(chem[CHEMISTRY_DESCRIPTION_FIELD]) - v4_chem_names.append(chem[CHEMISTRY_NAME_FIELD]) - - def is_crispr(sample): - library_type = sample.get("library_type") - if library_type is None: - return False - return library_type == rna_library.CRISPR_LIBRARY_TYPE - - if any(is_crispr(x) for x in sample_def) and chemistry_desc in v4_chem_names: - raise PreflightException( - f"Provided chemistry {chemistry_desc} is not compatible with CRISPR Guide Capture Libraries." - ) - - def check_sample_info( sample_def, reference_path, full_check, feature_ref_path=None, is_spatial=False ): @@ -703,7 +575,7 @@ def check_sample_info( if feature_ref_path is not None: print("Checking feature definition file...", flush=True) check_file_properties(feature_ref_path, file_desc="feature reference") - if full_check: + if full_check and reference_path is not None: # This requires loading the reference index and parsing the feature CSV, # and we don't want to do that e.g. during local preflight feature_ref = try_load_feature_ref(reference_path, feature_ref_path) @@ -779,7 +651,8 @@ def check_common_preflights( force_cells, ): print("Checking reference...", flush=True) - check_refdata(reference_path) + if reference_path is not None: + check_refdata(reference_path) if r1_length is not None: print("Checking read 1 length...", flush=True) diff --git a/lib/python/cellranger/products.py b/lib/python/cellranger/products.py index 06eb294..6d0fde3 100644 --- a/lib/python/cellranger/products.py +++ b/lib/python/cellranger/products.py @@ -26,6 +26,6 @@ def get_cmd_names(product_name: str) -> tuple[str, str]: else: # will never happen, but if it does we need to catch in testing with an exception raise RuntimeError( - "Unrecognized product name: '%s'. Expected 'spaceranger' or 'cellranger' or " - "'cellranger-arc' or 'cellranger-atac'" % product_name + f"Unrecognized product name: '{product_name}'. Expected 'spaceranger' or 'cellranger' or " + "'cellranger-arc' or 'cellranger-atac'" ) diff --git a/lib/python/cellranger/reference.py b/lib/python/cellranger/reference.py index 84ef3a9..27cbc61 100644 --- a/lib/python/cellranger/reference.py +++ b/lib/python/cellranger/reference.py @@ -70,9 +70,7 @@ class GtfParseError(Exception): def __init__(self, filename, msg): super().__init__( - "Error while parsing GTF file {}\n{}\n\nPlease fix your GTF and start again.".format( - filename, msg - ) + f"Error while parsing GTF file {filename}\n{msg}\n\nPlease fix your GTF and start again." ) @@ -142,8 +140,8 @@ def gtf_reader_iter( contigs = sorted(list(contig_lengths.keys())) raise GtfParseError( filename, - "Invalid contig name encountered on GTF line {}: {}. The FASTA file " - "has contigs:\n{}".format(i + 1, row[0], contigs), + f"Invalid contig name encountered on GTF line {i + 1}: {row[0]}. The FASTA file " + f"has contigs:\n{contigs}", ) max_len = contig_lengths[row[0]] @@ -378,16 +376,15 @@ def get_properties_dict( elif value.isdigit(): # unquoted integer value = int(value) - else: + elif '"' in key or '"' in value: # Leave it mostly as is (technically not against the GTF format, # at least as per http://mblab.wustl.edu/GTF22.html) # but make sure we don't have any quotes in the value, this will bjork the rust parser - if '"' in key or '"' in value: - raise GtfParseError( - filename, - "Error parsing GTF at line %d. Parsed attribute had a quote in the middle of a value. Please ensure quotes are only used to encapsulate attribute values.\n Bad Attribute Value = %s" - % (line_number, value), - ) + raise GtfParseError( + filename, + "Error parsing GTF at line %d. Parsed attribute had a quote in the middle of a value. Please ensure quotes are only used to encapsulate attribute values.\n Bad Attribute Value = %s" + % (line_number, value), + ) if '"' in key: raise GtfParseError( @@ -523,7 +520,7 @@ def get_sequence( elif strand == cr_constants.REVERSE_STRAND: return tk_seq.get_rev_comp(seq) else: - raise Exception("Invalid strand: %s" % strand) + raise Exception(f"Invalid strand: {strand}") def get_transcript_gc_content(self, transcript_obj: Transcript) -> float: pattern = re.compile(b"[cCgG]") diff --git a/lib/python/cellranger/reference_builder.py b/lib/python/cellranger/reference_builder.py index 9c3c351..8a1ae63 100644 --- a/lib/python/cellranger/reference_builder.py +++ b/lib/python/cellranger/reference_builder.py @@ -189,15 +189,15 @@ def get_contig_lengths(self): contig_lengths[chrom] = length if not contig_lengths: raise GexReferenceError( - "The samtools-constructed FASTA index file {} is empty. The supplied FASTA file(s) " - "have no contigs: {}".format(self.fasta_path, self.in_fasta_fns) + f"The samtools-constructed FASTA index file {self.fasta_path} is empty. The supplied FASTA file(s) " + f"have no contigs: {self.in_fasta_fns}" ) return contig_lengths def build_gex_reference(self, out_dir_exists: bool = False): """Construct a cellranger/spaceranger-compatible reference.""" if not out_dir_exists: - print("Creating new reference folder at %s" % self.out_dir) + print(f"Creating new reference folder at {self.out_dir}") os.mkdir(self.out_dir) print("...done\n") @@ -248,10 +248,8 @@ def write_genome_fasta(self, out_fasta_fn: os.PathLike | str | bytes): raise GexReferenceError(f"Input FASTA file {fn} is empty") if byte1 != b">": raise GexReferenceError( - "Input FASTA file {} is invalid. The first byte = {} but it must be " - "'>'. Note that gzipped FASTA files cannot be processed by mkref.".format( - fn, repr(byte1) - ) + f"Input FASTA file {fn} is invalid. The first byte = {byte1!r} but it must be " + "'>'. Note that gzipped FASTA files cannot be processed by mkref." ) if len(self.genomes) > 1: @@ -436,7 +434,7 @@ def index_reference( limit_ram=None, ): if os.path.exists(self.reference_star_path): - raise Exception("STAR reference path %s already exists" % self.reference_star_path) + raise Exception(f"STAR reference path {self.reference_star_path} already exists") os.mkdir(self.reference_star_path) diff --git a/lib/python/cellranger/reference_paths.py b/lib/python/cellranger/reference_paths.py index 4dac592..5afaf8c 100644 --- a/lib/python/cellranger/reference_paths.py +++ b/lib/python/cellranger/reference_paths.py @@ -21,6 +21,7 @@ import cellranger.constants as cr_constants import cellranger.h5_constants as h5_constants +from cellranger.targeted.simple_utils import load_target_csv_metadata if TYPE_CHECKING: from pysam import AlignmentFile @@ -42,9 +43,16 @@ def get_reference_genome_fasta(reference_path: str) -> str: return os.path.join(reference_path, cr_constants.REFERENCE_FASTA_PATH) -def get_reference_genomes(reference_path: str) -> list[str]: - data = _load_reference_metadata_file(reference_path) - return data[cr_constants.REFERENCE_GENOMES_KEY] +def get_reference_genomes( + reference_path: str | None, target_set_path: str | None = None +) -> list[str]: + """Return the genome names from the reference transcriptome, or target set, or ["NONE"].""" + if reference_path is not None: + return _load_reference_metadata_file(reference_path)[cr_constants.REFERENCE_GENOMES_KEY] + elif target_set_path is not None: + return [load_target_csv_metadata(target_set_path, "probe set")["reference_genome"]] + else: + return ["NONE"] def is_arc_reference(reference_path: str) -> bool: diff --git a/lib/python/cellranger/report.pyx b/lib/python/cellranger/report.pyx index ed980a8..41564de 100644 --- a/lib/python/cellranger/report.pyx +++ b/lib/python/cellranger/report.pyx @@ -54,8 +54,8 @@ class DictionaryMetric(Metric): self.d[elem] = self.d.get(elem, 0) + value def merge(self, metric: "DictionaryMetric"): - for elem in metric.d: - self.d[elem] += metric.d[elem] + for elem, value in metric.d.items(): + self.add(elem, value) def report(self) -> dict[int | bytes | str, int | float]: return self.d @@ -457,18 +457,16 @@ _BARCODES = intern("barcodes") _ALWAYS_ACTIVE = intern("always_active") -def _make_default_metrics() -> ( - dict[ - str, - tuple[ - type[Metric], - dict[ - str, - dict[str, str | bool] | list[str] | list[int | float] | list[range | list[int]], - ], +def _make_default_metrics() -> dict[ + str, + tuple[ + type[Metric], + dict[ + str, + dict[str, str | bool] | list[str] | list[int | float] | list[range | list[int]], ], - ] -): + ], +]: # Common subsections of the default metrics get reused, reducing allocations # and making string comparisons in dict/set lookup faster. report_type = intern("report_type") @@ -864,9 +862,7 @@ class Reporter: self.metadata[f"{metric_prefix}{key}"] = value elif key == cr_constants.REFERENCE_GENOMES_KEY: # Special case for genome key - self.metadata[ - f"{metric_prefix}{key}" - ] = get_ref_name_from_genomes(value) + self.metadata[f"{metric_prefix}{key}"] = get_ref_name_from_genomes(value) else: self.metadata[f"{metric_prefix}{key}"] = ", ".join(str(x) for x in value) diff --git a/lib/python/cellranger/rna/feature_ref.py b/lib/python/cellranger/rna/feature_ref.py index d58adfe..e634c5e 100644 --- a/lib/python/cellranger/rna/feature_ref.py +++ b/lib/python/cellranger/rna/feature_ref.py @@ -145,13 +145,11 @@ def _compile( continue if not pattern: raise FeatureDefException( - "Feature definition for %s has a sequence but no pattern specifying how to extract it." - % fd.id + f"Feature definition for {fd.id} has a sequence but no pattern specifying how to extract it." ) if not read: raise FeatureDefException( - "Feature definition for %s has a sequence but no read specifying where to extract it from." - % fd.id + f"Feature definition for {fd.id} has a sequence but no read specifying where to extract it from." ) regex_str, regex = compile_pattern(pattern, len(sequence)) @@ -376,9 +374,7 @@ def check_crispr_target_gene( continue if target_id not in gene_id_name_map: - msg = "CRISPR: This target_gene_id ({}) declared for one or more guide RNAs in the feature reference does not exist in the transcriptome.".format( - ensure_str(target_id) - ) + msg = f"CRISPR: This target_gene_id ({ensure_str(target_id)}) declared for one or more guide RNAs in the feature reference does not exist in the transcriptome." msg += "\nPlease specify a target_gene_id that exists in the reference, or use the string 'Non-Targeting' to indicate a control guide." raise FeatureDefException(msg) @@ -387,28 +383,20 @@ def check_crispr_target_gene( # target_features maps target set name to list of gene indices if not any(target_index in target_set for target_set in target_features.values()): msg = ( - "CRISPR: {} was specified as the target_gene_id for a guide RNA in the feature reference, ".format( - ensure_str(target_id) - ) + f"CRISPR: {ensure_str(target_id)} was specified as the target_gene_id for a guide RNA in the feature reference, " + "but this gene is not specified in the gene_id column of the target panel csv file." ) raise FeatureDefException(msg) target_name = feat.tags.get("target_gene_name") if target_name is None or target_name == "": - msg = "CRISPR: No target_gene_name specified for this target_gene_id ({}) in the feature reference.".format( - ensure_str(target_id) - ) + msg = f"CRISPR: No target_gene_name specified for this target_gene_id ({ensure_str(target_id)}) in the feature reference." raise FeatureDefException(msg) target_name = ensure_binary(target_name) if gene_id_name_map[target_id] != target_name: - msg = "CRISPR: You specified target_gene_id = {} and target_gene_name = {} in the feature reference.\n".format( - ensure_str(target_id), ensure_str(target_name) - ) - msg += "The transcriptome reference has gene_id = {} with name = {}. ".format( - ensure_str(target_id), ensure_str(gene_id_name_map[target_id]) - ) + msg = f"CRISPR: You specified target_gene_id = {ensure_str(target_id)} and target_gene_name = {ensure_str(target_name)} in the feature reference.\n" + msg += f"The transcriptome reference has gene_id = {ensure_str(target_id)} with name = {ensure_str(gene_id_name_map[target_id])}. " msg += "Please ensure the target_gene_name field has the correct gene name that matches the transcriptome." raise FeatureDefException(msg) @@ -419,7 +407,7 @@ def validate_sequence(seq: str): raise FeatureDefException("Feature sequence must be non-empty.") if not re.match("^[ACGTN]+$", seq): raise FeatureDefException( - 'Invalid sequence: "%s". The only allowed characters are A, C, G, T, and N.' % seq + f'Invalid sequence: "{seq}". The only allowed characters are A, C, G, T, and N.' ) @@ -427,7 +415,7 @@ def compile_pattern(pattern_str, length: int): """Compile a feature definition pattern into a regex.""" if "(BC)" not in pattern_str: raise FeatureDefException( - 'Invalid pattern: "%s". The pattern must contain the string "(BC)".' % pattern_str + f'Invalid pattern: "{pattern_str}". The pattern must contain the string "(BC)".' ) # keep for reporting errors against the initial input @@ -443,8 +431,7 @@ def compile_pattern(pattern_str, length: int): check_pattern = re.sub(r"\(BC\)", "", pattern_str) if not re.match(r"^\^{0,1}[ACGTN]*\${0,1}$", check_pattern): raise FeatureDefException( - 'Invalid pattern: "%s". The pattern must optionally start with "5P", optionally end with "3P", contain exactly one instance of the string "(BC)" and otherwise contain only the characters A, C, G, T, and N.' - % input_pattern_str + f'Invalid pattern: "{input_pattern_str}". The pattern must optionally start with "5P", optionally end with "3P", contain exactly one instance of the string "(BC)" and otherwise contain only the characters A, C, G, T, and N.' ) # Allow Ns to match anything @@ -524,7 +511,7 @@ def feature_reader(reader): # Check for a valid library_type if FeatureExtractor.get_feature_type(row) not in ALLOWED_FEATURE_TYPES: - options = " or ".join("'%s'" % x for x in PUBLIC_FEATURE_TYPES) + options = " or ".join(f"'{x}'" for x in PUBLIC_FEATURE_TYPES) msg = ( f"Unknown feature_type: '{FeatureExtractor.get_feature_type(row)}'." "\nThe 'feature_type' field in the feature reference" @@ -537,7 +524,7 @@ def feature_reader(reader): f_id: bytes = ensure_binary(row["id"]) if id in seen_ids: raise FeatureDefException( - 'Found duplicated ID in feature reference file: "%s"' % row["id"] + 'Found duplicated ID in feature reference file: "{}"'.format(row["id"]) ) seen_ids.add(f_id) @@ -551,7 +538,9 @@ def feature_reader(reader): ) seen_multi_unicity.add(multi_unicity) if "\t" in row["name"]: - raise FeatureDefException("Feature name field cannot contain tabs: '%s'" % row["name"]) + raise FeatureDefException( + "Feature name field cannot contain tabs: '{}'".format(row["name"]) + ) allowed_id_chars = set(string.printable) - set(string.whitespace) - set("/,'\"\\`") @@ -559,7 +548,7 @@ def feature_reader(reader): if not c in allowed_id_chars: if c in string.whitespace: raise FeatureDefException( - "Feature id field cannot contain whitespace: '%s'" % row["id"] + "Feature id field cannot contain whitespace: '{}'".format(row["id"]) ) else: msg = "Feature id field contains an illegal character at position %d: '%s'" % ( @@ -577,8 +566,7 @@ def feature_reader(reader): for key in tag_cols: if key in RESERVED_TAGS: raise FeatureDefException( - 'Found invalid column name "%s." This name cannot be used as a custom feature tag because it is reserved for internal use.' - % key + f'Found invalid column name "{key}." This name cannot be used as a custom feature tag because it is reserved for internal use.' ) elif key in TAGS_VALIDATION: row[key] = TAGS_VALIDATION[key](row[key], key) @@ -589,15 +577,17 @@ def feature_reader(reader): # Validate fields if len(tags["sequence"]) == 0: raise FeatureDefException( - "Found blank feature barcode sequence for feature id %s. The sequence column must be populated for this feature." - % row["id"] + "Found blank feature barcode sequence for feature id {}. The sequence column must be populated for this feature.".format( + row["id"] + ) ) validate_sequence(tags["sequence"]) if len(tags["pattern"]) == 0: raise FeatureDefException( - "Found blank feature barcode pattern for feature id %s. The pattern column must be populated for this feature." - % row["id"] + "Found blank feature barcode pattern for feature id {}. The pattern column must be populated for this feature.".format( + row["id"] + ) ) compile_pattern(tags["pattern"], len(tags["sequence"])) diff --git a/lib/python/cellranger/rna/library.py b/lib/python/cellranger/rna/library.py index 4f79219..dfc73ca 100644 --- a/lib/python/cellranger/rna/library.py +++ b/lib/python/cellranger/rna/library.py @@ -9,6 +9,7 @@ import json import re from collections.abc import Iterable +from enum import Enum from typing import TYPE_CHECKING if TYPE_CHECKING: @@ -71,6 +72,59 @@ MULTIPLEXING_LIBRARY_TYPE: DISPLAY_PREFIX_MULTIPLEXING, } + +# BarcodeMultiplexingType enum from lib/rust/cr_types/src/types.rs +class ReadLevel(Enum): + RTL = "RTL" + OH = "OH" + + +class CellLevel(Enum): + CMO = "CMO" + Hashtag = "Hashtag" + + +class BarcodeMultiplexingType: + """A class representing the multiplexing type, which can either be cell-level or read-level.""" + + def __init__(self, value: str): + if value == CellLevel.CMO.value: + self.level = "CellLevel" + self.type = CellLevel.CMO + elif value == CellLevel.Hashtag.value: + self.level = "CellLevel" + self.type = CellLevel.Hashtag + elif value == ReadLevel.RTL.value: + self.level = "ReadLevel" + self.type = ReadLevel.RTL + elif value == ReadLevel.OH.value: + self.level = "ReadLevel" + self.type = ReadLevel.OH + else: + raise ValueError("Invalid type for BarcodeMultiplexingType") + + def __str__(self): + return self.type.value + + def multiplexing_library_type(self): + """Returns the library associated with a given cell-level multiplexing type.""" + if self.level == "CellLevel": + if self.type == CellLevel.CMO: + return MULTIPLEXING_LIBRARY_TYPE + elif self.type == CellLevel.Hashtag: + return ANTIBODY_LIBRARY_TYPE + else: + raise ValueError("Invalid CellLevel BarcodeMultiplexingType!") + else: + raise ValueError("Multiplexing library is undefined for this BarcodeMultiplexingType!") + + def is_cell_multiplexed(self): + return self.level == "CellLevel" + + def is_read_multiplexed(self): + return self.level == "ReadLevel" + + # 'target_set_name' should be a key in library_info TARGET_SET_KEY = "target_set_name" DEFAULT_TARGET_SETS = ("", None) diff --git a/lib/python/cellranger/rna/refactor_report_matrix.py b/lib/python/cellranger/rna/refactor_report_matrix.py index 02f10c6..9961c81 100644 --- a/lib/python/cellranger/rna/refactor_report_matrix.py +++ b/lib/python/cellranger/rna/refactor_report_matrix.py @@ -129,6 +129,7 @@ def _compute_per_genome_metrics( barcode_metric_keys = [ f"{barcode_metric_key}_{genome}" for barcode_metric_key in genome_metrics ] + filtered_rows = per_barcode_metrics["barcode"].apply( lambda bc, genome=genome: is_valid_barcode(bc) and filtered_barcodes.contains(bc, genome) @@ -140,6 +141,6 @@ def _compute_per_genome_metrics( for barcode_metric_key, metric_key in genome_metrics.items(): metric_key = f"{genome}_{metric_key}" - metrics[metric_key] = metric_values[f"{barcode_metric_key}_{genome}"] + metrics[metric_key] = metric_values.get(f"{barcode_metric_key}_{genome}", 0) return metrics diff --git a/lib/python/cellranger/rna/report_matrix.py b/lib/python/cellranger/rna/report_matrix.py index be98cab..b89f696 100644 --- a/lib/python/cellranger/rna/report_matrix.py +++ b/lib/python/cellranger/rna/report_matrix.py @@ -147,26 +147,24 @@ def _report_genome_agnostic_metrics( # Deviation from cell load if recovered_cells is None: - d["%s_filtered_bcs_difference_from_recovered_cells" % rna_library.MULTI_REFS_PREFIX] = 0 + d[f"{rna_library.MULTI_REFS_PREFIX}_filtered_bcs_difference_from_recovered_cells"] = 0 d[ - "%s_filtered_bcs_relative_difference_from_recovered_cells" - % rna_library.MULTI_REFS_PREFIX + f"{rna_library.MULTI_REFS_PREFIX}_filtered_bcs_relative_difference_from_recovered_cells" ] = 0 else: - d["%s_filtered_bcs_difference_from_recovered_cells" % rna_library.MULTI_REFS_PREFIX] = int( + d[f"{rna_library.MULTI_REFS_PREFIX}_filtered_bcs_difference_from_recovered_cells"] = int( n_cell_bcs_union ) - int(recovered_cells) d[ - "%s_filtered_bcs_relative_difference_from_recovered_cells" - % rna_library.MULTI_REFS_PREFIX + f"{rna_library.MULTI_REFS_PREFIX}_filtered_bcs_relative_difference_from_recovered_cells" ] = tk_stats.robust_divide(n_cell_bcs_union - recovered_cells, recovered_cells) # Duplicate these metrics across genomes for backwards-compat for genome in genomes: - d["%s_total_raw_reads_per_filtered_bc" % genome] = tk_stats.robust_divide( + d[f"{genome}_total_raw_reads_per_filtered_bc"] = tk_stats.robust_divide( total_reads, n_cell_bcs_union ) - d["%s_total_conf_mapped_reads_per_filtered_bc" % genome] = tk_stats.robust_divide( + d[f"{genome}_total_conf_mapped_reads_per_filtered_bc"] = tk_stats.robust_divide( total_conf_mapped_reads, n_cell_bcs_union ) @@ -198,12 +196,7 @@ def _report_genome_agnostic_metrics( total_conf_mapped_barcoded_reads = 0 for genome in genome_matrices: - h5_key = "{}_{}_{}_{}_reads".format( - library_prefix, - genome, - cr_constants.TRANSCRIPTOME_REGION, - cr_constants.CONF_MAPPED_BC_READ_TYPE, - ) + h5_key = f"{library_prefix}_{genome}_{cr_constants.TRANSCRIPTOME_REGION}_{cr_constants.CONF_MAPPED_BC_READ_TYPE}_reads" cmb_reads = barcode_summary_h5[h5_key][:] total_conf_mapped_reads_in_cells += cmb_reads[bc_summary_cell_bc_indices].sum() if sample_bc_indices is not None: @@ -238,18 +231,18 @@ def _report_genome_agnostic_metrics( usable_reads += (filtered_bc_h5_row * np.array(barcode_summary_h5[h5_key])).sum() # Fraction reads usable - d[ - "%s_transcriptome_usable_reads_frac" % rna_library.MULTI_REFS_PREFIX - ] = tk_stats.robust_divide(usable_reads, total_reads) + d[f"{rna_library.MULTI_REFS_PREFIX}_transcriptome_usable_reads_frac"] = tk_stats.robust_divide( + usable_reads, total_reads + ) # Create a feature barcoding dual whose name makes sense d["frac_feature_reads_usable"] = tk_stats.robust_divide(usable_reads, total_reads) # Usable reads - d["%s_usable_reads" % rna_library.MULTI_REFS_PREFIX] = usable_reads + d[f"{rna_library.MULTI_REFS_PREFIX}_usable_reads"] = usable_reads # Usable reads per cell reads_usable_per_cell = tk_stats.robust_divide(usable_reads, n_cell_bcs_union) - d["%s_usable_reads_per_filtered_bc" % rna_library.MULTI_REFS_PREFIX] = reads_usable_per_cell + d[f"{rna_library.MULTI_REFS_PREFIX}_usable_reads_per_filtered_bc"] = reads_usable_per_cell # Create a feature barcoding dual whose name makes sense d["feature_reads_usable_per_cell"] = reads_usable_per_cell @@ -259,9 +252,9 @@ def _report_genome_agnostic_metrics( filtered_shape = filtered_mat.get_shape() total_entries = filtered_shape[0] * filtered_shape[1] print(total_entries, total_nonzero_entries, filtered_shape) - d[ - "%s_filtered_gene_bc_matrix_density" % rna_library.MULTI_REFS_PREFIX - ] = tk_stats.robust_divide(total_nonzero_entries, total_entries) + d[f"{rna_library.MULTI_REFS_PREFIX}_filtered_gene_bc_matrix_density"] = tk_stats.robust_divide( + total_nonzero_entries, total_entries + ) return d @@ -327,13 +320,13 @@ def _summarize_per_barcode(a): unique_genes_per_bc = filtered_mat.count_ge(axis=0, threshold=cr_constants.MIN_COUNTS_PER_GENE) unique_genes_stats = _summarize_per_barcode(unique_genes_per_bc) for stat, value in unique_genes_stats.items(): - d["filtered_bcs_%s_unique_genes_detected" % stat] = value + d[f"filtered_bcs_{stat}_unique_genes_detected"] = value # Counts per bc counts_per_bc = filtered_mat.sum(axis=0) counts_per_bc_stats = _summarize_per_barcode(counts_per_bc) for stat, value in counts_per_bc_stats.items(): - d["filtered_bcs_%s_counts" % stat] = value + d[f"filtered_bcs_{stat}_counts"] = value # Cumulative fraction of counts going to top bcs filt_total_umis = filtered_mat.sum() @@ -353,17 +346,17 @@ def _summarize_per_barcode(a): else: n_reads = 0 n_deduped_reads = 0 - d[ - "filtered_bcs_%s_dupe_reads_frac" % cr_constants.CDNA_PCR_DUPE_TYPE - ] = 1 - tk_stats.robust_divide(n_deduped_reads, n_reads) + d[f"filtered_bcs_{cr_constants.CDNA_PCR_DUPE_TYPE}_dupe_reads_frac"] = ( + 1 - tk_stats.robust_divide(n_deduped_reads, n_reads) + ) # Reads per top bc for the various read types (computed over top bcs) for read_type in MATRIX_REPORT_READ_TYPES: # Compute (n_reads)/(n_bcs) over all bcs and over top bcs - per_bc_metric = "filtered_bcs_%s_reads_per_filtered_bc" % read_type + per_bc_metric = f"filtered_bcs_{read_type}_reads_per_filtered_bc" # Cumulative fraction of reads going to top bcs - frac_metric = "filtered_bcs_%s_reads_cum_frac" % read_type + frac_metric = f"filtered_bcs_{read_type}_reads_cum_frac" if read_type in MATRIX_USE_MATRIX_FOR_READ_TYPE: n_reads = filt_total_umis diff --git a/lib/python/cellranger/sample_def.py b/lib/python/cellranger/sample_def.py deleted file mode 100644 index 9b7ddc6..0000000 --- a/lib/python/cellranger/sample_def.py +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2018 10X Genomics, Inc. All rights reserved. -# - -from __future__ import annotations - -import json -from collections import OrderedDict -from typing import TYPE_CHECKING, Any - -import cellranger.rna.library as rna_library - -if TYPE_CHECKING: - from collections.abc import Iterable, Mapping - - from cellranger.sample_bag import ( - BarcodeSet, - LenaSampleBag, - LenaSampleDef, - SequencingLibrary, - XenaBag, - ) - - -def get_library_type(sample_def: LenaSampleDef | SequencingLibrary) -> str | None: - """Get the library type from a LenaSampleDef. - - Note: - function modified to substitute library type - rna_library.FEATURETEST_LIBRARY_TYPE with library type - rna_library.MULTIPLEXING_LIBRARY_TYPE. - """ - ltype = sample_def.get(rna_library.LIBRARY_TYPE) - if ltype == rna_library.FEATURETEST_LIBRARY_TYPE: - return rna_library.MULTIPLEXING_LIBRARY_TYPE - return ltype or None - - -def get_subsample_rate(sample_def: Mapping[str, Any]): - return sample_def.get("subsample_rate", 1.0) - - -def get_target_set_name(sample_def: Mapping[str, Any]) -> str: - name = sample_def.get(rna_library.TARGET_SET_KEY) - # for untargeted case, target_set_name is set to null - if name is None: - name = rna_library.DEFAULT_TARGET_SETS[0] - return name - - -def get_target_set(sample_def) -> BarcodeSet | None: - return sample_def.get("target_set") - - -def get_params_json_overrides( - sample_def: XenaBag | LenaSampleBag, -) -> dict[str, None | str | int | float | bool | dict]: - """Return pipeline_parameters_json from this sample bag. - - Migrate pipeline parameters whose name has changed - for backward compatibility with older sample bags. - """ - if "metadata" in sample_def: - if TYPE_CHECKING: - assert isinstance(sample_def, XenaBag) - params_json = sample_def["metadata"].get("pipeline_parameters_json") - else: - if TYPE_CHECKING: - assert isinstance(sample_def, LenaSampleBag) - params_json = sample_def.get("pipeline_parameters_json") - if not params_json: - return {} - - params = json.loads(params_json) if isinstance(params_json, str) else params_json - - # Migrate pipeline parameters whose name has changed. - # The key is the previous name, and the value is the current name. - MIGRATE_PIPELINE_PARAMETERS = {"enforce_library_concordance": "check_library_compatibility"} - return {MIGRATE_PIPELINE_PARAMETERS.get(key, key): value for key, value in params.items()} - - -def get_gem_well(sample_def: LenaSampleDef): - """Get the GEM well from a sample def. - - Defaults to 1 if the gem_group is specified as None. - - Args: - sample_def (dict): Sample def - - Returns: - int: GEM well - """ - gg = sample_def["gem_group"] or 1 - return int(gg) - - -def assign_library_ids( - sample_defs: Iterable[LenaSampleDef], default_library_type=rna_library.DEFAULT_LIBRARY_TYPE -): - """Assign library ids to a list of sample defs if not given already. - - Each (gem group, library_type) must have a distinct library id. If missing, - the library id becomes an increasing integer. - - Args: - sample_defs (list of dict): Sample defs, some possibly already containing a library_id key - default_library_type (str): Use if a library_type is None or empty - - Returns: - list of str: Library IDs, one per sample def. - """ - # Resulting library ID for each sample def - sd_libs = [] - - # Map tuple of (gem_group (int), library_type (str)) to library ID (int) - library_to_id = OrderedDict() - - # Assign a library ID to each sample def (most commonly by generating a new, unique one) - for sd in sample_defs: - gem_group = get_gem_well(sd) - lib_type = get_library_type(sd) or default_library_type - lib_tuple = (gem_group, lib_type) # library - sd_libs.append(lib_tuple) # library for each sample def - - # If a library ID wasn't given by the user, assign it an integer that maps - # uniquely to (gem_group, library_type) - default_id = library_to_id.get(lib_tuple, str(len(library_to_id))) - - lib_id = sd.get("library_id", default_id) - - # Check if this library ID is already assigned to a different library. - if lib_id in library_to_id.values(): - # Find the first colliding library - other_lib = next( - other_lib - for other_lib, other_lib_id in library_to_id.items() - if other_lib_id == lib_id - ) - if other_lib != lib_tuple: - raise ValueError( - f'Library ID "{lib_id}" is already associated with library "{other_lib}." A library ID must identify exactly one library.' - ) - - if lib_tuple not in library_to_id: - library_to_id[lib_tuple] = lib_id - - elif library_to_id[lib_tuple] != lib_id: - # Library already has an ID - raise ValueError( - f'Library "{lib_tuple!s}" already has ID "{library_to_id[lib_tuple]}." Cannot assign it the different ID "{lib_id}."' - ) - - # remap library_ids to ints - library_to_id = OrderedDict((tup, i) for i, tup in enumerate(library_to_id)) - - # Map sample defs to library ids - return [library_to_id[lib] for lib in sd_libs] diff --git a/lib/python/cellranger/sgt.py b/lib/python/cellranger/sgt.py index 36a2382..cb828d8 100644 --- a/lib/python/cellranger/sgt.py +++ b/lib/python/cellranger/sgt.py @@ -51,11 +51,14 @@ def simple_good_turing(xr: np.ndarray, xnr: np.ndarray): xnrz = _averaging_transform(xr, xnr) slope, _, _, _, _ = sp_stats.linregress(np.log(xr), np.log(xnrz)) - if slope > -1: - raise SimpleGoodTuringError( - "The log-log slope is > -1 (%d); the SGT estimator is not applicable to these data." - % slope - ) + if slope < -1: + print(f"The SGT slope is {slope}.") + else: + # The Simple Good-Turing (SGT) method is not applicable when its slope is larger than -1, + # in which case use a slope of -1, which results in r* = r, and which is the MLE. + # Use Turing estimates at low frequencies, and switch to MLE estimates for higher frequencies. + slope = -1 + print("The SGT slope {slope} is > -1. The SGT estimator is not applicable to these data.") xrst = _rstest(xr, slope) xrstrel = xrst / xr @@ -78,12 +81,11 @@ def simple_good_turing(xr: np.ndarray, xnr: np.ndarray): for r in range(len(xr)): if not useturing: xrstcmbrel[r] = xrstrel[r] + elif np.abs(xrstrel[r] - xrstarel[r]) * (1 + r) / tursd[r] > 1.65: + xrstcmbrel[r] = xrstarel[r] else: - if np.abs(xrstrel[r] - xrstarel[r]) * (1 + r) / tursd[r] > 1.65: - xrstcmbrel[r] = xrstarel[r] - else: - useturing = False - xrstcmbrel[r] = xrstrel[r] + useturing = False + xrstcmbrel[r] = xrstrel[r] # Renormalize the probabilities for observed objects sumpraw = np.sum(xrstcmbrel * xr * xnr / xN) diff --git a/lib/python/cellranger/sparse.py b/lib/python/cellranger/sparse.py index 52b82b6..61abed2 100644 --- a/lib/python/cellranger/sparse.py +++ b/lib/python/cellranger/sparse.py @@ -19,8 +19,7 @@ def sum_masked( row_mask: np.ndarray[int, np.dtype[np.bool_]], col_mask: np.ndarray[int, np.dtype[np.bool_]], axis: None, -) -> np.generic: - ... +) -> np.generic: ... @overload @@ -29,8 +28,7 @@ def sum_masked( row_mask: np.ndarray[int, np.dtype[np.bool_]], col_mask: np.ndarray[int, np.dtype[np.bool_]], axis: int, -) -> np.ndarray[int, np.dtype[np.generic]]: - ... +) -> np.ndarray[int, np.dtype[np.generic]]: ... def sum_masked( @@ -79,8 +77,7 @@ def count_ge_masked( threshold: int, axis: None, chunk_size_mb: int = 64, -) -> np.uint64: - ... +) -> np.uint64: ... @overload @@ -91,8 +88,7 @@ def count_ge_masked( threshold: int, axis: int, chunk_size_mb: int = 64, -) -> np.ndarray[int, np.dtype[np.uint64]]: - ... +) -> np.ndarray[int, np.dtype[np.uint64]]: ... def count_ge_masked( diff --git a/lib/python/cellranger/spatial/data_utils.py b/lib/python/cellranger/spatial/data_utils.py index 41c4eed..7704cb3 100644 --- a/lib/python/cellranger/spatial/data_utils.py +++ b/lib/python/cellranger/spatial/data_utils.py @@ -39,10 +39,14 @@ HIRES_MAX_DIM_DEFAULT = 2000 HIRES_MAX_DIM_DICT = { PipelineMode(Product.VISIUM, SlideType.XL): 4000, + PipelineMode(Product.CYT, SlideType.XL): 4000, PipelineMode(Product.CYT, SlideType.VISIUM_HD): 6000, } LORES_MAX_DIM = 600 +# Size for websummary image. Should be smaller than HIRES_MAX_DIM_DICT +HD_WS_MAX_DIM = 2000 + # constants for dark_images mro parameter DARK_IMAGES_NONE = 0 DARK_IMAGES_CHANNELS = 1 @@ -55,6 +59,30 @@ # prefixes for * any * hd slide. Not just production VISIUM_HD_SLIDE_PREFIXES = ["H1", "SJ", "14072023", "14082023", "26062023", "RD", "UN"] +# Slide IDs which are used generically in cytassist runs. Thus disable checking +# slide ID if we see this. +SLIDE_ID_EXCEPTIONS = [ + "H13UA-N778", + "001744-121", + "001744-122", + "001744-123", + "001744-124", + "001744-126", + "001744-127", + "001744-128", + "001744-129", + "001744-210", + "001744-212", + "001744-213", + "H1-RRRDDDD", + "H1-6C48CQT", + "H1-MVDT69H", +] + +# Run info prefixes and suffixes +RUN_INFO_FILE_SUFFIX = "run-info.csv" +RUN_INFO_LINE_PREFIX = "Run Name," + # Map from slide capture area to the capture area generated by the # cytassist machine. The Cytassist machine generates capture areas "A" and "B" # Capture area "A" is mapped to slide capture area "A1" in all slides @@ -69,6 +97,9 @@ # Tags of Tifs in the TGZ that we do not want to pick up TAGS_OF_TIFS_TO_NOT_PICK = ["PreSandwichClosing", "SandwichDone"] +# Number of fields in Cytassist TIFF +NUMBER_CYTASSIST_TIFF_FIELD_SEPARATORS = 6 + # Map from slide capture area seen in the Tiff metadata to the capture area # in the pipeline. The Cytassist TIFFs contain capture areas "A1" and "D1" @@ -154,13 +185,68 @@ def get_cytassist_images_from_extracted_tgz_folder( Returns: list[str | bytes | os.PathLike]: list of extracted TGZ files """ - return [ + run_name = None + # Get run info if it exists + run_info_name = [ os.path.join(base_folder, x) for x in os.listdir(base_folder) - if x.endswith(".tif") - and x.split("_")[-2] in CAPTURE_AREA_TO_MACHINE_SUFFIX.get(capture_area, []) - and x.split("_")[-1].rsplit(".", maxsplit=1)[0] not in TAGS_OF_TIFS_TO_NOT_PICK + if x.endswith(RUN_INFO_FILE_SUFFIX) ] + # Read run name from run info if it exists. The run info is + # an invalid CSV file. + if len(run_info_name) == 1: + with open(run_info_name[0]) as f: + for line in f: + if line.startswith(RUN_INFO_LINE_PREFIX): + run_name = line.removeprefix(RUN_INFO_LINE_PREFIX) + + # If run_name is found use it to extract the TIF file + possible_cytassist_images = None + if run_name: + possible_cytassist_images = [ + os.path.join(base_folder, x) + for x in os.listdir(base_folder) + if x.endswith(".tif") + and len(y := x.split(run_name)) == 2 + and len(z := y[1].split("_")) > 3 + and z[2] in CAPTURE_AREA_TO_MACHINE_SUFFIX.get(capture_area, []) + and z[3].rsplit(".", maxsplit=1)[0] not in TAGS_OF_TIFS_TO_NOT_PICK + ] + + # If could not find run_name or run_name based processing failed, try decoding allowing + # sample name to have `_` but no underscore in run_name + if not possible_cytassist_images: + possible_cytassist_images = [ + os.path.join(base_folder, x) + for x in os.listdir(base_folder) + if x.endswith(".tif") + and x.split("_", maxsplit=NUMBER_CYTASSIST_TIFF_FIELD_SEPARATORS)[-2] + in CAPTURE_AREA_TO_MACHINE_SUFFIX.get(capture_area, []) + and x.split("_", maxsplit=NUMBER_CYTASSIST_TIFF_FIELD_SEPARATORS)[-1].rsplit( + ".", maxsplit=1 + )[0] + not in TAGS_OF_TIFS_TO_NOT_PICK + ] + + # If still cant decode, try decoding allowing + # run_name to have `_` but no underscore in sample_name + if not possible_cytassist_images: + possible_cytassist_images = [ + os.path.join(base_folder, x) + for x in os.listdir(base_folder) + if x.endswith(".tif") + and x.split("_")[-2] in CAPTURE_AREA_TO_MACHINE_SUFFIX.get(capture_area, []) + and x.split("_")[-1].rsplit(".", maxsplit=1)[0] not in TAGS_OF_TIFS_TO_NOT_PICK + ] + + return possible_cytassist_images + + +def get_all_images_from_tgz_folder( + base_folder: str | bytes | os.PathLike, +) -> list[str | bytes | os.PathLike]: + """Get open close images in the cytassist tarball.""" + return [os.path.join(base_folder, x) for x in os.listdir(base_folder) if x.endswith(".tif")] def get_galfile_path(barcode_whitelist: str) -> str: diff --git a/lib/python/cellranger/spatial/image.py b/lib/python/cellranger/spatial/image.py index bb4c0d6..82d9d6f 100644 --- a/lib/python/cellranger/spatial/image.py +++ b/lib/python/cellranger/spatial/image.py @@ -14,7 +14,7 @@ from PIL import Image, ImageOps -def _base64_encode_image(filename, fmt="jpg"): +def _base64_encode_image(filename, fmt="jpeg"): """Opens a file using PIL and returns it encoded as a base64 string. :param filename: @@ -26,8 +26,13 @@ def _base64_encode_image(filename, fmt="jpg"): return f"data:image/{fmt};base64," + encoded_string -def base64_encode_png(fname): - return _base64_encode_image(fname, fmt="png") +def base64_encode_image(fname): + """base64 encode image.""" + _, fmt = os.path.splitext(fname) + fmt = fmt.removeprefix(".") + if fmt == "jpg": + fmt = "jpeg" + return _base64_encode_image(fname, fmt=fmt) class WebImage: @@ -60,7 +65,7 @@ def base64_encoded_grayscale_image(self) -> str: ImageOps.grayscale(img).save(img_bytes, format="PNG") image_show = img_bytes.getvalue() encoded_string = base64.b64encode(image_show).decode("utf-8") - return f"data:image/jpg;base64,{encoded_string}" + return f"data:image/png;base64,{encoded_string}" def resize_and_encode_image(self, new_width=None, new_height=None): """:param new_width: New image height. diff --git a/lib/python/cellranger/stats.py b/lib/python/cellranger/stats.py index 9be83c3..e3cdd7e 100644 --- a/lib/python/cellranger/stats.py +++ b/lib/python/cellranger/stats.py @@ -1,18 +1,17 @@ #!/usr/bin/env python # -# Copyright (c) 2015 10X Genomics, Inc. All rights reserved. +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. # -from __future__ import annotations - -import sys - import numpy as np -import scipy.stats as sp_stats -from scipy.special import loggamma +from scipy import optimize +from scipy.special import betaln, gammaln, loggamma import tenkit.stats as tk_stats +# Pre-seed the RNG on package import +RNG = np.random.default_rng(seed=42) + def effective_diversity(counts): """Inverse Simpson Index, or the effective diversity of power 2.""" @@ -21,85 +20,274 @@ def effective_diversity(counts): return tk_stats.robust_divide(float(numerator), float(denominator)) -def eval_multinomial_loglikelihoods(matrix, profile_p, max_mem_gb: float = 0.1): - """Compute the multinomial log PMF for many barcodes. +def incremental_counts_from_sample(sample_draws): + """Produces an incremental count vector from a categorial sample vector. + + Takes a set of drawn samples from a multinomial or similar distribution + distribution and produces a vector of the same size, with each element the + the number of times the sample at that position has been seen + indices. I.e., it would turn the following vector of sample draws: + [1, 1, 2, 1, 0, 2, 1, 3] into + [1, 2, 1, 3, 1, 2, 4, 1] + + Args: + sample_draws (np.ndarray(int)): A vector of sample indices. + + Returns: + inc_counts (np.ndarray(int)): The incremental counts of those sample indices. + + """ + idxs, c = np.unique(sample_draws, return_counts=True) + mask = np.isin(sample_draws, idxs[c > 1]) + inc_counts = np.ones_like(sample_draws) + counts = {} + for i, j in zip(np.arange(len(sample_draws))[mask], sample_draws[mask]): + if j not in counts: + counts[j] = 2 + else: + inc_counts[i] = counts[j] + counts[j] += 1 + return inc_counts + + +def collapse_draws_to_counts(sample_draws, num_features): + """Produces a count of items in the sample draws. + + Takes an array of samples drawn from a distribution and returns a new + array of counts of how many times each feature was seen in the draws. + + Args: + sample_draws (np.ndarray(int)): A vector of sample indices. + + Returns: + counts (np.ndarray(int): A vector of counts for each feature index. + + """ + return np.bincount(sample_draws, minlength=num_features) + + +def eval_multinomial_loglikelihoods(matrix, logp, n=None): + """Computes the multinomial log-likelihood for many barcodes. + + Multinomial log-likelihood for a single barcode where the count of UMIs for + feature i is x_i is: + l = log(gamma(sum_i(x_i) + 1)) - sum_i(log(gamma(x_i + 1)) + sum_i(log(p_i) * x_i) + + Because the input matrix is sparse and zero counts do not contribute to the + likelihood, we can rapidly remove zero elements from the computation. Args: matrix (scipy.sparse.csc_matrix): Matrix of UMI counts (feature x barcode) - profile_p (np.ndarray(float)): Multinomial probability vector - max_mem_gb (float): Try to bound memory usage. + logp (np.ndarray(float)): The natural log of the multinomial probability + vector across features + n (int, optional): The total number of UMIs per barcode. Saves computation + if it can be precomputed. Returns: - log_likelihoods (np.ndarray(float)): Log-likelihood for each barcode + loglk (np.ndarray(float)): Log-likelihood for each barcode """ - gb_per_bc = float(matrix.shape[0] * matrix.dtype.itemsize) / (1024**3) - bcs_per_chunk = max(1, int(np.round(max_mem_gb / gb_per_bc))) num_bcs = matrix.shape[1] + loglk = np.zeros(num_bcs, dtype=float) + if n is None: + n = np.asarray(matrix.sum(axis=0))[0] + + consts = gammaln(n + 1) + for i in range(num_bcs): + idx_start, idx_end = matrix.indptr[i], matrix.indptr[i + 1] + idxs = matrix.indices[idx_start:idx_end] + row = matrix.data[idx_start:idx_end] + short_logp = logp.take(idxs, axis=None, mode="clip") + loglk[i] = consts[i] - gammaln(row + 1).sum() + (row * short_logp).sum() + return loglk - loglk = np.zeros(num_bcs) - for chunk_start in range(0, num_bcs, bcs_per_chunk): - chunk = slice(chunk_start, chunk_start + bcs_per_chunk) - matrix_chunk = matrix[:, chunk].transpose().toarray() - n = matrix_chunk.sum(1) - loglk[chunk] = sp_stats.multinomial.logpmf(matrix_chunk, n, p=profile_p) +def eval_multinomial_loglikelihood_cumulative(sample_draws, logp): + """Computes the cumulative multinomial log-likelihood for a vector. + + Given a vector of sample draws from a multinomial distribution, computes the + log-likelihood of all of the draws up to each draw. This is done incrementally, + by first pre-computing the rank R of each draw as the number of times that + feature was seen when it was drawn. Then the incremental log-likelihood from + that draw is + + dl = log(i) - log(R_i) + log(p_i) + + Args: + sample_draws (np.ndarray(int)): A vector of sample draws + logp (np.ndarray(float)): The log-probability of sampling each feature + + Returns: + loglk (np.ndarray(float): The cumulative log-likelihood up to each draw + """ + marginal_counts = incremental_counts_from_sample(sample_draws) + nvals = np.arange(1, len(sample_draws) + 1) + loglk = np.log(nvals) - np.log(marginal_counts) + logp[sample_draws] + return np.cumsum(loglk) + + +def eval_dirichlet_multinomial_loglikelihoods(matrix, alpha, n=None): + """Computes the Dirichlet-multinomial log-likelihood for many barcodes. + + Dirichlet-Multinomial log-likelihood for a single barcode where the count + of UMIs for feature i is x_i is: + l = log(sum_i(x_i)) + log(beta(sum_i(a_i), sum_i(x_i))) - + sum_i(log(x_i)) - sum_i(log(beta(a_i, x_i))) + + Because the input matrix is sparse and zero counts do not contribute to the + likelihood, we can rapidly remove zero elements from the computation. + + Args: + matrix (scipy.sparse.csc_matrix): Matrix of UMI counts (feature x barcode) + alpha (np.ndarray(float)): The vector of Dirichlet parameters for each feature + n (int, optional): The total number of UMIs per barcode. Saves computation + if it can be precomputed. + + Returns: + loglk (np.ndarray(float)): Log-likelihood for each barcode + """ + num_bcs = matrix.shape[1] + loglk = np.zeros(num_bcs) + if n is None: + n = np.asarray(matrix.sum(axis=0))[0] + consts = np.log(n) + betaln(np.sum(alpha), n) + for bc_index in range(matrix.shape[1]): + idx_start, idx_end = matrix.indptr[bc_index], matrix.indptr[bc_index + 1] + idxs = matrix.indices[idx_start:idx_end] + row = matrix.data[idx_start:idx_end] + short_alpha = alpha.take(idxs, axis=None, mode="clip") + loglk[bc_index] = consts[bc_index] - np.log(row).sum() - betaln(short_alpha, row).sum() return loglk -def _get_sample( - profile_p: np.array, - sample_size: int, - *, - existing_sample: None | np.array, - current_index: None | int, -): - """Gets single samples from a multinomial distribution. +def eval_dirichlet_multinomial_loglikelihood_cumulative(sample_draws, alpha): + """Computes the cumulative Dirichlet-multinomial log-likelihood for a vector. + + Given a vector of sample draws from a Dirichlet-multinomial distribution, computes the + log-likelihood of all of the draws up to each draw. This is done incrementally, + by first pre-computing the rank R of each draw as the number of times that + feature was seen when it was drawn. Then the incremental log-likelihood from + that draw is + + dl = log(i) - log(R_i) - log(i + sum_i(a_i) - 1) + log(R_i + a_i - 1) + + Args: + sample_draws (np.ndarray(int)): A vector of sample draws + alpha (np.ndarray(float)): The Dirichlet parameter for each feature + + Returns: + loglk (np.ndarray(float): The cumulative log-likelihood up to each draw + """ + marginal_counts = incremental_counts_from_sample(sample_draws) + nvals = np.arange(1, len(sample_draws) + 1) + alpha_0 = np.sum(alpha) + loglk = ( + np.log(nvals) + - np.log(marginal_counts) + - np.log(nvals + alpha_0 - 1) + + np.log((marginal_counts - 1) + alpha[sample_draws]) + ) + return np.cumsum(loglk) + + +def estimate_dirichlet_overdispersion(matrix, ambient_bcs, p): + """Estimates the best-fit overdispersion parameter for data. + + Uses a Dirichlet-multinomial to maximize the log-likelihood of the ambient + barcode signal, given an input probability per feature that is scaled by + a fixed overdispersion parameter. + + Args: + matrix (scipy.sparse.csc_matrix): Matrix of UMI counts (feature x barcode) + ambient_bcs (np.array): Array of barcode indexes to use for the ambient background + p (np.ndarray(float)): The estimated multinomial probability vector across features + + Returns: + alpha (float): Best-fit overdispersion for the data + """ + matrix = matrix[:, ambient_bcs] + + umis_per_bc = np.asarray(matrix.sum(axis=0)).flatten() + + def ambient_loglk(alpha, matrix, p, umis_per_bc): + # We return the negative so function minimization gets the max likelihood + return np.sum(-eval_dirichlet_multinomial_loglikelihoods(matrix, alpha * p, n=umis_per_bc)) + + bounds = [0.001, 10000] + result = optimize.minimize_scalar( + ambient_loglk, + bounds=bounds, + args=(matrix, p, umis_per_bc), + ) + if not result.success: + raise ValueError(f"Could not find valid alpha: {result.message}") + else: + print( + f"Alpha = {result.x}: maximizes the likelihood of the ambient barcodes. Search bounds: {bounds}" + ) + return result.x + + +def draw_multinomial_sample(num_draws, p_cumulative): + """Returns a fixed size array of multinomial draws from the input probabilities. - Code can take an existing array that has len(existing_sample) - current_index "unused" samples in it - and append that to the start of a new sample. Done it this way to make sure the sample order of the code - in this file is always the same, even as we add more vectors. + Given a number of samples to draw and a probability vector for all features + to sample from, produces an array of feature indices of the desired size, + drawn according to a multinomial distribution. Because it is significantly + faster to generate random numbers on the unit interval, we use that and then + find the feature index using the cumulative probabilities of the probability + vector. Args: - profile_p: - sample_size: - existing_sample: - current_index: + num_draws (int): The number of samples to draw from the distribution + p_cumulative (np.ndarray(float)): The cumulative probability of all possible + features. The length of this array should be the number of features. + It should be sorted from smallest to largest, and the last entry should + be 1. Returns: - An array of sampled indices + sample_draws (np.ndarray(float)): A random set of draws from a multinomial + distribution. + """ + rng_nums = RNG.random(size=num_draws) + return np.searchsorted(p_cumulative, rng_nums) + + +def draw_dirichlet_multinomial_sample(num_draws, alpha): + """Returns an array of Dirichlet-multinomial draws from the input parameters. + Given a number of samples to draw and a vector of alpha parameters for all + features to sample from, produces an array of feature indices of the desired + size, drawn according to a Dirichlet-multinomial distribution. Note that + Dirichlet-multinomial draws are *not* independent and identically-distributed, + so that all draws for a sample must be done with a single call or the + sample variance will be under-stated. + + Args: + num_draws (int): The number of samples to draw from the distribution + alpha (np.ndarray(float)): The Dirichlet parameters for each feature. + Normalized to a sum of 1, these are the mean probabilities of each feature + over many draws of many samples. The length of this array should be the + number of features. + + Returns: + sample_draws (np.ndarray(float)): A random set of draws from a Dirichlet- + multinomial distribution. """ - if existing_sample is not None: - assert current_index is not None - old_sample = existing_sample[current_index : len(existing_sample)] - sample_size = sample_size - len(old_sample) - new_sample = np.random.choice(len(profile_p), size=sample_size, p=profile_p, replace=True) - return np.concatenate((old_sample, new_sample)) - return np.random.choice(len(profile_p), size=sample_size, p=profile_p, replace=True) - - -def simulate_multinomial_loglikelihoods( - profile_p, - umis_per_bc, - num_sims: int = 1000, - jump: int = 1000, - n_sample_feature_block: int = 1000000, - verbose: bool = False, -): - """Simulate draws from a multinomial distribution for various values of N. - - Note, the samples within a given simulation are not independent. Given two barcodes with UMIs equal to 10 and - another equal to 20, we simulate the 10 UMI barcode, than draw another 10 samples to get the likelihood for the - 20 UMI barcode. - - Uses the approximation from Lun et al. ( https://www.biorxiv.org/content/biorxiv/early/2018/04/04/234872.full.pdf ) + probs = RNG.dirichlet(alpha) + return draw_multinomial_sample(num_draws, np.cumsum(probs)) + + +def simulate_multinomial_loglikelihoods(p, umis_per_bc, num_sims): + """Simulate draws from a multinomial distribution for many values of N. + + Note that the samples within each simulation are not independent; we generate + N draws for the largest value of N and use subsamples of the largest simulation + for smaller values of N. Args: - profile_p (np.ndarray(float)): Probability of observing each feature. - umis_per_bc (np.ndarray(int)): UMI counts per barcode (multinomial N). - num_sims (int): Number of simulations per distinct N value. - jump (int): Vectorize the sampling if the gap between two distinct Ns exceeds this. - n_sample_feature_block (int): Vectorize this many feature samplings at a time. + p (np.ndarray(float)): Probability of observing each feature. + umis_per_bc (np.ndarray(int)): UMI counts per barcode. + num_sims (int): Number of simulations to perform. Returns: distinct_ns (np.ndarray(int)): an array containing the distinct N values @@ -107,98 +295,49 @@ def simulate_multinomial_loglikelihoods( log_likelihoods (np.ndarray(float)): a len(distinct_ns) x num_sims matrix containing the simulated log likelihoods. """ - np.random.seed(0) - distinct_n = np.flatnonzero(np.bincount(umis_per_bc)) + max_n = max(distinct_n) + loglk = np.zeros((len(distinct_n), num_sims), dtype=float) + p_cumulative = np.cumsum(p) + logp = np.log(p) + + for i in range(num_sims): + draw = draw_multinomial_sample(max_n, p_cumulative) + # Note we can use the distinct N values as indices to extract the log-likelihood + # at each N value. + loglk[:, i] = eval_multinomial_loglikelihood_cumulative(draw, logp)[distinct_n - 1] + return distinct_n, loglk + + +def simulate_dirichlet_multinomial_loglikelihoods(alpha, umis_per_bc, num_sims): + """Simulate draws from a Dirichlet-multinomial distribution for many values of N. + Note that the samples within each simulation are not independent; we generate + N draws for the largest value of N and use subsamples of the largest simulation + for smaller values of N. + + Args: + alpha (np.ndarray(float)): Dirichlet parameter for each feature. + umis_per_bc (np.ndarray(int)): UMI counts per barcode. + num_sims (int): Number of simulations to perform. + + Returns: + distinct_ns (np.ndarray(int)): an array containing the distinct N values + that were simulated. + log_likelihoods (np.ndarray(float)): a len(distinct_ns) x num_sims matrix + containing the simulated log likelihoods. + """ + distinct_n = np.flatnonzero(np.bincount(umis_per_bc)) + max_n = max(distinct_n) loglk = np.zeros((len(distinct_n), num_sims), dtype=float) - num_all_n = np.max(distinct_n) - np.min(distinct_n) - if verbose: - print("Number of distinct N supplied: %d" % len(distinct_n)) - print("Range of N: %d" % num_all_n) - print("Number of features: %d" % len(profile_p)) - - sampled_features = _get_sample( - profile_p, n_sample_feature_block, existing_sample=None, current_index=None - ) - k = 0 - - log_profile_p = np.log(profile_p) - - for sim_idx in range(num_sims): - if verbose and sim_idx % 100 == 99: - sys.stdout.write(".") - sys.stdout.flush() - curr_counts = np.ravel(sp_stats.multinomial.rvs(distinct_n[0], profile_p, size=1)) - - curr_loglk = sp_stats.multinomial.logpmf(curr_counts, distinct_n[0], p=profile_p) - - loglk[0, sim_idx] = curr_loglk - - # There are three strategies here for incrementing the likelihood to go from a Barcode that had X UMIs observed - # to one with X+Y UMIs observed. We either get a whole new Y sample, add it to the old one, and recompute the - # full likelihood, we add a single new observation Y times, or we add a group of Y new observations together at - # once. This design comes from trying to maintain compatibility with the original version of the code while - # improving performance, would not be the way to do this from scratch. - for i in range(1, len(distinct_n)): - step = distinct_n[i] - distinct_n[i - 1] - if step >= jump: - # Instead of iterating for each n, sample the intermediate ns all at once - curr_counts += np.ravel(sp_stats.multinomial.rvs(step, profile_p, size=1)) - curr_loglk = sp_stats.multinomial.logpmf(curr_counts, distinct_n[i], p=profile_p) - assert not np.isnan(curr_loglk) - elif ( - step < 20 - ): # With small sizes calling np.unique and doing a vector version not worth the overhead - # Profiling test_filter_barcodes showed 20 was faster than 10 but slower than 100, - # further optimization of the cutoff might be possible. - # In this case we'll iteratively sample between the two distinct values of n - for n in range(distinct_n[i - 1] + 1, distinct_n[i] + 1): - j = sampled_features[k] - k += 1 - if k >= n_sample_feature_block: - # Amortize this operation - sampled_features = _get_sample( - profile_p, - n_sample_feature_block, - existing_sample=None, - current_index=None, - ) - k = 0 - curr_counts[j] += 1 - curr_loglk += log_profile_p[j] + np.log(float(n) / curr_counts[j]) - else: - # Vectorized version of an incremental new sampling, grab all new samples at once - end = k + step - if end >= n_sample_feature_block: - if step >= n_sample_feature_block: - n_sample_feature_block = step + 1 - sampled_features = _get_sample( - profile_p, - n_sample_feature_block, - existing_sample=sampled_features, - current_index=k, - ) - k = 0 - end = step - feats, cnts = np.unique(sampled_features[k:end], return_counts=True) - k = end - old_cnts = curr_counts[feats] - curr_counts[feats] += cnts - # Log(p_i^k) - curr_loglk += np.sum(np.multiply(log_profile_p[feats], cnts)) - # calc N_new! - (N_new-N_old)! to incrementally update likelihood - factorial_increase = loggamma((distinct_n[i] + 1, distinct_n[i - 1] + 1)) - curr_loglk += factorial_increase[0] - factorial_increase[1] - # calc X_new! - (X_new - X_old)! and subtract as that's in the denominator - curr_loglk -= np.sum(loggamma(old_cnts + cnts + 1) - loggamma(old_cnts + 1)) - del old_cnts - - loglk[i, sim_idx] = curr_loglk - - if verbose: - sys.stdout.write("\n") + for i in range(num_sims): + draw = draw_dirichlet_multinomial_sample(max_n, alpha) + # Note we can use the distinct N values as indices to extract the log-likelihood + # at each N value. + loglk[:, i] = eval_dirichlet_multinomial_loglikelihood_cumulative(draw, alpha)[ + distinct_n - 1 + ] return distinct_n, loglk diff --git a/lib/python/cellranger/subsample.py b/lib/python/cellranger/subsample.py index 232b708..fd2ad81 100644 --- a/lib/python/cellranger/subsample.py +++ b/lib/python/cellranger/subsample.py @@ -68,7 +68,7 @@ ] # - for all other libraries -SUBSAMPLE_FIXED_DEPTHS = [3000, 5000, 10000, 20000, 30000, 50000] +SUBSAMPLE_FIXED_DEPTHS = [1000, 3000, 5000, 10000, 20000, 30000, 50000] # Number of additional quantile-based depth targets SUBSAMPLE_NUM_ADDITIONAL_DEPTHS = 10 @@ -171,12 +171,12 @@ def _subsampling_for_depth( target_depth: int, subsample_type: str, library_type: str, - num_cells_per_lib: np.ndarray[int, np.dtype[np.float_]], - usable_frac_per_lib: np.ndarray[int, np.dtype[np.float_]], + num_cells_per_lib: np.ndarray[int, np.dtype[np.float64]], + usable_frac_per_lib: np.ndarray[int, np.dtype[np.float64]], max_computed_depth: int | None, lib_indices: np.ndarray[int, np.dtype[np.int32]], - raw_reads_per_lib: np.ndarray[int, np.dtype[np.float_]], - usable_reads_per_lib: np.ndarray[int, np.dtype[np.float_]], + raw_reads_per_lib: np.ndarray[int, np.dtype[np.float64]], + usable_reads_per_lib: np.ndarray[int, np.dtype[np.float64]], library_count: int, ) -> SubsamplingDef: if subsample_type == BULK_SUBSAMPLE_TYPE: @@ -190,7 +190,7 @@ def _subsampling_for_depth( target_usable_reads_per_lib = target_depth * num_cells_per_lib * usable_frac_per_lib # compute subsampling rates (frac. of usable reads) - subsample_rates: np.ndarray[int, np.dtype[np.float_]] = np.zeros(library_count, dtype=float) + subsample_rates: np.ndarray[int, np.dtype[np.float64]] = np.zeros(library_count, dtype=float) if subsample_type == BULK_SUBSAMPLE_TYPE: denominator = raw_reads_per_lib else: @@ -274,8 +274,7 @@ def make_subsamplings( max_target_depth = np.min( ( raw_rppc_per_lib - if subsample_type == RAW_SUBSAMPLE_TYPE - or subsample_type == RAW_CELLS_SUBSAMPLE_TYPE + if subsample_type in (RAW_SUBSAMPLE_TYPE, RAW_CELLS_SUBSAMPLE_TYPE) else usable_rppc_per_lib )[lib_indices] ) @@ -284,10 +283,10 @@ def make_subsamplings( # N.B. computed_depths is empty if max_target_depth is less than 1 read pair per cell. # This might happen if there are very few usable reads for this library type. max_computed_depth = np.max(computed_depths) if len(computed_depths) > 0 else None - target_depths: np.ndarray[ - int, np.dtype[np.int_] - ] = np.concatenate( # pylint: disable=unexpected-keyword-arg - [computed_depths, fixed_depths], dtype=int + target_depths: np.ndarray[int, np.dtype[np.int_]] = ( + np.concatenate( # pylint: disable=unexpected-keyword-arg + [computed_depths, fixed_depths], dtype=int + ) ) target_depths.sort() target_depths = np.unique(target_depths) @@ -379,13 +378,12 @@ def construct_all_subsamplings( if is_targeted_gex: fixed_depths = SUBSAMPLE_TARGETED_FIXED_DEPTHS subsampling_usable_reads_per_lib = usable_reads_per_lib + elif subsample_type == BULK_SUBSAMPLE_TYPE: + fixed_depths = SUBSAMPLE_BULK_FIXED_DEPTHS + subsampling_usable_reads_per_lib = transcriptomic_reads_per_lib else: - if subsample_type == BULK_SUBSAMPLE_TYPE: - fixed_depths = SUBSAMPLE_BULK_FIXED_DEPTHS - subsampling_usable_reads_per_lib = transcriptomic_reads_per_lib - else: - fixed_depths = SUBSAMPLE_FIXED_DEPTHS - subsampling_usable_reads_per_lib = usable_reads_per_lib + fixed_depths = SUBSAMPLE_FIXED_DEPTHS + subsampling_usable_reads_per_lib = usable_reads_per_lib subsamplings.extend( make_subsamplings( diff --git a/lib/python/cellranger/targeted/rtl_multiplexing.py b/lib/python/cellranger/targeted/rtl_multiplexing.py index 40dcb7f..692dc41 100644 --- a/lib/python/cellranger/targeted/rtl_multiplexing.py +++ b/lib/python/cellranger/targeted/rtl_multiplexing.py @@ -12,9 +12,7 @@ def _get_barcode_length(barcode_def: list[dict[str, str | int]], barcode_kind: s return None -def get_barcode_locations( - barcode_def: list[dict[str, str | int]] -) -> tuple[ +def get_barcode_locations(barcode_def: list[dict[str, str | int]]) -> tuple[ tuple[int | None, int | None], tuple[int | None, int | None], tuple[int | None, int | None], diff --git a/lib/python/cellranger/targeted/simple_utils.py b/lib/python/cellranger/targeted/simple_utils.py index ca0e9ce..4e43ba6 100644 --- a/lib/python/cellranger/targeted/simple_utils.py +++ b/lib/python/cellranger/targeted/simple_utils.py @@ -9,6 +9,7 @@ from __future__ import annotations import re +from pathlib import Path from typing import TYPE_CHECKING from six import ensure_binary, ensure_str @@ -37,7 +38,7 @@ def parse_bool(astring: str): def parse_target_csv( - filename: str | bytes, + filename: Path | str | bytes, ref_gene_index: GeneIndex | NewGeneIndex | None = None, gene_name_to_id: dict[bytes, bytes] | None = None, filter_probes: bool = True, @@ -88,7 +89,7 @@ def parse_target_csv( check_target_csv_metadata(filename, descriptive_name, required_metadata, conflicting_metadata) - valid_bases = b"ATGCN" + valid_bases = b"ATGCN-" # "-" used as separator between probe halves (and if present gap) min_bait_length = 1 # Track set of unique gene IDs and gene_id, bait_sequence tuples @@ -155,9 +156,7 @@ def parse_target_csv( included = parse_bool(included_string) if included is None: raise ValueError( - 'The column "included" must be "true" or "false" and saw "{}"'.format( - ensure_str(included_string) - ) + f'The column "included" must be "true" or "false" and saw "{ensure_str(included_string)}"' ) gene_included[gene_id] = gene_included.get(gene_id, True) and included @@ -177,7 +176,11 @@ def parse_target_csv( raise cr_csv_utils.CSVParseException(msg) bait_probe_seq = entry.get("bait_seq", None) or entry.get("probe_seq", None) - if bait_probe_seq is not None and targeting_method == TARGETING_METHOD_TL: + if ( + bait_probe_seq is not None + and targeting_method == TARGETING_METHOD_TL + and float(method_info.file_version) < 3.0 + ): if last_seq_length is None: last_seq_length = len(bait_probe_seq) elif last_seq_length != len(bait_probe_seq): @@ -265,6 +268,8 @@ def get_target_panel_or_probe_set_file_format_spec(targeting_method, file_versio valid_cols.extend(["probe_seq", "probe_id", "included"]) if float(file_version) >= 2.0: # region introduced in 2.0 valid_cols.append("region") + if float(file_version) >= 3.0: # gene_name introduced in 3.0 + valid_cols.append("gene_name") required_cols.extend(["probe_seq", "probe_id"]) conflicting_metadata.update( {TARGETING_METHOD_HC_FILE_FORMAT: TARGETING_METHOD_TL_FILE_FORMAT} @@ -273,7 +278,7 @@ def get_target_panel_or_probe_set_file_format_spec(targeting_method, file_versio return valid_cols, required_cols, required_metadata, conflicting_metadata -def load_target_csv_metadata(filename, descriptive_name): +def load_target_csv_metadata(filename: str, descriptive_name: str) -> dict[str, str]: """Return a dictionary of metadata fields contained in header of target panel CSV file. Args: @@ -290,9 +295,7 @@ def load_target_csv_metadata(filename, descriptive_name): k_v_pair = row.strip("#").split("=") if len(k_v_pair) != 2: raise cr_csv_utils.CSVParseException( - 'Invalid metadata format detected in {} file: "{}". Must follow "#field=value" format.'.format( - descriptive_name, row - ) + f'Invalid metadata format detected in {descriptive_name} file: "{row}". Must follow "#field=value" format.' ) k, v = k_v_pair k, v = k.strip(), v.strip() @@ -343,9 +346,9 @@ def check_target_csv_metadata( f'The "{field1}" metadata field in the {descriptive_name} CSV file header conflicts with the "{field2}" metadata field. Please check the {descriptive_name} csv file.' ) - if float(method_info.file_version) > 2.0: + if float(method_info.file_version) > 3.0: raise cr_csv_utils.CSVParseException( - f'The {descriptive_name} file {filename} contains an unknown {method_info.file_format_tag}: "{method_info.file_version}". Must be 2.0 or less.' + f'The {descriptive_name} file {filename} contains an unknown {method_info.file_format_tag}: "{method_info.file_version}". Must be 3.0 or less.' ) return float(method_info.file_version) diff --git a/lib/python/cellranger/utils.py b/lib/python/cellranger/utils.py index 5910a53..d61e9dc 100644 --- a/lib/python/cellranger/utils.py +++ b/lib/python/cellranger/utils.py @@ -67,15 +67,13 @@ def format_barcode_seqs( @overload def split_barcode_seq( barcode: None, -) -> tuple[None, None]: - ... +) -> tuple[None, None]: ... @overload def split_barcode_seq( barcode: bytes, -) -> tuple[bytes, int | None]: - ... +) -> tuple[bytes, int | None]: ... def split_barcode_seq(barcode: bytes | None): diff --git a/lib/python/cellranger/vdj/annotations.py b/lib/python/cellranger/vdj/annotations.py index 2e030d0..47cdea3 100644 --- a/lib/python/cellranger/vdj/annotations.py +++ b/lib/python/cellranger/vdj/annotations.py @@ -337,13 +337,11 @@ def search_cdr3_signature_no_vj(seq, v_region=None, j_region=None): @overload -def _bytes_or_none(maybe_str: None) -> None: - ... +def _bytes_or_none(maybe_str: None) -> None: ... @overload -def _bytes_or_none(maybe_str: bytes | str) -> bytes: - ... +def _bytes_or_none(maybe_str: bytes | str) -> bytes: ... def _bytes_or_none(maybe_str: bytes | str | None) -> bytes | None: @@ -893,10 +891,7 @@ def get_annotations_bed(self): ensure_str(self.contig_name), str(anno.contig_match_start), str(anno.contig_match_end), - "{}_{}".format( - ensure_str(anno.feature.display_name), - ensure_str(anno.feature.region_type), - ), + f"{ensure_str(anno.feature.display_name)}_{ensure_str(anno.feature.region_type)}", ] ) @@ -981,11 +976,10 @@ def annotate_cdr3(self): ) assert (cdr_pos[1] - cdr_pos[0]) % 3 == 0 + elif cdr_pos is None: + flags.append("NO_CDR3") else: - if cdr_pos is None: - flags.append("NO_CDR3") - else: - flags.append("CDR3_TOO_LONG:%d" % (cdr_pos[1] - cdr_pos[0])) + flags.append("CDR3_TOO_LONG:%d" % (cdr_pos[1] - cdr_pos[0])) if not self.cdr3: # Either this didn't have both a V and a J, or the annotation-guided search failed to give a valid CDR3. @@ -1818,14 +1812,14 @@ def report_clonotypes( if cl is not None: paired_cls_metric.add( - 1, filter=is_cl_paired and (gp == vdj_gene_pair or gp == MULTI_REFS_PREFIX) + 1, filter=is_cl_paired and (gp in (vdj_gene_pair, MULTI_REFS_PREFIX)) ) bcs_in_paired_cls_metric.add( len(bc_contig_lists), - filter=is_cl_paired and (gp == vdj_gene_pair or gp == MULTI_REFS_PREFIX), + filter=is_cl_paired and (gp in (vdj_gene_pair, MULTI_REFS_PREFIX)), ) - if gp == vdj_gene_pair or gp == MULTI_REFS_PREFIX: + if gp in (vdj_gene_pair, MULTI_REFS_PREFIX): num_clonotypes_metric = reporter._get_metric_attr( "vdj_clonotype_count", gp, prefix ) diff --git a/lib/python/cellranger/vdj/clonotype.py b/lib/python/cellranger/vdj/clonotype.py index e82a262..ed11200 100644 --- a/lib/python/cellranger/vdj/clonotype.py +++ b/lib/python/cellranger/vdj/clonotype.py @@ -2,7 +2,32 @@ """Clonotype related functions.""" +from collections import Counter + def extract_clonotype_id_from_name(clonotype_name: str): """Extract the clonotype id from a clonotype name string.""" return int(clonotype_name.split("clonotype")[1]) + + +def count_changes(initial_labels, final_labels): + """Counts the number of changes needed to swap between two cluster labels. + + The changes are identified as splits in the initial cluster labels and + joins among these split labels. + """ + merged, start_edges, end_edges = Counter(), Counter(), Counter() + if not len(initial_labels) == len(final_labels): + raise ValueError("Both input label arrays must be the same size.") + for pair in zip(initial_labels, final_labels): + ( + init, + last, + ) = pair + if pair not in merged: + start_edges[init] += 1 + end_edges[last] += 1 + merged[pair] += 1 + splits = sum(start_edges.values()) - len(start_edges) + joins = sum(end_edges.values()) - len(end_edges) + return splits, joins diff --git a/lib/python/cellranger/vdj/preflight.py b/lib/python/cellranger/vdj/preflight.py index 7f0a866..865725e 100644 --- a/lib/python/cellranger/vdj/preflight.py +++ b/lib/python/cellranger/vdj/preflight.py @@ -93,8 +93,7 @@ def check_inner_enrichment_primers(primers_file, reference_path): return raise PreflightException( - "Inner enrichment primers are required for species other than human or mouse for which primers are not provided by 10x Genomics. None of the constant regions in the reference (%s) is targeted by the known primers." - % reference_path + f"Inner enrichment primers are required for species other than human or mouse for which primers are not provided by 10x Genomics. None of the constant regions in the reference ({reference_path}) is targeted by the known primers." ) hostname = socket.gethostname() @@ -124,8 +123,7 @@ def check_inner_enrichment_primers(primers_file, reference_path): if not inner_primers: # Empty file raise PreflightException( - "Inner enrichment primers file (%s) contains zero entries. You should specify at least one primer" - % primers_file + f"Inner enrichment primers file ({primers_file}) contains zero entries. You should specify at least one primer" ) if reference_path: diff --git a/lib/python/cellranger/vdj/reference.py b/lib/python/cellranger/vdj/reference.py index c49407e..002a320 100644 --- a/lib/python/cellranger/vdj/reference.py +++ b/lib/python/cellranger/vdj/reference.py @@ -162,15 +162,15 @@ def build_reference_fasta_from_fasta( # Sanity check values if b" " in feat.region_type: raise VDJReferenceConstructionError( - 'Spaces not allowed in region type: "%s"' % feat.region_type + f'Spaces not allowed in region type: "{feat.region_type}"' ) if b" " in feat.gene_name: raise VDJReferenceConstructionError( - 'Spaces not allowed in gene name: "%s"' % feat.gene_name + f'Spaces not allowed in gene name: "{feat.gene_name}"' ) if b" " in feat.record_id: raise VDJReferenceConstructionError( - 'Spaces not allowed in record ID: "%s"' % feat.record_id + f'Spaces not allowed in record ID: "{feat.record_id}"' ) key = get_duplicate_feature_key(feat) @@ -184,15 +184,13 @@ def build_reference_fasta_from_fasta( seq = feat.sequence if b"N" in seq: print( - "Warning: Feature %s contains Ns. Stripping from the ends." - % str((feat.display_name, feat.record_id, feat.region_type)) + f"Warning: Feature {(feat.display_name, feat.record_id, feat.region_type)!s} contains Ns. Stripping from the ends." ) seq = seq.strip(b"N") if len(seq) == 0: print( - "Warning: Feature %s is all Ns. Skipping." - % str((feat.display_name, feat.record_id, feat.region_type)) + f"Warning: Feature {(feat.display_name, feat.record_id, feat.region_type)!s} is all Ns. Skipping." ) continue @@ -285,7 +283,7 @@ def parse_fasta_entry(header: bytes, sequence: bytes) -> VdjAnnotationFeature: # Check the header if len(words) != 2: raise VDJReferenceConstructionError( - 'Expected two strings separated by a space in FASTA header. Found "%s"' % header + f'Expected two strings separated by a space in FASTA header. Found "{header}"' ) values1 = words[0].split(b"|") @@ -326,7 +324,7 @@ def parse_fasta_entry(header: bytes, sequence: bytes) -> VdjAnnotationFeature: raise ValueError() except ValueError: raise VDJReferenceConstructionError( - 'The feature ID must be an integer greater than 0. Found: "%s"' % str(feature_id) + f'The feature ID must be an integer greater than 0. Found: "{feature_id!s}"' ) fields["sequence"] = sequence diff --git a/lib/python/cellranger/vdj/reference_maker.py b/lib/python/cellranger/vdj/reference_maker.py index dbe2bc2..c7e7566 100644 --- a/lib/python/cellranger/vdj/reference_maker.py +++ b/lib/python/cellranger/vdj/reference_maker.py @@ -152,7 +152,7 @@ def build_reference_fasta_from_ensembl( continue if not all(r.strand == regions[0].strand for r in regions): - print("Warning: Transcript %s spans multiple strands. Skipping." % transcript_id) + print(f"Warning: Transcript {transcript_id} spans multiple strands. Skipping.") continue chrom: str = regions[0].chrom @@ -181,15 +181,13 @@ def build_reference_fasta_from_ensembl( # Strip Ns from termini if b"N" in seq: print( - "Warning: Feature %s contains Ns. Stripping from the ends." - % str((ens_gene_name, transcript_id, region_type)) + f"Warning: Feature {(ens_gene_name, transcript_id, region_type)!s} contains Ns. Stripping from the ends." ) seq = seq.strip(b"N") if len(seq) == 0: print( - "Warning: Feature %s is all Ns. Skipping." - % str((ens_gene_name, transcript_id, region_type)) + f"Warning: Feature {(ens_gene_name, transcript_id, region_type)!s} is all Ns. Skipping." ) continue @@ -205,12 +203,12 @@ def build_reference_fasta_from_ensembl( # Disallow spaces in these fields if " " in region_type: raise VDJReferenceConstructionError( - 'Spaces not allowed in region type: "%s"' % region_type + f'Spaces not allowed in region type: "{region_type}"' ) if " " in gene_name: - raise VDJReferenceConstructionError('Spaces not allowed in gene name: "%s"' % gene_name) + raise VDJReferenceConstructionError(f'Spaces not allowed in gene name: "{gene_name}"') if " " in record_id: - raise VDJReferenceConstructionError('Spaces not allowed in record ID: "%s"' % record_id) + raise VDJReferenceConstructionError(f'Spaces not allowed in record ID: "{record_id}"') # Warn on features we couldn't classify properly if chain_type not in chain_types.VDJ_CHAIN_TYPES: diff --git a/lib/python/cellranger/vdj/report.py b/lib/python/cellranger/vdj/report.py index bc68548..a901607 100644 --- a/lib/python/cellranger/vdj/report.py +++ b/lib/python/cellranger/vdj/report.py @@ -307,134 +307,26 @@ def vdj_filter_barcodes_cb( "vdj_filtered_bcs_relative_difference_from_recovered_cells" ).set_value(len(cell_barcodes) - recovered_cells, recovered_cells) - def vdj_recombinome_bam_cb(self, read1, read2, bam, strand): - """Report on a single read-to-germline-segment alignment. - - Returns (chain1, chain2); chain annotations for each read - """ - paired_end = read2 is not None - - if paired_end: - assert read1.is_secondary == read2.is_secondary - if read1.is_secondary or read2.is_secondary: - return (None, None) - else: - if read1.is_secondary: - return (None, None) - - read1_mapped = not read1.is_unmapped - read2_mapped = paired_end and not read2.is_unmapped - pair_mapped = (read1_mapped and read2_mapped) or (not paired_end) and read1_mapped - - if read1_mapped: - ref_name = bam.references[read1.tid] - feature_id = vdj_reference.get_feature_id_from_aligned_ref_name(ref_name) - read1_chain = self.vdj_reference.get_feature_by_id(feature_id).chain - else: - read1_chain = None - - if read2_mapped: - ref_name = bam.references[read2.tid] - feature_id = vdj_reference.get_feature_id_from_aligned_ref_name(ref_name) - read2_chain = self.vdj_reference.get_feature_by_id(feature_id).chain - else: - read2_chain = None - - for chain in vdj_constants.VDJ_GENES + [lib_constants.MULTI_REFS_PREFIX]: - if chain == lib_constants.MULTI_REFS_PREFIX: - read1_this_chain = True - read2_this_chain = True - else: - read1_this_chain = read1_chain == chain - read2_this_chain = read2_chain == chain - - mapped_reads_frac = self._get_metric_attr("vdj_recombinome_mapped_reads_frac", chain) - mapped_reads_frac.add(1, filter=read1_mapped and read1_this_chain) - mapped_reads_frac.add(1, filter=read2_mapped and read2_this_chain) - self._get_metric_attr("vdj_recombinome_mapped_read1_frac", chain).add( - 1, filter=read1_mapped and read1_this_chain - ) - self._get_metric_attr("vdj_recombinome_mapped_read2_frac", chain).add( - 1, filter=read2_mapped and read2_this_chain - ) - - is_pair_mapped = ( - pair_mapped - and read1_this_chain - and read2_this_chain - or (not paired_end) - and pair_mapped - and read1_this_chain - ) - self._get_metric_attr("vdj_recombinome_mapped_read_pairs_frac", chain).add( - 1, filter=is_pair_mapped - ) - - self._get_metric_attr("vdj_recombinome_chimeric_read_pairs_frac", chain).add( - 1, - filter=paired_end - and pair_mapped - and read1_chain != read2_chain - and (read1_this_chain or read2_this_chain), - ) - - is_antisense = ( - is_pair_mapped - and ( - (strand == "+" and read1.is_reverse and (not read2.is_reverse)) - or (strand == "-" and (not read1.is_reverse) and read2.is_reverse) - ) - or (not paired_end) - and ( - (strand == "+" and read1.is_reverse) or (strand == "-" and not read1.is_reverse) - ) - ) - self._get_metric_attr("vdj_recombinome_antisense_read_pairs_frac", chain).add( - 1, filter=is_antisense - ) - - return (read1_chain, read2_chain) - def vdj_assembly_cb( self, - summary_df: pd.DataFrame | None, umi_summary_df: pd.DataFrame | None, annotation_dicts: Iterable[vdj_annot.AnnotationDict], reference: vdj_reference.VdjReference, prefix="", ): - # From contig name to its chain (eg. TRA, TRB) - contig_chains: dict[str, bytes] = { - annotation.contig_name: next(iter(annotation.contig_chains())) - for annotation in ( - vdj_annot.AnnotatedContig.from_dict(annotation_dict, reference) - for annotation_dict in annotation_dicts - ) - if annotation.high_confidence and annotation.is_single_chain() - } - - good_umis: set[str] = ( - set() - if umi_summary_df is None - else {str(int(s)) for s in umi_summary_df[umi_summary_df["good_umi"]]["umi_id"]} - ) - - # From chain to the umis assigned to contigs of that chain - chain_umis: defaultdict[str, list[str]] = defaultdict(list) - if not summary_df is None: - for _, row in summary_df.iterrows(): - assert isinstance(row.contig_name, str) - if row.contig_name in contig_chains: - # If the contig was assigned to a single chain... - chain: str = ensure_str(contig_chains[row.contig_name]) - # ...get all umis for that contig - umis = [u for u in row.umi_list.split(",") if u in good_umis] - chain_umis[chain].extend(umis) - chain_umis[lib_constants.MULTI_REFS_PREFIX].extend(umis) - - numis_by_chain: dict[str, int] = { - c: len(set(chain_umis.get(c, []))) for c in self.vdj_genes - } + # build the chain:num_umis dict using contig_annotations_json + numis_by_chain: dict[str, int] = {key: 0 for key in self.vdj_genes} + for annotation_dict in annotation_dicts: + annot = vdj_annot.AnnotatedContig.from_dict(annotation_dict, reference) + if prefix == "": + if annot.productive and annot.high_confidence and annot.is_single_chain(): + chain = annot.contig_chains().pop() + numis_by_chain[ensure_str(chain)] += annot.umi_count + numis_by_chain[lib_constants.MULTI_REFS_PREFIX] += annot.umi_count + elif annot.high_confidence and annot.is_single_chain(): + chain = annot.contig_chains().pop() + numis_by_chain[ensure_str(chain)] += annot.umi_count + numis_by_chain[lib_constants.MULTI_REFS_PREFIX] += annot.umi_count def exclusive_count_mismatch(chain): assert isinstance(chain, str) @@ -537,7 +429,7 @@ def vdj_barcode_contig_cb( # Gene-specific per-contig metrics for gene in self.vdj_genes: - is_gene = gene == contig_gene or gene == lib_constants.MULTI_REFS_PREFIX + is_gene = gene in (contig_gene, lib_constants.MULTI_REFS_PREFIX) # Contig length if is_gene: diff --git a/lib/python/cellranger/vdj/utils.py b/lib/python/cellranger/vdj/utils.py index bbeda4d..e1355ba 100644 --- a/lib/python/cellranger/vdj/utils.py +++ b/lib/python/cellranger/vdj/utils.py @@ -78,7 +78,7 @@ def write_csv_row(row, f): for i, v in enumerate(row): if "," in v: raise ValueError("Failed write to csv file: Column %d contains commas" % i) - f.write("%s\n" % ",".join(row)) + f.write("{}\n".format(",".join(row))) def format_clonotype_id(clonotype_index, inferred): @@ -128,7 +128,7 @@ def get_json_obj_iter(f): brace_count = 1 elif brace_count == 1 and c == "}": brace_count = 0 - elif c == "{" or c == "}": + elif c in ("{", "}"): brace_count += 1 if c == "{" else -1 if brace_count != 0 or len(x) > 0: x += c diff --git a/lib/python/cellranger/version.py b/lib/python/cellranger/version.py index df2ce58..87cde36 100644 --- a/lib/python/cellranger/version.py +++ b/lib/python/cellranger/version.py @@ -19,8 +19,10 @@ def get_version(): if that is not found it will attempt to query git for the version. """ # NOTE: this makes assumptions about the directory structure - script_dir = os.path.join(os.path.dirname(__file__), "..", "..", "..", "bin") - version_fn = os.path.join(script_dir, "..", ".version") + repo_base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) + script_dir = os.path.join(repo_base_dir, "bin") + version_fn = os.path.join(repo_base_dir, ".version") + if os.path.exists(version_fn): with open(version_fn) as f: output = f.read() diff --git a/lib/python/cellranger/webshim/common.py b/lib/python/cellranger/webshim/common.py index ebeb450..53fbc49 100755 --- a/lib/python/cellranger/webshim/common.py +++ b/lib/python/cellranger/webshim/common.py @@ -12,6 +12,7 @@ import random import re import sys +from collections.abc import Sequence from typing import Any # pylint: disable=unused-import import numpy as np @@ -29,11 +30,11 @@ import cellranger.webshim.constants.vdj as ws_vdj_constants import tenkit.safe_json as tk_safe_json from cellranger.analysis.multigenome import MultiGenomeAnalysis -from cellranger.analysis.singlegenome import SingleGenomeAnalysis +from cellranger.analysis.singlegenome import Projection, SingleGenomeAnalysis from cellranger.reference_paths import get_ref_name_from_genomes from cellranger.webshim.data import SampleData, generate_counter_barcode_rank_plot_data from cellranger.webshim.jibes_plotting import _make_rc_vectors, make_color_map, make_histogram_plot -from cellranger.websummary.helpers import get_tsne_key +from cellranger.websummary.helpers import get_projection_key from cellranger.websummary.sample_properties import CountSampleProperties, SampleProperties @@ -98,7 +99,7 @@ def format_value(value, format_type): return f"{value:,.0f}" elif format_type[0] == "%": return format_type % float(value) - raise Exception("Invalid format type: %s" % format_type) + raise Exception(f"Invalid format type: {format_type}") def lookup_name(data, name): @@ -321,7 +322,7 @@ def convert_numpy_array_to_line_chart(array, ntype): rows = [] previous_count = None for (index,), count in np.ndenumerate(array): - if index == 0 or index == len(array) - 1: + if index in (0, len(array) - 1): rows.append([index, ntype(count)]) elif previous_count != count: assert previous_count is not None @@ -530,7 +531,7 @@ def plot_barcode_rank(chart, sample_properties, sample_data): # TODO: This unneccesary argument is needed because of how the PD code is structured. def plot_vdj_barcode_rank(chart, sample_properties, sample_data): """Generate the VDJ barcode rank plot.""" - if not sample_data.cell_barcodes: # No cells + if not sample_data.cell_barcodes or sample_data.vdj_barcode_support is None: return None counts_per_bc, plot_segments = sample_data.vdj_barcode_rank_plot_data() @@ -592,7 +593,7 @@ def plot_clonotype_table(chart, sample_properties, sample_data): cols = [] for name, col_def in col_defs.items(): if name not in clonotypes: - raise ValueError("Column not found in clonotype summary: %s" % name) + raise ValueError(f"Column not found in clonotype summary: {name}") cols.append( { "label": col_def["label"], @@ -685,13 +686,13 @@ def plot_barnyard_barcode_counts(chart, sample_properties, sample_data): series["y"].append(int(count1)) chart["layout"]["xaxis"] = { - "title": "%s UMI counts" % analysis.result["genome0"], + "title": "{} UMI counts".format(analysis.result["genome0"]), "rangemode": "tozero", "autorange": True, "fixedrange": False, } chart["layout"]["yaxis"] = { - "title": "%s UMI counts" % analysis.result["genome1"], + "title": "{} UMI counts".format(analysis.result["genome1"]), "rangemode": "tozero", "autorange": True, "fixedrange": False, @@ -722,8 +723,8 @@ def plot_preprocess(analyses): return analyses -def load_sample_data(sample_properties, sample_data_paths): - return SampleData(sample_properties, sample_data_paths, plot_preprocess) +def load_sample_data(sample_properties, sample_data_paths, projections: Sequence[Projection]): + return SampleData(sample_properties, sample_data_paths, plot_preprocess, projections) def plot_tsne(chart, sample_properties, sample_data): @@ -735,9 +736,9 @@ def plot_tsne(chart, sample_properties, sample_data): matrix = sample_data.get_analysis(SingleGenomeAnalysis).matrix library_types = matrix.get_library_types() if rna_library.GENE_EXPRESSION_LIBRARY_TYPE in library_types: - key = get_tsne_key(rna_library.GENE_EXPRESSION_LIBRARY_TYPE, 2) + key = get_projection_key(rna_library.GENE_EXPRESSION_LIBRARY_TYPE, 2) elif rna_library.ANTIBODY_LIBRARY_TYPE in library_types: - key = get_tsne_key(rna_library.ANTIBODY_LIBRARY_TYPE, 2) + key = get_projection_key(rna_library.ANTIBODY_LIBRARY_TYPE, 2) args = [ analysis.get_tsne(key=key).transformed_tsne_matrix, @@ -856,10 +857,10 @@ def plot_tsne_totalcounts(chart, sample_properties, sample_data): library_types = matrix.get_library_types() if rna_library.GENE_EXPRESSION_LIBRARY_TYPE in library_types: library_type = rna_library.GENE_EXPRESSION_LIBRARY_TYPE - key = get_tsne_key(library_type, 2) + key = get_projection_key(library_type, 2) elif rna_library.ANTIBODY_LIBRARY_TYPE in library_types: library_type = rna_library.ANTIBODY_LIBRARY_TYPE - key = get_tsne_key(library_type, 2) + key = get_projection_key(library_type, 2) matrix = analysis.matrix.select_features_by_type(library_type) reads_per_bc = matrix.get_counts_per_bc() @@ -1045,16 +1046,13 @@ def plot_subsampled_scatterplot_metric( targeting_groups_to_plot = [cr_constants.ON_TARGET_SUBSAMPLE] if not show_targeted_only: targeting_groups_to_plot.append(cr_constants.OFF_TARGET_SUBSAMPLE) - targeting_group_suffix = "_(%s)" % ("|".join(targeting_groups_to_plot)) + targeting_group_suffix = "_({})".format("|".join(targeting_groups_to_plot)) else: targeting_group_suffix = "" # Regular expression to match ___ pattern - metric_pattern = r"^{}({})_([0-9]+)_{}{}$".format( - ref_prefix, - subsample_type, - metric_suffix, - targeting_group_suffix, + metric_pattern = ( + rf"^{ref_prefix}({subsample_type})_([0-9]+)_{metric_suffix}{targeting_group_suffix}$" ) metric_search_results = [re.search(metric_pattern, key) for key in summary_data.keys()] @@ -1090,13 +1088,10 @@ def plot_subsampled_scatterplot_metric( trace_label = cr_tgt_utils.reformat_targeted_label(targeting_group) else: trace_label = "" + elif is_targeted: + trace_label = f"{genome}_{cr_tgt_utils.reformat_targeted_label(targeting_group)}" else: - if is_targeted: - trace_label = "{}_{}".format( - genome, cr_tgt_utils.reformat_targeted_label(targeting_group) - ) - else: - trace_label = genome + trace_label = genome points.append( ( @@ -1167,7 +1162,7 @@ def build_charts(sample_properties, chart_dicts, sample_data, all_prefixes={}, m assert f if function is not None and f is None: - raise ValueError('Could not find webshim chart function "%s"' % function) + raise ValueError(f'Could not find webshim chart function "{function}"') kwargs: dict[str, Any] = chart_dict.pop("kwargs", {}) @@ -1359,7 +1354,7 @@ def build_info_dict(sample_properties, sample_data, pipeline): name_metric = f"{prefix}{cr_constants.REFERENCE_GENOMES_KEY}" if name_metric not in sample_data.summary: raise ValueError( - "Reference metadata metric %s not found in metrics summary." % name_metric + f"Reference metadata metric {name_metric} not found in metrics summary." ) ref_name = sample_data.summary.get(name_metric) diff --git a/lib/python/cellranger/webshim/constants/gex.py b/lib/python/cellranger/webshim/constants/gex.py index 93fa93a..2a1ac63 100644 --- a/lib/python/cellranger/webshim/constants/gex.py +++ b/lib/python/cellranger/webshim/constants/gex.py @@ -467,6 +467,12 @@ "description": "Fraction of CRISPR library reads with a barcode found in or corrected to one that is found in the whitelist", "format": "percent", }, + { + "name": REPORT_PREFIX_CRISPR + "good_umi_frac", + "display_name": DISPLAY_PREFIX_CRISPR + "Valid UMIs", + "description": "Fraction of CRISPR library reads with valid UMIs; i.e., UMI sequences that do not contain Ns and that are not homopolymers.", + "format": "percent", + }, { "name": REPORT_PREFIX_CRISPR + "multi_cdna_pcr_dupe_reads_frac", "display_name": DISPLAY_PREFIX_CRISPR + "Sequencing Saturation", @@ -538,42 +544,32 @@ { "name": REPORT_PREFIX_MULTIPLEXING + "recognized_feature_bc_frac", "display_name": DISPLAY_PREFIX_MULTIPLEXING + f"Fraction {MULTIPLEXING_NAME} Reads", - "description": "Fraction of {name} library reads with a recognized {name} sequence".format( - name=MULTIPLEXING_NAME - ), + "description": f"Fraction of {MULTIPLEXING_NAME} library reads with a recognized {MULTIPLEXING_NAME} sequence", "format": "percent", }, { "name": REPORT_PREFIX_MULTIPLEXING + "frac_feature_reads_usable", "display_name": DISPLAY_PREFIX_MULTIPLEXING + f"Fraction {MULTIPLEXING_NAME} Reads Usable", - "description": "Fraction of {name} library reads with a recognized {name} sequence, a valid UMI, and a cell-associated barcode".format( - name=MULTIPLEXING_NAME - ), + "description": f"Fraction of {MULTIPLEXING_NAME} library reads with a recognized {MULTIPLEXING_NAME} sequence, a valid UMI, and a cell-associated barcode", "format": "percent", }, { "name": REPORT_PREFIX_MULTIPLEXING + "feature_reads_usable_per_cell", "display_name": DISPLAY_PREFIX_MULTIPLEXING + f"{MULTIPLEXING_NAME} Reads Usable per Cell", - "description": "Number of {} library guide reads usable divided by the number of cell-associated barcodes".format( - MULTIPLEXING_NAME - ), + "description": f"Number of {MULTIPLEXING_NAME} library guide reads usable divided by the number of cell-associated barcodes", "format": "integer", }, { "name": REPORT_PREFIX_MULTIPLEXING + "unrecognized_feature_bc_frac", "display_name": DISPLAY_PREFIX_MULTIPLEXING + f"Fraction {MULTIPLEXING_NAME} Not Recognized", - "description": "Among all {name} library reads, the fraction with a {name} sequence that was not recognized".format( - name=MULTIPLEXING_NAME - ), + "description": f"Among all {MULTIPLEXING_NAME} library reads, the fraction with a {MULTIPLEXING_NAME} sequence that was not recognized", "format": "percent", }, { "name": REPORT_PREFIX_MULTIPLEXING + "feature_reads_in_cells", "display_name": DISPLAY_PREFIX_MULTIPLEXING + f"{MULTIPLEXING_NAME} Reads in Cells", - "description": "Among {name} library reads with a recognized {name} sequence, a valid UMI, and a valid barcode, the fraction associated with cell-containing partitions".format( - name=MULTIPLEXING_NAME - ), + "description": f"Among {MULTIPLEXING_NAME} library reads with a recognized {MULTIPLEXING_NAME} sequence, a valid UMI, and a valid barcode, the fraction associated with cell-containing partitions", "format": "percent", }, { @@ -648,6 +644,12 @@ "description": "Fraction of Antibody library reads with a barcode found in or corrected to one that is found in the whitelist", "format": "percent", }, + { + "name": REPORT_PREFIX_ANTIBODY + "good_umi_frac", + "display_name": DISPLAY_PREFIX_ANTIBODY + "Valid UMIs", + "description": "Fraction of Antibody library reads with valid UMIs; i.e., UMI sequences that do not contain Ns and that are not homopolymers.", + "format": "percent", + }, { "name": REPORT_PREFIX_ANTIBODY + "multi_cdna_pcr_dupe_reads_frac", "display_name": DISPLAY_PREFIX_ANTIBODY + "Sequencing Saturation", @@ -811,6 +813,13 @@ "format": "percent", "prefix": "custom_features", }, + { + "name": "good_umi_frac", + "display_name": "%s: Valid UMIs", + "description": "Fraction of Custom library reads with valid UMIs; i.e., UMI sequences that do not contain Ns and that are not homopolymers.", + "format": "percent", + "prefix": "custom_features", + }, { "name": "multi_cdna_pcr_dupe_reads_frac", "display_name": "%s: Sequencing Saturation", @@ -870,6 +879,7 @@ PRENORM_READS_METRIC, POSTNORM_READS_METRIC, GOOD_BCS_METRIC, + GOOD_UMIS_METRIC, CDNA_DUPE_FRAC_METRIC, SEQUENCING_SATURATION_METRIC, TARGETED_SEQUENCING_SATURATION_METRIC, @@ -1273,8 +1283,9 @@ "kwargs_prefixes": ["references"], "config": shared.CHARTS_PLOTLY_MOVABLE_CONFIG, "name": "median_genes_per_cell", - "description": "This plot shows the %s as a function of downsampled sequencing depth in mean reads per cell, up to the observed sequencing depth. The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point." - % (GENES_PER_DETECTED_CELL_METRIC["display_name"]), + "description": "This plot shows the {} as a function of downsampled sequencing depth in mean reads per cell, up to the observed sequencing depth. The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point.".format( + GENES_PER_DETECTED_CELL_METRIC["display_name"] + ), "function": "plot_subsampled_scatterplot_metric", }, ] @@ -1313,12 +1324,12 @@ "format": GOOD_BCS_METRIC["format"], "error": { "title": "Low Fraction Valid Barcodes", - "message": "Ideal > 75%. This may indicate a quality issue with the Illumina I7 read for Single Cell 3' v1 or the R1 read for Single Cell 3' v2/v3 and Single Cell 5'. Application performance is likely to be affected.", + "message": "Ideal > 75%. This may indicate a quality issue with the R1 read. Application performance is likely to be affected.", "test": "< 0.5", }, "warn": { "title": "Low Fraction Valid Barcodes", - "message": "Ideal > 75%. This may indicate a quality issue with the Illumina I7 read for Single Cell 3' v1 or the R1 read for Single Cell 3' v2/v3 and Single Cell 5'. Application performance may be affected.", + "message": "Ideal > 75%. This may indicate a quality issue with the R1 read. Application performance may be affected.", "test": "< 0.75", }, }, @@ -1327,12 +1338,12 @@ "format": GOOD_UMIS_METRIC["format"], "error": { "title": "Low Fraction Valid UMIs", - "message": "Ideal > 75%. This may indicate a quality issue with the Illumina R2 read for Single Cell 3' v1 or the R1 read for Single Cell 3' v2/v3 and Single Cell 5'. Application performance is likely to be affected.", + "message": "Ideal > 75%. This may indicate a quality issue with the R1 read. Application performance is likely to be affected.", "test": "< 0.5", }, "warn": { "title": "Low Fraction Valid UMIs", - "message": "Ideal > 75%. This may indicate a quality issue with the Illumina R2 read for Single Cell 3' v1 or the R1 read for Single Cell 3' v2/v3 and Single Cell 5'. Application performance may be affected.", + "message": "Ideal > 75%. This may indicate a quality issue with the R1 read. Application performance may be affected.", "test": "< 0.75", }, }, diff --git a/lib/python/cellranger/webshim/constants/vdj.py b/lib/python/cellranger/webshim/constants/vdj.py index 104d4b7..df61eb8 100644 --- a/lib/python/cellranger/webshim/constants/vdj.py +++ b/lib/python/cellranger/webshim/constants/vdj.py @@ -15,7 +15,7 @@ def vdj_gene_pair_format(gene_pair_str): if gene_pair_str == lib_constants.MULTI_REFS_PREFIX: return "" else: - return "(%s)" % ", ".join(vdj_utils.get_genes_in_pair(gene_pair_str)) + return "({})".format(", ".join(vdj_utils.get_genes_in_pair(gene_pair_str))) # NOTE: Q30 metrics are currently shared with count. diff --git a/lib/python/cellranger/webshim/data.py b/lib/python/cellranger/webshim/data.py index 0e9aab7..a9a6a96 100644 --- a/lib/python/cellranger/webshim/data.py +++ b/lib/python/cellranger/webshim/data.py @@ -10,6 +10,8 @@ import collections import json import os +from collections.abc import Sequence +from typing import TYPE_CHECKING import h5py import numpy as np @@ -21,6 +23,10 @@ import cellranger.utils as cr_utils import cellranger.vdj.utils as vdj_utils import cellranger.webshim.constants.gex as gex_constants + +if TYPE_CHECKING: + from cellranger.analysis.singlegenome import Projection + from cellranger.websummary.sample_properties import ( AggrCountSampleProperties, CountSampleProperties, @@ -71,7 +77,7 @@ def generate_counter_barcode_rank_plot_data( - plot_segments: List of BarcodeRankPlotSegment """ if restrict_barcodes: - restrict_indices = np.nonzero(np.in1d(barcode_summary["bc_sequence"][:], restrict_barcodes)) + restrict_indices = np.nonzero(np.isin(barcode_summary["bc_sequence"][:], restrict_barcodes)) counts_per_bc = barcode_summary[key][:][restrict_indices] barcode_sequences = barcode_summary["bc_sequence"][:][restrict_indices] else: @@ -89,7 +95,13 @@ def generate_counter_barcode_rank_plot_data( class SampleData: - def __init__(self, sample_properties, sample_data_paths, plot_preprocess_func): + def __init__( + self, + sample_properties, + sample_data_paths, + plot_preprocess_func, + projections: Sequence[Projection], + ): if sample_properties: # Can be None assert isinstance(sample_properties, SampleProperties) self.summary = load_metrics_summary(sample_data_paths.summary_path) @@ -97,7 +109,7 @@ def __init__(self, sample_properties, sample_data_paths, plot_preprocess_func): self.num_cells = self.summary.get("filtered_bcs_transcriptome_union") self.analyses, self.original_cluster_sizes = load_analyses( - sample_data_paths.analysis_path, plot_preprocess_func, sample_properties + sample_data_paths.analysis_path, plot_preprocess_func, sample_properties, projections ) self.barcode_summary = load_barcode_summary(sample_data_paths.barcode_summary_path) @@ -132,6 +144,7 @@ def __init__(self, sample_properties, sample_data_paths, plot_preprocess_func): converters={"barcode": ensure_binary}, ) if sample_data_paths.vdj_barcode_support_path + and os.path.getsize(sample_data_paths.vdj_barcode_support_path) != 0 else None ) @@ -334,16 +347,28 @@ def load_treemap_data(antibody_treemap_path): return json.load(f) -def load_analyses(base_dir, plot_preprocess_func, sample_properties): +def load_analyses( + base_dir, + plot_preprocess_func, + sample_properties, + projections: Sequence[Projection], +): """Returns (analysis_object, original_cluster_sizes).""" if base_dir is None: return None, None + if isinstance(sample_properties, CountSampleProperties): if len(sample_properties.genomes) == 1: - analyses = [cr_sg_analysis.SingleGenomeAnalysis.load_default_format(base_dir, "pca")] + analyses = [ + cr_sg_analysis.SingleGenomeAnalysis.load_default_format( + base_dir, method="pca", projections=projections + ) + ] else: analyses = [ - cr_sg_analysis.SingleGenomeAnalysis.load_default_format(base_dir, "pca"), + cr_sg_analysis.SingleGenomeAnalysis.load_default_format( + base_dir, method="pca", projections=projections + ), cr_mg_analysis.MultiGenomeAnalysis.load_default_format(base_dir), ] diff --git a/lib/python/cellranger/webshim/jibes_plotting.py b/lib/python/cellranger/webshim/jibes_plotting.py index 5a39d38..748b650 100644 --- a/lib/python/cellranger/webshim/jibes_plotting.py +++ b/lib/python/cellranger/webshim/jibes_plotting.py @@ -55,7 +55,7 @@ def make_color_map(features, jibes_plot=True): def make_histogram_plot( - feature_names, feature_counts, color_map, x_axis_lab: str = "Log 10 (1 + Count)" + feature_names, feature_counts, color_map, x_axis_lab: str = "Log 10 (1 + UMI Counts)" ): """Make a histogram plot. @@ -99,8 +99,8 @@ def _make_rc_vectors(original_vectors): for i, v in enumerate(original_vectors): store_key = f"{JIBES_SHARED_VECTORS_RESOURCE_KEY_PREFIX}_{i}" use_key = f"{RESOURCE_PREFIX}_{store_key}" - shared_resources[ - store_key - ] = cellranger.websummary.numeric_converters.array_to_float32_base64(v) + shared_resources[store_key] = ( + cellranger.websummary.numeric_converters.array_to_float32_base64(v) + ) vectors.append(use_key) return shared_resources, vectors diff --git a/lib/python/cellranger/websummary/aggr_websummary_builder.py b/lib/python/cellranger/websummary/aggr_websummary_builder.py index 81d5717..369b8f9 100644 --- a/lib/python/cellranger/websummary/aggr_websummary_builder.py +++ b/lib/python/cellranger/websummary/aggr_websummary_builder.py @@ -9,13 +9,18 @@ import cellranger.rna.library as rna_library import cellranger.websummary.sample_properties as wsp from cellranger import utils as cr_util -from cellranger.analysis.singlegenome import SingleGenomeAnalysis +from cellranger.analysis.singlegenome import ( + PROJECTION_TITLE, + TSNE_NAME, + Projection, + SingleGenomeAnalysis, +) from cellranger.targeted.targeted_constants import TARGETING_METHOD_TL from cellranger.webshim.common import load_sample_data from cellranger.webshim.constants.shared import CELLRANGER_COMMAND_NAME, PIPELINE_AGGR from cellranger.websummary import plotly_tools as pltly -from cellranger.websummary.analysis_tab_core import TSNE_LAYOUT_CONFIG -from cellranger.websummary.helpers import get_tsne_key +from cellranger.websummary.analysis_tab_core import projection_layout_config +from cellranger.websummary.helpers import get_projection_key from cellranger.websummary.metrics import ( MetricAnnotations, SpatialAggrMetricAnnotations, @@ -33,8 +38,8 @@ from cellranger.websummary.web_summary_builder import build_web_summary_html_sc_and_aggr -def library_on_tsne_plot(sample_data, gg_id_to_name): - """Get the tSNE colored by batch; only makes sense in aggregataions.""" +def library_on_projection_plot(sample_data, gg_id_to_name, *, projection: Projection): + """Get the tSNE/UMAP colored by batch; only makes sense in aggregataions.""" if sample_data is None: return None @@ -48,10 +53,15 @@ def library_on_tsne_plot(sample_data, gg_id_to_name): library_types = analysis.matrix.get_library_types() if rna_library.GENE_EXPRESSION_LIBRARY_TYPE in library_types: - key = get_tsne_key(rna_library.GENE_EXPRESSION_LIBRARY_TYPE, 2) + key = get_projection_key(rna_library.GENE_EXPRESSION_LIBRARY_TYPE, 2) elif rna_library.ANTIBODY_LIBRARY_TYPE in library_types: - key = get_tsne_key(rna_library.ANTIBODY_LIBRARY_TYPE, 2) - tsne_coordinates = analysis.get_tsne(key=key).transformed_tsne_matrix + key = get_projection_key(rna_library.ANTIBODY_LIBRARY_TYPE, 2) + + if projection == TSNE_NAME: + projection_coordinates = analysis.get_tsne(key=key).transformed_tsne_matrix + else: + projection_coordinates = analysis.get_umap(key=key).transformed_umap_matrix + layout = projection_layout_config(projection=projection).copy() data = [] for library in gg_id_to_name.values(): @@ -65,22 +75,21 @@ def library_on_tsne_plot(sample_data, gg_id_to_name): data.append( { "name": name + f" ({len(indices)})", - "x": round_floats_in_list(list(tsne_coordinates[indices, 0])), - "y": round_floats_in_list(list(tsne_coordinates[indices, 1])), + "x": round_floats_in_list(list(projection_coordinates[indices, 0])), + "y": round_floats_in_list(list(projection_coordinates[indices, 1])), "indices": list(indices), "type": "scattergl", "mode": "markers", "marker": {"opacity": 0.6, "size": 4}, } ) - layout = TSNE_LAYOUT_CONFIG.copy() assert "title" not in layout - batch_tsne_plot = { + batch_projection_plot = { "config": pltly.PLOT_CONFIG, "layout": layout, "data": data, } - return batch_tsne_plot + return batch_projection_plot def build_web_summary_html_aggr( @@ -88,6 +97,7 @@ def build_web_summary_html_aggr( sample_properties, gg_id_to_name_map, sample_data_paths, + projection: Projection, sample_defs=None, ): """Build a web summary file for an AGGR Run. @@ -97,13 +107,14 @@ def build_web_summary_html_aggr( sample_properties: Instance of AggrCountSampleProperties gg_id_to_name_map: dictionary to map gem group ids in barcode to library names sample_data_paths: Instance of SampleDataPaths + projection: Projection used in websummary (TSNE_NAME or UMAP_NAME) sample_defs: Map of sample defs passed in from PARSE_CSV Returns: None """ web_sum_data = build_web_summary_data_aggr( - sample_properties, gg_id_to_name_map, sample_data_paths, sample_defs + sample_properties, gg_id_to_name_map, sample_data_paths, projection, sample_defs ) write_html_file(filename, web_sum_data) @@ -113,6 +124,7 @@ def build_web_summary_data_aggr( sample_properties, gg_id_to_name_map, sample_data_paths, + projection: Projection, sample_defs=None, ): """Build a web summary file for an AGGR Run. @@ -121,6 +133,7 @@ def build_web_summary_data_aggr( sample_properties: Instance of AggrCountSampleProperties gg_id_to_name_map: dictionary to map gem group ids in barcode to library names sample_data_paths: Instance of SampleDataPaths + projection: Tuple including all available projections sample_defs: Map of sample defs from PARSE_CSV Returns: @@ -128,7 +141,12 @@ def build_web_summary_data_aggr( """ assert isinstance(sample_properties, wsp.AggrCountSampleProperties) # add metadata info that will be needed to draw batch tsne and determine targeting method - sample_data = load_sample_data(sample_properties, sample_data_paths) + + sample_data = load_sample_data( + sample_properties, + sample_data_paths, + (projection,), + ) if sample_properties.is_spatial: command = SPATIAL_COMMAND_NAME if sample_properties.is_targeted: @@ -154,14 +172,19 @@ def build_web_summary_data_aggr( PIPELINE_AGGR, metadata, command, - sample_defs, + projection=projection, + sample_defs=sample_defs, + ) + + clustering_plot = library_on_projection_plot( + sample_data, gg_id_to_name_map, projection=projection ) + clustering_plot_title = f"{PROJECTION_TITLE[projection]} Projection Colored by Sample ID" - tsne_plot = library_on_tsne_plot(sample_data, gg_id_to_name_map) - if tsne_plot: - web_sum_data.summary_tab["aggr_batch_tsne"] = PlotWithHeader( - "t-SNE Projection Colored by Sample ID", - tsne_plot, + if clustering_plot: + web_sum_data.summary_tab["aggr_batch_projection"] = PlotWithHeader( + clustering_plot_title, + clustering_plot, help_text="Number of cells for each sample is provided in parentheses.", ) diff --git a/lib/python/cellranger/websummary/analysis_tab_aux.py b/lib/python/cellranger/websummary/analysis_tab_aux.py index 11d03ab..192c87b 100644 --- a/lib/python/cellranger/websummary/analysis_tab_aux.py +++ b/lib/python/cellranger/websummary/analysis_tab_aux.py @@ -5,7 +5,7 @@ """This file shows plots in the analysis tab that aren't related to the outputs of the SC_RNA_ANALYZER pipeline. e.g. targeted UMI plots, sequencing saturation plots, etc -splitting things up in this way allows turing repo to utilize TSNE/clustering plots without pulling in a lot of transitive dependencies +splitting things up in this way allows turing repo to utilize UMAP/clustering plots without pulling in a lot of transitive dependencies """ from __future__ import annotations @@ -22,7 +22,7 @@ import cellranger.webshim.constants.shared as shared_constants import cellranger.websummary.plotly_tools as pltly from cellranger.analysis.multigenome import MultiGenomeAnalysis -from cellranger.analysis.singlegenome import SingleGenomeAnalysis +from cellranger.analysis.singlegenome import UMAP_NAME, SingleGenomeAnalysis from cellranger.targeted.targeted_constants import ( GDNA_CONTENT_METRIC, GDNA_PLOT_NAME, @@ -32,8 +32,8 @@ ) from cellranger.targeted.utils import OFFTARGET_WS_LABEL, TARGETED_WS_LABEL from cellranger.webshim.jibes_plotting import make_color_map -from cellranger.websummary.analysis_tab_core import TSNE_LAYOUT_CONFIG -from cellranger.websummary.helpers import get_tsne_key +from cellranger.websummary.analysis_tab_core import projection_layout_config +from cellranger.websummary.helpers import get_projection_key from cellranger.websummary.metrics import SpatialAggrMetricAnnotations from cellranger.websummary.numeric_converters import round_floats_in_list from cellranger.websummary.react_components import BarnyardPanel @@ -68,8 +68,7 @@ SEQ_SATURATION_PLOT_HELP = { "helpText": "This plot shows the Sequencing Saturation metric as a function of downsampled sequencing depth (measured in mean reads per cell), up to the observed sequencing depth. " "Sequencing Saturation is a measure of the observed library complexity, and approaches 1.0 (100%) when all converted mRNA transcripts have been sequenced. " - "The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point. " - "The dotted line is drawn at a value reasonably approximating the saturation point.", + "The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point. ", "title": "Sequencing Saturation", } @@ -108,16 +107,21 @@ SPATIAL_SEQ_SATURATION_PLOT_HELP = { "helpText": "This plot shows the Sequencing Saturation metric as a function of downsampled sequencing depth (measured in mean reads per spot), up to the observed sequencing depth. " "Sequencing Saturation is a measure of the observed library complexity, and approaches 1.0 (100%) when all converted mRNA transcripts have been sequenced. " - "The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point. " - "The dotted line is drawn at a value reasonably approximating the saturation point.", + "The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point. ", "title": "Sequencing Saturation", } RTL_SEQ_SATURATION_PLOT_HELP = { HELP_TEXT_KEY: "This plot shows the Sequencing Saturation metric as a function of downsampled sequencing depth (measured in mean reads per spot), up to the observed sequencing depth. " "Sequencing Saturation is a measure of the observed library complexity, and approaches 1.0 (100%) when all converted probe ligation products have been sequenced. " - "The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point. " - "The dotted line is drawn at a value reasonably approximating the saturation point.", + "The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point. ", + TITLE_KEY: "Sequencing Saturation", +} + +VISIUM_HD_RTL_SEQ_SATURATION_PLOT_HELP = { + HELP_TEXT_KEY: "This plot shows the Sequencing Saturation metric as a function of downsampled sequencing depth (measured in total number of read pairs), up to the observed sequencing depth. " + "Sequencing Saturation is a measure of the observed library complexity, and approaches 1.0 (100%) when all converted probe ligation products have been sequenced. " + "The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point. ", TITLE_KEY: "Sequencing Saturation", } @@ -306,9 +310,8 @@ def targeted_table(metadata, sample_data, species_list, is_spatial=False): if is_spatial: if enrichment_calculations_disabled and metric == "spatial_num_rpu_enriched_genes": value_on_target = value_off_target = "N/A" - else: - if enrichment_calculations_disabled and metric == "num_rpu_enriched_genes": - value_on_target = value_off_target = "N/A" + elif enrichment_calculations_disabled and metric == "num_rpu_enriched_genes": + value_on_target = value_off_target = "N/A" metric_name = on_target_metric[0].name metric_helptext = metadata.gen_metric_helptext([metric + TARGETED_WS_LABEL.metric_suffix]) @@ -371,20 +374,6 @@ def seq_saturation_plot(sample_data, sample_properties): "range": [0, 1], "fixedrange": False, }, - "shapes": [ - { - "type": "line", - "x0": 0, - "y0": 0.9, - "x1": 0, - "y1": 0.9, - "line": { - "color": "rgb(128, 128, 128)", - "width": 4, - "dash": "dot", - }, - }, - ], }, "data": [], # data entries are built in the function } @@ -483,7 +472,7 @@ def reads_per_umi_plot(sample_data): x1 = np.log10(np.nanmax(per_feature_metrics[cr_tgt_utils.UMIS_IN_CELLS_COLNAME]) + 1) data.append( { - "name": "Reads per UMI threshold (%.2f)" % math.pow(10, b), + "name": f"Reads per UMI threshold ({math.pow(10, b):.2f})", "x": [x0, x1], "y": [x0 * a + b, x1 * a + b], "mode": "lines", @@ -570,22 +559,29 @@ def _add_targeting_line_colors(plot): return plot -def cmo_tags_on_tsne_from_path( - analysis_dir, cells_per_tag: CellsPerFeature, non_singlet_barcodes: CellsPerFeature +def cmo_tags_on_umap_from_path( + analysis_dir, + cells_per_tag: CellsPerFeature, + non_singlet_barcodes: CellsPerFeature, + multiplexing_method: rna_library.BarcodeMultiplexingType, ): """Given the base analysis directory for a single genome analysis h5,. - Get the CMO tSNE colored by CMO tag labels + Get the CMO UMAP colored by CMO tag labels """ if analysis_dir is None or cells_per_tag is None or non_singlet_barcodes is None: return None - analysis = SingleGenomeAnalysis.load_default_format(analysis_dir, "pca") + analysis = SingleGenomeAnalysis.load_default_format( + analysis_dir, method="pca", projections=(UMAP_NAME,) + ) if analysis is None: return None - return cmo_tags_on_tsne_helper(analysis, cells_per_tag, non_singlet_barcodes) + return cmo_tags_on_umap_helper( + analysis, cells_per_tag, non_singlet_barcodes, multiplexing_method + ) def _filter_out_missing_barcodes( @@ -617,21 +613,23 @@ def _filter_out_missing_barcodes( return matrix_bcs -# whole-library TSNE for CMO tag data, colored by CMO tag. -def cmo_tags_on_tsne_helper( +# whole-library UMAP for CMO tag data, colored by CMO tag. +def cmo_tags_on_umap_helper( analysis: SingleGenomeAnalysis, cells_per_tag: CellsPerFeature, non_singlet_barcodes: CellsPerFeature, + multiplexing_method: rna_library.BarcodeMultiplexingType, ): # pylint: disable=too-many-locals - """CMO tag labels on CMO tSNE helper function.""" - library_type = rna_library.MULTIPLEXING_LIBRARY_TYPE - key = get_tsne_key(library_type, 2) - if key not in analysis.tsne: + """CMO tag labels on CMO UMAP helper function.""" + assert multiplexing_method.is_cell_multiplexed(), "Unsupported multiplexing method!" + library_type = multiplexing_method.multiplexing_library_type() + key = get_projection_key(library_type, 2) + if key not in analysis.umap: return None - tsne_coordinates = analysis.get_tsne(key=key).transformed_tsne_matrix + umap_coordinates = analysis.get_umap(key=key).transformed_umap_matrix - title = "t-SNE Projection of Cells by CMO" + title = "UMAP Projection of Cells by CMO" data = [] total_bcs = float(len(analysis.matrix.bcs)) @@ -661,8 +659,8 @@ def add_data(tag, tag_prop, tag_indices): data.append( { "name": f"{tag} ({tag_prop:.1%})", - "x": round_floats_in_list(tsne_coordinates[tag_indices, 0]), - "y": round_floats_in_list(tsne_coordinates[tag_indices, 1]), + "x": round_floats_in_list(umap_coordinates[tag_indices, 0]), + "y": round_floats_in_list(umap_coordinates[tag_indices, 1]), "type": "scattergl", "mode": "markers", "marker": {"opacity": 0.9, "size": 4, "color": color_map[tag]}, @@ -698,15 +696,15 @@ def add_data(tag, tag_prop, tag_indices): unassigned_indices = analysis.matrix.bcs_to_ints(unassigned) add_data(b"Unassigned", unassigned_prop, unassigned_indices) - # Note: the help text has been included in tsne_cluster plot - layout = TSNE_LAYOUT_CONFIG.copy() + # Note: the help text has been included in umap_cluster plot + layout = projection_layout_config(projection=UMAP_NAME).copy() layout["title"] = title - cmo_tag_tsne_plot = { + cmo_tag_umap_plot = { "config": pltly.PLOT_CONFIG, "layout": layout, "data": data, } - return cmo_tag_tsne_plot + return cmo_tag_umap_plot def antibody_histogram_plot(sample_data): diff --git a/lib/python/cellranger/websummary/analysis_tab_core.py b/lib/python/cellranger/websummary/analysis_tab_core.py index 525200e..d67229d 100644 --- a/lib/python/cellranger/websummary/analysis_tab_core.py +++ b/lib/python/cellranger/websummary/analysis_tab_core.py @@ -10,16 +10,21 @@ from __future__ import annotations -from copy import deepcopy - import numpy as np import cellranger.rna.library as rna_library import cellranger.webshim.constants.gex as ws_gex_constants import cellranger.websummary.plotly_tools as pltly +from cellranger.analysis.analysis_types import DifferentialExpressionWithFeatures from cellranger.analysis.clustering import AB_PREFIX, GEX_PREFIX -from cellranger.analysis.singlegenome import TSNE_NAME, UMAP_NAME, SingleGenomeAnalysis -from cellranger.websummary.helpers import get_tsne_key +from cellranger.analysis.singlegenome import ( + PROJECTION_TITLE, + TSNE_NAME, + UMAP_NAME, + Projection, + SingleGenomeAnalysis, +) +from cellranger.websummary.helpers import get_projection_key from cellranger.websummary.numeric_converters import round_floats_in_list from cellranger.websummary.react_components import ( ClusteringData, @@ -29,45 +34,6 @@ SharedCoordinatePlotCollection, ) -TSNE_LAYOUT_CONFIG = { - "xaxis": { - "type": "linear", - "title": "t-SNE1", - "showline": False, - "zeroline": True, - "fixedrange": False, - }, - "yaxis": { - "type": "linear", - "title": "t-SNE2", - "showline": False, - "zeroline": True, - "fixedrange": False, - }, - "margin": {"t": 30}, # needed to keep screenshots from hitting the top - "hovermode": "closest", -} - -UMAP_LAYOUT_CONFIG = { - "xaxis": { - "type": "linear", - "title": "UMAP1", - "showline": False, - "zeroline": True, - "fixedrange": False, - }, - "yaxis": { - "type": "linear", - "title": "UMAP2", - "showline": False, - "zeroline": True, - "fixedrange": False, - }, - "margin": {"t": 30}, # needed to keep screenshots from hitting the top - "hovermode": "closest", -} - - DIFFEXP_TABLE_HELP = { "helpText": "The differential expression analysis seeks to find, for each cluster, features that are more highly expressed in that cluster relative to the rest of the sample. " "Here a differential expression test was performed between each cluster and the rest of the sample for each feature. " @@ -117,28 +83,6 @@ "title": "Top Features by Cluster (Log2 fold-change, p-value)", } -TSNE_CLUSTERING_PLOT_HELP = { - "data": [ - [ - "", - [ - "(left) Shown here are the total UMI counts for each cell-barcode. " - "Cells with greater UMI counts likely have higher RNA content than cells with fewer UMI counts. " - "The axes correspond to the 2-dimensional embedding produced by the t-SNE algorithm. " - "In this space, pairs of cells that are close to each other have more similar gene expression profiles than cells that are distant from each other. " - "The display is limited to a random subset of cells.", - "(right) These are the assignments of each cell-barcode to clusters by an automated clustering algorithm. " - "The clustering groups together cells that have similar expression profiles. " - "The axes correspond to the 2-dimensional embedding produced by the t-SNE algorithm. " - "In this space, pairs of cells that are close to each other have more similar gene expression profiles than cells that are distant from each other. " - "The display is limited to a random subset of cells. " - "Please use Loupe Browser to view the entire dataset.", - ], - ] - ], - "title": "t-SNE Projection", -} - SPATIAL_TSNE_CLUSTERING_PLOT_HELP = { "data": [ [ @@ -150,7 +94,7 @@ "Only spots under tissue are used in the clustering algorithm.", "(right) Spots are colored by clustering assignment and shown in t-SNE space. " "The axes correspond to the 2-dimensional embedding produced by the t-SNE algorithm. " - "In this space, pairs of spots that are close to each other have more similar gene expression profiles than spots that are distant from each other. " + "In this space, pairs of spots that are close to each other have more similar gene expression profiles than spots that are distant from each other. ", # "The display is limited to a random subset of spots.", # TODO: We should set a max # of cells in insitu and subsample if necessary ], ] @@ -169,7 +113,7 @@ "Only cells with a Nucleus detected in the DAPI stain are used in the clustering algorithm.", "(right) Cells are colored by clustering assignment and shown in t-SNE space. " "The axes correspond to the 2-dimensional embedding produced by the t-SNE algorithm. " - "In this space, pairs of cells that are close to each other have more similar gene expression profiles than cells that are distant from each other. " + "In this space, pairs of cells that are close to each other have more similar gene expression profiles than cells that are distant from each other. ", # "The display is limited to a random subset of spots.", # TODO: We should set a max # of cells in insitu and subsample if necessary ], ] @@ -180,12 +124,82 @@ UMI_TSNE_PLOT = "umi_tsne_plot" -def diffexp_table(diffexp, clustering, analysis: SingleGenomeAnalysis): +def projection_clustering_plot_help(projection: Projection): + return { + "data": [ + [ + "", + [ + "(left) Shown here are the total UMI counts for each cell-barcode. " + "Cells with greater UMI counts likely have higher RNA content than cells with fewer UMI counts. " + f"The axes correspond to the 2-dimensional embedding produced by the {PROJECTION_TITLE[projection]} algorithm. " + "In this space, pairs of cells that are close to each other have more similar gene expression profiles than cells that are distant from each other. " + "The display is limited to a random subset of cells.", + "(right) These are the assignments of each cell-barcode to clusters by an automated clustering algorithm. " + "The clustering groups together cells that have similar expression profiles. " + f"The axes correspond to the 2-dimensional embedding produced by the {PROJECTION_TITLE[projection]} algorithm. " + "In this space, pairs of cells that are close to each other have more similar gene expression profiles than cells that are distant from each other. " + "The display is limited to a random subset of cells. " + "Please use Loupe Browser to view the entire dataset.", + ], + ] + ], + "title": f"{PROJECTION_TITLE[projection]} Projection", + } + + +def projection_layout_config(projection: Projection): + return { + "xaxis": { + "type": "linear", + "title": f"{PROJECTION_TITLE[projection]}1", + "showline": False, + "zeroline": True, + "fixedrange": False, + }, + "yaxis": { + "type": "linear", + "title": f"{PROJECTION_TITLE[projection]}2", + "showline": False, + "zeroline": True, + "fixedrange": False, + }, + "margin": {"t": 30}, # needed to keep screenshots from hitting the top + "hovermode": "closest", + } + + +def diffexp_table_from_analysis( + diffexp, + clustering, + analysis: SingleGenomeAnalysis, +): """Show diffexp table for the given clustering.""" - # pylint: disable=too-many-locals,invalid-name + if not analysis: + raise ValueError("A analysis object must be provided.") + if not clustering: + raise ValueError("A clustering must be provided.") + n_clusters: int = clustering.clusters.max() + cluster_names = [f"Cluster {i + 1}" for i in range(n_clusters)] + diffexp_with_features = DifferentialExpressionWithFeatures.from_cmatrix_and_diffexp( + cmatrix=analysis.matrix, diffexp=diffexp + ) + return diffexp_table(diffexp_with_features=diffexp_with_features, cluster_names=cluster_names) + +def diffexp_table( + diffexp_with_features: DifferentialExpressionWithFeatures, cluster_names +): # pylint: disable=too-many-locals + """Show diffexp table for the given clustering.""" # Limit the number of entries in the DE table + diffexp = diffexp_with_features.diffexp + feature_id_to_name = dict( + zip(diffexp_with_features.feature_ids, diffexp_with_features.feature_names) + ) + feature_id_to_int = {x: i for i, x in enumerate(diffexp_with_features.feature_ids)} + + n_clusters = len(cluster_names) n_genes = int(np.floor(float(ws_gex_constants.MAX_DE_TABLE_ENTRIES) / (n_clusters**2))) if n_genes < 1: n_genes = 1 @@ -204,8 +218,7 @@ def diffexp_table(diffexp, clustering, analysis: SingleGenomeAnalysis): # Get the union of top DE genes top_genes = set() - for i in range(n_clusters): - # Filter genes by mean count and sort by log2 fold-change, descending + for i, cluster_name in enumerate(cluster_names): means = diffexp.data[:, 0 + 3 * i] log2fcs = diffexp.data[:, 1 + 3 * i] @@ -213,11 +226,11 @@ def diffexp_table(diffexp, clustering, analysis: SingleGenomeAnalysis): top_gene_indices = keep_indices[log2fcs[keep_indices].argsort()[::-1]][:n_genes] for j in top_gene_indices: - top_genes.add(analysis.matrix.int_to_feature_id(j)) + top_genes.add(diffexp_with_features.feature_ids[j]) columns.append( { - "Header": f"Cluster {i + 1}", + "Header": cluster_name, "columns": [ { "Header": "L2FC", @@ -235,8 +248,8 @@ def diffexp_table(diffexp, clustering, analysis: SingleGenomeAnalysis): table = [] for gene_id in top_genes: - i = analysis.matrix.feature_id_to_int(gene_id) - gene_name = analysis.matrix.feature_id_to_name(gene_id) + i = feature_id_to_int[gene_id] + gene_name = feature_id_to_name[gene_id] row = {"feature": {"fn": gene_name, "id": gene_id}} @@ -246,8 +259,8 @@ def diffexp_table(diffexp, clustering, analysis: SingleGenomeAnalysis): greyed = bool(log2fc <= 0 or adj_p_value >= ws_gex_constants.PVALUE_DEEMPHASIS_CUTOFF) - cn = f"c{j + 1}" - row[cn] = DifferentialExpressionTableValue(adj_p_value, log2fc, greyed) + cluster_num = f"c{j + 1}" + row[cluster_num] = DifferentialExpressionTableValue(adj_p_value, log2fc, greyed) table.append(row) @@ -282,12 +295,12 @@ def _get_unit_and_plt_type(is_spatial: bool = False, is_insitu: bool = False): def analysis_by_clustering_helper( analysis: SingleGenomeAnalysis, + projection: Projection, spatial: bool = False, insitu: bool = False, library_type: str = rna_library.GENE_EXPRESSION_LIBRARY_TYPE, projection_marker_opacity: float = 0.9, projection_marker_size: float = 4, - projection: str = TSNE_NAME, downsample_mask: np.ndarray | None = None, ): """Constructs a ClusteringSelector object from a SingleGenomeAnalyis. @@ -302,8 +315,8 @@ def analysis_by_clustering_helper( Defaults to 0.9. projection_marker_size (float, optional): plotting marker size. Defaults to 4. - projection (str, optional): Which manifold projection to use in - plotting: 'tsne' or 'umap'. Defaults to 'tsne'. + projection (Projection): Which manifold projection to use in + plotting: 'tsne' or 'umap'. downsample_mask (Optional[np.ndarray], optional): downsample points. Defaults to None. @@ -317,7 +330,7 @@ def analysis_by_clustering_helper( assert projection in (TSNE_NAME, UMAP_NAME) # pylint: disable=too-many-function-args,too-many-locals - key = get_tsne_key(library_type, 2) + key = get_projection_key(library_type, 2) unit, plt_type = _get_unit_and_plt_type(spatial, insitu) @@ -325,17 +338,13 @@ def analysis_by_clustering_helper( if key not in analysis.tsne: return None proj_coords = analysis.get_tsne(key=key).transformed_tsne_matrix - layout = deepcopy(TSNE_LAYOUT_CONFIG) - layout["title"] = f"t-SNE Projection of {unit} by Clustering" elif projection == UMAP_NAME: if key not in analysis.umap: return None proj_coords = analysis.get_umap(key=key).transformed_umap_matrix - layout = deepcopy(UMAP_LAYOUT_CONFIG) - layout["title"] = f"UMAP Projection of {unit} by Clustering" - else: - raise NotImplementedError("projection must be 'tsne' or 'umap'") + layout = projection_layout_config(projection=projection).copy() + layout["title"] = f"{PROJECTION_TITLE[projection]} Projection of {unit} by Clustering" layout["hover_mode"] = "closest" if downsample_mask is not None: @@ -364,7 +373,7 @@ def analysis_by_clustering_helper( diftblclust = ClusteringData( key=clustering_key, clustering=clustering, - data=diffexp_table( + data=diffexp_table_from_analysis( analysis.differential_expression[clustering_key], clustering, analysis ), ) @@ -387,16 +396,23 @@ def analysis_by_clustering_helper( SPATIAL_TSNE_CLUSTERING_PLOT_HELP, SPATIAL_DIFFEXP_TABLE_HELP ) else: - clust_select = ClusteringSelector(TSNE_CLUSTERING_PLOT_HELP, DIFFEXP_TABLE_HELP) + clust_select = ClusteringSelector( + projection_clustering_plot_help(projection=projection), DIFFEXP_TABLE_HELP + ) + clust_select.right_plots = proj_data clust_select.tables = diff_exp_tables return clust_select def analysis_by_clustering( - sample_data, spatial=False, library_type=rna_library.GENE_EXPRESSION_LIBRARY_TYPE + sample_data, + spatial=False, + library_type=rna_library.GENE_EXPRESSION_LIBRARY_TYPE, + *, + projection: Projection, ): - """Get the tSNE (colored by clustering) and diffexp table for each clustering.""" + """Get the tSNE/UMAP (colored by clustering) and diffexp table for each clustering.""" if sample_data is None: return None @@ -405,30 +421,51 @@ def analysis_by_clustering( return None return analysis_by_clustering_helper( analysis, + projection=projection, spatial=spatial, library_type=library_type, - projection_marker_size=3 - if analysis.matrix.bcs_dim > ws_gex_constants.MAX_WEBSHIM_BCS_DIM - else 4, + projection_marker_size=( + 3 if analysis.matrix.bcs_dim > ws_gex_constants.MAX_WEBSHIM_BCS_DIM else 4 + ), ) -def umi_on_tsne_helper(analysis: SingleGenomeAnalysis, spatial: bool = False, library_type=None): - """Get the tSNE projections for a given library adn retun the left-side plot as json.""" +def umi_on_projection_helper( + analysis: SingleGenomeAnalysis, + spatial: bool = False, + library_type=None, + tag_type=None, + *, + projection: Projection, +): + """Get the t-SNE/UMAP projections for a given library and retun the left-side plot as json.""" if library_type is None: - proj_coords = analysis.get_tsne().transformed_tsne_matrix + + if projection == TSNE_NAME: + proj_coords = analysis.get_tsne().transformed_tsne_matrix + else: + proj_coords = analysis.get_umap().transformed_umap_matrix reads_per_bc = analysis.matrix.get_counts_per_bc() else: - key = get_tsne_key(library_type, 2) - if key not in analysis.tsne: - return None - proj_coords = analysis.get_tsne(key=key).transformed_tsne_matrix - matrix = analysis.matrix.select_features_by_type(library_type) - reads_per_bc = matrix.get_counts_per_bc() + key = get_projection_key(library_type, 2) + if projection == TSNE_NAME: + if key not in analysis.tsne: + return None + proj_coords = analysis.get_tsne(key=key).transformed_tsne_matrix + else: + assert projection == UMAP_NAME + if key not in analysis.umap: + return None + proj_coords = analysis.get_umap(key=key).transformed_umap_matrix + if tag_type is None: + matrix = analysis.matrix.select_features_by_type(library_type) + reads_per_bc = matrix.get_counts_per_bc() + else: + matrix = analysis.matrix.select_features_by_type_and_tag(library_type, tag_type) + reads_per_bc = matrix.get_counts_per_bc() color = get_umi_color(reads_per_bc) unit, plt_type = _get_unit_and_plt_type(spatial) - title = f"t-SNE Projection of {unit} Colored by UMI Counts" data = [ { "name": unit, @@ -447,16 +484,15 @@ def umi_on_tsne_helper(analysis: SingleGenomeAnalysis, spatial: bool = False, li "text": [f"{reads:,d}" for reads in reads_per_bc], } ] - # Note: the help text has been included in tsne_cluster plot - layout = TSNE_LAYOUT_CONFIG.copy() - layout["title"] = title - umi_tsne_plot = { + layout = projection_layout_config(projection=projection).copy() + layout["title"] = f"{PROJECTION_TITLE[projection]} Projection of {unit} Colored by UMI Counts" + umi_projection_plot = { "config": pltly.PLOT_CONFIG, "layout": layout, "data": data, } - return umi_tsne_plot + return umi_projection_plot def get_umi_color(umi_per_bc): @@ -468,60 +504,84 @@ def get_umi_color(umi_per_bc): return color -def umi_on_tsne_plot( - sample_data, spatial=False, library_type=rna_library.GENE_EXPRESSION_LIBRARY_TYPE +def umi_on_projection_plot( + sample_data, + *, + spatial, + library_type, + tag_type, + projection: Projection, ): """UMI count on tSNE plot.""" if sample_data is None: return None analysis = sample_data.get_analysis(SingleGenomeAnalysis) + if analysis is None: return None - return umi_on_tsne_helper(analysis, spatial=spatial, library_type=library_type) + return umi_on_projection_helper( + analysis, + spatial=spatial, + library_type=library_type, + tag_type=tag_type, + projection=projection, + ) ########################### Only used in multi stages ####################################### -def tsne_diffexp_plots_from_path(analysis_dir, library_type=None): +def projection_diffexp_plots_from_path(analysis_dir, *, projection: Projection, library_type=None): """Given the base analysis directory for a single genome analysis h5 file,. - Get the tSNEs (left-right plots colored by clustering and umi counts) + Get the tSNE/UMAPs (left-right plots colored by clustering and umi counts) and diffexp table for each clustering """ if analysis_dir is None: return None - analysis = SingleGenomeAnalysis.load_default_format(analysis_dir, "pca") + analysis = SingleGenomeAnalysis.load_default_format( + analysis_dir, method="pca", projections=(projection,) + ) if analysis is None: return None # right (colored by clustering) tsne plot and gene expression table - plots = analysis_by_clustering_helper(analysis, spatial=False, library_type=library_type) + plots = analysis_by_clustering_helper( + analysis, projection=projection, spatial=False, library_type=library_type + ) # left (colored by umi count) tsne plot if plots: - left_plots = umi_on_tsne_helper(analysis, spatial=False, library_type=library_type) + left_plots = umi_on_projection_helper( + analysis, spatial=False, library_type=library_type, projection=projection + ) if left_plots: plots.left_plots = left_plots return plots -def umi_on_tsne_from_path(analysis_dir, library_type=None): +def umi_on_projection_from_path( + analysis_dir, projection: Projection, library_type=None, tag_type=None +): """Given the base analysis directory for a single genome analysis h5,. - Get the tSNE colored by umi counts, optionally filtered for a specific library type + Get the t-SNE/UMAP colored by umi counts, optionally filtered for a specific library type """ # pylint: disable=missing-function-docstring if analysis_dir is None: return None - analysis = SingleGenomeAnalysis.load_default_format(analysis_dir, "pca") + analysis = SingleGenomeAnalysis.load_default_format( + analysis_dir, method="pca", projections=(projection,) + ) if analysis is None: return None # left (colored by umi count) tsne plot - return umi_on_tsne_helper(analysis, spatial=False, library_type=library_type) + return umi_on_projection_helper( + analysis, spatial=False, library_type=library_type, tag_type=tag_type, projection=projection + ) diff --git a/lib/python/cellranger/websummary/helpers.py b/lib/python/cellranger/websummary/helpers.py index 3064814..9c92501 100644 --- a/lib/python/cellranger/websummary/helpers.py +++ b/lib/python/cellranger/websummary/helpers.py @@ -5,6 +5,6 @@ from __future__ import annotations -def get_tsne_key(feature_type, n_components): - """Return the correct tsne key for each feature type and number of components, e.g. gene_expression_2.""" +def get_projection_key(feature_type, n_components): + """Return the correct tsne/umap key for each feature type and number of components, e.g. gene_expression_2.""" return "{}_{}".format(feature_type.replace(" ", "_").lower(), n_components).encode() diff --git a/lib/python/cellranger/websummary/histograms.py b/lib/python/cellranger/websummary/histograms.py index 372e14b..28c4f46 100644 --- a/lib/python/cellranger/websummary/histograms.py +++ b/lib/python/cellranger/websummary/histograms.py @@ -24,6 +24,7 @@ DEFAULT_MAX_HISTOGRAMS = 120 MHC_ALLELE = "mhc_allele" TARGETING_ANTIGEN = "targeting_antigen" +HASHTAG_LABEL = " (Hashtag)" class HistogramData(NamedTuple): @@ -75,12 +76,12 @@ def make_histogram_help(is_antibody, is_spatial): return { "helpText": f"Only {link_text} antibodies with total UMI counts over {MIN_COUNTS_PER_ANTIBODY:,} are plotted, and only up to the top {DEFAULT_MAX_HISTOGRAMS} Antibodies by UMI count are shown. " f"The X-axis is the UMI counts in the log scale, while the Y-axis is the number of {spot_or_cell} observed with that UMI count.", - "title": "Histogram of Antibody Counts", + "title": "Histogram of Antibody UMI Counts", } else: return { "helpText": f"Only Antigens with non-zero total UMI counts in the library are shown. The X-axis is the UMI counts in log scale while the Y-axis is the number of {spot_or_cell} observed with that UMI count. The histogram excludes the 0 data point i.e. the number of barcodes with 0 UMI counts for a given Antigen.\nDouble-click on the name of any feature in the plot legend to view the UMI counts only for that feature.", - "title": "Histogram of Antigen Counts", + "title": "Histogram of Antigen UMI Counts", } @@ -149,6 +150,7 @@ def make_histogram_as_bar_plot( "opacity": 0.6, "name": cnts.name, "marker": {"color": color_map[cnts.name]}, + "showlegend": True, } if cnts.group is not None and cnts.group != "": trace["legendgroup"] = cnts.group @@ -168,7 +170,7 @@ def make_histogram_as_bar_plot( return plot -def make_antibody_histograms(ab_matrix, is_spatial): +def make_antibody_histograms(ab_matrix, is_spatial, hashtags=None): """Take an antibody or antigen barcode matrix and generate json for web summary histograms. This is also used to define whether the antibody tab should be inserted into the websummary. @@ -203,6 +205,10 @@ def make_antibody_histograms(ab_matrix, is_spatial): else: control_suffix = [""] * ab_matrix.features_dim vector_names = [ensure_str(x) for x in ab_matrix.feature_ids_map.keys()] + + # Specify which features are hashtags. + hashtags = hashtags or [] + vector_names = [f"{x}{HASHTAG_LABEL}" if x in hashtags else x for x in vector_names] color_map = make_color_map(vector_names, jibes_plot=False) data = [] for ( @@ -212,10 +218,11 @@ def make_antibody_histograms(ab_matrix, is_spatial): cnts = ab_counts[index, :] if not is_antibody: cnts = cnts[cnts != 0] + hashtag_label_value = HASHTAG_LABEL if feature_id.decode("utf-8") in hashtags else "" data.append( HistogramData( cnts, - ensure_str(feature_id), + (f"{ensure_str(feature_id)}{hashtag_label_value}"), legend_group[index], control_suffix[index], ) diff --git a/lib/python/cellranger/websummary/metrics.py b/lib/python/cellranger/websummary/metrics.py index 82115ef..2595000 100644 --- a/lib/python/cellranger/websummary/metrics.py +++ b/lib/python/cellranger/websummary/metrics.py @@ -167,21 +167,25 @@ def gen_metric( # alarm ranges are dependent on debug, which indicates internal or customer-facing. alert_name_map = { - WARNING_THRESHOLD: metric_info.alert_warn_name + alert_name_suffix - if metric_info.alert_warn_name - else None, - ERROR_THRESHOLD: metric_info.alert_error_name + alert_name_suffix - if metric_info.alert_error_name - else None, + WARNING_THRESHOLD: ( + metric_info.alert_warn_name + alert_name_suffix + if metric_info.alert_warn_name + else None + ), + ERROR_THRESHOLD: ( + metric_info.alert_error_name + alert_name_suffix + if metric_info.alert_error_name + else None + ), } # This appears under detail when an alert is raised alert_detail_map = { - WARNING_THRESHOLD: metric_info.alert_warn_detail - if debug - else metric_info.alert_warn_detail_cs, - ERROR_THRESHOLD: metric_info.alert_error_detail - if debug - else metric_info.alert_error_detail_cs, + WARNING_THRESHOLD: ( + metric_info.alert_warn_detail if debug else metric_info.alert_warn_detail_cs + ), + ERROR_THRESHOLD: ( + metric_info.alert_error_detail if debug else metric_info.alert_error_detail_cs + ), } acceptable = metric_info.acceptable if debug else metric_info.acceptable_cs targeted = metric_info.targeted if debug else metric_info.targeted_cs @@ -342,13 +346,6 @@ def __init__(self): self._override_metric_settings(file_path) -class SpatialTargetedCompareMetricAnnotations(SpatialMetricAnnotations): - def __init__(self): - super().__init__() - file_path = os.path.join(os.path.dirname(__file__), "spatial_targeted_compare_metrics.csv") - self._override_metric_settings(file_path) - - class SpatialTemplateLigationMetricAnnotations(SpatialMetricAnnotations): def __init__(self): super().__init__() @@ -386,11 +383,6 @@ def __init__(self): self._override_metric_settings(file_path) -class TargetedCompareMetricAnnotations(MetricAnnotations): - def __init__(self): - super().__init__("targeted_compare_metrics.csv") - - class LTMetricAnnotations(MetricAnnotations): def __init__(self, intron_mode_alerts=False): super().__init__(intron_mode_alerts=intron_mode_alerts) @@ -563,14 +555,12 @@ def threshold_type(self): if self.evaluation_function(self.value, self.targeted): return VALID_THRESHOLD return WARNING_THRESHOLD + elif self.evaluation_function(self.value, self.targeted): + return VALID_THRESHOLD + elif self.evaluation_function(self.value, self.acceptable): + return WARNING_THRESHOLD else: - # Both set - error/warn depending on which we meet. - if self.evaluation_function(self.value, self.targeted): - return VALID_THRESHOLD - elif self.evaluation_function(self.value, self.acceptable): - return WARNING_THRESHOLD - else: - return ERROR_THRESHOLD + return ERROR_THRESHOLD @property def color(self): @@ -653,12 +643,16 @@ def gen_metric(self, key, value, debug=False, chain=None): name = name.format(chain=chain) alert_name_map = { - WARNING_THRESHOLD: metric_info.alert_warn_name.format(chain=chain) - if metric_info.alert_warn_name - else None, - ERROR_THRESHOLD: metric_info.alert_error_name.format(chain=chain) - if metric_info.alert_error_name - else None, + WARNING_THRESHOLD: ( + metric_info.alert_warn_name.format(chain=chain) + if metric_info.alert_warn_name + else None + ), + ERROR_THRESHOLD: ( + metric_info.alert_error_name.format(chain=chain) + if metric_info.alert_error_name + else None + ), } # alarm ranges are dependent on debug, which indicates internal or customer-facing. @@ -708,11 +702,10 @@ def gen_metric_list(self, value_dict, keys, debug=False, chain_type=None): ) else: print(f"{full_key} not found in metrics") + elif key in value_dict: + output.append(self.gen_metric(key, value_dict[key], debug=debug)) else: - if key in value_dict: - output.append(self.gen_metric(key, value_dict[key], debug=debug)) - else: - print(f"{key} not found in metrics") + print(f"{key} not found in metrics") return output def gen_metric_helptext(self, keys, chain_type=None): @@ -726,10 +719,9 @@ def gen_metric_helptext(self, keys, chain_type=None): for chain in load_chains_from_chain_type(chain_type): full_name = metric_info.full_name.format(chain=chain) output += [[full_name, [metric_info.help_description.format(chain=chain)]]] - else: - if metric_info.help_description is not None: - full_name = metric_info.full_name - output += [[full_name, [metric_info.help_description]]] + elif metric_info.help_description is not None: + full_name = metric_info.full_name + output += [[full_name, [metric_info.help_description]]] else: print(f"{key} not found in registered metrics") return output diff --git a/lib/python/cellranger/websummary/react_components.py b/lib/python/cellranger/websummary/react_components.py index da8ce24..02afd34 100644 --- a/lib/python/cellranger/websummary/react_components.py +++ b/lib/python/cellranger/websummary/react_components.py @@ -636,9 +636,9 @@ def _format_antibody_clustering_selector(self): Also, invalidate the reference. """ if self._antibody_clustering_selector: - self.antibody_tab[ - WebSummaryData._ANTIBODY_CLUSTERING_SELECTOR - ] = self._antibody_clustering_selector + self.antibody_tab[WebSummaryData._ANTIBODY_CLUSTERING_SELECTOR] = ( + self._antibody_clustering_selector + ) self._antibody_clustering_selector = None def _get_safe(self, key): diff --git a/lib/python/cellranger/websummary/sample_properties.py b/lib/python/cellranger/websummary/sample_properties.py index 0d6efa4..ea9288b 100644 --- a/lib/python/cellranger/websummary/sample_properties.py +++ b/lib/python/cellranger/websummary/sample_properties.py @@ -5,7 +5,11 @@ from __future__ import annotations +import json +from dataclasses import dataclass + import martian +from typing_extensions import Self from cellranger.chemistry import ( CHEMISTRY_SC3P_LT, @@ -15,6 +19,11 @@ ) from cellranger.version import get_version +CYTASSIST_RUN_NAME_KEY = "cytassistRunName" +CYTASSIST_SERIAL_KEY = "cytassistInstrumentSerial" +CYTASSIST_SOFTWARE_VERSION = "cytassistInstrumentSoftwareVersion" +CYTASSIST_NOT_FOUND_SENTINEL = "Not Found" + class SampleProperties: """Sample properties.""" @@ -32,6 +41,36 @@ def __init__(self, sample_id, sample_desc, version_from_git=False): self.version = get_version() +@dataclass +class CytassistRunProperties: + cytassist_run_name: str + cytassist_instrument_serial: str + cytassist_instrument_software_version: str + + @classmethod + def from_json(cls, json_path: str | bytes) -> Self: + with open(json_path) as f: + metadata = json.load(f) + + return cls( + cytassist_run_name=( + metadata.get(CYTASSIST_RUN_NAME_KEY) + if metadata.get(CYTASSIST_RUN_NAME_KEY) + else CYTASSIST_NOT_FOUND_SENTINEL + ), + cytassist_instrument_serial=( + metadata.get(CYTASSIST_SERIAL_KEY) + if metadata.get(CYTASSIST_SERIAL_KEY) + else CYTASSIST_NOT_FOUND_SENTINEL + ), + cytassist_instrument_software_version=( + metadata.get(CYTASSIST_SOFTWARE_VERSION) + if metadata.get(CYTASSIST_SOFTWARE_VERSION) + else CYTASSIST_NOT_FOUND_SENTINEL + ), + ) + + # pylint: disable=too-many-instance-attributes class CountSampleProperties(SampleProperties): """Sample properties for Count, Aggr, Reanalyze, Spatial web summaries.""" @@ -47,12 +86,13 @@ class CountSampleProperties(SampleProperties): aligner: str | None redundant_loupe_alignment: bool loupe_alignment_file: str | None - v1_filtered_fbm: str | None + v1_pattern_fix: dict | None default_layout: bool | None override_id: bool | None slide_id_mismatch: bool | None is_visium_hd: bool | None cmdline: str | None + itk_error_string: str | None # pylint: disable=too-many-locals def __init__( @@ -71,12 +111,13 @@ def __init__( aligner=None, redundant_loupe_alignment=False, loupe_alignment_file=None, - v1_filtered_fbm=None, + v1_pattern_fix=None, default_layout=False, override_id=False, slide_id_mismatch=False, is_visium_hd=False, cmdline=None, + itk_error_string=None, ): super().__init__(sample_id, sample_desc, version_from_git=version_from_git) self.genomes = genomes @@ -90,12 +131,13 @@ def __init__( self.aligner = aligner self.redundant_loupe_alignment = redundant_loupe_alignment self.loupe_alignment_file = loupe_alignment_file - self.v1_filtered_fbm = v1_filtered_fbm + self.v1_pattern_fix = v1_pattern_fix self.default_layout = default_layout self.override_id = override_id self.slide_id_mismatch = slide_id_mismatch self.is_visium_hd = is_visium_hd self.cmdline = cmdline + self.itk_error_string = itk_error_string @property def is_targeted(self): @@ -111,6 +153,7 @@ class ExtendedCountSampleProperties(CountSampleProperties): reference_path: str chemistry_defs: ChemistryDefs + cytassist_run_properties: CytassistRunProperties | None # pylint: disable=too-many-locals def __init__( @@ -132,12 +175,14 @@ def __init__( aligner=None, redundant_loupe_alignment=False, loupe_alignment_file=None, - v1_filtered_fbm=None, + v1_pattern_fix=None, default_layout=False, override_id=False, slide_id_mismatch=False, is_visium_hd=False, cmdline=None, + cytassist_run_metrics=None, + itk_error_string=None, ): super().__init__( sample_id, @@ -154,16 +199,21 @@ def __init__( aligner=aligner, redundant_loupe_alignment=redundant_loupe_alignment, loupe_alignment_file=loupe_alignment_file, - v1_filtered_fbm=v1_filtered_fbm, + v1_pattern_fix=v1_pattern_fix, default_layout=default_layout, override_id=override_id, slide_id_mismatch=slide_id_mismatch, is_visium_hd=is_visium_hd, cmdline=cmdline, + itk_error_string=itk_error_string, ) self.reference_path = reference_path self.chemistry_defs = chemistry_defs self.disable_ab_aggregate_detection = disable_ab_aggregate_detection + if cytassist_run_metrics: + self.cytassist_run_properties = CytassistRunProperties.from_json(cytassist_run_metrics) + else: + self.cytassist_run_properties = None def chemistry_description(self) -> str: """Return the chemistry description of the primary chemistry.""" diff --git a/lib/python/cellranger/websummary/summary_tab.py b/lib/python/cellranger/websummary/summary_tab.py index 414c85d..83b4448 100644 --- a/lib/python/cellranger/websummary/summary_tab.py +++ b/lib/python/cellranger/websummary/summary_tab.py @@ -425,19 +425,46 @@ def _get_chemistry_description( return chemistry_description if sample_data.targeting_method == TARGETING_METHOD_TL: + # covers both fresh/fixed frozen and FFPE products # Determine the assay from the chemistry. - assay = { - "Visium V1 Slide": "FFPE v1", - "Visium V2 Slide": "FFPE v1", - "Visium V3 Slide": "FFPE v2", - "Visium V4 Slide": "FFPE v2", - "Visium V5 Slide": "FFPE v2", - }.get(chemistry_description, "FFPE") + assay_version = { + "Visium V1 Slide": "v1", + "Visium V2 Slide": "v1", + "Visium V3 Slide": "v2", + "Visium V4 Slide": "v2", + "Visium V5 Slide": "v2", + "Visium HD v1": "v1", + }.get(chemistry_description) + assay_base = {"Visium HD v1": "HD probe-based"}.get(chemistry_description, "Probe-based") + assay = f"{assay_base} {assay_version}" if assay_version else assay_base elif sample_data.targeting_method == TARGETING_METHOD_HC: assay = "Targeted" else: assay = "3'" - return f"{chemistry_description } - {assay}" + sanitised_chemistry_description = {"Visium HD v1": "Visium HD H1 Slide"}.get( + chemistry_description, chemistry_description + ) + return f"{sanitised_chemistry_description} - {assay}" + + +def _add_throughput_to_chemistry(chemistry_desc: str, sample_data: SampleData) -> str: + throughput_inferred = sample_data.summary.get(THROUGHPUT_INFERRED_METRIC) + + chemistry_with_throughput = chemistry_desc + if throughput_inferred == HT_THROUGHPUT and chemistry_desc[-2:] not in [ + LT_THROUGHPUT, + MT_THROUGHPUT, + HT_THROUGHPUT, + ]: + chemistry_with_throughput = f"{chemistry_desc} {HT_THROUGHPUT}" + + if ( + chemistry_desc.endswith(HT_THROUGHPUT) + and throughput_inferred + and throughput_inferred != HT_THROUGHPUT + ): + sample_data.summary[INCONSISTENT_THROUGHPUT_METRIC] = HT_THROUGHPUT + return chemistry_with_throughput # pylint: disable=too-many-branches @@ -466,34 +493,40 @@ def pipeline_info_table( alarms = [] - throughput_inferred = sample_data.summary.get(THROUGHPUT_INFERRED_METRIC) - # Get the chemistry description for the sample(s) if isinstance(sample_properties, AggrCountSampleProperties) and sample_defs: chemistry_row = [] for sample_def in sample_defs: chemistry = _get_chemistry_description(sample_data=sample_data, sample_def=sample_def) chemistry_row.append([f"Chemistry ({sample_def['library_id']})", chemistry]) + elif not sample_properties.is_spatial and isinstance( + sample_properties, ExtendedCountSampleProperties + ): + # We may have different chemistries per library; need to collect them. + # If chemistry for every library is the same, only produce one line. + # Do not do this for spatial. + chem_desc_unique = set( + chem_def["description"] for chem_def in sample_properties.chemistry_defs.values() + ) + if len(chem_desc_unique) == 1: + chemistry_row = [ + ["Chemistry", _add_throughput_to_chemistry(chem_desc_unique.pop(), sample_data)] + ] + else: + chemistry_row = [ + [ + f"Chemistry ({lib_type})", + _add_throughput_to_chemistry(chem_def["description"], sample_data), + ] + for (lib_type, chem_def) in sample_properties.chemistry_defs.items() + ] + # Ensure stable ordering by alphabetized library type. + chemistry_row.sort() else: chemistry = _get_chemistry_description( sample_data=sample_data, sample_properties=sample_properties ) - - chemistry_with_throughput = chemistry - if throughput_inferred == HT_THROUGHPUT and chemistry[-2:] not in [ - LT_THROUGHPUT, - MT_THROUGHPUT, - HT_THROUGHPUT, - ]: - chemistry_with_throughput = f"{chemistry} {HT_THROUGHPUT}" - - if ( - chemistry.endswith(HT_THROUGHPUT) - and throughput_inferred - and throughput_inferred != HT_THROUGHPUT - ): - sample_data.summary[INCONSISTENT_THROUGHPUT_METRIC] = HT_THROUGHPUT - chemistry_row = [["Chemistry", chemistry_with_throughput]] + chemistry_row = [["Chemistry", _add_throughput_to_chemistry(chemistry, sample_data)]] if pipeline == shared_constants.PIPELINE_AGGR: run_identifier = "Run" @@ -556,7 +589,7 @@ def pipeline_info_table( ref_version_key = f"{prefix}{cr_constants.REFERENCE_VERSION_KEY}" if ref_version_key in sample_data.summary: - ref_version = "-%s" % sample_data.summary.get(ref_version_key) + ref_version = f"-{sample_data.summary.get(ref_version_key)}" else: ref_version = "" @@ -577,10 +610,7 @@ def pipeline_info_table( and sample_properties.is_spatial and pipeline not in shared_constants.PIPELINE_AGGR ): - if ( - sample_properties.reorientation_mode == "rotation" - or sample_properties.reorientation_mode == "rotation+mirror" - ): + if sample_properties.reorientation_mode in ("rotation", "rotation+mirror"): rows.append(["Image Reorientation", "On"]) else: rows.append(["Image Reorientation", "Off"]) @@ -598,6 +628,29 @@ def pipeline_info_table( if sample_data.targeting_method == TARGETING_METHOD_TL: rows.append(["Filter Probes", "Off" if sample_properties.filter_probes is False else "On"]) + # add cytassist metadata + if ( + isinstance(sample_properties, ExtendedCountSampleProperties) + and sample_properties.is_spatial + and sample_properties.cytassist_run_properties + ): + rows.extend( + [ + [ + "CytAssist Run Name", + sample_properties.cytassist_run_properties.cytassist_run_name, + ], + [ + "CytAssist Instrument Serial ID", + sample_properties.cytassist_run_properties.cytassist_instrument_serial, + ], + [ + "CytAssist Instrument Software Version", + sample_properties.cytassist_run_properties.cytassist_instrument_software_version, + ], + ] + ) + pipeline_info = { "header": ["Sample"], "rows": rows, @@ -641,10 +694,10 @@ def pipeline_info_table( } to_return[ALARMS].extend([aligner_info_alarm]) - # chevron downsampling + # pattern downsampling if ( isinstance(sample_properties, CountSampleProperties) - and sample_properties.v1_filtered_fbm + and sample_properties.v1_pattern_fix and sample_properties.is_spatial ): if ALARMS not in to_return: @@ -678,13 +731,14 @@ def pipeline_info_table( isinstance(sample_properties, CountSampleProperties) and sample_properties.override_id and sample_properties.is_visium_hd + and sample_properties.loupe_alignment_file is None ): if ALARMS not in to_return: to_return[ALARMS] = [] override_id_alarm = { "formatted_value": None, "title": "Override ID Used", - "message": "Visium HD slide ID entered on the CytAssist instrument was overridden by the slide ID provided to the Space Ranger pipeline. Confirm that the slide ID matches the slide used to generate the dataset.", + "message": "Visium HD slide ID entered on the CytAssist instrument was overridden by the inputs provided to the Space Ranger pipeline. Confirm that the slide ID matches the slide used to generate the dataset.", "level": WARNING_THRESHOLD, } to_return[ALARMS].extend([override_id_alarm]) @@ -705,6 +759,23 @@ def pipeline_info_table( } to_return[ALARMS].extend([slide_id_mismatch_alarm]) + if ( + isinstance(sample_properties, CountSampleProperties) + and sample_properties.itk_error_string + and sample_properties.is_visium_hd + ): + if ALARMS not in to_return: + to_return[ALARMS] = [] + itk_error_alarm = { + "formatted_value": None, + "title": "Tissue Registration", + "message": "CytAssist to microscope image registration metrics indicate a possible poor alignment. " + "Review your registration carefully. If automated registration performs poorly, perform manual alignment via " + "Loupe Browser.", + "level": WARNING_THRESHOLD, + } + to_return[ALARMS].extend([itk_error_alarm]) + # If Isotype Normalization was used if sample_data.summary.get("ANTIBODY_isotype_normalized") is not None: rows.append(["Isotype Normalization", sample_data.summary["ANTIBODY_isotype_normalized"]]) @@ -775,12 +846,15 @@ def create_table_with_alarms( return result -def sequencing_table(metadata, sample_data, species_list, is_targeted=False): +def sequencing_table(metadata, sample_data, species_list, is_targeted=False, is_hd=False): """Sequencing info for GEX.""" + metric_keys = SEQUENCING_METRIC_KEYS if not is_targeted else TARGETED_SEQUENCING_METRIC_KEYS + if is_hd: + metric_keys.append("filtered_bcs_conf_mapped_barcoded_reads_cum_frac") return create_table_with_alarms( "sequencing", "Sequencing", - SEQUENCING_METRIC_KEYS if not is_targeted else TARGETED_SEQUENCING_METRIC_KEYS, + metric_keys, SEQUENCING_ALARM_KEYS, metadata, sample_data, @@ -833,10 +907,12 @@ def mapping_table(metadata, sample_data, species_list): return create_table_with_alarms( "mapping", "Mapping", - MAPPING_KEYS - if "targeting_method" not in sample_data.summary - or sample_data.targeting_method == TARGETING_METHOD_HC - else TEMP_LIG_MAPPING_KEYS, + ( + MAPPING_KEYS + if "targeting_method" not in sample_data.summary + or sample_data.targeting_method == TARGETING_METHOD_HC + else TEMP_LIG_MAPPING_KEYS + ), alarm_keys, metadata, sample_data, @@ -1045,7 +1121,7 @@ def split_table_by_samples(table, table_name): for row_name in all_samples: row_content = [row_name] for metric_name in all_metrics: - row_content.append(data[row_name][metric_name]) + row_content.append(data[row_name].get(metric_name, float("NaN"))) new_rows.append(row_content) table[table_name]["table"]["header"] = ["Sample ID"] + all_metrics diff --git a/lib/python/cellranger/websummary/treemaps.py b/lib/python/cellranger/websummary/treemaps.py index 4d6d10f..9164c74 100644 --- a/lib/python/cellranger/websummary/treemaps.py +++ b/lib/python/cellranger/websummary/treemaps.py @@ -132,20 +132,22 @@ def make_antibody_treemap_plot(ab_matrix, lib_type, subset_features, is_spatial= labels=["" + label + "" for label in antibody_label], values=ab_frac_values, parents=[""] * len(antibody_label), - text=list( - map( - "
".join, - zip( - [ - "" + name + barcodes_or_cells + "" - for name in barcodes_per_feature - ], - ["" + name + "" for name in secondary_names], - ), + text=( + list( + map( + "
".join, + zip( + [ + "" + name + barcodes_or_cells + "" + for name in barcodes_per_feature + ], + ["" + name + "" for name in secondary_names], + ), + ) ) - ) - if has_secondary_name - else barcodes_per_feature_labs, + if has_secondary_name + else barcodes_per_feature_labs + ), marker_colorscale="Blackbody", hovertemplate=hover_text, ) diff --git a/lib/python/cellranger/websummary/vdj.py b/lib/python/cellranger/websummary/vdj.py index cb6fa4c..90d736f 100644 --- a/lib/python/cellranger/websummary/vdj.py +++ b/lib/python/cellranger/websummary/vdj.py @@ -353,7 +353,7 @@ def vdj_clonotype_table(sample_data): clonotypes in the analysis tab """ assert sample_data.vdj_clonotype_summary is not None - table_heading = ["Clonotype ID", "CDR3s", "Frequency", "Proportion"] + table_heading = ["Clonotype ID", "CDR3s", "Number of cells", "Fraction of cells"] table_help = { "title": "Top 10 Clonotype CDR3 Sequences", "data": [ @@ -362,8 +362,8 @@ def vdj_clonotype_table(sample_data): [ 'This table lists the CDR3 sequence of the first exact subclonotype of the 10 \ most abundant clonotypes in this sample. For each of the top 10 clonotypes, \ - the constant region, number of cells (frequency), and what percentage of the \ - dataset those cells occupy (proportion) are also displayed. For the full table \ + the constant region, number of cells, and what percentage of the \ + dataset those cells occupy (Fraction of cells) are also displayed. For the full table \ and more details, please refer to the "clonotypes.csv" and \ "consensus_annotations.csv" files produced by the pipeline.', ], diff --git a/lib/python/cellranger/websummary/violin_plots.py b/lib/python/cellranger/websummary/violin_plots.py index c09887e..f468a6c 100644 --- a/lib/python/cellranger/websummary/violin_plots.py +++ b/lib/python/cellranger/websummary/violin_plots.py @@ -1,13 +1,14 @@ -#!/usr/bin/env python -# +# !/usr/bin/env python + # Copyright (c) 2022 10X Genomics, Inc. All rights reserved. -# + """Code to produce altair umi and Genes distribution plots for the websummary.""" import altair as alt -import numpy as np import pandas as pd +import polars as pl import cellranger.altair_utils as alt_utils +import cellranger.matrix as cr_matrix from cellranger.analysis.singlegenome import SingleGenomeAnalysis from cellranger.webshim.data import SampleData from cellranger.websummary.numeric_converters import round_floats_in_list @@ -15,6 +16,116 @@ alt.data_transformers.disable_max_rows() +def _make_boxplot(counts: str): + """Helper function to make a base boxplot. + + Args: + counts(string): the name of the colum with the counts for plotting + """ + boxplot = alt.Chart().mark_boxplot(color="grey").encode(y=alt.Y(f"{counts}:Q", title="")) + return boxplot + + +def _make_violin_plot( + data, counts: str, group_by_name: str, y_label: str, set_scale: bool, logy: bool = False +): + """Helper function to make a base violin plot. + + Args: + data(DataFrame): data to use for the plot. can be pandas or polars + counts(string): the name of the colum with the counts for plotting + group_by_name (string): name of the column that data should be grouped by + y_label(string): name of the y-axis label + set_scale(bool): set a custom color scale. Useful for spatial ws plots + logy(bool): log the y-axis + """ + # Conditional color scaling + if set_scale: + color_scale = alt.Scale(domain=data.variable.unique(), range=["black", "red"]) + x_scale = alt.Scale(nice=False, zero=True, padding=100) + else: + color_scale = alt.Scale() + x_scale = alt.Scale(nice=False, zero=False) + + y_axis = ( + alt.Y(f"{counts}:Q", title=y_label).scale(type="log") + if logy + else alt.Y(f"{counts}:Q", title=y_label) + ) + + violin = ( + alt.Chart() + .transform_density( + f"{counts}", + as_=[f"{counts}", "density"], + groupby=[f"{group_by_name}"], + extent=[1, max(data[f"{counts}"]) + 0.5] if logy else [0, max(data[f"{counts}"]) + 0.5], + ) + .mark_area(orient="horizontal", opacity=0.4) + .encode( + y=y_axis, + color=alt.Color( + f"{group_by_name}:N", + legend=None, + scale=color_scale, + ), + x=alt.X( + "density:Q", + stack="center", + impute=None, + title=None, + scale=x_scale, + axis=alt.Axis(labels=False, values=[0], grid=False, ticks=False), + ), + ) + ) + return violin + + +def _combine_box_violin_plots( + boxplot, violin, data, group_by_name, plot_width, rotate_labels=False +): + """Combine violin and box plots. + + Args: + boxplot = altar base boxplot + violin = altair base violin plot + data = plotting data + group_by_name (string): name of the column that data should be grouped by + rotate_labels = rotate the x axis labels + """ + violin_box_plot = ( + alt.layer(violin, boxplot, data=data) + .properties(width=plot_width) + .facet( + column=alt.Column( + f"{group_by_name}:N", + header=( + alt.Header( + title=None, + labelOrient="bottom", + labelFontSize=15, + labelAngle=-45, + labelAlign="right", + labelPadding=20, + ) + if rotate_labels + else alt.Header( + title=None, + labelOrient="bottom", + labelFontSize=15, + ) + ), + ), + ) + .configure_facet(spacing=0) + .resolve_scale(x=alt.ResolveMode("independent")) + .configure_view(stroke=None) + .configure_axis(titleFontSize=15) + ) + return violin_box_plot + + def make_violin_plot_help(is_spatial: bool): """Produce the help text seen in the web summary. @@ -26,20 +137,27 @@ def make_violin_plot_help(is_spatial: bool): """ barcode_key = "Spots" if is_spatial else "Cells" violin_plot_help = { - "helpText": f"Distributions of genes and UMIs. {barcode_key} marked as outliers shown as grey circles. " + "helpText": f"Distributions of genes and UMIs + 1. {barcode_key} marked as outliers shown as grey circles. " + "Y-axis is log scale. " "Hover over the boxplot to see quartile values.", "title": "Gene and UMI Distribution", } return violin_plot_help -def make_violin_plots(sample_data: SampleData, library_type: str, is_spatial: bool): +def make_gene_umi_violin_plots( + sample_data: SampleData, + library_type: str, + is_spatial: bool, + group_by_name: str = "variable", +): """Makes a plot with distributions from UMIs/Genes per barcode. Args: sample_data (SampleData): SampleData class object library_type (str): library type from from cellranger.rna.library is_spatial (bool): is the sample spatial? + group_by_name (string): name of the column that data should be grouped by Returns: Dict: violin plot data and help for plotting in the websummary @@ -57,66 +175,202 @@ def make_violin_plots(sample_data: SampleData, library_type: str, is_spatial: bo # Tidy the data into a pandas data.frame plot_data = pd.DataFrame.from_dict( - {f"UMIs per {barcode_key}": umi_per_bc, f"Genes per {barcode_key}": genes_per_bc} + { + f"UMIs per {barcode_key}": umi_per_bc, + f"Genes per {barcode_key}": genes_per_bc, + } ) plot_data = pd.melt( plot_data, value_vars=[f"UMIs per {barcode_key}", f"Genes per {barcode_key}"], value_name="count", ) - plot_data["count"] = round_floats_in_list(np.log10(plot_data["count"] + 1)) - # plot_data["count"] = round_floats_in_list(plot_data["count"]) - - # Make the plot - boxplot = alt.Chart().mark_boxplot(color="grey").encode(y=alt.Y("count:Q", title="")) - - violin = ( - alt.Chart() - .transform_density( - "count", - as_=["count", "density"], - groupby=["variable"], - extent=[0, max(plot_data["count"]) + 0.5], - ) - .mark_area(orient="horizontal", opacity=0.4) - .encode( - y=alt.Y("count:Q", title="Log10(1+Count)"), - color=alt.Color( - "variable:N", - legend=None, - scale=alt.Scale(domain=plot_data.variable.unique(), range=["black", "red"]), - ), - x=alt.X( - "density:Q", - stack="center", - impute=None, - title=None, - scale=alt.Scale(nice=False, zero=True, padding=100), - axis=alt.Axis(labels=False, values=[0], grid=False, ticks=False), - ), - ) + plot_data["count"] = round_floats_in_list(plot_data["count"] + 1) + # Make the box plot + boxplot = _make_boxplot(counts="count") + # Make violin plot + violin = _make_violin_plot( + data=plot_data, + counts="count", + group_by_name=group_by_name, + y_label="(1+Count)", + set_scale=True, + logy=True, ) - - violin_box_plot = ( - alt.layer(violin, boxplot, data=plot_data) - .properties(width=450) - .facet( - column=alt.Column( - "variable:N", - header=alt.Header( - title=None, - labelOrient="bottom", - labelFontSize=15, - ), - ), - ) - .configure_facet(spacing=0) - .configure_view(stroke=None) - .configure_axis(titleFontSize=15) - .resolve_scale(x=alt.ResolveMode("independent")) + # Combine the plots + violin_box_plot = _combine_box_violin_plots( + boxplot, + violin, + data=plot_data, + group_by_name=group_by_name, + plot_width=440, + rotate_labels=False, ) violin_box_plot = alt_utils.chart_to_json(violin_box_plot) violin_plot_help = make_violin_plot_help(is_spatial) violin_plot_data = {"violin_plots": {"help": violin_plot_help, "spec": violin_box_plot}} return violin_plot_data + + +def make_cell_types_df( + h5_path: str, + cell_types: str, + barcode_lower_bound: int, + group_by_name: str, +): + """Makes a plot with distributions from UMIs cell types. + + Args: + h5_path (str): path to filtered_feature_bc_matrix.h5 + cell_types (str): path to cell_types.csv + barcode_lower_bound(int): minimum number of barcodes per cell type for plot + group_by_name (string): name of the column that data should be grouped by + + Returns: + tupel: [cell_types (DataFrame), cell_levels(int)] + """ + mat = cr_matrix.CountMatrix.load_h5_file(h5_path) + mat = mat.select_features_by_type("Gene Expression") + counts = mat.get_counts_per_bc() + bcs = cr_matrix.CountMatrix.load_bcs_from_h5_file_handle(h5_path) + bcs = [b.decode("utf-8") for b in bcs] + counts_per_bcs = pl.DataFrame({"barcode": bcs, "umi_counts": counts}) + cell_types = pl.read_csv(cell_types) + cell_types = cell_types.join(counts_per_bcs, on="barcode") + cell_types = cell_types.select([group_by_name, "umi_counts"]) + cell_types = cell_types.join( + cell_types.group_by(group_by_name) + .agg(pl.count().alias("count")) + .filter(pl.col("count") >= barcode_lower_bound), + on=group_by_name, + how="inner", + ) + cell_types = cell_types.with_columns(pl.col("umi_counts") + 1) + cell_levels = cell_types[group_by_name].n_unique() + return cell_types, cell_levels + + +def make_cell_types_violin_plot( + h5_path: str, + cell_types: str, + barcode_lower_bound: int, + final_plot_width: int, + group_by_name: str = "coarse_cell_type", + return_plot: bool = False, +): + """Makes a plot with distributions from UMIs cell types. + + Args: + h5_path (str): path to filtered_feature_bc_matrix.h5 + cell_types (str): path to cell_types.csv + barcode_lower_bound(int): minimum number of barcodes per cell type for plot + final_plot_width (int): plot width that should be displayed in the WS + group_by_name (string): name of the column that data should be grouped by + return_plot (bool): should the plot be returned (for notebooks) instead of the json for the WS + + Returns: + Dict: violin plot data and help for plotting in the websummary + """ + cell_types, cell_levels = make_cell_types_df( + h5_path, cell_types, barcode_lower_bound, group_by_name + ) + cell_types = cell_types.with_columns(pl.col("umi_counts") + 1) + cell_levels = cell_types[f"{group_by_name}"].n_unique() + + # Make the box plot + boxplot = _make_boxplot(counts="umi_counts") + # Make violin plot + violin = _make_violin_plot( + data=cell_types, + counts="umi_counts", + group_by_name=group_by_name, + y_label="1+UMI", + set_scale=False, + logy=True, + ) + # Combine the plots + violin_box_plot = _combine_box_violin_plots( + boxplot=boxplot, + violin=violin, + data=cell_types, + group_by_name=group_by_name, + plot_width=final_plot_width / cell_levels, + rotate_labels=True, + ) + + if return_plot: + return violin_box_plot + else: + violin_box_plot = alt_utils.chart_to_json(violin_box_plot) + return violin_box_plot + + +def make_cell_types_boxplot( + h5_path: str, + cell_types: str, + barcode_lower_bound: int, + final_plot_width: int, + group_by_name: str = "coarse_cell_type", + return_plot: bool = False, +): + """Makes a plot with distributions from UMIs cell types. + + Args: + h5_path (str): path to filtered_feature_bc_matrix.h5 + cell_types (str): path to cell_types.csv + barcode_lower_bound(int): minimum number of barcodes per cell type for plot + final_plot_width (int): plot width that should be displayed in the WS + group_by_name (string): name of the column that data should be grouped by + return_plot (bool): should the plot be returned (for notebooks) instead of the json for the WS + + Returns: + Dict: violin plot data and help for plotting in the websummary + """ + cell_types, cell_levels = make_cell_types_df( + h5_path, cell_types, barcode_lower_bound, group_by_name + ) + + box_width = final_plot_width / (cell_levels + 1) + box_plot = alt.Chart(cell_types).mark_boxplot(size=box_width).encode( + alt.X( + f"{group_by_name}:N", + axis=alt.Axis(labelAngle=-45, labelFontSize=15, title=None), + ), + alt.Y("umi_counts:Q", title="1+UMI").scale(type="log"), + alt.Color(f"{group_by_name}:N").legend(None), + tooltip=[ + alt.Tooltip("umi_counts:Q", title="UMI", format=",.2f"), + ], + ) + alt.Chart(cell_types).transform_aggregate( + min="min(umi_counts)", + max="max(umi_counts)", + mean="mean(umi_counts)", + median="median(umi_counts)", + q1="q1(umi_counts)", + q3="q3(umi_counts)", + count="max(count)", + groupby=[f"{group_by_name}"], + ).mark_bar( + opacity=0 + ).encode( + x=f"{group_by_name}:N", + y="q1:Q", + y2="q3:Q", + tooltip=[ + alt.Tooltip("min:Q", title="Minimum UMI", format=".2f"), + alt.Tooltip("q1:Q", title="Lower Quartile", format=".2f"), + alt.Tooltip("mean:Q", title="Mean UMI", format=".2f"), + alt.Tooltip("median:Q", title="Median UMI", format=".2f"), + alt.Tooltip("q3:Q", title="Upper Quartile", format=".2f"), + alt.Tooltip("max:Q", title="Maximum UMI", format=".2f"), + alt.Tooltip("count:Q", title="# Barcodes"), + ], + ).properties( + width=final_plot_width + ) + if return_plot: + return box_plot + else: + box_plot = alt_utils.chart_to_json(box_plot) + return box_plot diff --git a/lib/python/cellranger/websummary/web_summary_builder.py b/lib/python/cellranger/websummary/web_summary_builder.py index 2c9baab..743e3f8 100644 --- a/lib/python/cellranger/websummary/web_summary_builder.py +++ b/lib/python/cellranger/websummary/web_summary_builder.py @@ -13,6 +13,7 @@ import cellranger.rna.library as rna_library import cellranger.websummary.sample_properties as wsp import cellranger.websummary.violin_plots as violin_plots +from cellranger.analysis.singlegenome import TSNE_NAME, UMAP_NAME, Projection from cellranger.rna.library import GENE_EXPRESSION_LIBRARY_TYPE from cellranger.targeted.targeted_constants import TARGETING_METHOD_HC, TARGETING_METHOD_TL from cellranger.webshim.common import load_sample_data @@ -28,8 +29,9 @@ seq_saturation_plot, targeted_table, ) -from cellranger.websummary.analysis_tab_core import analysis_by_clustering, umi_on_tsne_plot +from cellranger.websummary.analysis_tab_core import analysis_by_clustering, umi_on_projection_plot from cellranger.websummary.metrics import ( + INFO_THRESHOLD, LTMetricAnnotations, MetricAnnotations, TargetedMetricAnnotations, @@ -99,7 +101,11 @@ def _build_summary_tab_common( summary_tab, alarm_list, sequencing_table( - metadata, sample_data, species_list, is_targeted=sample_data.is_targeted() + metadata, + sample_data, + species_list, + is_targeted=sample_data.is_targeted(), + is_hd=sample_data.is_visium_hd, ), ) add_data( @@ -169,7 +175,7 @@ def _build_summary_tab_common( [ "", [ - f"
{sample_properties.cmdline!s}
" + f"
{sample_properties.cmdline!s}
" ], ] ], @@ -198,7 +204,14 @@ def _add_gdna_to_websummary(ws_data: WebSummaryData, g_table: BarnyardPanel) -> def _build_analysis_tab_common( - metadata, sample_data, pipeline, species_list, sample_properties, ws_data + metadata, + sample_data, + pipeline, + species_list, + sample_properties, + ws_data, + *, + projection: Projection, ): """Code to create analysis tab shared by spatial and single cell.""" alarm_list = ws_data.alarms @@ -214,7 +227,7 @@ def _build_analysis_tab_common( median_gene_plot(sample_data, sample_properties, species_list), ) ws_data.clustering_selector = analysis_by_clustering( - sample_data, spatial=sample_properties.is_spatial + sample_data, spatial=sample_properties.is_spatial, projection=projection ) # gDNA g_table = gdna_table(metadata, sample_data, species_list) @@ -223,7 +236,7 @@ def _build_analysis_tab_common( violin_plot = None if sample_properties.is_spatial: - violin_plot = violin_plots.make_violin_plots( + violin_plot = violin_plots.make_gene_umi_violin_plots( sample_data, library_type=GENE_EXPRESSION_LIBRARY_TYPE, is_spatial=sample_properties.is_spatial, @@ -236,7 +249,7 @@ def _build_analysis_tab_common( ) -def _build_antibody_tab_common(sample_data, sample_properties, ws_data): +def _build_antibody_tab_common(sample_data, sample_properties, ws_data, *, projection: Projection): """Code to create antibody tab shared by spatial and single cell.""" alarm_list = ws_data.alarms antibody_tab = ws_data.antibody_tab @@ -271,6 +284,7 @@ def _build_antibody_tab_common(sample_data, sample_properties, ws_data): sample_data, spatial=sample_properties.is_spatial, library_type=rna_library.ANTIBODY_LIBRARY_TYPE, + projection=projection, ) @@ -297,6 +311,7 @@ def _build_diagnostic_values(sample_data, ws_data): "i1_bases_with_q30_frac", "i2_bases_with_q30_frac", "low_support_umi_reads_frac", + "corrected_bc_frac", ] mets = {} for met in diagnostic_metrics: @@ -314,10 +329,13 @@ def build_web_summary_data_common( zoom_images=None, regist_images=None, sample_defs=None, + *, + projection: Projection, ): """Produce common data shared by both spatial and cell ranger, VDJ is currently independent.""" is_spatial = command != CELLRANGER_COMMAND_NAME wsd = WebSummaryData(sample_properties, command, pipeline) + species_list = sample_properties.genomes _build_summary_tab_common( metadata, @@ -339,10 +357,11 @@ def build_web_summary_data_common( species_list, sample_properties, wsd, + projection=projection, ) # use presence/absence of the histograms as a proxy for whether to build the antibody/antigen tabs if sample_data.antibody_histograms is not None: - _build_antibody_tab_common(sample_data, sample_properties, wsd) + _build_antibody_tab_common(sample_data, sample_properties, wsd, projection=projection) if sample_data.antigen_histograms is not None: _build_antigen_tab_common(sample_data, sample_properties, wsd) _build_diagnostic_values(sample_data, wsd) @@ -385,12 +404,14 @@ def build_web_summary_html_sc_and_aggr( pipeline, metadata, command_name, + *, + projection: Projection, sample_defs=None, ): """Produce the main websummary.""" assert isinstance(sample_properties, CountSampleProperties) assert isinstance(sample_data_paths, SampleDataPaths) - sample_data = load_sample_data(sample_properties, sample_data_paths) + sample_data = load_sample_data(sample_properties, sample_data_paths, (projection,)) species_list = sample_properties.genomes web_sum_data = build_web_summary_data_common( @@ -400,7 +421,9 @@ def build_web_summary_html_sc_and_aggr( metadata, command_name, sample_defs=sample_defs, + projection=projection, ) + # Single cell specific stuff add_data( web_sum_data.summary_tab, @@ -418,17 +441,34 @@ def build_web_summary_html_sc_and_aggr( batch_correction_table(metadata, sample_data, species_list), ) - # t-SNE plot appears as a constant left plot in the Cell Ranger + # t-SNE/UMAP plot appears as a constant left plot in the Cell Ranger # clustering selector if web_sum_data.clustering_selector: - web_sum_data.clustering_selector.left_plots = umi_on_tsne_plot( - sample_data, spatial=sample_properties.is_spatial + web_sum_data.clustering_selector.left_plots = umi_on_projection_plot( + sample_data, + spatial=sample_properties.is_spatial, + projection=projection, + library_type=rna_library.GENE_EXPRESSION_LIBRARY_TYPE, + tag_type=None, ) + if pipeline == PIPELINE_AGGR and projection == UMAP_NAME: + web_sum_data.alarms.extend( + [ + { + "formatted_value": None, + "title": "UMAP Projection", + "message": """UMAP projection is now the default for Cellranger Aggr. Run cellranger aggr with --enable-tsne=true to enable t-SNE projection.""", + "level": INFO_THRESHOLD, + } + ] + ) if web_sum_data.antibody_clustering_selector: - web_sum_data.antibody_clustering_selector.left_plots = umi_on_tsne_plot( + web_sum_data.antibody_clustering_selector.left_plots = umi_on_projection_plot( sample_data, + projection=projection, spatial=sample_properties.is_spatial, library_type=rna_library.ANTIBODY_LIBRARY_TYPE, + tag_type=None, ) # Barnyard @@ -458,7 +498,8 @@ def build_web_summary_html_sc( pipeline, metadata, command, - sample_defs, + projection=TSNE_NAME, + sample_defs=sample_defs, ) # to circumvent self._check_valid data = copy.deepcopy(web_sum_data) diff --git a/lib/python/tenkit/bcl.py b/lib/python/tenkit/bcl.py index 7c27831..700a90a 100644 --- a/lib/python/tenkit/bcl.py +++ b/lib/python/tenkit/bcl.py @@ -129,9 +129,9 @@ def log_version_info(self) -> None: "ApplicationName": self.application, "ApplicationVersion": self.application_version, } - martian.log_info("BCL folder RTA Version: %s" % self.rta_version) - martian.log_info("BCL params: %s" % str(bcl_params)) - martian.log_info("RC'ing i2 read: %s" % str(self.rc_i2)) + martian.log_info(f"BCL folder RTA Version: {self.rta_version}") + martian.log_info(f"BCL params: {bcl_params!s}") + martian.log_info(f"RC'ing i2 read: {self.rc_i2!s}") @property def sequencer(self) -> IlluminaSequencer: @@ -302,16 +302,13 @@ def check_bcl2fastq(self, hostname: str) -> tuple[Bcl2FastqVersion | str]: if v1 is not None: return Bcl2FastqVersion.V1, v1 else: - msg = "mkfastq requires bcl2fastq 1.8.4 for RTA version: %s" % self.rta_version + msg = f"mkfastq requires bcl2fastq 1.8.4 for RTA version: {self.rta_version}" martian.exit(msg) raise SystemExit() # RTA >= 1.18.54 -> run 2.17 or higher # NovaSeq X -> run 2.20 or higher if v2 is None: - msg = ( - "No valid bcl2fastq found on path. Recommended version of bcl2fastq is v2.20.\n\n%s" - % v2_msg - ) + msg = f"No valid bcl2fastq found on path. Recommended version of bcl2fastq is v2.20.\n\n{v2_msg}" martian.exit(msg) raise SystemExit() @@ -353,7 +350,7 @@ def _get_bcl2fastq_v2(hostname: str) -> tuple[bytes, None] | tuple[None, str]: [bcl2fastq, "--version"], env=new_environ, stderr=subprocess.STDOUT ) except subprocess.CalledProcessError: - msg = "On machine: %s, bcl2fastq does not work." % hostname + msg = f"On machine: {hostname}, bcl2fastq does not work." return (None, msg) for l in output.split(b"\n"): match = re.match(b"bcl2fastq v([0-9.]+)", l) @@ -365,7 +362,7 @@ def _get_bcl2fastq_v2(hostname: str) -> tuple[bytes, None] | tuple[None, str]: "bcl2fastq version not recognized -- please check the output of bcl2fastq --version", ) else: - msg = "On machine: %s, bcl2fastq not found on PATH." % hostname + msg = f"On machine: {hostname}, bcl2fastq not found on PATH." return (None, msg) @@ -493,18 +490,25 @@ def load_run_info(run_info_xml: str) -> tuple[list[ReadInfo], str | None]: read_info = [ ReadInfo( read_length=x, - index_read=idx != 0 and idx != len(reads) - 1, - read_name="R1" if idx == 0 else "R2" if idx == len(reads) - 1 else "I" + str(idx), + index_read=(idx not in (0, len(reads) - 1)) or is_indexed_read, + read_name=( + "R1" + if idx == 0 and not is_indexed_read + else "R2" if idx == len(reads) - 1 and not is_indexed_read else "I" + str(idx) + ), original_read_name="R" + str(idx + 1), ) - for idx, x in enumerate(int(read.attrib["NumCycles"]) for read in reads) + for idx, (x, is_indexed_read) in enumerate( + (int(read.attrib["NumCycles"]), read.attrib.get("IsIndexedRead") == "Y") + for read in reads + ) ] flowcell = tree.getroot().find("Run").find("Flowcell").text # NB: currently you have to comment out the next two lines to get # nosetests to run correctly outside of a stage. - martian.log_info("Read Info: %s" % read_info) - martian.log_info("Flowcell ID: %s" % flowcell) + martian.log_info(f"Read Info: {read_info}") + martian.log_info(f"Flowcell ID: {flowcell}") return (read_info, flowcell) @@ -547,7 +551,7 @@ def base_mask(read): else: return "Y" + str(read["read_length"]) else: - martian.throw("read name was not recognized: %s" % read["read_name"]) + martian.throw("read name was not recognized: {}".format(read["read_name"])) raise SystemExit() # Special hack to convert the bases_mask diff --git a/lib/python/tenkit/cache.py b/lib/python/tenkit/cache.py index de27e26..90c7e6e 100644 --- a/lib/python/tenkit/cache.py +++ b/lib/python/tenkit/cache.py @@ -25,8 +25,7 @@ def __init__( [str | bytes | os.PathLike[str] | os.PathLike[bytes], Literal["w", "r", "a"]], TextIO, ] = ..., - ): - ... + ): ... @overload def __init__( @@ -36,8 +35,7 @@ def __init__( [str | bytes | os.PathLike[str] | os.PathLike[bytes], Literal["wb", "rb", "ab"]], BinaryIO, ] = ..., - ): - ... + ): ... def __init__( self, diff --git a/lib/python/tenkit/fasta.py b/lib/python/tenkit/fasta.py index 4635cf8..46906ec 100644 --- a/lib/python/tenkit/fasta.py +++ b/lib/python/tenkit/fasta.py @@ -56,7 +56,7 @@ def __init__(self, fullpath: str | bytes): elif len(dot_parts) > 2 and dot_parts[-2] == b"fastq": name = dot_parts[-3] else: - raise NameError("%s is not a fastq file" % fullpath) + raise NameError(f"{fullpath} is not a fastq file") all_flds = name.split(b"_") @@ -100,11 +100,11 @@ def __init__(self, fullpath: str | bytes): elif len(dot_parts) > 2 and dot_parts[-2] == b"fastq": name = dot_parts[-3] else: - raise NameError("%s is not a fastq file" % fullpath.decode()) + raise NameError(f"{fullpath.decode()} is not a fastq file") name_parts = BCL_PROCESSOR_FILENAME_REGEX.match(name) if not name_parts: - raise NameError("Not a demux output fastq: %s" % fullpath.decode()) + raise NameError(f"Not a demux output fastq: {fullpath.decode()}") self.read = name_parts.group(1) self.index = name_parts.group(2) self.lane = int(name_parts.group(3), 10) @@ -151,15 +151,13 @@ def write_read_pair_fastq( @overload def read_generator_fastq( fastq_file: BinaryIO | BufferedReader | gzip.GzipFile, paired_end: Literal[True] = ... -) -> Iterator[tuple[bytes, bytes, bytes, bytes, bytes, bytes]]: - ... +) -> Iterator[tuple[bytes, bytes, bytes, bytes, bytes, bytes]]: ... @overload def read_generator_fastq( fastq_file: BinaryIO | BufferedReader | gzip.GzipFile, paired_end: Literal[False] = False -) -> Iterator[tuple[bytes, bytes, bytes]]: - ... +) -> Iterator[tuple[bytes, bytes, bytes]]: ... @overload @@ -167,8 +165,7 @@ def read_generator_fastq( fastq_file: BinaryIO | BufferedReader | gzip.GzipFile, paired_end: bool = False ) -> ( Iterator[tuple[bytes, bytes, bytes]] | Iterator[tuple[bytes, bytes, bytes, bytes, bytes, bytes]] -): - ... +): ... def read_generator_fastq( @@ -243,13 +240,11 @@ def uninterleave_fastq( @overload -def get_qvs(qual: None) -> None: - ... +def get_qvs(qual: None) -> None: ... @overload -def get_qvs(qual: str | bytes) -> numpy.ndarray[int, numpy.dtype[numpy.byte]]: - ... +def get_qvs(qual: str | bytes) -> numpy.ndarray[int, numpy.dtype[numpy.byte]]: ... def get_qvs(qual: str | bytes | None) -> numpy.ndarray[int, numpy.dtype[numpy.byte]] | None: @@ -260,13 +255,11 @@ def get_qvs(qual: str | bytes | None) -> numpy.ndarray[int, numpy.dtype[numpy.by @overload -def get_bases_qual(qual: None, cutoff) -> None: - ... +def get_bases_qual(qual: None, cutoff) -> None: ... @overload -def get_bases_qual(qual: str | bytes, cutoff: int) -> int: - ... +def get_bases_qual(qual: str | bytes, cutoff: int) -> int: ... def get_bases_qual(qual: str | bytes | None, cutoff: int) -> int | None: @@ -278,13 +271,11 @@ def get_bases_qual(qual: str | bytes | None, cutoff: int) -> int | None: @overload -def get_min_qual(qual: None) -> None: - ... +def get_min_qual(qual: None) -> None: ... @overload -def get_min_qual(qual: str | bytes) -> int: - ... +def get_min_qual(qual: str | bytes) -> int: ... def get_min_qual(qual: str | bytes | None) -> int | None: @@ -295,13 +286,11 @@ def get_min_qual(qual: str | bytes | None) -> int | None: @overload -def get_expected_errors(qual: None) -> None: - ... +def get_expected_errors(qual: None) -> None: ... @overload -def get_expected_errors(qual: str | bytes) -> float: - ... +def get_expected_errors(qual: str | bytes) -> float: ... def get_expected_errors(qual: str | bytes | None) -> float | None: @@ -559,14 +548,12 @@ def check_fastq_types( if not fastqprefix: samples_list = b"\n".join(samples) raise AmbiguousValueError( - "The --sample argument must be specified if multiple samples were demultiplexed in a run folder. Options:\n%s" - % samples_list + f"The --sample argument must be specified if multiple samples were demultiplexed in a run folder. Options:\n{samples_list}" ) # no overlap case elif not set(samples).intersection(fastqprefixes or ()): raise ValueError( - "Samples not detected among demultiplexed FASTQs: %s" - % fastqprefix_outstr.decode() + f"Samples not detected among demultiplexed FASTQs: {fastqprefix_outstr.decode()}" ) # some overlap; legal fastqprefix case else: @@ -612,10 +599,7 @@ def check_fastq_types_multipath( raise ex except ValueError as ex: sys.stderr.write( - "Invalid path/prefix combination: {}, {}\n".format( - path, - fastqprefix.decode() if isinstance(fastqprefix, bytes) else str(fastqprefix), - ) + f"Invalid path/prefix combination: {path}, {fastqprefix.decode() if isinstance(fastqprefix, bytes) else str(fastqprefix)}\n" ) error_messages.add(str(ex)) @@ -624,7 +608,7 @@ def check_fastq_types_multipath( if len(error_messages) == 1: raise ValueError(error_messages.pop()) else: - raise ValueError("FASTQ selection errors:\n%s" % ("\n".join(error_messages))) + raise ValueError("FASTQ selection errors:\n{}".format("\n".join(error_messages))) elif len(input_modes) > 1: raise ValueError( "Cannot process FASTQs at same time from different demultiplexing methods." diff --git a/lib/python/tenkit/lane.py b/lib/python/tenkit/lane.py index 93cc994..84e03d6 100644 --- a/lib/python/tenkit/lane.py +++ b/lib/python/tenkit/lane.py @@ -24,7 +24,9 @@ class ReadLocation(NamedTuple): y: int -READ_NAME_REGEX: str = r"^[a-zA-Z0-9\-]+:[a-z0-9\-]+:([a-zA-Z0-9\-]+):([0-9]):([0-9])([0-9])([0-9]+):([0-9]+):([0-9]+)$" +READ_NAME_REGEX: str = ( + r"^[a-zA-Z0-9\-]+:[a-z0-9\-]+:([a-zA-Z0-9\-]+):([0-9]):([0-9])([0-9])([0-9]+):([0-9]+):([0-9]+)$" +) NUM_READS_TO_ESTIMATE_TILE_EXTENTS: int = 2000 diff --git a/lib/python/tenkit/log_subprocess.py b/lib/python/tenkit/log_subprocess.py index 4f0e818..12e20c2 100644 --- a/lib/python/tenkit/log_subprocess.py +++ b/lib/python/tenkit/log_subprocess.py @@ -72,8 +72,7 @@ def check_output( *, encoding: None = None, **kwargs, -) -> bytes: - ... +) -> bytes: ... @overload @@ -82,8 +81,7 @@ def check_output( *, encoding: str, **kwargs, -) -> str: - ... +) -> str: ... def check_output( @@ -112,8 +110,7 @@ def Popen( # pylint: disable=invalid-name *, encoding: None = None, **kwargs, -) -> subprocess.Popen[bytes]: - ... +) -> subprocess.Popen[bytes]: ... @overload @@ -122,8 +119,7 @@ def Popen( # pylint: disable=invalid-name *, encoding: str, **kwargs, -) -> subprocess.Popen[str]: - ... +) -> subprocess.Popen[str]: ... def Popen( # pylint: disable=invalid-name @@ -241,13 +237,11 @@ def _pipeline( @overload -def _is_file_handle(obj: IO[bytes]) -> Literal[True]: - ... +def _is_file_handle(obj: IO[bytes]) -> Literal[True]: ... @overload -def _is_file_handle(obj: str | bytes | int) -> Literal[False]: - ... +def _is_file_handle(obj: str | bytes | int) -> Literal[False]: ... def _is_file_handle(obj) -> bool: diff --git a/lib/python/tenkit/preflight.py b/lib/python/tenkit/preflight.py index 1c8768c..46060d5 100644 --- a/lib/python/tenkit/preflight.py +++ b/lib/python/tenkit/preflight.py @@ -274,8 +274,7 @@ def check_rta_complete(folder_path: str) -> str: rta_complete = os.path.join(folder_path, "RTAComplete.txt") if not os.path.exists(rta_complete): martian.exit( - "On machine: %s, run does not appear to be complete yet. RTAComplete.txt not found." - % hostname + f"On machine: {hostname}, run does not appear to be complete yet. RTAComplete.txt not found." ) return rta_complete @@ -291,19 +290,13 @@ def check_runinfo_xml(folder_path: str) -> str: runinfo = os.path.join(folder_path, "RunInfo.xml") if not os.path.exists(runinfo): martian.exit( - "On machine: %s, RunInfo.xml not found. Cannot verify run was 10X-prepped." % hostname + f"On machine: {hostname}, RunInfo.xml not found. Cannot verify run was 10X-prepped." ) if not os.access(runinfo, os.R_OK): - martian.exit("On machine: %s, insufficient permission to open RunInfo.xml." % hostname) + martian.exit(f"On machine: {hostname}, insufficient permission to open RunInfo.xml.") return runinfo -def check_barcode_whitelist(whitelist_path: str) -> str: - hostname = socket.gethostname() - check_file("barcode whitelist", whitelist_path, hostname) - return whitelist_path - - def check_refdata(reference_path: str, max_contigs=None) -> tuple[bool, str]: hostname = socket.gethostname() @@ -318,8 +311,7 @@ def check_refdata(reference_path: str, max_contigs=None) -> tuple[bool, str]: if not os.path.exists(version_path): return ( False, - "Your reference does not contain the expected files, or they are not readable. Please check your reference folder on %s." - % hostname, + f"Your reference does not contain the expected files, or they are not readable. Please check your reference folder on {hostname}.", ) # Known genomes get a more stringent check @@ -328,17 +320,13 @@ def check_refdata(reference_path: str, max_contigs=None) -> tuple[bool, str]: ): return ( False, - "Your reference does not contain the expected files, or they are not readable. Please check your reference folder on %s." - % hostname, - ) - else: - # We only require the fasta for unknown genomes - if not os.path.exists(os.path.join(reference_path, "fasta/")): - return ( - False, - "Your reference does not contain the expected files, or they are not readable. Please check your reference folder on %s." - % hostname, + f"Your reference does not contain the expected files, or they are not readable. Please check your reference folder on {hostname}.", ) + elif not os.path.exists(os.path.join(reference_path, "fasta/")): + return ( + False, + f"Your reference does not contain the expected files, or they are not readable. Please check your reference folder on {hostname}.", + ) if not os.path.exists( os.path.join(reference_path, "fasta/genome.fa.flat") @@ -358,9 +346,11 @@ def check_refdata(reference_path: str, max_contigs=None) -> tuple[bool, str]: to fix the issue. If you do not have write permissions, please contact your system administrator.""".format( - "please reinstall the 10X refdata\ntar file on " - if known_genome - else "please reindex your reference\nusing the mkref tool", + ( + "please reinstall the 10X refdata\ntar file on " + if known_genome + else "please reindex your reference\nusing the mkref tool" + ), hostname if known_genome else "", os.path.join(reference_path, "fasta", "genome.fa.*"), ) @@ -454,9 +444,9 @@ def check_sample_indices( return ( None, ( - "Sample index '%s' is not valid. Must be one of: any, SI-, " + f"Sample index '{sample_index}' is not valid. Must be one of: any, SI-, " "SI--, 220, or " - "a nucleotide sequence." % sample_index + "a nucleotide sequence." ), ) @@ -509,8 +499,7 @@ def check_gem_groups(sample_def: Iterable[SampleDef]) -> tuple[bool, str | None] if group - prev > 1: return ( False, - "gem_groups must be numbered contiguously. missing groups: %s" - % list(range(prev + 1, group)), + f"gem_groups must be numbered contiguously. missing groups: {list(range(prev + 1, group))}", ) prev = group diff --git a/lib/python/tenkit/safe_json.py b/lib/python/tenkit/safe_json.py index 11dea19..84c094b 100644 --- a/lib/python/tenkit/safe_json.py +++ b/lib/python/tenkit/safe_json.py @@ -17,6 +17,7 @@ import json import math from collections.abc import Callable, Generator, Iterable, Iterator, Mapping +from pathlib import PurePath from typing import IO, Any, TypeVar import numpy as np @@ -61,11 +62,15 @@ def _sanitize_key(k: Any) -> str: return str(k) -def _sanitize_scalar(data: bytes | float | np.integer | np.floating) -> None | str | int | float: +def _sanitize_scalar( + data: bytes | PurePath | float | np.integer | np.floating, +) -> None | str | int | float: if isinstance(data, str | int | bool): return data elif isinstance(data, bytes): return data.decode() + elif isinstance(data, PurePath): + return str(data) elif isinstance(data, np.integer): return int(data) elif isinstance(data, float | np.floating): @@ -128,7 +133,7 @@ def json_sanitize(data) -> None | dict[str, Any] | int | str | float | list[Any] # Don't construct a new object if we don't have to. return data # This really doesn't make me happy. How many cases we we have to test? - if isinstance(data, bytes | float | np.floating | np.integer): + if isinstance(data, bytes | PurePath | float | np.floating | np.integer): return _sanitize_scalar(data) elif (dict_items := _dict_items(data)) is not None: return {_sanitize_key(k): json_sanitize(value) for k, value in dict_items} @@ -273,7 +278,7 @@ def _iterencode_dict(obj: Iterable[tuple[Any, Any]], depth: int) -> Generator[st def _iterencode(obj: Any, depth: int) -> Generator[str, None, None]: if obj is None or (_is_safe(obj) if not indent else isinstance(obj, (str, int, bool))): yield from enc(obj, depth) - elif isinstance(obj, (bytes, float, float64, integer)): + elif isinstance(obj, bytes | PurePath | float | float64 | integer): yield from enc(_sanitize_scalar(obj), depth) elif (dict_items := _dict_items(obj)) is not None: yield from _iterencode_dict(dict_items, depth) @@ -302,7 +307,7 @@ def default(self, o: Any) -> Any: # pylint: disable=method-hidden """ if _is_safe(o): return o - elif isinstance(o, bytes | float | np.floating | np.integer): + elif isinstance(o, bytes | PurePath | float | np.floating | np.integer): return _sanitize_scalar(o) if isinstance(o, np.ndarray): if o.ndim >= 1: @@ -336,12 +341,16 @@ def iterencode(self, o: Any, _one_shot: bool = False) -> Iterator[str]: json.encoder.c_make_encoder( {} if self.check_circular else None, self.default, - json.encoder.c_encode_basestring_ascii - if self.ensure_ascii - else json.encoder.c_encode_basestring, - indent := self.indent - if self.indent is None or isinstance(self.indent, str) - else " " * self.indent, + ( + json.encoder.c_encode_basestring_ascii + if self.ensure_ascii + else json.encoder.c_encode_basestring + ), + indent := ( + self.indent + if self.indent is None or isinstance(self.indent, str) + else " " * self.indent + ), self.key_separator, self.item_separator, self.sort_keys, diff --git a/lib/python/tenkit/sample_index.py b/lib/python/tenkit/sample_index.py index ce6f1dc..c57e0f3 100644 --- a/lib/python/tenkit/sample_index.py +++ b/lib/python/tenkit/sample_index.py @@ -4,6 +4,8 @@ """Sample index mappings.""" +import sys + # pylint: disable=too-many-lines,invalid-name # GemCode Tubes @@ -907,6 +909,59 @@ SI_NN_H11 = ["TTCAAGTCCT", "CAGCAGCTAA"] SI_NN_H12 = ["CTCCAACCTA", "GCACCGCATC"] +# NEB #E7874 plates +# Only A1 - H6 are used +# Taken from: +# https://www.neb.com/en/-/media/nebus/files/manuals/manuale7395_e7874_e7876_e7878.pdf +SI_NEB7874_A1 = ["CACTGTAG", "AAGCGACT"] +SI_NEB7874_B1 = ["GTGCACGA", "TGATAGGC"] +SI_NEB7874_C1 = ["ATGTTCCT", "TCAGCGCC"] +SI_NEB7874_D1 = ["CATTATGG", "AGTCACAT"] +SI_NEB7874_E1 = ["TCTTGTTT", "CCTTTCAC"] +SI_NEB7874_F1 = ["GGCTTACT", "CTTTCCCT"] +SI_NEB7874_G1 = ["ACGATATG", "GACAATTC"] +SI_NEB7874_H1 = ["ATCCGCAG", "ACACGACT"] +SI_NEB7874_A2 = ["AAGCGACT", "ACGAATCC"] +SI_NEB7874_B2 = ["TGATAGGC", "GTCTGAGT"] +SI_NEB7874_C2 = ["AACACCAC", "GGTGTGAG"] +SI_NEB7874_D2 = ["ACCTCTTC", "CTTGCATA"] +SI_NEB7874_E2 = ["GTCCGATC", "GCCAATCC"] +SI_NEB7874_F2 = ["GAGGACCA", "ATGCCGGT"] +SI_NEB7874_G2 = ["CGCTCTTA", "CATACCGT"] +SI_NEB7874_H2 = ["CTGAGCTC", "ATCAGAGC"] +SI_NEB7874_A3 = ["ACGAATCC", "ATTACCCA"] +SI_NEB7874_B3 = ["GTCTGAGT", "GACTTGTG"] +SI_NEB7874_C3 = ["CCTAAACT", "ACGAGGAG"] +SI_NEB7874_D3 = ["TGTCACAC", "TAATCTCG"] +SI_NEB7874_E3 = ["GATATGAA", "TACGGCAG"] +SI_NEB7874_F3 = ["AAGTGTGG", "TGCCCATC"] +SI_NEB7874_G3 = ["GTTGGCGT", "CAGCAGTC"] +SI_NEB7874_H3 = ["TAGCTGGC", "TACCGGCT"] +SI_NEB7874_A4 = ["ATTACCCA", "CACTGTAG"] +SI_NEB7874_B4 = ["GACTTGTG", "GTGCACGA"] +SI_NEB7874_C4 = ["CAGGTAAG", "CTCGAAAT"] +SI_NEB7874_D4 = ["AAGGAGAC", "CTCACAAC"] +SI_NEB7874_E4 = ["AGTCAGGT", "GTAACCAC"] +SI_NEB7874_F4 = ["ACCGTAAG", "CATATCCA"] +SI_NEB7874_G4 = ["TATGACGT", "CGCTAATC"] +SI_NEB7874_H4 = ["TTGGGTAC", "CTTCCAAC"] +SI_NEB7874_A5 = ["TTCAATAG", "TCCCACGA"] +SI_NEB7874_B5 = ["GTTTGCTC", "ACCAACAG"] +SI_NEB7874_C5 = ["AGAAGCCT", "GTCAGTAT"] +SI_NEB7874_D5 = ["CTAGGTTG", "ATTCGAGC"] +SI_NEB7874_E5 = ["TGTGTCAG", "CACCTGTA"] +SI_NEB7874_F5 = ["AGAACCAG", "CCGACTCT"] +SI_NEB7874_G5 = ["ATTGGACA", "TTGCTGGA"] +SI_NEB7874_H5 = ["ACCCGTTG", "CAGCTTCG"] +SI_NEB7874_A6 = ["ACCGGAGT", "AAGGAAGG"] +SI_NEB7874_B6 = ["CTTGACGA", "GCACACAA"] +SI_NEB7874_C6 = ["GCCACGAC", "CCTCGGGT"] +SI_NEB7874_D6 = ["TCTGGAAC", "TAGCACCT"] +SI_NEB7874_E6 = ["CACTAGAC", "TGAGGACT"] +SI_NEB7874_F6 = ["TTGCGTTA", "TTCCCGAA"] +SI_NEB7874_G6 = ["CCTATGCA", "GAGTCGAT"] +SI_NEB7874_H6 = ["CAACCGAG", "TACCTGTG"] + SAMPLE_INDEX_MAP = { # GemCode Tube labels "SI-001": SI_001, @@ -1708,6 +1763,12 @@ "SI-P02-H10": SI_P2_H10, "SI-P02-H11": SI_P2_H11, "SI-P02-H12": SI_P2_H12, + # T1T2 (used single ended by QC) + **{ + sys.intern(f"SI-TT-{c}{i}"): globals()[f"SI_TT_{c}{i}"] + for i in range(1, 13) + for c in "ABCDEFGH" + }, } SAMPLE_SINGLE_INDEX_MAP = SAMPLE_INDEX_MAP @@ -2194,6 +2255,55 @@ "SI-TS-H10": SI_TS_H10, "SI-TS-H11": SI_TS_H11, "SI-TS-H12": SI_TS_H12, + # NEB #E7874; A1 - A6 wells + "SI-NEB7874-A1": SI_NEB7874_A1, + "SI-NEB7874-B1": SI_NEB7874_B1, + "SI-NEB7874-C1": SI_NEB7874_C1, + "SI-NEB7874-D1": SI_NEB7874_D1, + "SI-NEB7874-E1": SI_NEB7874_E1, + "SI-NEB7874-F1": SI_NEB7874_F1, + "SI-NEB7874-G1": SI_NEB7874_G1, + "SI-NEB7874-H1": SI_NEB7874_H1, + "SI-NEB7874-A2": SI_NEB7874_A2, + "SI-NEB7874-B2": SI_NEB7874_B2, + "SI-NEB7874-C2": SI_NEB7874_C2, + "SI-NEB7874-D2": SI_NEB7874_D2, + "SI-NEB7874-E2": SI_NEB7874_E2, + "SI-NEB7874-F2": SI_NEB7874_F2, + "SI-NEB7874-G2": SI_NEB7874_G2, + "SI-NEB7874-H2": SI_NEB7874_H2, + "SI-NEB7874-A3": SI_NEB7874_A3, + "SI-NEB7874-B3": SI_NEB7874_B3, + "SI-NEB7874-C3": SI_NEB7874_C3, + "SI-NEB7874-D3": SI_NEB7874_D3, + "SI-NEB7874-E3": SI_NEB7874_E3, + "SI-NEB7874-F3": SI_NEB7874_F3, + "SI-NEB7874-G3": SI_NEB7874_G3, + "SI-NEB7874-H3": SI_NEB7874_H3, + "SI-NEB7874-A4": SI_NEB7874_A4, + "SI-NEB7874-B4": SI_NEB7874_B4, + "SI-NEB7874-C4": SI_NEB7874_C4, + "SI-NEB7874-D4": SI_NEB7874_D4, + "SI-NEB7874-E4": SI_NEB7874_E4, + "SI-NEB7874-F4": SI_NEB7874_F4, + "SI-NEB7874-G4": SI_NEB7874_G4, + "SI-NEB7874-H4": SI_NEB7874_H4, + "SI-NEB7874-A5": SI_NEB7874_A5, + "SI-NEB7874-B5": SI_NEB7874_B5, + "SI-NEB7874-C5": SI_NEB7874_C5, + "SI-NEB7874-D5": SI_NEB7874_D5, + "SI-NEB7874-E5": SI_NEB7874_E5, + "SI-NEB7874-F5": SI_NEB7874_F5, + "SI-NEB7874-G5": SI_NEB7874_G5, + "SI-NEB7874-H5": SI_NEB7874_H5, + "SI-NEB7874-A6": SI_NEB7874_A6, + "SI-NEB7874-B6": SI_NEB7874_B6, + "SI-NEB7874-C6": SI_NEB7874_C6, + "SI-NEB7874-D6": SI_NEB7874_D6, + "SI-NEB7874-E6": SI_NEB7874_E6, + "SI-NEB7874-F6": SI_NEB7874_F6, + "SI-NEB7874-G6": SI_NEB7874_G6, + "SI-NEB7874-H6": SI_NEB7874_H6, } # Chromium lot-specific oligos diff --git a/lib/python/tenkit/samplesheet.py b/lib/python/tenkit/samplesheet.py index 0871ba5..f79cbcf 100644 --- a/lib/python/tenkit/samplesheet.py +++ b/lib/python/tenkit/samplesheet.py @@ -83,7 +83,7 @@ def index_hamming(x, y): # if SI lengths are different, for some reason, return min(len(x,y)) return min(len(x), len(y)) # if Ns in sample index, count as distance 0 - return sum(xi != yi and xi != "N" and yi != "N" for xi, yi in zip(x, y)) + return sum(xi not in (yi, "N") for xi, yi in zip(x, y)) class SampleSheetSection: @@ -95,7 +95,7 @@ def __init__(self, name, rows): def to_row_array(self): if self.name: - output_rows = [["[%s]" % self.name]] + output_rows = [[f"[{self.name}]"]] else: output_rows = [] output_rows.extend(self.rows) @@ -257,7 +257,7 @@ def row_is_simple_data(row): if not len(row) >= 3: return False, "Row has less than three columns" if not cell_is_valid_lane(row[0]): - return False, "First column not a valid lane: %s" % row[0] + return False, f"First column not a valid lane: {row[0]}" if not row[1]: return False, "Sample name blank" if not ( @@ -265,9 +265,9 @@ def row_is_simple_data(row): or row[2] in SAMPLE_DUAL_INDEX_MAP or OLIGO_RE.match(row[2]) ): - return False, "Unrecognized sample index: %s" % row[2] + return False, f"Unrecognized sample index: {row[2]}" if len(row) > 3 and not (row[3] in SAMPLE_DUAL_INDEX_MAP or OLIGO_RE.match(row[3])): - return False, "Unrecognized dual index: %s" % row[3] + return False, f"Unrecognized dual index: {row[3]}" return True, None @@ -341,7 +341,7 @@ def file_get_iem_data_frame(path): """ rows = read_csv_rows(path) if not rows_are_iem_samplesheet(rows): - raise ValueError("Invalid IEM samplesheet format: %s" % path) + raise ValueError(f"Invalid IEM samplesheet format: {path}") section_gen = rows_iem_section_generator(rows) for section in section_gen: if section_is_valid_data(section): @@ -350,7 +350,7 @@ def file_get_iem_data_frame(path): df = pandas.DataFrame(data=section.rows[1:], columns=section.rows[0]) # skip tailing rows return df[df["Sample_ID"].notnull()] - raise ValueError("Invalid IEM samplesheet format, no data found: %s" % path) + raise ValueError(f"Invalid IEM samplesheet format, no data found: {path}") def rows_are_iem_samplesheet(rows): @@ -611,7 +611,7 @@ def check_sample_index_collision(data_section, barcode_mismatches_param="1"): for spec2 in index_specs[idx + 1 :]: # if not on same lane (and a lane is specified; a blank lane is an inferred wildcard), # ignore - if spec1.lane != "" and spec2.lane != "" and spec1.lane != spec2.lane: + if spec1.lane not in ("", spec2.lane): continue # check SI distance si_distance = index_hamming(spec1.index, spec2.index) @@ -651,16 +651,14 @@ def transform_simple_line(row, fc_lane_count, project_name=None, dual_indexed=Fa """ valid_row, _ = row_is_simple_data(row) if not valid_row: - raise ValueError("Invalid data row: %s" % ",".join(row)) + raise ValueError("Invalid data row: {}".format(",".join(row))) dual_index_row, _ = row_is_dual_index_data(row) dual_index_10x_si, _ = row_is_10x_dual_index(row) lanes = cell_expand_lanes(row[0], fc_lane_count) if not lanes: raise NoFastqDataException( - "Invalid data row: {}. The flow cell has {} lanes but lane {} was specified.".format( - row, fc_lane_count, row[0] - ) + f"Invalid data row: {row}. The flow cell has {fc_lane_count} lanes but lane {row[0]} was specified." ) rows = [] for lane in lanes: @@ -1021,7 +1019,7 @@ def transform_samplesheet( else: populated_rows = [row for row in csv_rows if any(row)] if not rows_are_valid_csv(populated_rows): - raise ValueError("Cannot figure out input type: %s" % csv_path) + raise ValueError(f"Cannot figure out input type: {csv_path}") if row_is_simple_header(populated_rows[0]): populated_rows = populated_rows[1:] diff --git a/lib/python/websummary/src/yarn.lock b/lib/python/websummary/src/yarn.lock index 8aec591..a5f3bfd 100644 --- a/lib/python/websummary/src/yarn.lock +++ b/lib/python/websummary/src/yarn.lock @@ -2,113 +2,107 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.9.tgz#895b6c7e04a7271a0cbfd575d2e8131751914cc7" + integrity sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ== dependencies: - "@babel/highlight" "^7.24.2" + "@babel/highlight" "^7.25.9" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.9.tgz#24b01c5db6a3ebf85661b4fb4a946a9bccc72ac8" + integrity sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.9.tgz#855a4cddcec4158f3f7afadacdab2a7de8af7434" + integrity sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helpers" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== +"@babel/generator@^7.25.9", "@babel/generator@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.9.tgz#c7e828ebe0c2baba103b712924699c9e8a6e32f0" + integrity sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA== dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.25.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.25.9" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" + integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== dependencies: - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" - integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.24.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" + integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - regexpu-core "^5.3.1" + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.1.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1": +"@babel/helper-define-polyfill-provider@^0.6.2": version "0.6.2" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== @@ -119,181 +113,165 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" - integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" - -"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== - -"@babel/helper-remap-async-to-generator@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" - integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helper-wrap-function@^7.22.20": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" - integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== - dependencies: - "@babel/helper-function-name" "^7.23.0" - "@babel/template" "^7.24.0" - "@babel/types" "^7.24.5" - -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz#12e4fb2969197ef6d78ea8a2f24375ce85b425fb" + integrity sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-simple-access@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" + integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helpers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.9.tgz#9e26aa6fbefdbca4f8c8a1d66dc6f1c00ddadb0a" + integrity sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/highlight@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" + integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.9.tgz#8fcaa079ac7458facfddc5cd705cc8005e4d3817" + integrity sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" - integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" - integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" - integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" - integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/plugin-proposal-class-properties@^7.16.7": version "7.18.6" @@ -303,30 +281,28 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-decorators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b" - integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== +"@babel/plugin-proposal-decorators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz#8680707f943d1a3da2cd66b948179920f097e254" + integrity sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-decorators" "^7.24.1" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-decorators" "^7.25.9" -"@babel/plugin-proposal-do-expressions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.24.1.tgz#580e97ffb93d537933df3b8d2e6bef67d0beaa0e" - integrity sha512-tVYbJAE3Duz/T0lV5P27aAgpg2vTfUuV0dXN4NNbnoRk7G989IcgjYIA+1pMHUMMLij7Gun42CC15UN5jWm4LA== +"@babel/plugin-proposal-do-expressions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.25.9.tgz#c1eae77aeb86fcd689804378acefd9e8f1ca8a27" + integrity sha512-0IkO77tw2OcZua/ADovH//IEiUyQpNjWvLyMFNidXnZx4eEriQjwkH9t/EyQZUaQu0KOxxdszC7m8VUVs51ydg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-do-expressions" "^7.24.1" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-export-default-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" - integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== +"@babel/plugin-proposal-export-default-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c" + integrity sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-export-default-from" "^7.24.1" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" @@ -336,22 +312,20 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-function-bind@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.24.1.tgz#e3e265ec2f1324dbe29b249c35fab58b5c15a684" - integrity sha512-GDz3lXY623E+SMhloR0HDKYfFjLnqYEHjxIHo3SvpJTV3SV89974Y3mADXSYnO1N+UP7bioAFKqpOmsD9aOnuw== +"@babel/plugin-proposal-function-bind@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.25.9.tgz#ef98187f3d2cb87abf0f815f43bf4f26c1a6d968" + integrity sha512-1g0b0XU667A2IZNdhovGr0ZdywJxf081B8JN5qyiNqzJK7GtdYBxGcuA+lq7q8OgO4cAc4vF57Ad0XLoDBsJAg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-function-bind" "^7.24.1" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-function-sent@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.24.1.tgz#228c85798b62fc1c1a84c8ab512d46c41885f4bd" - integrity sha512-GxHpB7jATDZWYEuYkR5jv5aiHbwkmbvk3fJP5G2Dvl7va+kewfbYxpnU1BadIHd3kXlLPQj4CKbLKoWxX4nTtA== +"@babel/plugin-proposal-function-sent@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.25.9.tgz#50eccfe5a6a518f9f264eacfc9a9865dcb2bfa85" + integrity sha512-Qi9KEBTY6WAjHBeHJ1jm4HyGlwvZLfjUaxO9g1jKHqyQPe6c+q7DlKgyrBUH7v+VWLJ0bNy5cQlXHtOV5/uibw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-wrap-function" "^7.22.20" - "@babel/plugin-syntax-function-sent" "^7.24.1" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" "@babel/plugin-proposal-json-strings@^7.16.7": version "7.18.6" @@ -394,26 +368,25 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-pipeline-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.24.1.tgz#a8ea2b281b68cdb676270298f32d46da61c22a6b" - integrity sha512-JFqo+VsSosYxzo1PPfrbeoIi0IcAJnjGpDXeVABNl5bH6/Zvn84Kd8utGEA1eT3gLsynyt1+TfQ/opGXtb0Y/A== +"@babel/plugin-proposal-pipeline-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.25.9.tgz#8494cd391e0f08de9cb2b19e48978554b4683daa" + integrity sha512-rmb8zOYFdVz6y/OqJn6RfbIBiJPQdUbHg7R5ibym5KM0e8uNGdU9yfn9cjkBLwS22Lqd+ey3D8/UvK5GLyyh5A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-pipeline-operator" "^7.24.1" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-pipeline-operator" "^7.25.9" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-proposal-throw-expressions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.24.1.tgz#7f08e07de51463fd302860e7928cccdcb4fa1d48" - integrity sha512-wiae/VkKNX1WuM+wXIeAZY1cvbVKJJIf92eA23s2ufpp4w+vOlp+/4T3yfxN6nzN+hIwT15AsdwujAelIqNW+w== +"@babel/plugin-proposal-throw-expressions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.25.9.tgz#9bfba4a4b775dbadfc5ca91a9f22097754142b56" + integrity sha512-Zw62DP6cdbXXEtTNMWYY10rIOPGAWPk8qdqM+AT3JbHtFq8ook0JXJCWdQJTlSVACHo0R6lvoNKO9B1ZVkjClg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-throw-expressions" "^7.24.1" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -429,7 +402,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -443,19 +416,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" - integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== +"@babel/plugin-syntax-decorators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz#986b4ca8b7b5df3f67cee889cedeffc2e2bf14b3" + integrity sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-syntax-do-expressions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.24.1.tgz#8e423c79355797e2dbdac26e03c248be27391795" - integrity sha512-l5ZJA2DB2s/pM3SQzwf1ykWOiBaqN6Eb07EoZ/mH8dUR5RnaWlmPLoav6y4OT8A9Pkl615osBMZOedFbErdOOA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -464,13 +430,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" - integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" @@ -478,35 +437,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-function-bind@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.24.1.tgz#5a3ba1b9ab91286822373fb1dc34b468d8510ea2" - integrity sha512-7K+uzNJ5ZuL6g4Ud/UhbIxghwN2FAj8NBrzEO+eM0g9YddjOv+BD81ar/N7Es5sH+G8z9tnTYcfCu6EaPrkSDw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-syntax-function-sent@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.24.1.tgz#cd3fd5fa9fce0f53d6dcb78999dd7201561c2304" - integrity sha512-aVwkxqagsGCI8vtuyMI+LnZ2SWtGP4+v9T/T88j2MwKRsGYzc9FAaEzsNMu1Htu6SsHPcfwQ7uZ7pYPGrVmG+g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" - integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== +"@babel/plugin-syntax-import-assertions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz#631686872fac3d4d1f1ae9a406a8fd1c482c7b2a" + integrity sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" - integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz#29c9643445deea4533c05e6ac6c39d15424bbe78" + integrity sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -520,14 +465,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== +"@babel/plugin-syntax-jsx@^7.25.9", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -541,7 +486,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -569,12 +514,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.24.1.tgz#149bacade7594288dd9ad373bcbfe2927ea750cc" - integrity sha512-UU7uLj95zh6oMQiREvkTmXAvWy9pJI9p76SFkNsXTesDwQ67YM1UU1Bkx576djA6ZDcPSbzM/MqTJNcYeQ0G2g== +"@babel/plugin-syntax-pipeline-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.25.9.tgz#5488436b3e0a313716b4ff05d3a4f47970639dd4" + integrity sha512-W0KjBvv8uT4A8DUoRNpXEHkKekqO/PC57doaWCqbJeG0lGxKFh7w7/PHYPmwgF+jKxekNnc+YOMQNCo94d8MJg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" @@ -583,14 +528,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-throw-expressions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.24.1.tgz#f8b18a0126cb2991e4f093c6fdab662ef46d7eee" - integrity sha512-o4dN/9/hUAC6RuX1QZDlauBG2nmSmUMk0K7/IOIFxjM8V16FS1JTHHiBWqGkkIjK4myeHucJbBHurqjtWFAdsw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -598,11 +536,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -612,511 +550,492 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" - integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" - integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== +"@babel/plugin-transform-async-generator-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" + integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" - integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== dependencies: - "@babel/helper-module-imports" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" - integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== +"@babel/plugin-transform-block-scoped-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-block-scoping@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" - integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" - integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== +"@babel/plugin-transform-class-static-block@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz#1cab37c4278a563409d74c1e4f08fb77de5d7a5c" + integrity sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-classes@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" - integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" - integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/template" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" - integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" - integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" - integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" - integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" - integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-export-namespace-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" - integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== +"@babel/plugin-transform-exponentiation-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" + integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-for-of@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" - integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-function-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" - integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== +"@babel/plugin-transform-for-of@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" - integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" - integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" - integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" - integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" - integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" - integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" - integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== +"@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" + integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" - integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" - integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" - integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" - integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" + integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-rest-spread@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" - integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-super@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" - integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" - integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" -"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" - integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-parameters@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" - integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-private-methods@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" - integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-property-in-object@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" - integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.5" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" - integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-display-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" - integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== +"@babel/plugin-transform-react-display-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d" + integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== +"@babel/plugin-transform-react-jsx-development@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz#8fd220a77dd139c07e25225a903b8be8c829e0d7" + integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" + "@babel/plugin-transform-react-jsx" "^7.25.9" -"@babel/plugin-transform-react-pure-annotations@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" - integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== +"@babel/plugin-transform-react-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" - integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== +"@babel/plugin-transform-react-pure-annotations@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz#ea1c11b2f9dbb8e2d97025f43a3b5bc47e18ae62" + integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" - integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-shorthand-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" - integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" - integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-sticky-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" - integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-template-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" - integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== +"@babel/plugin-transform-template-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" + integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" - integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== +"@babel/plugin-transform-typeof-symbol@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" + integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" - integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" - integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" - integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" - integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/preset-env@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" - integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== +"@babel/preset-env@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.9.tgz#fc8a68705e02553cdeeeb5477bf241e12b9c3cd9" + integrity sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q== dependencies: - "@babel/compat-data" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + "@babel/compat-data" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-import-assertions" "^7.25.9" + "@babel/plugin-syntax-import-attributes" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.5" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.5" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.5" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.5" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.5" - "@babel/plugin-transform-parameters" "^7.24.5" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.5" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.5" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.25.9" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.25.9" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.25.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" + core-js-compat "^3.38.1" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1128,63 +1047,54 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" - integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== +"@babel/preset-react@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e" + integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-react-display-name" "^7.24.1" - "@babel/plugin-transform-react-jsx" "^7.23.4" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.24.1" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-react-display-name" "^7.25.9" + "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx-development" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations" "^7.25.9" -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" - integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== +"@babel/runtime@^7.21.0", "@babel/runtime@^7.24.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.9.tgz#65884fd6dc255a775402cc1d9811082918f4bf00" + integrity sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" +"@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.9.tgz#620f35ea1f4233df529ec9a2668d2db26574deee" + integrity sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ== dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@bazel/hide-bazel-files@latest": version "1.7.0" @@ -1204,95 +1114,125 @@ commander "^2.15.1" "@discoveryjs/json-ext@^0.5.0": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.6.1": - version "4.6.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" - integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== +"@eslint/config-array@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.7.0.tgz#a1bb4b6a4e742a5ff1894b7ee76fbf884ec72bd3" + integrity sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw== + +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" + espree "^10.0.1" + globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@9.13.0": + version "9.13.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.13.0.tgz#c5f89bcd57eb54d5d4fa8b77693e9c28dc97e547" + integrity sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA== -"@floating-ui/core@^1.0.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" - integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + +"@eslint/plugin-kit@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz#8712dccae365d24e9eeecb7b346f85e750ba343d" + integrity sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig== + dependencies: + levn "^0.4.1" + +"@floating-ui/core@^1.6.0": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== dependencies: - "@floating-ui/utils" "^0.2.1" + "@floating-ui/utils" "^0.2.8" "@floating-ui/dom@^1.6.1": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" - integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== + version "1.6.11" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.11.tgz#8631857838d34ee5712339eb7cbdfb8ad34da723" + integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ== dependencies: - "@floating-ui/core" "^1.0.0" - "@floating-ui/utils" "^0.2.0" + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.8" -"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" - integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== -"@fontsource/inconsolata@^5.0.18": - version "5.0.18" - resolved "https://registry.yarnpkg.com/@fontsource/inconsolata/-/inconsolata-5.0.18.tgz#6c2a4bd67ba006846d24a7ea4760096a074f569e" - integrity sha512-VVG5RWMfYEmWRKv3sh8M1n3Ux3vs7v8978vYZ205lBQPlff3e7H67f7TRfswj2ybnX53+QxWylySvcv8ACCvWw== +"@fontsource/inconsolata@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@fontsource/inconsolata/-/inconsolata-5.1.0.tgz#f6a76680173336d02d2ce4009699821a6be239ce" + integrity sha512-vYPdG3R46MhK+99De8e8MMyNad5BAb1oTnHMpojlctZyWJIcin8bKHFPUpQSNRhZ4HQL/+DCW+RTiG2RbnweTw== -"@fontsource/overpass@^5.0.18": - version "5.0.18" - resolved "https://registry.yarnpkg.com/@fontsource/overpass/-/overpass-5.0.18.tgz#715160c366d3d1bddf8e7ab0c294cc73b255116d" - integrity sha512-LU7sz+9d0vBpnxuefhaXD+E16gkXksHfxjF9CaT/n9oYDur6HivPM4Qd8KYvvbsaaCyBQkx23gddpDwBX6aANw== +"@fontsource/overpass@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@fontsource/overpass/-/overpass-5.1.1.tgz#71aab7b63f3f0fed9f55ea4cf007d308066e6c6f" + integrity sha512-Zanaf61C+fKw+T6rnxacltqLmOo0MkiYTJIkAcOIPhsiD0zAubBvyyHUshmGIf/5C15MZjxK+JDeAd/dB3Zn5g== "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanfs/core@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.0.tgz#08db7a8c73bb07673d9ebd925f2dad746411fcec" + integrity sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw== + +"@humanfs/node@^0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.5.tgz#a9febb7e7ad2aff65890fdc630938f8d20aa84ba" + integrity sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" + "@humanfs/core" "^0.19.0" + "@humanwhocodes/retry" "^0.3.0" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/retry@^0.3.0", "@humanwhocodes/retry@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1433,13 +1373,6 @@ strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -1497,18 +1430,6 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -1521,15 +1442,6 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" @@ -1540,14 +1452,9 @@ "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" @@ -1555,19 +1462,19 @@ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -1575,14 +1482,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - "@mapbox/geojson-rewind@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz#591a5d71a9cd1da1a0bf3420b3bea31b0fc7946a" @@ -1596,7 +1495,7 @@ resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== -"@mapbox/jsonlint-lines-primitives@^2.0.2": +"@mapbox/jsonlint-lines-primitives@^2.0.2", "@mapbox/jsonlint-lines-primitives@~2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" integrity sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ== @@ -1616,11 +1515,21 @@ resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== +"@mapbox/tiny-sdf@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz#9a1d33e5018093e88f6a4df2343e886056287282" + integrity sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA== + "@mapbox/unitbezier@^0.0.0": version "0.0.0" resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" integrity sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA== +"@mapbox/unitbezier@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz#d32deb66c7177e9e9dfc3bbd697083e2e657ff01" + integrity sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw== + "@mapbox/vector-tile@^1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" @@ -1633,6 +1542,20 @@ resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== +"@maplibre/maplibre-gl-style-spec@^20.3.1": + version "20.3.1" + resolved "https://registry.yarnpkg.com/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.3.1.tgz#4e835f6cd9ab5e92791e63099281036840ecc121" + integrity sha512-5ueL4UDitzVtceQ8J4kY+Px3WK+eZTsmGwha3MBKHKqiHvKrjWWwBCIl1K8BuJSc5OFh83uI8IFNoFvQxX2uUw== + dependencies: + "@mapbox/jsonlint-lines-primitives" "~2.0.2" + "@mapbox/unitbezier" "^0.0.1" + json-stringify-pretty-compact "^4.0.0" + minimist "^1.2.8" + quickselect "^2.0.0" + rw "^1.3.3" + sort-object "^3.0.3" + tinyqueue "^3.0.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1641,12 +1564,12 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1662,18 +1585,18 @@ "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/move-file@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== dependencies: mkdirp "^1.0.4" rimraf "^3.0.2" "@pkgr/core@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.0.tgz#7d8dacb7fdef0e4387caf7396cbd77f179867d06" - integrity sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ== + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== "@plotly/d3-sankey-circular@0.33.1": version "0.33.1" @@ -1694,10 +1617,10 @@ d3-collection "1" d3-shape "^1.2.0" -"@plotly/d3@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@plotly/d3/-/d3-3.8.1.tgz#674bf19809ffcc359e0ab388a1051f2dac5e6877" - integrity sha512-x49ThEu1FRA00kTso4Jdfyf2byaCPLBGmLjAYQz5OzaPyLUhHesX3/Nfv2OHEhynhdy2UB39DLXq6thYe2L2kg== +"@plotly/d3@3.8.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@plotly/d3/-/d3-3.8.2.tgz#06a93a1dfc1377c1a441c24ddb156fc8da786f4a" + integrity sha512-wvsNmh1GYjyJfyEBPKJLTMzgf2c2bEbSIL50lmqVUi+o1NHaLPi1Lb4v7VxXXJn043BhNyrxUrWI85Q+zmjOVA== "@plotly/mapbox-gl@1.13.4": version "1.13.4" @@ -1744,28 +1667,28 @@ pick-by-alias "^1.2.0" "@popperjs/core@^2.11.6": - version "2.11.7" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" - integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@react-aria/ssr@^3.5.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.6.0.tgz#e5d52bd1686ff229f68f806cf94ee29dd9f54fb7" - integrity sha512-OFiYQdv+Yk7AO7IsQu/fAEPijbeTwrrEYvdNoJ3sblBBedD5j5fBTNWrUPNVlwC4XWWnWTCMaRIVsJujsFiWXg== + version "3.9.5" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.5.tgz#775d84f51f90934ff51ae74eeba3728daac1a381" + integrity sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ== dependencies: - "@swc/helpers" "^0.4.14" + "@swc/helpers" "^0.5.0" "@restart/hooks@^0.4.9": - version "0.4.9" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.9.tgz#ad858fb39d99e252cccce19416adc18fc3f18fcb" - integrity sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ== + version "0.4.16" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" + integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w== dependencies: - dequal "^2.0.2" + dequal "^2.0.3" -"@restart/ui@^1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.3.tgz#8063f5b5e0131d41db2cefe148b20cb08a208e76" - integrity sha512-7HM5aiSWvJBWr+FghZj/n3PSuH2kUrOPiu/D92aIv1zTL8IBwFoQ3oz/f76svoN5v2PKaP6pQbg6vTcIiSffzg== +"@restart/ui@^1.6.9": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.8.0.tgz#3e8d80822b5fbef0576f94acda51d7da9e79e005" + integrity sha512-xJEOXUOTmT4FngTmhdjKFRrVVF0hwCLNPdatLCHkyS4dkiSK12cEu1Y0fjxktjJrdst9jJIc5J6ihMJCoWEN/g== dependencies: "@babel/runtime" "^7.21.0" "@popperjs/core" "^2.11.6" @@ -1774,14 +1697,9 @@ "@types/warning" "^3.0.0" dequal "^2.0.3" dom-helpers "^5.2.0" - uncontrollable "^7.2.1" + uncontrollable "^8.0.1" warning "^4.0.3" -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -1801,10 +1719,10 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@swc/helpers@^0.4.14": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" - integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== +"@swc/helpers@^0.5.0": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" + integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== dependencies: tslib "^2.4.0" @@ -1818,41 +1736,51 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@turf/area@^6.4.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.5.0.tgz#1d0d7aee01d8a4a3d4c91663ed35cc615f36ad56" - integrity sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg== +"@turf/area@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@turf/area/-/area-7.1.0.tgz#c8b506cfa9f8b06570c090c9cf915fa080ae7b66" + integrity sha512-w91FEe02/mQfMPRX2pXua48scFuKJ2dSVMF2XmJ6+BJfFiCPxp95I3+Org8+ZsYv93CDNKbf0oLNEPnuQdgs2g== dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" + "@turf/helpers" "^7.1.0" + "@turf/meta" "^7.1.0" + "@types/geojson" "^7946.0.10" + tslib "^2.6.2" -"@turf/bbox@^6.4.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.5.0.tgz#bec30a744019eae420dac9ea46fb75caa44d8dc5" - integrity sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw== +"@turf/bbox@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-7.1.0.tgz#45a9287c084f7b79577ee88b7b539d83562b923b" + integrity sha512-PdWPz9tW86PD78vSZj2fiRaB8JhUHy6piSa/QXb83lucxPK+HTAdzlDQMTKj5okRCU8Ox/25IR2ep9T8NdopRA== dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" + "@turf/helpers" "^7.1.0" + "@turf/meta" "^7.1.0" + "@types/geojson" "^7946.0.10" + tslib "^2.6.2" -"@turf/centroid@^6.0.2": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.5.0.tgz#ecaa365412e5a4d595bb448e7dcdacfb49eb0009" - integrity sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A== +"@turf/centroid@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-7.1.0.tgz#7cd55ec0bab79b5fc0ef03a4870a8cbc75e6207f" + integrity sha512-1Y1b2l+ZB1CZ+ITjUCsGqC4/tSjwm/R4OUfDztVqyyCq/VvezkLmTNqvXTGXgfP0GXkpv68iCfxF5M7QdM5pJQ== dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" + "@turf/helpers" "^7.1.0" + "@turf/meta" "^7.1.0" + "@types/geojson" "^7946.0.10" + tslib "^2.6.2" -"@turf/helpers@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" - integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== +"@turf/helpers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-7.1.0.tgz#eb734e291c9c205822acdd289fe20e91c3cb1641" + integrity sha512-dTeILEUVeNbaEeoZUOhxH5auv7WWlOShbx7QSd4s0T4Z0/iz90z9yaVCtZOLbU89umKotwKaJQltBNO9CzVgaQ== + dependencies: + "@types/geojson" "^7946.0.10" + tslib "^2.6.2" -"@turf/meta@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.5.0.tgz#b725c3653c9f432133eaa04d3421f7e51e0418ca" - integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== +"@turf/meta@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-7.1.0.tgz#b2af85afddd0ef08aeae8694a12370a4f06b6d13" + integrity sha512-ZgGpWWiKz797Fe8lfRj7HKCkGR+nSJ/5aKXMyofCvLSc2PuYJs/qyyifDPWjASQQCzseJ7AlF2Pc/XQ/3XkkuA== dependencies: - "@turf/helpers" "^6.5.0" + "@turf/helpers" "^7.1.0" + "@types/geojson" "^7946.0.10" "@types/babel__core@^7.1.14": version "7.20.5" @@ -1881,42 +1809,33 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" -"@types/clone@~2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/clone/-/clone-2.1.1.tgz#9b880d0ce9b1f209b5e0bd6d9caa38209db34024" - integrity sha512-BZIU34bSYye0j/BFcPraiDZ5ka6MJADjcDVELGf7glr9K+iE8NYVjFslJFVWzskSxkLLyCrSPScE82/UUoBSvg== - -"@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" +"@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== -"@types/eslint@*": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.2.2.tgz#b64dbdb64b1957cfc8a698c68297fcf8983e94c7" - integrity sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A== +"@types/geojson-vt@3.2.5": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/geojson-vt/-/geojson-vt-3.2.5.tgz#b6c356874991d9ab4207533476dfbcdb21e38408" + integrity sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g== dependencies: - "@types/estree" "*" - "@types/json-schema" "*" + "@types/geojson" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/geojson@*", "@types/geojson@^7946.0.10", "@types/geojson@^7946.0.14": + version "7946.0.14" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" + integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== -"@types/geojson@^7946.0.10": - version "7946.0.10" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" - integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== +"@types/geojson@7946.0.4": + version "7946.0.4" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.4.tgz#4e049756383c3f055dd8f3d24e63fb543e98eb07" + integrity sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q== "@types/graceful-fs@^4.1.3": version "4.1.9" @@ -1925,109 +1844,227 @@ dependencies: "@types/node" "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-coverage@^2.0.1": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/lodash@^4.17.12": + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.12.tgz#25d71312bf66512105d71e55d42e22c36bcfc689" + integrity sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ== + +"@types/mapbox__point-geometry@*", "@types/mapbox__point-geometry@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz#0ef017b75eedce02ff6243b4189210e2e6d5e56d" + integrity sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA== + +"@types/mapbox__vector-tile@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz#ad757441ef1d34628d9e098afd9c91423c1f8734" + integrity sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg== + dependencies: + "@types/geojson" "*" + "@types/mapbox__point-geometry" "*" + "@types/pbf" "*" "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== -"@types/node@*": - version "17.0.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" - integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== +"@types/node@*", "@types/node@^22.7.9": + version "22.7.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9" + integrity sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg== + dependencies: + undici-types "~6.19.2" "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/pbf@*", "@types/pbf@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/pbf/-/pbf-3.0.5.tgz#a9495a58d8c75be4ffe9a0bd749a307715c07404" + integrity sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA== + +"@types/plotly.js@*", "@types/plotly.js@^2.33.4": + version "2.33.4" + resolved "https://registry.yarnpkg.com/@types/plotly.js/-/plotly.js-2.33.4.tgz#2128af8c90bafd49f556b5cc5a2c8e1b615fc052" + integrity sha512-BzAbsJTiUQyALkkYx1D31YZ9YvcU2ag3LlE/iePMo19eDPvM30cbM2EFNIcu31n39EhXj/9G7800XLA8/rfApA== "@types/prop-types@*": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== + +"@types/react-dom@^18.3.0": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react-plotly.js@^2.6.3": + version "2.6.3" + resolved "https://registry.yarnpkg.com/@types/react-plotly.js/-/react-plotly.js-2.6.3.tgz#49829a5c4f011345d09f6cab692f7ddbf558cbfb" + integrity sha512-HBQwyGuu/dGXDsWhnQrhH+xcJSsHvjkwfSRjP+YpOsCCWryIuXF78ZCBjpfgO3sCc0Jo8sYp4NOGtqT7Cn3epQ== + dependencies: + "@types/plotly.js" "*" + "@types/react" "*" "@types/react-table@^6.8.5": - version "6.8.9" - resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-6.8.9.tgz#0925879352e4c15b9b9a7087481ac4268bf8e5ae" - integrity sha512-fVQXjy/EYDbgraScgjDONA291McKqGrw0R0NeK639fx2bS4T19TnXMjg3FjOPlkI3qYTQtFTPADlRYysaQIMpA== + version "6.8.15" + resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-6.8.15.tgz#6fecf57ebe43677372333411865c53093ad845d3" + integrity sha512-5+1Fv5aqvjEvfmjDhGyJgtA/spUSuTcUWSP8e2QS6vdFUdDeRiQmqDK+2619mm9htlmWMgb8vUMUlpsKXmUgRg== dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.5": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" - integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== +"@types/react-transition-group@^4.4.6": + version "4.4.11" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5" + integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.9.11": - version "17.0.38" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" - integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.3.1": + version "18.3.10" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.10.tgz#6edc26dc22ff8c9c226d3c7bf8357b013c842219" + integrity sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/supercluster@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/supercluster/-/supercluster-7.1.3.tgz#1a1bc2401b09174d9c9e44124931ec7874a72b27" + integrity sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA== + dependencies: + "@types/geojson" "*" + "@types/warning@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" - integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" + integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@typescript-eslint/eslint-plugin@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz#c3f087d20715fa94310b30666c08b3349e0ab084" + integrity sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.11.0" + "@typescript-eslint/type-utils" "8.11.0" + "@typescript-eslint/utils" "8.11.0" + "@typescript-eslint/visitor-keys" "8.11.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.11.0.tgz#2ad1481388dc1c937f50b2d138c9ca57cc6c5cce" + integrity sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg== + dependencies: + "@typescript-eslint/scope-manager" "8.11.0" + "@typescript-eslint/types" "8.11.0" + "@typescript-eslint/typescript-estree" "8.11.0" + "@typescript-eslint/visitor-keys" "8.11.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz#9d399ce624118966732824878bc9a83593a30405" + integrity sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ== + dependencies: + "@typescript-eslint/types" "8.11.0" + "@typescript-eslint/visitor-keys" "8.11.0" + +"@typescript-eslint/type-utils@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz#b7f9e6120c1ddee8a1a07615646642ad85fc91b5" + integrity sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg== + dependencies: + "@typescript-eslint/typescript-estree" "8.11.0" + "@typescript-eslint/utils" "8.11.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.11.0.tgz#7c766250502097f49bbc2e651132e6bf489e20b8" + integrity sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw== + +"@typescript-eslint/typescript-estree@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz#35fe5d3636fc5727c52429393415412e552e222b" + integrity sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg== + dependencies: + "@typescript-eslint/types" "8.11.0" + "@typescript-eslint/visitor-keys" "8.11.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.11.0.tgz#4480d1e9f2bb18ea3510c79f870a1aefc118103d" + integrity sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.11.0" + "@typescript-eslint/types" "8.11.0" + "@typescript-eslint/typescript-estree" "8.11.0" + +"@typescript-eslint/visitor-keys@8.11.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz#273de1cbffe63d9f9cd7dfc20b5a5af66310cb92" + integrity sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw== + dependencies: + "@typescript-eslint/types" "8.11.0" + eslint-visitor-keys "^3.4.3" "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" @@ -2190,10 +2227,10 @@ acorn-dynamic-import@^4.0.0: resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-jsx@^5.2.0, acorn-jsx@^5.3.2: version "5.3.2" @@ -2210,10 +2247,10 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== +acorn@^8.12.0, acorn@^8.7.1, acorn@^8.8.2: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -2223,12 +2260,10 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: - debug "^4.1.0" - depd "^1.1.2" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -2269,14 +2304,14 @@ ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" almost-equal@^1.1.0: version "1.1.0" @@ -2327,10 +2362,10 @@ anymatch@^3.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== dependencies: delegates "^1.0.0" readable-stream "^3.6.0" @@ -2347,6 +2382,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + array-bounds@^1.0.0, array-bounds@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" @@ -2365,7 +2405,7 @@ array-find-index@^1.0.2: resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== -array-includes@^3.1.5, array-includes@^3.1.7: +array-includes@^3.1.6, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -2394,7 +2434,7 @@ array-rearrange@^2.2.2: resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== -array.prototype.findlast@^1.2.4: +array.prototype.findlast@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== @@ -2406,35 +2446,35 @@ array.prototype.findlast@^1.2.4: es-object-atoms "^1.0.0" es-shim-unscopables "^1.0.2" -array.prototype.flatmap@^1.2.5, array.prototype.flatmap@^1.3.2: +array.prototype.flat@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== +array.prototype.flatmap@^1.2.5, array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" + es-abstract "^1.23.3" + es-errors "^1.3.0" es-shim-unscopables "^1.0.2" arraybuffer.prototype.slice@^1.0.3: @@ -2456,21 +2496,26 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA== -autoprefixer@^10.4.18: - version "10.4.18" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.18.tgz#fcb171a3b017be7cb5d8b7a825f5aacbf2045163" - integrity sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g== +autoprefixer@^10.4.20: + version "10.4.20" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001591" + browserslist "^4.23.3" + caniuse-lite "^1.0.30001646" fraction.js "^4.3.7" normalize-range "^0.1.2" - picocolors "^1.0.0" + picocolors "^1.0.1" postcss-value-parser "^4.2.0" available-typed-arrays@^1.0.7: @@ -2493,12 +2538,12 @@ babel-jest@^29.7.0: graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" - integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== +babel-loader@^9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" + integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== dependencies: - find-cache-dir "^3.3.2" + find-cache-dir "^4.0.0" schema-utils "^4.0.0" babel-plugin-istanbul@^6.1.1: @@ -2523,46 +2568,49 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__traverse" "^7.0.6" babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" - integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" - integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== +babel-plugin-polyfill-corejs3@^0.10.6: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" - core-js-compat "^3.36.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" - integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^29.6.3: version "29.6.3" @@ -2613,11 +2661,9 @@ bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: integrity sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA== bitmap-sdf@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" - integrity sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg== - dependencies: - clamp "^1.0.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz#e87b8b1d84ee846567cfbb29d60eedd34bca5b6f" + integrity sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg== bl@^1.0.0: version "1.2.3" @@ -2653,22 +2699,29 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== +browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.23.3, browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" bser@2.1.1: version "2.1.1" @@ -2710,16 +2763,31 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -cacache@^16.0.2: - version "16.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.0.3.tgz#0b6314bde969bd4098b03a5f90a351e8a1483f48" - integrity "sha1-C2MUvelpvUCYsDpfkKNR6KFIP0g= sha512-eC7wYodNCVb97kuHGk5P+xZsvUJHkhSEOyNwkenqQPAsOtrTjvWOE5vSPNBpz9d8X3acIf6w2Ub5s4rvOCTs4g==" +bytewise-core@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" + integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== + dependencies: + typewise-core "^1.2" + +bytewise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" + integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== + dependencies: + bytewise-core "^1.2.2" + typewise "^1.0.3" + +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== dependencies: "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^1.1.2" + "@npmcli/move-file" "^2.0.0" chownr "^2.0.0" fs-minipass "^2.1.0" - glob "^7.2.0" + glob "^8.0.1" infer-owner "^1.0.4" lru-cache "^7.7.1" minipass "^3.1.6" @@ -2730,9 +2798,9 @@ cacache@^16.0.2: p-map "^4.0.0" promise-inflight "^1.0.1" rimraf "^3.0.2" - ssri "^8.0.1" + ssri "^9.0.0" tar "^6.1.11" - unique-filename "^1.1.1" + unique-filename "^2.0.0" call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" @@ -2779,10 +2847,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001591: - version "1.0.30001617" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" - integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669: + version "1.0.30001669" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3" + integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w== canvas-fit@^1.5.0: version "1.5.0" @@ -2800,7 +2868,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2826,19 +2894,19 @@ chownr@^2.0.0: integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== ci-info@^3.2.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.6.1.tgz#7594f1c95cb7fdfddee7af95a13af7dbc67afdcf" - integrity sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== clamp@1.0.1, clamp@^1.0.1: version "1.0.1" @@ -2846,9 +2914,9 @@ clamp@1.0.1, clamp@^1.0.1: integrity sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA== classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.0, classnames@^2.3.1, classnames@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== clean-stack@^2.0.0: version "2.2.0" @@ -2873,11 +2941,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2888,13 +2951,20 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -color-alpha@1.0.4, color-alpha@^1.0.4: +color-alpha@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.0.4.tgz#c141dc926e95fc3db647d0e14e5bc3651c29e040" integrity sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A== dependencies: color-parse "^1.3.8" +color-alpha@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.1.3.tgz#71250189e9f02bba8261a94d5e7d5f5606d1749a" + integrity sha512-krPYBO1RSO5LH4AGb/b6z70O1Ip2o0F0+0cVFN5FN99jfQtZFT08rQyg+9oOBNJYAn3SRwJIFC8jUEOKz7PisA== + dependencies: + color-parse "^1.4.1" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2926,7 +2996,7 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-normalize@1.5.0, color-normalize@^1.5.0: +color-normalize@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.0.tgz#ee610af9acb15daf73e77a945a847b18e40772da" integrity sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw== @@ -2935,6 +3005,14 @@ color-normalize@1.5.0, color-normalize@^1.5.0: color-rgba "^2.1.1" dtype "^2.0.0" +color-normalize@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.2.tgz#d6c8beb02966849548f91a6ac0274c6f19924509" + integrity sha512-yYMIoyFJmUoKbCK6sBShljBWfkt8DXVfaZJn9/zvRJkF9eQJDbZhcYC6LdOVy40p4tfVwYYb9cXl8oqpu7pzBw== + dependencies: + color-rgba "^2.2.0" + dtype "^2.0.0" + color-parse@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-2.0.0.tgz#6bcf1f0f1fafffe68cacc2dde7a19b3a8c3d7bcd" @@ -2942,14 +3020,14 @@ color-parse@2.0.0: dependencies: color-name "^1.0.0" -color-parse@^1.3.8: - version "1.4.2" - resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.2.tgz#78651f5d34df1a57f997643d86f7f87268ad4eb5" - integrity sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA== +color-parse@^1.3.8, color-parse@^1.4.1, color-parse@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.3.tgz#6dadfb49128c554c60c49d63f3d025f2c5a7ff22" + integrity sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A== dependencies: color-name "^1.0.0" -color-rgba@2.1.1, color-rgba@^2.1.1: +color-rgba@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.1.1.tgz#4633b83817c7406c90b3d7bf4d1acfa48dde5c83" integrity sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw== @@ -2958,6 +3036,14 @@ color-rgba@2.1.1, color-rgba@^2.1.1: color-parse "^1.3.8" color-space "^1.14.6" +color-rgba@^2.1.1, color-rgba@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.4.0.tgz#ae85819c530262c29fc2da129fc7c8f9efc57015" + integrity sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q== + dependencies: + color-parse "^1.4.2" + color-space "^2.0.0" + color-space@^1.14.6: version "1.16.0" resolved "https://registry.yarnpkg.com/color-space/-/color-space-1.16.0.tgz#611781bca41cd8582a1466fd9e28a7d3d89772a2" @@ -2966,20 +3052,25 @@ color-space@^1.14.6: hsluv "^0.0.3" mumath "^3.3.4" -color-support@^1.1.2: +color-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-space/-/color-space-2.0.1.tgz#da39871175baf4a5785ba519397df04b8d67e0fa" + integrity sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA== + +color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -colord@^2.9.1: - version "2.9.2" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" - integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== +colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== colors@~0.6.0-1: version "0.6.2" @@ -3006,10 +3097,10 @@ commander@~2.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" integrity sha512-J2wnb6TKniXNOtoHS8TSrG9IOQluPrsmyAJ8oCUJOBmv+uLBCyPYAZkD2jFvw2DCzIXNnISIM01NIvr35TkBMQ== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== concat-map@0.0.1: version "0.0.1" @@ -3026,7 +3117,7 @@ concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" -console-control-strings@^1.0.0, console-control-strings@^1.1.0: +console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== @@ -3036,27 +3127,27 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" - integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== +core-js-compat@^3.38.0, core-js-compat@^3.38.1: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.3" core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^8.3.5: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: + env-paths "^2.2.1" import-fresh "^3.3.0" js-yaml "^4.1.0" parse-json "^5.2.0" - path-type "^4.0.0" country-regex@^1.1.0: version "1.1.0" @@ -3085,10 +3176,10 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== +css-declaration-sorter@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" + integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== css-font-size-keywords@^1.0.0: version "1.0.0" @@ -3130,31 +3221,31 @@ css-global-keywords@^1.0.1: resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" integrity sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ== -css-loader@^6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.9.0.tgz#0cc2f14df94ed97c526c5ae42b6b13916d1d8d0e" - integrity sha512-3I5Nu4ytWlHvOP6zItjiHlefBNtrH+oehq8tnQa2kO305qpVyx9XNIT1CXIj5bgCJs7qICBCkgCYxQLKPANoLA== +css-loader@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.2.tgz#64671541c6efe06b0e22e750503106bdd86880f8" + integrity sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA== dependencies: icss-utils "^5.1.0" - postcss "^8.4.31" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" semver "^7.5.4" -css-minimizer-webpack-plugin@^5: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz#33effe662edb1a0bf08ad633c32fa75d0f7ec565" - integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== +css-minimizer-webpack-plugin@^7: + version "7.0.0" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.0.tgz#b77a3d2f7c0fd02d3ac250dcc2f79065363f3cd3" + integrity sha512-niy66jxsQHqO+EYbhPuIhqRQ1mNcNVUHrMnkzzir9kFOERJUaQDDRhh7dKDz33kBpkWMF9M8Vx0QlDbc5AHOsw== dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - cssnano "^6.0.1" - jest-worker "^29.4.3" - postcss "^8.4.24" - schema-utils "^4.0.1" - serialize-javascript "^6.0.1" + "@jridgewell/trace-mapping" "^0.3.25" + cssnano "^7.0.1" + jest-worker "^29.7.0" + postcss "^8.4.38" + schema-utils "^4.2.0" + serialize-javascript "^6.0.2" css-select@^5.1.0: version "5.1.0" @@ -3172,7 +3263,15 @@ css-system-font-keywords@^1.0.0: resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" integrity sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA== -css-tree@^2.2.1, css-tree@~2.2.0: +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== @@ -3195,53 +3294,54 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz#2a93247140d214ddb9f46bc6a3562fa9177fe301" - integrity sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^4.0.0" - postcss-calc "^9.0.0" - postcss-colormin "^6.0.0" - postcss-convert-values "^6.0.0" - postcss-discard-comments "^6.0.0" - postcss-discard-duplicates "^6.0.0" - postcss-discard-empty "^6.0.0" - postcss-discard-overridden "^6.0.0" - postcss-merge-longhand "^6.0.0" - postcss-merge-rules "^6.0.1" - postcss-minify-font-values "^6.0.0" - postcss-minify-gradients "^6.0.0" - postcss-minify-params "^6.0.0" - postcss-minify-selectors "^6.0.0" - postcss-normalize-charset "^6.0.0" - postcss-normalize-display-values "^6.0.0" - postcss-normalize-positions "^6.0.0" - postcss-normalize-repeat-style "^6.0.0" - postcss-normalize-string "^6.0.0" - postcss-normalize-timing-functions "^6.0.0" - postcss-normalize-unicode "^6.0.0" - postcss-normalize-url "^6.0.0" - postcss-normalize-whitespace "^6.0.0" - postcss-ordered-values "^6.0.0" - postcss-reduce-initial "^6.0.0" - postcss-reduce-transforms "^6.0.0" - postcss-svgo "^6.0.0" - postcss-unique-selectors "^6.0.0" - -cssnano-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.0.tgz#d1da885ec04003ab19505ff0e62e029708d36b08" - integrity sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw== +cssnano-preset-default@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz#0220fa7507478369aa2a226bac03e1204cd024c1" + integrity sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ== + dependencies: + browserslist "^4.23.3" + css-declaration-sorter "^7.2.0" + cssnano-utils "^5.0.0" + postcss-calc "^10.0.2" + postcss-colormin "^7.0.2" + postcss-convert-values "^7.0.4" + postcss-discard-comments "^7.0.3" + postcss-discard-duplicates "^7.0.1" + postcss-discard-empty "^7.0.0" + postcss-discard-overridden "^7.0.0" + postcss-merge-longhand "^7.0.4" + postcss-merge-rules "^7.0.4" + postcss-minify-font-values "^7.0.0" + postcss-minify-gradients "^7.0.0" + postcss-minify-params "^7.0.2" + postcss-minify-selectors "^7.0.4" + postcss-normalize-charset "^7.0.0" + postcss-normalize-display-values "^7.0.0" + postcss-normalize-positions "^7.0.0" + postcss-normalize-repeat-style "^7.0.0" + postcss-normalize-string "^7.0.0" + postcss-normalize-timing-functions "^7.0.0" + postcss-normalize-unicode "^7.0.2" + postcss-normalize-url "^7.0.0" + postcss-normalize-whitespace "^7.0.0" + postcss-ordered-values "^7.0.1" + postcss-reduce-initial "^7.0.2" + postcss-reduce-transforms "^7.0.0" + postcss-svgo "^7.0.1" + postcss-unique-selectors "^7.0.3" + +cssnano-utils@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687" + integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ== -cssnano@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.1.tgz#87c38c4cd47049c735ab756d7e77ac3ca855c008" - integrity sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg== +cssnano@^7.0.1: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.6.tgz#63d54fd42bc017f6aaed69e47d9aaef85b7850ec" + integrity sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw== dependencies: - cssnano-preset-default "^6.0.1" - lilconfig "^2.1.0" + cssnano-preset-default "^7.0.6" + lilconfig "^3.1.2" csso@^5.0.5: version "5.0.5" @@ -3251,19 +3351,19 @@ csso@^5.0.5: css-tree "~2.2.0" csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== d3-array@1, d3-array@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== -"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3.2.2, d3-array@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.2.tgz#f8ac4705c5b06914a7e0025bbf8d5f1513f6a86e" - integrity sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ== +"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3.2.4, d3-array@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== dependencies: internmap "1 - 2" @@ -3278,17 +3378,22 @@ d3-collection@1, d3-collection@^1.0.4: integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== d3-delaunay@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" - integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== dependencies: delaunator "5" -d3-dispatch@1, "d3-dispatch@1 - 3": +d3-dispatch@1: version "1.0.6" resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== +"d3-dispatch@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + d3-dsv@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" @@ -3347,9 +3452,9 @@ d3-geo-projection@^4.0.0: d3-geo "1.12.0 - 3" "d3-geo@1.12.0 - 3", d3-geo@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" - integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== dependencies: d3-array "2.5.0 - 3" @@ -3370,7 +3475,7 @@ d3-hierarchy@^3.1.2: resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== -"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== @@ -3387,11 +3492,24 @@ d3-path@^3.1.0: resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== -d3-quadtree@1, "d3-quadtree@1 - 3": +d3-quadtree@1: version "1.0.7" resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== +"d3-quadtree@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-scale-chromatic@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + d3-scale@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" @@ -3453,13 +3571,13 @@ d3-timer@1: resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== dependencies: - es5-ext "^0.10.50" - type "^1.0.1" + es5-ext "^0.10.64" + type "^2.7.2" data-view-buffer@^1.0.1: version "1.0.1" @@ -3495,12 +3613,12 @@ debug@2: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.6: version "3.2.7" @@ -3510,9 +3628,9 @@ debug@^3.2.6: ms "^2.1.1" decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -3527,7 +3645,7 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -3556,32 +3674,22 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: object-keys "^1.1.1" defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== delaunator@5: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== + version "5.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== dependencies: - robust-predicates "^3.0.0" + robust-predicates "^3.0.2" delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -dequal@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" - integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== - dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -3639,13 +3747,6 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -3668,7 +3769,7 @@ domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^5.0.1, domhandler@^5.0.2: +domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== @@ -3676,13 +3777,13 @@ domhandler@^5.0.1, domhandler@^5.0.2: domelementtype "^2.3.0" domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" - domhandler "^5.0.1" + domhandler "^5.0.3" draw-svg-path@^1.0.0: version "1.0.0" @@ -3720,14 +3821,19 @@ duplexify@^3.4.5: stream-shift "^1.0.0" earcut@^2.1.5, earcut@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4" - integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug== + version "2.2.4" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== + +earcut@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-3.0.0.tgz#a8d5bf891224eaea8287201b5e787c6c0318af89" + integrity sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg== -electron-to-chromium@^1.4.668: - version "1.4.687" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.687.tgz#8b80da91848c13a90802f840c7de96c8558fef52" - integrity sha512-Ic85cOuXSP6h7KM0AIJ2hpJ98Bo4hyTUjc4yjMbkvD+8yTxEhfK9+8exT2KKYsSjnCn2tGsKVSZwE7ZgTORQCw== +electron-to-chromium@^1.5.41: + version "1.5.42" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.42.tgz#4b3ca7648fb0865daec92298f9ba79e278a476a3" + integrity sha512-gIfKavKDw1mhvic9nbzA5lZw8QSHpdMwLwXc0cWidQz9B15pDoDdDH4boIatuFfeoCatb3a/NGL6CYRVFxGZ9g== element-resize-detector@^1.2.2: version "1.2.4" @@ -3772,28 +3878,28 @@ end-of-stream@^1.0.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" entities@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -env-paths@^2.2.0: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== err-code@^2.0.2: version "2.0.3" @@ -3807,7 +3913,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -3866,15 +3972,15 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.17: - version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== +es-iterator-helpers@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6" + integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" @@ -3883,18 +3989,18 @@ es-iterator-helpers@^1.0.17: es-set-tostringtag "^2.0.3" function-bind "^1.1.2" get-intrinsic "^1.2.4" - globalthis "^1.0.3" + globalthis "^1.0.4" has-property-descriptors "^1.0.2" has-proto "^1.0.3" has-symbols "^1.0.3" internal-slot "^1.0.7" - iterator.prototype "^1.1.2" + iterator.prototype "^1.1.3" safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== es-object-atoms@^1.0.0: version "1.0.0" @@ -3928,10 +4034,10 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14: - version "0.10.63" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.63.tgz#9c222a63b6a332ac80b1e373b426af723b895bd6" - integrity sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ== +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -3948,12 +4054,12 @@ es6-iterator@^2.0.3: es6-symbol "^3.1.1" es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== dependencies: - d "^1.0.1" - ext "^1.1.2" + d "^1.0.2" + ext "^1.7.0" es6-weak-map@^2.0.3: version "2.0.3" @@ -3965,10 +4071,10 @@ es6-weak-map@^2.0.3: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" @@ -3985,49 +4091,53 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^1.11.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" - estraverse "^4.2.0" + estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -eslint-plugin-prettier@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" - integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== +eslint-plugin-prettier@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" + integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== dependencies: prettier-linter-helpers "^1.0.0" - synckit "^0.8.6" + synckit "^0.9.1" -eslint-plugin-react@^7.34.1: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== +eslint-plugin-react-hooks@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz#72e2eefbac4b694f5324154619fee44f5f60f101" + integrity sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw== + +eslint-plugin-react@^7.37.2: + version "7.37.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" + integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" + es-iterator-helpers "^1.1.0" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" prop-types "^15.8.1" resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.10" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" eslint-scope@5.1.1: version "5.1.1" @@ -4037,61 +4147,63 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" + integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== +eslint-visitor-keys@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" + integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== + +eslint@^9.13.0: + version "9.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.13.0.tgz#7659014b7dda1ff876ecbd990f726e11c61596e6" + integrity sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.18.0" + "@eslint/core" "^0.7.0" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.13.0" + "@eslint/plugin-kit" "^0.2.0" + "@humanfs/node" "^0.16.5" "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" + "@humanwhocodes/retry" "^0.3.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" - doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" + eslint-scope "^8.1.0" + eslint-visitor-keys "^4.1.0" + espree "^10.2.0" + esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" + file-entry-cache "^8.0.0" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.3" - strip-ansi "^6.0.1" text-table "^0.2.0" esniff@^2.0.1: @@ -4104,24 +4216,24 @@ esniff@^2.0.1: event-emitter "^0.3.5" type "^2.7.2" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1, espree@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" + integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== dependencies: - acorn "^8.9.0" + acorn "^8.12.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.1.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.2.tgz#c6d3fee05dd665808e2ad870631f221f5617b1d1" - integrity sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng== +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -4132,7 +4244,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -4196,12 +4308,27 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== +ext@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: - type "^2.5.0" + assign-symbols "^1.0.0" + is-extendable "^1.0.1" falafel@^2.1.0: version "2.2.5" @@ -4216,15 +4343,15 @@ fast-deep-equal@1.0.0: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" integrity sha512-46+Jxk9Yj/nQY+3a1KTnpbBTemcAbPySTKya8iM9D7EsiONpSWbvzesalcCJ6tmJrCUITT2fmAQfNHFG+OHM6Q== -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3, fast-deep-equal@~3.1.3: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-formula-parser@^1.0.19: version "1.0.19" @@ -4236,6 +4363,17 @@ fast-formula-parser@^1.0.19: chevrotain "^7.0.1" jstat "^1.9.3" +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-isnumeric@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz#e165786ff471c439e9ace2b8c8e66cceb47e2ea4" @@ -4248,25 +4386,30 @@ fast-json-patch@^3.1.1: resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@~2.1.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" + integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== + fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -4277,28 +4420,27 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" -find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" @@ -4316,6 +4458,14 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + findup@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/findup/-/findup-0.1.5.tgz#8ad929a3393bac627957a7e5de4623b06b0e2ceb" @@ -4324,18 +4474,23 @@ findup@^0.1.5: colors "~0.6.0-1" commander "~2.1.0" -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" + flatted "^3.2.9" + keyv "^4.5.4" -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== flatten-vertex-data@^1.0.2: version "1.0.2" @@ -4407,7 +4562,7 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: +function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -4422,20 +4577,19 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gauge@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.0.tgz#afba07aa0374a93c6219603b1fb83eaa2264d8f8" - integrity sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== dependencies: - ansi-regex "^5.0.1" aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" has-unicode "^2.0.1" - signal-exit "^3.0.0" + signal-exit "^3.0.7" string-width "^4.2.3" strip-ansi "^6.0.1" - wide-align "^1.1.2" + wide-align "^1.1.5" gaze@^1.0.0: version "1.1.3" @@ -4454,6 +4608,11 @@ geojson-vt@^3.2.1: resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== +geojson-vt@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-4.0.2.tgz#1162f6c7d61a0ba305b1030621e6e111f847828a" + integrity sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -4464,7 +4623,7 @@ get-canvas-context@^1.0.1: resolved "https://registry.yarnpkg.com/get-canvas-context/-/get-canvas-context-1.0.2.tgz#d6e7b50bc4e4c86357cd39f22647a84b73601e93" integrity sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A== -get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -4499,20 +4658,25 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" +get-value@^2.0.2, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + gl-mat4@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" integrity sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA== -gl-matrix@^3.2.1: +gl-matrix@^3.2.1, gl-matrix@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== -gl-text@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.3.1.tgz#f36594464101b5b053178d6d219c3d08fb9144c8" - integrity sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w== +gl-text@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.4.0.tgz#223f89b2719f1dbea581368a66a0edf0def63174" + integrity sha512-o47+XBqLCj1efmuNyCHt7/UEJmB9l66ql7pnobD6p+sgmBUdzfMZXIF0zD2+KRfpd99DJN+QXdvTFAGCKCVSmQ== dependencies: bit-twiddle "^1.0.2" color-normalize "^1.5.0" @@ -4545,6 +4709,13 @@ gl-util@^3.1.2: pick-by-alias "^1.2.0" weak-map "^1.0.5" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -4557,7 +4728,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4569,6 +4740,17 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + glob@~7.1.1: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -4581,29 +4763,37 @@ glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +global-prefix@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-4.0.0.tgz#e9cc79aab9be1d03287e156a3f912dd0895463ed" + integrity sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA== + dependencies: + ini "^4.1.3" + kind-of "^6.0.3" + which "^4.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== - dependencies: - type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== +globalthis@^1.0.3, globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globule@^1.0.0: version "1.3.4" resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.4.tgz#7c11c43056055a75a6e68294453c17f2796170fb" - integrity "sha1-fBHEMFYFWnWm5oKURTwX8nlhcPs= sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==" + integrity sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg== dependencies: glob "~7.1.1" lodash "^4.17.21" @@ -4914,10 +5104,10 @@ ify-loader@^1.1.0: read-package-json "^2.0.2" resolve "^1.1.6" -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" @@ -4928,9 +5118,9 @@ import-fresh@^3.2.1, import-fresh@^3.3.0: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -4963,6 +5153,11 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -4989,10 +5184,13 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ip@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" - integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" is-array-buffer@^3.0.4: version "3.0.4" @@ -5039,12 +5237,12 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-view@^1.0.1: version "1.0.1" @@ -5060,7 +5258,12 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" -is-extendable@^1.0.0: +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.0, is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== @@ -5106,7 +5309,7 @@ is-generator-function@^1.0.10: dependencies: has-tostringtag "^1.0.0" -is-glob@^4.0.0, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -5123,10 +5326,10 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-mobile@^4.0.0: version "4.0.0" @@ -5155,17 +5358,12 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -5180,10 +5378,10 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" @@ -5228,10 +5426,10 @@ is-typed-array@^1.1.13: dependencies: which-typed-array "^1.1.14" -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" @@ -5240,13 +5438,13 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" isarray@0.0.1: version "0.0.1" @@ -5268,6 +5466,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" @@ -5290,9 +5493,9 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-instrument@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" - integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: "@babel/core" "^7.23.9" "@babel/parser" "^7.23.9" @@ -5326,10 +5529,10 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== +iterator.prototype@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" + integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== dependencies: define-properties "^1.2.1" get-intrinsic "^1.2.1" @@ -5637,18 +5840,6 @@ jest-snapshot@^29.7.0: pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" @@ -5696,16 +5887,6 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.4.3: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" @@ -5727,9 +5908,9 @@ jest@^29.7.0: jest-cli "^29.7.0" jiti@^1.20.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== jquery@^3.7.1: version "3.7.1" @@ -5761,16 +5942,26 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +jsesc@^3.0.2, jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -5796,6 +5987,11 @@ json-stringify-pretty-compact@^3.0.0, json-stringify-pretty-compact@~3.0.0: resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz#f71ef9d82ef16483a407869556588e91b681d9ab" integrity sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA== +json-stringify-pretty-compact@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz#cf4844770bddee3cb89a6170fe4b00eee5dbf1d4" + integrity sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q== + json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -5807,18 +6003,32 @@ jstat@^1.9.3: integrity sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug== "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" kdbush@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== +kdbush@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39" + integrity sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA== + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -5842,18 +6052,10 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +lilconfig@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== lines-and-columns@^1.1.6: version "1.2.4" @@ -5861,9 +6063,9 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== locate-path@^5.0.0: version "5.0.0" @@ -5879,6 +6081,13 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -5926,9 +6135,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" lru-cache@^7.7.1: - version "7.14.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" - integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== magic-string@^0.25.7: version "0.25.9" @@ -5937,13 +6146,6 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -5952,12 +6154,12 @@ make-dir@^4.0.0: semver "^7.5.3" make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.4: - version "10.1.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.1.tgz#d93e9241e580ebe0b2b7294b2d1b79ab4e5adfa4" - integrity "sha1-2T6SQeWA6+CytylLLRt5q05a36Q= sha512-3/mCljDQNjmrP7kl0vhS5WVlV+TvSKoZaFhdiYV7MOijEnrhrjaVnqbp/EY/7S+fhUB2KpH7j8c1iRsIOs+kjw==" + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== dependencies: agentkeepalive "^4.2.1" - cacache "^16.0.2" + cacache "^16.1.0" http-cache-semantics "^4.1.0" http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" @@ -5970,8 +6172,8 @@ make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.4: minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^6.1.1" - ssri "^8.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" makeerror@1.0.12: version "1.0.12" @@ -5997,6 +6199,38 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +maplibre-gl@^4.5.2: + version "4.7.1" + resolved "https://registry.yarnpkg.com/maplibre-gl/-/maplibre-gl-4.7.1.tgz#06a524438ee2aafbe8bcd91002a4e01468ea5486" + integrity sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA== + dependencies: + "@mapbox/geojson-rewind" "^0.5.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^2.0.6" + "@mapbox/unitbezier" "^0.0.1" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + "@maplibre/maplibre-gl-style-spec" "^20.3.1" + "@types/geojson" "^7946.0.14" + "@types/geojson-vt" "3.2.5" + "@types/mapbox__point-geometry" "^0.1.4" + "@types/mapbox__vector-tile" "^1.3.4" + "@types/pbf" "^3.0.5" + "@types/supercluster" "^7.1.3" + earcut "^3.0.0" + geojson-vt "^4.0.2" + gl-matrix "^3.4.3" + global-prefix "^4.0.0" + kdbush "^4.0.2" + murmurhash-js "^1.0.0" + pbf "^3.3.0" + potpack "^2.0.0" + quickselect "^3.0.0" + supercluster "^8.0.1" + tinyqueue "^3.0.0" + vt-pbf "^3.1.3" + math-log2@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" @@ -6007,6 +6241,11 @@ mdn-data@2.0.28: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + meow@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" @@ -6030,25 +6269,30 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.0, micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.27: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.51.0" + mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" @@ -6061,19 +6305,34 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2: - version "2.7.7" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.7.tgz#4acf02f362c641c38fb913bfcb7ca2fc4a7cf339" - integrity sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw== + version "2.9.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz#4d184f12ce90582e983ccef0f6f9db637b4be758" + integrity sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ== dependencies: schema-utils "^4.0.0" + tapable "^2.2.1" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimatch@~3.0.2: version "3.0.8" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" @@ -6090,7 +6349,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -6135,9 +6394,9 @@ minipass-sized@^1.0.3: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: - version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" - integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" @@ -6190,10 +6449,10 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2, ms@^2.0.0, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multipipe@^0.3.0: version "0.3.1" @@ -6215,9 +6474,9 @@ murmurhash-js@^1.0.0: integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw== nan@^2.17.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + version "2.20.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" + integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== nanoid@^3.3.7: version "3.3.7" @@ -6259,9 +6518,9 @@ next-tick@^1.1.0: integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -6287,10 +6546,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== node-sass@^9: version "9.0.0" @@ -6374,19 +6633,19 @@ npm-run-path@^4.0.1: path-key "^3.0.0" npmlog@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.0.tgz#ba9ef39413c3d936ea91553db7be49c34ad0520c" - integrity sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q== + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== dependencies: - are-we-there-yet "^2.0.0" + are-we-there-yet "^3.0.0" console-control-strings "^1.1.0" - gauge "^4.0.0" + gauge "^4.0.3" set-blocking "^2.0.0" nth-check@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" @@ -6403,16 +6662,16 @@ object-assign@4.1.1, object-assign@^4.1.0, object-assign@^4.1.1: integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.3, object.assign@^4.1.5: +object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== @@ -6422,7 +6681,7 @@ object.assign@^4.1.3, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.7: +object.entries@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -6431,7 +6690,7 @@ object.entries@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -6441,15 +6700,6 @@ object.fromentries@^2.0.7: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.hasown@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - object.omit@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-3.0.0.tgz#0e3edc2fce2ba54df5577ff529f6d97bd8a522af" @@ -6457,7 +6707,7 @@ object.omit@^3.0.0: dependencies: is-extendable "^1.0.0" -object.values@^1.1.7: +object.values@^1.1.6, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -6487,29 +6737,17 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" p-limit@^2.2.0: version "2.3.0" @@ -6525,6 +6763,13 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -6539,6 +6784,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -6600,6 +6852,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -6615,15 +6872,10 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbf@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" - integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== +pbf@^3.2.1, pbf@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.3.0.tgz#1790f3d99118333cc7f498de816028a346ef367f" + integrity sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q== dependencies: ieee754 "^1.1.12" resolve-protobuf-schema "^2.1.0" @@ -6638,10 +6890,10 @@ pick-by-alias@^1.2.0: resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" integrity sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -6653,25 +6905,32 @@ pirates@^4.0.4: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -plotly.js@~2.31.1: - version "2.31.1" - resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-2.31.1.tgz#7f7d7b4badf6119be2bd9e19df03b4b6cc9d37fd" - integrity sha512-KEdSZHDyd7bIj8IY/7JTenRHof5MwbhT6CLsjhbzVhy/XDw35Pju+2M7J6nbPcmnnRzmSTjoBch1gNzcJc50vA== +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +plotly.js@~2.35.2: + version "2.35.2" + resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-2.35.2.tgz#01ea5d0196c8dfa95bc8aab84781d391c80fee73" + integrity sha512-s0knlWzRvLQXxzf3JQ6qbm8FpwKuMjkr+6r04f8/yCEByAQ+I0jkUzY/hSGRGb+u7iljTh9hgpEiiJP90vjyeQ== dependencies: - "@plotly/d3" "3.8.1" + "@plotly/d3" "3.8.2" "@plotly/d3-sankey" "0.7.2" "@plotly/d3-sankey-circular" "0.33.1" "@plotly/mapbox-gl" "1.13.4" - "@turf/area" "^6.4.0" - "@turf/bbox" "^6.4.0" - "@turf/centroid" "^6.0.2" + "@turf/area" "^7.1.0" + "@turf/bbox" "^7.1.0" + "@turf/centroid" "^7.1.0" base64-arraybuffer "^1.0.2" canvas-fit "^1.5.0" color-alpha "1.0.4" @@ -6679,6 +6938,7 @@ plotly.js@~2.31.1: color-parse "2.0.0" color-rgba "2.1.1" country-regex "^1.1.0" + css-loader "^7.1.2" d3-force "^1.2.1" d3-format "^1.4.5" d3-geo "^1.12.1" @@ -6689,17 +6949,18 @@ plotly.js@~2.31.1: d3-time-format "^2.2.3" fast-isnumeric "^1.1.4" gl-mat4 "^1.2.0" - gl-text "^1.3.1" + gl-text "^1.4.0" has-hover "^1.0.1" has-passive-events "^1.0.0" is-mobile "^4.0.0" + maplibre-gl "^4.5.2" mouse-change "^1.4.0" mouse-event-offset "^3.0.2" mouse-wheel "^1.2.0" native-promise-only "^0.8.1" parse-svg-path "^0.1.2" point-in-polygon "^1.1.0" - polybooljs "^1.2.0" + polybooljs "^1.2.2" probe-image-size "^7.2.3" regl "npm:@plotly/regl@^2.1.2" regl-error2d "^2.0.12" @@ -6707,6 +6968,7 @@ plotly.js@~2.31.1: regl-scatter2d "^3.3.1" regl-splom "^1.0.14" strongly-connected-components "^1.0.1" + style-loader "^4.0.0" superscript-text "^1.0.0" svg-path-sdf "^1.1.3" tinycolor2 "^1.4.2" @@ -6720,10 +6982,10 @@ point-in-polygon@^1.1.0: resolved "https://registry.yarnpkg.com/point-in-polygon/-/point-in-polygon-1.1.0.tgz#b0af2616c01bdee341cbf2894df643387ca03357" integrity sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw== -polybooljs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" - integrity sha512-mKjR5nolISvF+q2BtC1fi/llpxBPTQ3wLWN8+ldzdw2Hocpc8C72ZqnamCM4Z6z+68GVVjkeM01WJegQmZ8MEQ== +polybooljs@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.2.tgz#c7127b014a63e1d00c70608abbd8dc0967ffeea3" + integrity sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg== popper.js@^1.16.1: version "1.16.1" @@ -6735,129 +6997,132 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-calc@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" - integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== +postcss-calc@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.0.2.tgz#15f01635a27b9d38913a98c4ef2877f5b715b439" + integrity sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg== dependencies: - postcss-selector-parser "^6.0.11" + postcss-selector-parser "^6.1.2" postcss-value-parser "^4.2.0" -postcss-colormin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.0.tgz#d4250652e952e1c0aca70c66942da93d3cdeaafe" - integrity sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw== +postcss-colormin@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.2.tgz#6f3c53c13158168669f45adc3926f35cb240ef8e" + integrity sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.3" caniuse-api "^3.0.0" - colord "^2.9.1" + colord "^2.9.3" postcss-value-parser "^4.2.0" -postcss-convert-values@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz#ec94a954957e5c3f78f0e8f65dfcda95280b8996" - integrity sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw== +postcss-convert-values@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz#fc13ecedded6365f3c794b502dbcf77d298da12c" + integrity sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.3" postcss-value-parser "^4.2.0" -postcss-discard-comments@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz#9ca335e8b68919f301b24ba47dde226a42e535fe" - integrity sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw== +postcss-discard-comments@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz#9c414e8ee99d3514ad06a3465ccc20ec1dbce780" + integrity sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA== + dependencies: + postcss-selector-parser "^6.1.2" -postcss-discard-duplicates@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz#c26177a6c33070922e67e9a92c0fd23d443d1355" - integrity sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA== +postcss-discard-duplicates@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz#f87f2fe47d8f01afb1e98361c1db3ce1e8afd1a3" + integrity sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ== -postcss-discard-empty@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz#06c1c4fce09e22d2a99e667c8550eb8a3a1b9aee" - integrity sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ== +postcss-discard-empty@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz#218829d1ef0a5d5142dd62f0aa60e00e599d2033" + integrity sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA== -postcss-discard-overridden@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz#49c5262db14e975e349692d9024442de7cd8e234" - integrity sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw== +postcss-discard-overridden@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz#b123ea51e3d4e1d0a254cf71eaff1201926d319c" + integrity sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w== -postcss-loader@^7: - version "7.3.4" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" - integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== +postcss-loader@^8: + version "8.1.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-8.1.1.tgz#2822589e7522927344954acb55bbf26e8b195dfe" + integrity sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ== dependencies: - cosmiconfig "^8.3.5" + cosmiconfig "^9.0.0" jiti "^1.20.0" semver "^7.5.4" -postcss-merge-longhand@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz#6f627b27db939bce316eaa97e22400267e798d69" - integrity sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg== +postcss-merge-longhand@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz#a52d0662b4b29420f3b64a8d5b0ac5133d8db776" + integrity sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^6.0.0" + stylehacks "^7.0.4" -postcss-merge-rules@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz#39f165746404e646c0f5c510222ccde4824a86aa" - integrity sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw== +postcss-merge-rules@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz#648cc864d3121e6ec72c2a4f08df1cc801e60ce8" + integrity sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.3" caniuse-api "^3.0.0" - cssnano-utils "^4.0.0" - postcss-selector-parser "^6.0.5" + cssnano-utils "^5.0.0" + postcss-selector-parser "^6.1.2" -postcss-minify-font-values@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz#68d4a028f9fa5f61701974724b2cc9445d8e6070" - integrity sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA== +postcss-minify-font-values@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz#d16a75a2548e000779566b3568fc874ee5d0aa17" + integrity sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog== dependencies: postcss-value-parser "^4.2.0" -postcss-minify-gradients@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz#22b5c88cc63091dadbad34e31ff958404d51d679" - integrity sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA== +postcss-minify-gradients@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz#f6d84456e6d49164a55d0e45bb1b1809c6cf0959" + integrity sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg== dependencies: - colord "^2.9.1" - cssnano-utils "^4.0.0" + colord "^2.9.3" + cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz#2b3a85a9e3b990d7a16866f430f5fd1d5961b539" - integrity sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ== +postcss-minify-params@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz#264a76e25f202d8b5ca5290569c0e8c3ac599dfe" + integrity sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ== dependencies: - browserslist "^4.21.4" - cssnano-utils "^4.0.0" + browserslist "^4.23.3" + cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz#5046c5e8680a586e5a0cad52cc9aa36d6be5bda2" - integrity sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g== +postcss-minify-selectors@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz#2b69c99ec48a1c223fce4840609d9c53340a11f5" + integrity sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA== dependencies: - postcss-selector-parser "^6.0.5" + cssesc "^3.0.0" + postcss-selector-parser "^6.1.2" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz#fbfddfda93a31f310f1d152c2bb4d3f3c5592ee0" - integrity sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg== +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== dependencies: postcss-selector-parser "^6.0.4" @@ -6869,149 +7134,149 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-nested@^6: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: - postcss-selector-parser "^6.0.11" + postcss-selector-parser "^6.1.1" -postcss-normalize-charset@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz#36cc12457259064969fb96f84df491652a4b0975" - integrity sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ== +postcss-normalize-charset@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz#92244ae73c31bf8f8885d5f16ff69e857ac6c001" + integrity sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ== -postcss-normalize-display-values@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz#8d2961415078644d8c6bbbdaf9a2fdd60f546cd4" - integrity sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw== +postcss-normalize-display-values@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz#01fb50e5e97ef8935363629bea5a6d3b3aac1342" + integrity sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz#25b96df99a69f8925f730eaee0be74416865e301" - integrity sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg== +postcss-normalize-positions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz#4eebd7c9d3dde40c97b8047cad38124fc844c463" + integrity sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz#ddf30ad8762feb5b1eb97f39f251acd7b8353299" - integrity sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A== +postcss-normalize-repeat-style@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz#0cb784655d5714d29bd3bda6dee2fb628aa7227b" + integrity sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-string@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz#948282647a51e409d69dde7910f0ac2ff97cb5d8" - integrity sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w== +postcss-normalize-string@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz#a119d3e63a9614570d8413d572fb9fc8c6a64e8c" + integrity sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz#5f13e650b8c43351989fc5de694525cc2539841c" - integrity sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg== +postcss-normalize-timing-functions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz#99d0ee8c4b23b7f4355fafb91385833b9b07108b" + integrity sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz#741b3310f874616bdcf07764f5503695d3604730" - integrity sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg== +postcss-normalize-unicode@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz#095f8d36ea29adfdf494069c1de101112992a713" + integrity sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.3" postcss-value-parser "^4.2.0" -postcss-normalize-url@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz#d0a31e962a16401fb7deb7754b397a323fb650b4" - integrity sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw== +postcss-normalize-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz#c88cb7cf8952d3ff631e4eba924e7b060ca802f6" + integrity sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz#accb961caa42e25ca4179b60855b79b1f7129d4d" - integrity sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw== +postcss-normalize-whitespace@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz#46b025f0bea72139ddee63015619b0c21cebd845" + integrity sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ== dependencies: postcss-value-parser "^4.2.0" -postcss-ordered-values@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz#374704cdff25560d44061d17ba3c6308837a3218" - integrity sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg== +postcss-ordered-values@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz#8b4b5b8070ca7756bd49f07d5edf274b8f6782e0" + integrity sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw== dependencies: - cssnano-utils "^4.0.0" + cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-reduce-initial@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz#7d16e83e60e27e2fa42f56ec0b426f1da332eca7" - integrity sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA== +postcss-reduce-initial@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz#3dc085347a5943e18547d4b0aa5bd4ff5a93b2c5" + integrity sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.3" caniuse-api "^3.0.0" -postcss-reduce-transforms@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz#28ff2601a6d9b96a2f039b3501526e1f4d584a46" - integrity sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w== +postcss-reduce-transforms@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz#0386080a14e5faad9f8eda33375b79fe7c4f9677" + integrity sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew== dependencies: postcss-value-parser "^4.2.0" -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.0.tgz#7b18742d38d4505a0455bbe70d52b49f00eaf69d" - integrity sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw== +postcss-svgo@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.0.1.tgz#2b63571d8e9568384df334bac9917baff4d23f58" + integrity sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA== dependencies: postcss-value-parser "^4.2.0" - svgo "^3.0.2" + svgo "^3.3.2" -postcss-unique-selectors@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz#c94e9b0f7bffb1203894e42294b5a1b3fb34fbe1" - integrity sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw== +postcss-unique-selectors@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz#483fc11215b23d517d5d9bbe5833d9915619ca33" + integrity sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g== dependencies: - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.1.2" postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.24, postcss@^8.4.31, postcss@^8.4.33: - version "8.4.33" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" - integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== +postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47: + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" + picocolors "^1.1.0" + source-map-js "^1.2.1" potpack@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== +potpack@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-2.0.0.tgz#61f4dd2dc4b3d5e996e3698c0ec9426d0e169104" + integrity sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -7019,10 +7284,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== pretty-format@^29.7.0: version "29.7.0" @@ -7091,9 +7356,9 @@ protocol-buffers-schema@^3.3.1: integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: version "6.1.0" @@ -7115,6 +7380,11 @@ quickselect@^2.0.0: resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== +quickselect@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-3.0.0.tgz#a37fc953867d56f095a20ac71c6d27063d2de603" + integrity sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g== + raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -7137,15 +7407,15 @@ react-bootstrap-range-slider@^3.0.8: classnames "^2.3.1" prop-types "^15.7.2" -react-bootstrap@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.8.0.tgz#781f254b33090c1d50ed521b40697727267c6add" - integrity sha512-e/aNtxl0Z2ozrIaR82jr6Zz7ss9GSoaXpQaxmvtDUsTZIq/XalkduR/ZXP6vbQHz2T4syvjA+4FbtwELxxmpww== +react-bootstrap@^2.10.5: + version "2.10.5" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.5.tgz#2d3416fb4178d0f460ddafbfcab0aebfbbf1cf25" + integrity sha512-XueAOEn64RRkZ0s6yzUTdpFtdUXs5L5491QU//8ZcODKJNDLt/r01tNyriZccjgRImH1REynUc9pqjiRMpDLWQ== dependencies: - "@babel/runtime" "^7.21.0" + "@babel/runtime" "^7.24.7" "@restart/hooks" "^0.4.9" - "@restart/ui" "^1.6.3" - "@types/react-transition-group" "^4.4.5" + "@restart/ui" "^1.6.9" + "@types/react-transition-group" "^4.4.6" classnames "^2.3.2" dom-helpers "^5.2.1" invariant "^2.2.4" @@ -7225,10 +7495,10 @@ react-sizeme@^3.0.2: shallowequal "^1.1.0" throttle-debounce "^3.0.1" -react-spreadsheet@^0.9.4: - version "0.9.4" - resolved "https://registry.yarnpkg.com/react-spreadsheet/-/react-spreadsheet-0.9.4.tgz#c80358e5aa0312742c12127e5b89ae25ed9c82d8" - integrity sha512-BVvABaSbxkz33nsR3qdXzDEjUmLTUmV01+Co6PS1a9KTFu63c+rJng1dP3GAGOeAF/BhA2M9224H6PPeyCjZJA== +react-spreadsheet@^0.9.5: + version "0.9.5" + resolved "https://registry.yarnpkg.com/react-spreadsheet/-/react-spreadsheet-0.9.5.tgz#5fc545a47375aa9c97a88a5a695af67b6aeb9c5a" + integrity sha512-1sqV9YAqowTBaPHPq8x8yGzz04n7SrnCmmPdjHWeKfTPvSZA0RUa1VNS8P0ltU6F5+SEetklJxeNH7xtAGSGHg== dependencies: array.prototype.flatmap "^1.2.5" classnames "^2.3.1" @@ -7259,10 +7529,10 @@ react-table@^6.11.4: classnames "^2.2.5" react-is "^16.8.1" -react-tooltip@^5.26.3: - version "5.26.3" - resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.26.3.tgz#bcb9a53e15bdbf9ae007ddf8bf413a317a637054" - integrity sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg== +react-tooltip@^5.28.0: + version "5.28.0" + resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.28.0.tgz#c7b5343ab2d740a428494a3d8315515af1f26f46" + integrity sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg== dependencies: "@floating-ui/dom" "^1.6.1" classnames "^2.3.0" @@ -7287,10 +7557,10 @@ react-vega@^7.6.0: prop-types "^15.8.1" vega-embed "^6.5.1" -react-zoom-pan-pinch@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.4.3.tgz#10027dcf8ca997783414f43f84413fc00458d76b" - integrity sha512-x5MFlfAx2D6NTpZu8OISqc2nYn4p+YEaM1p21w7S/VE1wbVzK8vRzTo9Bj1ydufa649MuP7JBRM3vvj1RftFZw== +react-zoom-pan-pinch@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.6.1.tgz#fb68b879b66f029f1f89986810fc2e0ac34fa48a" + integrity sha512-SdPqdk7QDSV7u/WulkFOi+cnza8rEZ0XX4ZpeH7vx3UZEg7DoyuAy3MCmm+BWv/idPQL2Oe73VoC0EhfCN+sZQ== react@^16.14.0: version "16.14.0" @@ -7341,9 +7611,9 @@ read-pkg@^5.2.0: string_decoder "~0.10.x" readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -7354,9 +7624,9 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable util-deprecate "~1.0.1" readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -7378,21 +7648,22 @@ redent@^3.0.0: strip-indent "^3.0.0" reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" globalthis "^1.0.3" which-builtin-type "^1.1.3" -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== dependencies: regenerate "^1.4.2" @@ -7447,15 +7718,15 @@ regexpu-core@4.5.4: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" -regexpu-core@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.1.tgz#66900860f88def39a5cb79ebd9490e84f17bcdfb" - integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== +regexpu-core@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" + integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== dependencies: - "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.11.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" @@ -7464,6 +7735,18 @@ regjsgen@^0.5.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.0.tgz#f01e6ccaba36d384fb0d00a06b78b372c8b681e8" + integrity sha512-vTbzVAjQDzwQdKuvj7qEq6OlAprCjE656khuGQ4QaBLg7abQ9I9ISpmLuc6inWe7zP75AECjqUa4g4sdQvOXhg== + dependencies: + jsesc "~3.0.2" + regjsparser@^0.6.0: version "0.6.9" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" @@ -7471,13 +7754,6 @@ regjsparser@^0.6.0: dependencies: jsesc "~0.5.0" -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - regl-error2d@^2.0.12: version "2.0.12" resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.12.tgz#3b976e13fe641d5242a154fcacc80aecfa0a9881" @@ -7603,11 +7879,11 @@ resolve@^0.6.1: integrity sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg== resolve@^1.0.0, resolve@^1.1.10, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -7642,10 +7918,10 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -robust-predicates@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" - integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== run-parallel@^1.1.9: version "1.2.0" @@ -7669,7 +7945,12 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -7698,17 +7979,17 @@ sass-graph@^4.0.1: scss-tokenizer "^0.4.3" yargs "^17.2.1" -sass-loader@^13: - version "13.3.3" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133" - integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA== +sass-loader@^16: + version "16.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-16.0.2.tgz#e581bc13d7cb5090e27f155c6aa2855c08cafe86" + integrity sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw== dependencies: neo-async "^2.6.2" sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== scheduler@^0.19.1: version "0.19.1" @@ -7718,10 +7999,10 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -7734,7 +8015,7 @@ schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0, schema-utils@^4.0.1: +schema-utils@^4.0.0, schema-utils@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== @@ -7757,22 +8038,20 @@ scss-tokenizer@^0.4.3: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" +semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== +serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -7803,6 +8082,16 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -7842,11 +8131,6 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== - signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -7872,27 +8156,49 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@^6.1.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" - integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== dependencies: agent-base "^6.0.2" debug "^4.3.3" socks "^2.6.2" socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" -source-map-js@^1.0.1, source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +sort-asc@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sort-asc/-/sort-asc-0.2.0.tgz#00a49e947bc25d510bfde2cbb8dffda9f50eb2fc" + integrity sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA== + +sort-desc@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sort-desc/-/sort-desc-0.2.0.tgz#280c1bdafc6577887cedbad1ed2e41c037976646" + integrity sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w== + +sort-object@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sort-object/-/sort-object-3.0.3.tgz#945727165f244af9dc596ad4c7605a8dee80c269" + integrity sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ== + dependencies: + bytewise "^1.1.0" + get-value "^2.0.2" + is-extendable "^0.1.1" + sort-asc "^0.2.0" + sort-desc "^0.2.0" + union-value "^1.0.1" + +source-map-js@^1.0.1, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-support@0.5.13: version "0.5.13" @@ -7915,7 +8221,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: +source-map@^0.7.3, source-map@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== @@ -7926,17 +8232,17 @@ sourcemap-codec@^1.4.8: integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -7947,19 +8253,31 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + +split-string@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== dependencies: minipass "^3.1.1" @@ -7976,11 +8294,11 @@ stack-utils@^2.0.3: escape-string-regexp "^2.0.0" static-eval@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" - integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + version "2.1.1" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.1.tgz#71ac6a13aa32b9e14c5b5f063c362176b0d584ba" + integrity sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA== dependencies: - escodegen "^1.11.1" + escodegen "^2.1.0" stdout-stream@^1.4.0: version "1.4.1" @@ -7997,9 +8315,9 @@ stream-parser@~0.3.1: debug "2" stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== string-length@^4.0.1: version "4.0.2" @@ -8025,7 +8343,7 @@ string-split-by@^1.0.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.10: +string.prototype.matchall@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== @@ -8043,6 +8361,14 @@ string.prototype.matchall@^4.0.10: set-function-name "^2.0.2" side-channel "^1.0.6" +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trim@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" @@ -8071,18 +8397,25 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - safe-buffer "~5.1.0" + safe-buffer "~5.2.0" string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -8117,18 +8450,18 @@ strongly-connected-components@^1.0.1: resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" integrity sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA== -style-loader@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" - integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== +style-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-4.0.0.tgz#0ea96e468f43c69600011e0589cb05c44f3b17a5" + integrity sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA== -stylehacks@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.0.tgz#9fdd7c217660dae0f62e14d51c89f6c01b3cb738" - integrity sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw== +stylehacks@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.4.tgz#9c21f7374f4bccc0082412b859b3c89d77d3277c" + integrity sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww== dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" + browserslist "^4.23.3" + postcss-selector-parser "^6.1.2" supercluster@^7.1.0: version "7.1.5" @@ -8137,6 +8470,13 @@ supercluster@^7.1.0: dependencies: kdbush "^3.0.0" +supercluster@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-8.0.1.tgz#9946ba123538e9e9ab15de472531f604e7372df5" + integrity sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ== + dependencies: + kdbush "^4.0.2" + superscript-text@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/superscript-text/-/superscript-text-1.0.0.tgz#e7cb2752567360df50beb0610ce8df3d71d8dfd8" @@ -8194,27 +8534,28 @@ svg-path-sdf@^1.1.3: parse-svg-path "^0.1.2" svg-path-bounds "^1.0.1" -svgo@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.0.2.tgz#5e99eeea42c68ee0dc46aa16da093838c262fe0a" - integrity sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ== +svgo@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" + integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== dependencies: "@trysound/sax" "0.2.0" commander "^7.2.0" css-select "^5.1.0" - css-tree "^2.2.1" + css-tree "^2.3.1" + css-what "^6.1.0" csso "^5.0.5" picocolors "^1.0.0" -synckit@^0.8.6: - version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" - integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== +synckit@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" + integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -8243,9 +8584,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5, terser@^5.26.0: - version "5.31.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" - integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== + version "5.36.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" + integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -8288,37 +8629,44 @@ through2@^2.0.1: xtend "~4.0.1" tinycolor2@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + version "1.6.0" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== tinyqueue@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== +tinyqueue@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-3.0.0.tgz#101ea761ccc81f979e29200929e78f1556e3661e" + integrity sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-float32@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.1.0.tgz#39bd3b11eadccd490c08f5f9171da5127b6f3946" integrity sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg== -to-px@1.0.1, to-px@^1.0.1: +to-px@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.0.1.tgz#5bbaed5e5d4f76445bcc903c293a2307dd324646" integrity sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw== dependencies: parse-unit "^1.0.1" +to-px@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.1.0.tgz#b6b269ed5db0cc9aefc15272a4c8bcb2ca1e99ca" + integrity sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw== + dependencies: + parse-unit "^1.0.1" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -8348,15 +8696,31 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== -tslib@^2.4.0, tslib@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== -tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +ts-loader@^9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" + integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + source-map "^0.7.4" + +tslib@^2.4.0, tslib@^2.6.2, tslib@^2.6.3: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tslib@~2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -8365,13 +8729,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -8382,11 +8739,6 @@ type-fest@^0.18.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -8402,15 +8754,10 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0, type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +type@^2.7.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486" + integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== typed-array-buffer@^1.0.2: version "1.0.2" @@ -8469,6 +8816,23 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typescript@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +typewise-core@^1.2, typewise-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" + integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== + +typewise@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== + dependencies: + typewise-core "^1.2.0" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -8489,15 +8853,25 @@ uncontrollable@^7.2.1: invariant "^2.2.4" react-lifecycles-compat "^3.0.4" +uncontrollable@^8.0.1: + version "8.0.4" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" + integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-match-property-ecmascript@^1.0.4: version "1.0.4" @@ -8521,9 +8895,9 @@ unicode-match-property-value-ecmascript@^1.1.0: integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== unicode-property-aliases-ecmascript@^1.0.4: version "1.1.0" @@ -8531,26 +8905,36 @@ unicode-property-aliases-ecmascript@^1.0.4: integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +union-value@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" uniqid@^5.0.3: version "5.4.0" resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-5.4.0.tgz#4e17bfcab66dfe33563411ae0c801f46ef964e66" integrity sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A== -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== dependencies: - unique-slug "^2.0.0" + unique-slug "^3.0.0" -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== dependencies: imurmurhash "^0.1.4" @@ -8559,13 +8943,13 @@ unquote@^1.1.0: resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.0" update-diff@^1.1.0: version "1.1.0" @@ -8580,9 +8964,9 @@ uri-js@^4.2.2: punycode "^2.1.0" use-context-selector@^1.3.7: - version "1.4.1" - resolved "https://registry.yarnpkg.com/use-context-selector/-/use-context-selector-1.4.1.tgz#eb96279965846b72915d7f899b8e6ef1d768b0ae" - integrity sha512-Io2ArvcRO+6MWIhkdfMFt+WKQX+Vb++W8DS2l03z/Vw/rz3BclKpM0ynr4LYGyU85Eke+Yx5oIhTY++QR0ZDoA== + version "1.4.4" + resolved "https://registry.yarnpkg.com/use-context-selector/-/use-context-selector-1.4.4.tgz#f5d65c7fcd78f994cb33cacd57651007a40595c0" + integrity sha512-pS790zwGxxe59GoBha3QYOwk8AFGp4DN6DOtH+eoqVmgBBRXVx4IlPDhJmmMiNQAgUaLlP+58aqRC3A4rdaSjg== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -8590,9 +8974,9 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -8606,375 +8990,372 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vega-canvas@^1.2.6, vega-canvas@^1.2.7: +vega-canvas@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/vega-canvas/-/vega-canvas-1.2.7.tgz#cf62169518f5dcd91d24ad352998c2248f8974fb" integrity sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q== -vega-crossfilter@~4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/vega-crossfilter/-/vega-crossfilter-4.1.1.tgz#3ff3ca0574883706f7a399dc6d60f4a0f065ece4" - integrity sha512-yesvlMcwRwxrtAd9IYjuxWJJuAMI0sl7JvAFfYtuDkkGDtqfLXUcCzHIATqW6igVIE7tWwGxnbfvQLhLNgK44Q== +vega-crossfilter@~4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vega-crossfilter/-/vega-crossfilter-4.1.2.tgz#810281c279b3592310f12814bc61206dd42ca61d" + integrity sha512-J7KVEXkpfRJBfRvwLxn5vNCzQCNkrnzmDvkvwhuiwT4gPm5sk7MK5TuUP8GCl/iKYw+kWeVXEtrVHwWtug+bcQ== dependencies: d3-array "^3.2.2" - vega-dataflow "^5.7.5" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-util "^1.17.2" -vega-dataflow@^5.7.3, vega-dataflow@^5.7.5, vega-dataflow@~5.7.5: - version "5.7.5" - resolved "https://registry.yarnpkg.com/vega-dataflow/-/vega-dataflow-5.7.5.tgz#0d559f3c3a968831f2995e099a2e270993ddfed9" - integrity sha512-EdsIl6gouH67+8B0f22Owr2tKDiMPNNR8lEvJDcxmFw02nXd8juimclpLvjPQriqn6ta+3Dn5txqfD117H04YA== +vega-dataflow@^5.7.6, vega-dataflow@~5.7.6: + version "5.7.6" + resolved "https://registry.yarnpkg.com/vega-dataflow/-/vega-dataflow-5.7.6.tgz#21dfad9120cb18d9aeaed578658670839d1adc95" + integrity sha512-9Md8+5iUC1MVKPKDyZ7pCEHk6I9am+DgaMzZqo/27O/KI4f23/WQXPyuI8jbNmc/mkm340P0TKREmzL5M7+2Dg== dependencies: - vega-format "^1.1.1" - vega-loader "^4.5.1" - vega-util "^1.17.1" + vega-format "^1.1.2" + vega-loader "^4.5.2" + vega-util "^1.17.2" vega-embed@^6.5.1: - version "6.21.0" - resolved "https://registry.yarnpkg.com/vega-embed/-/vega-embed-6.21.0.tgz#a6f7d4965c653e40620bfd0a51fb419321cff02c" - integrity sha512-Tzo9VAfgNRb6XpxSFd7uphSeK2w5OxDY2wDtmpsQ+rQlPSEEI9TE6Jsb2nHRLD5J4FrmXKLrTcORqidsNQSXEg== + version "6.26.0" + resolved "https://registry.yarnpkg.com/vega-embed/-/vega-embed-6.26.0.tgz#25ca51783b2819adf6e6330ae6dd5771e8da8653" + integrity sha512-AZCTdKHDAuhp6TFZRQOOs332tStCwZr/5e4uZMNEuJL69A57cT66NNZJdNiCP6u66REzIToYtMJhMTL9wl5B3A== dependencies: fast-json-patch "^3.1.1" json-stringify-pretty-compact "^3.0.0" - semver "^7.3.7" - tslib "^2.4.0" - vega-interpreter "^1.0.4" + semver "^7.6.2" + tslib "^2.6.3" + vega-interpreter "^1.0.5" vega-schema-url-parser "^2.2.0" - vega-themes "^2.10.0" - vega-tooltip "^0.28.0" + vega-themes "^2.15.0" + vega-tooltip "^0.34.0" -vega-encode@~4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/vega-encode/-/vega-encode-4.9.1.tgz#bad0e99bebec86d42184bcb898576c8accd91e89" - integrity sha512-05JB47UZaqIBS9t6rtHI/aKjEuH4EsSIH+wJWItht4BFj33eIl4XRNtlXdE31uuQT2pXWz5ZWW3KboMuaFzKLw== +vega-encode@~4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/vega-encode/-/vega-encode-4.10.1.tgz#1656e20396db99c414f495704ef3d9cff99631df" + integrity sha512-d25nVKZDrg109rC65M8uxE+7iUrTxktaqgK4fU3XZBgpWlh1K4UbU5nDag7kiHVVN4tKqwgd+synEotra9TiVQ== dependencies: d3-array "^3.2.2" d3-interpolate "^3.0.1" - vega-dataflow "^5.7.5" - vega-scale "^7.3.0" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-scale "^7.4.1" + vega-util "^1.17.2" -vega-event-selector@^3.0.1, vega-event-selector@~3.0.0, vega-event-selector@~3.0.1: +vega-event-selector@^3.0.1, vega-event-selector@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/vega-event-selector/-/vega-event-selector-3.0.1.tgz#b99e92147b338158f8079d81b28b2e7199c2e259" integrity sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A== -vega-expression@^5.0.1, vega-expression@~5.0.0, vega-expression@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-5.0.1.tgz#e6a6eff564d2a93496a9bf34cbc78d8942f236a8" - integrity sha512-atfzrMekrcsuyUgZCMklI5ki8cV763aeo1Y6YrfYU7FBwcQEoFhIV/KAJ1vae51aPDGtfzvwbtVIo3WShFCP2Q== +vega-expression@^5.0.1, vega-expression@^5.1.1, vega-expression@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-5.1.1.tgz#9b2d287a1f34d990577c9798ae68ec88453815ef" + integrity sha512-zv9L1Hm0KHE9M7mldHyz8sXbGu3KmC0Cdk7qfHkcTNS75Jpsem6jkbu6ZAwx5cNUeW91AxUQOu77r4mygq2wUQ== dependencies: "@types/estree" "^1.0.0" - vega-util "^1.17.1" + vega-util "^1.17.2" -vega-force@~4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/vega-force/-/vega-force-4.2.0.tgz#5374d0dbac674c92620a9801e12b650b0966336a" - integrity sha512-aE2TlP264HXM1r3fl58AvZdKUWBNOGkIvn4EWyqeJdgO2vz46zSU7x7TzPG4ZLuo44cDRU5Ng3I1eQk23Asz6A== +vega-force@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vega-force/-/vega-force-4.2.1.tgz#bdce6ec8572867b4ff2fb7e09d2894798c5358ec" + integrity sha512-2BcuuqFr77vcCyKfcpedNFeYMxi+XEFCrlgLWNx7YV0PI8pdP5y/yPkzyuE9Tb894+KkRAvfQHZRAshcnFNcMw== dependencies: d3-force "^3.0.0" - vega-dataflow "^5.7.5" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-util "^1.17.2" -vega-format@^1.1.1, vega-format@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vega-format/-/vega-format-1.1.1.tgz#92e4876e18064e7ad54f39045f7b24dede0030b8" - integrity sha512-Rll7YgpYbsgaAa54AmtEWrxaJqgOh5fXlvM2wewO4trb9vwM53KBv4Q/uBWCLK3LLGeBXIF6gjDt2LFuJAUtkQ== +vega-format@^1.1.2, vega-format@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vega-format/-/vega-format-1.1.2.tgz#d344ba8a2680144e92127459c149a4181e9e7f84" + integrity sha512-0kUfAj0dg0U6GcEY0Kp6LiSTCZ8l8jl1qVdQyToMyKmtZg/q56qsiJQZy3WWRr1MtWkTIZL71xSJXgjwjeUaAw== dependencies: d3-array "^3.2.2" d3-format "^3.1.0" d3-time-format "^4.1.0" - vega-time "^2.1.1" - vega-util "^1.17.1" + vega-time "^2.1.2" + vega-util "^1.17.2" -vega-functions@^5.13.1, vega-functions@~5.13.1: - version "5.13.1" - resolved "https://registry.yarnpkg.com/vega-functions/-/vega-functions-5.13.1.tgz#504d672924495fe3ea844e6940c7f6e151cde151" - integrity sha512-0LhntimnvBl4VzRO/nkCwCTbtaP8bE552galKQbCg88GDxdmcmlsoTCwUzG0vZ/qmNM3IbqnP5k5/um3zwFqLw== +vega-functions@^5.15.0, vega-functions@~5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/vega-functions/-/vega-functions-5.15.0.tgz#a7905e1dd6457efe265dbf954cbc0a5721c484b0" + integrity sha512-pCqmm5efd+3M65jrJGxEy3UGuRksmK6DnWijoSNocnxdCBxez+yqUUVX9o2pN8VxMe3648vZnR9/Vk5CXqRvIQ== dependencies: d3-array "^3.2.2" d3-color "^3.1.0" d3-geo "^3.1.0" - vega-dataflow "^5.7.5" - vega-expression "^5.0.1" - vega-scale "^7.3.0" - vega-scenegraph "^4.10.2" - vega-selections "^5.4.1" - vega-statistics "^1.8.1" - vega-time "^2.1.1" - vega-util "^1.17.1" - -vega-geo@~4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/vega-geo/-/vega-geo-4.4.1.tgz#3850232bf28c98fab5e26c5fb401acb6fb37b5e5" - integrity sha512-s4WeZAL5M3ZUV27/eqSD3v0FyJz3PlP31XNSLFy4AJXHxHUeXT3qLiDHoVQnW5Om+uBCPDtTT1ROx1smGIf2aA== + vega-dataflow "^5.7.6" + vega-expression "^5.1.1" + vega-scale "^7.4.1" + vega-scenegraph "^4.13.0" + vega-selections "^5.4.2" + vega-statistics "^1.9.0" + vega-time "^2.1.2" + vega-util "^1.17.2" + +vega-geo@~4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/vega-geo/-/vega-geo-4.4.2.tgz#da4a08ee39c9488bfc4fe6493779f584dd8bb412" + integrity sha512-unuV/UxUHf6UJu6GYxMZonC3SZlMfFXYLOkgEsRSvmsMPt3+CVv8FmG88dXNRUJUrdROrJepgecqx0jOwMSnGA== dependencies: d3-array "^3.2.2" d3-color "^3.1.0" d3-geo "^3.1.0" vega-canvas "^1.2.7" - vega-dataflow "^5.7.5" - vega-projection "^1.6.0" - vega-statistics "^1.8.1" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-projection "^1.6.1" + vega-statistics "^1.9.0" + vega-util "^1.17.2" -vega-hierarchy@~4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/vega-hierarchy/-/vega-hierarchy-4.1.1.tgz#897974a477dfa70cc0d4efab9465b6cc79a9071f" - integrity sha512-h5mbrDtPKHBBQ9TYbvEb/bCqmGTlUX97+4CENkyH21tJs7naza319B15KRK0NWOHuhbGhFmF8T0696tg+2c8XQ== +vega-hierarchy@~4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vega-hierarchy/-/vega-hierarchy-4.1.2.tgz#e42938c42527b392b110b1e3bf89eaa456dba1b8" + integrity sha512-m+xDtT5092YPSnV0rdTLW+AWmoCb+A54JQ66MUJwiDBpKxvfKnTiQeuiWDU2YudjUoXZN9EBOcI6QHF8H2Lu2A== dependencies: d3-hierarchy "^3.1.2" - vega-dataflow "^5.7.5" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-util "^1.17.2" -vega-interpreter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vega-interpreter/-/vega-interpreter-1.0.4.tgz#291ebf85bc2d1c3550a3da22ff75b3ba0d326a39" - integrity sha512-6tpYIa/pJz0cZo5fSxDSkZkAA51pID2LjOtQkOQvbzn+sJiCaWKPFhur8MBqbcmYZ9bnap1OYNwlrvpd2qBLvg== +vega-interpreter@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/vega-interpreter/-/vega-interpreter-1.0.5.tgz#19e1d1b5f84a4ea9cb25c4e90a05ce16cd058484" + integrity sha512-po6oTOmeQqr1tzTCdD15tYxAQLeUnOVirAysgVEemzl+vfmvcEP7jQmlc51jz0jMA+WsbmE6oJywisQPu/H0Bg== -vega-label@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vega-label/-/vega-label-1.2.1.tgz#ea45fa5a407991c44edfea9c4ca40874d544a3db" - integrity sha512-n/ackJ5lc0Xs9PInCaGumYn2awomPjJ87EMVT47xNgk2bHmJoZV1Ve/1PUM6Eh/KauY211wPMrNp/9Im+7Ripg== - dependencies: - vega-canvas "^1.2.6" - vega-dataflow "^5.7.3" - vega-scenegraph "^4.9.2" - vega-util "^1.15.2" - -vega-lite@^5.6.1: - version "5.6.1" - resolved "https://registry.yarnpkg.com/vega-lite/-/vega-lite-5.6.1.tgz#538e50f6cd90a7c267f48acd06a2c1d29acf413a" - integrity sha512-Dij2OkJcmK+/2pIcLambjV/vWmhP11ypL3YqDVryBfJxP1m+ZgZU+8/SOEP3B2R1MhmmT7JDYQUtiNcGi1/2ig== - dependencies: - "@types/clone" "~2.1.1" - clone "~2.1.2" - fast-deep-equal "~3.1.3" - fast-json-stable-stringify "~2.1.0" +vega-label@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/vega-label/-/vega-label-1.3.0.tgz#21b3e5ef40e63f51ac987a449d183068c4961503" + integrity sha512-EfSFSCWAwVPsklM5g0gUEuohALgryuGC/SKMmsOH7dYT/bywmLBZhLVbrE+IHJAUauoGrMhYw1mqnXL/0giJBg== + dependencies: + vega-canvas "^1.2.7" + vega-dataflow "^5.7.6" + vega-scenegraph "^4.13.0" + vega-util "^1.17.2" + +vega-lite@^5.21.0: + version "5.21.0" + resolved "https://registry.yarnpkg.com/vega-lite/-/vega-lite-5.21.0.tgz#21ce8b905a02ba364b7b1d7ef471497ba3e12e93" + integrity sha512-hNxM9nuMqpI1vkUOhEx6ewEf23WWLmJxSFJ4TA86AW43ixJyqcLV+iSCO0NipuVTE0rlDcc2e8joSewWyOlEwA== + dependencies: json-stringify-pretty-compact "~3.0.0" - tslib "~2.5.0" - vega-event-selector "~3.0.0" - vega-expression "~5.0.0" - vega-util "~1.17.0" - yargs "~17.6.2" + tslib "~2.6.3" + vega-event-selector "~3.0.1" + vega-expression "~5.1.1" + vega-util "~1.17.2" + yargs "~17.7.2" -vega-loader@^4.5.1, vega-loader@~4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.5.1.tgz#b85262b3cb8376487db0c014a8a13c3a5e6d52ad" - integrity sha512-qy5x32SaT0YkEujQM2yKqvLGV9XWQ2aEDSugBFTdYzu/1u4bxdUSRDREOlrJ9Km3RWIOgFiCkobPmFxo47SKuA== +vega-loader@^4.5.2, vega-loader@~4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.5.2.tgz#7212f093c397b153f69f7e6cfef47817c17c5c01" + integrity sha512-ktIdGz3DRIS3XfTP9lJ6oMT5cKwC86nQkjUbXZbOtwXQFVNE2xVWBuH13GP6FKUZxg5hJCMtb5v/e/fwTvhKsQ== dependencies: d3-dsv "^3.0.1" node-fetch "^2.6.7" topojson-client "^3.1.0" - vega-format "^1.1.1" - vega-util "^1.17.1" + vega-format "^1.1.2" + vega-util "^1.17.2" -vega-parser@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/vega-parser/-/vega-parser-6.2.0.tgz#c982aff0a6409486cbbe743a5799412b8b897654" - integrity sha512-as+QnX8Qxe9q51L1C2sVBd+YYYctP848+zEvkBT2jlI2g30aZ6Uv7sKsq7QTL6DUbhXQKR0XQtzlanckSFdaOQ== +vega-parser@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/vega-parser/-/vega-parser-6.4.0.tgz#6a12f07f0f9178492a17842efe7e1f51a2d36bed" + integrity sha512-/hFIJs0yITxfvLIfhhcpUrcbKvu4UZYoMGmly5PSsbgo60oAsVQW8ZbX2Ji3iNFqZJh1ifoX/P0j+9wep1OISw== dependencies: - vega-dataflow "^5.7.5" + vega-dataflow "^5.7.6" vega-event-selector "^3.0.1" - vega-functions "^5.13.1" - vega-scale "^7.3.0" - vega-util "^1.17.1" + vega-functions "^5.15.0" + vega-scale "^7.4.1" + vega-util "^1.17.2" -vega-projection@^1.6.0, vega-projection@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/vega-projection/-/vega-projection-1.6.0.tgz#921acd3220e7d9d04ccd5ce0109433afb3236966" - integrity sha512-LGUaO/kpOEYuTlul+x+lBzyuL9qmMwP1yShdUWYLW+zXoeyGbs5OZW+NbPPwLYqJr5lpXDr/vGztFuA/6g2xvQ== +vega-projection@^1.6.1, vega-projection@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/vega-projection/-/vega-projection-1.6.1.tgz#da687abc60f4a93bb888385beb23e0a1000f8b57" + integrity sha512-sqfnAAHumU7MWU1tQN3b6HNgKGF3legek0uLHhjLKcDJQxEc7kwcD18txFz2ffQks6d5j+AUhBiq4GARWf0DEQ== dependencies: d3-geo "^3.1.0" d3-geo-projection "^4.0.0" - vega-scale "^7.3.0" + vega-scale "^7.4.1" -vega-regression@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vega-regression/-/vega-regression-1.1.1.tgz#b53a964152a2fec4847e31571f522bfda23089af" - integrity sha512-98i/z0vdDhOIEhJUdYoJ2nlfVdaHVp2CKB39Qa7G/XyRw0+QwDFFrp8ZRec2xHjHfb6bYLGNeh1pOsC13FelJg== +vega-regression@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/vega-regression/-/vega-regression-1.3.0.tgz#3e68e234fa9460041fac082c6a3469c896d436a8" + integrity sha512-gxOQfmV7Ft/MYKpXDEo09WZyBuKOBqxqDRWay9KtfGq/E0Y4vbTPsWLv2cB1ToPJdKE6XSN6Re9tCIw5M/yMUg== dependencies: d3-array "^3.2.2" - vega-dataflow "^5.7.3" - vega-statistics "^1.7.9" - vega-util "^1.15.2" + vega-dataflow "^5.7.6" + vega-statistics "^1.9.0" + vega-util "^1.17.2" -vega-runtime@^6.1.4, vega-runtime@~6.1.4: - version "6.1.4" - resolved "https://registry.yarnpkg.com/vega-runtime/-/vega-runtime-6.1.4.tgz#98b67160cea9554e690bfd44719f9d17f90c4220" - integrity sha512-0dDYXyFLQcxPQ2OQU0WuBVYLRZnm+/CwVu6i6N4idS7R9VXIX5581EkCh3pZ20pQ/+oaA7oJ0pR9rJgJ6rukRQ== +vega-runtime@^6.2.0, vega-runtime@~6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/vega-runtime/-/vega-runtime-6.2.0.tgz#10f435089fff11d8e1b49cb0cbab8041731e6f06" + integrity sha512-30UXbujWjKNd5aeP+oeHuwFmzuyVYlBj4aDy9+AjfWLECu8wJt4K01vwegcaGPdCWcPLVIv4Oa9Lob4mcXn5KQ== dependencies: - vega-dataflow "^5.7.5" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-util "^1.17.2" -vega-scale@^7.3.0, vega-scale@~7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/vega-scale/-/vega-scale-7.3.0.tgz#02b83435a892c6d91a87ee7d3d350fac987f464b" - integrity sha512-pMOAI2h+e1z7lsqKG+gMfR6NKN2sTcyjZbdJwntooW0uFHwjLGjMSY7kSd3nSEquF0HQ8qF7zR6gs1eRwlGimw== +vega-scale@^7.4.1, vega-scale@~7.4.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/vega-scale/-/vega-scale-7.4.1.tgz#2dcd3e39ebb00269b03a8be86e44c7b48c67442a" + integrity sha512-dArA28DbV/M92O2QvswnzCmQ4bq9WwLKUoyhqFYWCltmDwkmvX7yhqiFLFMWPItIm7mi4Qyoygby6r4DKd1X2A== dependencies: d3-array "^3.2.2" d3-interpolate "^3.0.1" d3-scale "^4.0.2" - vega-time "^2.1.1" - vega-util "^1.17.1" + d3-scale-chromatic "^3.1.0" + vega-time "^2.1.2" + vega-util "^1.17.2" -vega-scenegraph@^4.10.2, vega-scenegraph@^4.9.2, vega-scenegraph@~4.10.2: - version "4.10.2" - resolved "https://registry.yarnpkg.com/vega-scenegraph/-/vega-scenegraph-4.10.2.tgz#3ae9ad8e99bbf75e2a4f3ebf2c1f9dee7562d245" - integrity sha512-R8m6voDZO5+etwNMcXf45afVM3XAtokMqxuDyddRl9l1YqSJfS+3u8hpolJ50c2q6ZN20BQiJwKT1o0bB7vKkA== +vega-scenegraph@^4.13.0, vega-scenegraph@~4.13.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/vega-scenegraph/-/vega-scenegraph-4.13.0.tgz#c4fa5c82773f6244a9ca8b01a44e380adf03fabd" + integrity sha512-nfl45XtuqB5CxyIZJ+bbJ+dofzosPCRlmF+eUQo+0J23NkNXsTzur+1krJDSdhcw0SOYs4sbYRoMz1cpuOM4+Q== dependencies: d3-path "^3.1.0" d3-shape "^3.2.0" vega-canvas "^1.2.7" - vega-loader "^4.5.1" - vega-scale "^7.3.0" - vega-util "^1.17.1" + vega-loader "^4.5.2" + vega-scale "^7.4.1" + vega-util "^1.17.2" vega-schema-url-parser@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz#a0d1e02915adfbfcb1fd517c8c2ebe2419985c1e" integrity sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw== -vega-selections@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/vega-selections/-/vega-selections-5.4.1.tgz#3233acb920703bfc323df8b960aa52e55ac08c70" - integrity sha512-EtYc4DvA+wXqBg9tq+kDomSoVUPCmQfS7hUxy2qskXEed79YTimt3Hcl1e1fW226I4AVDBEqTTKebmKMzbSgAA== +vega-selections@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/vega-selections/-/vega-selections-5.4.2.tgz#cb4f41f5d4c0ee924ebf131b8dbd43e7885bcad4" + integrity sha512-99FUhYmg0jOJr2/K4TcEURmJRkuibrCDc8KBUX7qcQEITzrZ5R6a4QE+sarCvbb3hi8aA9GV2oyST6MQeA9mgQ== dependencies: - d3-array "3.2.2" + d3-array "3.2.4" vega-expression "^5.0.1" vega-util "^1.17.1" -vega-statistics@^1.7.9, vega-statistics@^1.8.1, vega-statistics@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.8.1.tgz#596fc3713ac68cc649bf28d0faf7def5ef34fef6" - integrity sha512-eRR3LZBusnTXUkc/uunAvWi1PjCJK+Ba4vFvEISc5Iv5xF4Aw2cBhEz1obEt6ID5fGVCTAl0E1LOSFxubS89hQ== +vega-statistics@^1.9.0, vega-statistics@~1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.9.0.tgz#7d6139cea496b22d60decfa6abd73346f70206f9" + integrity sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ== dependencies: d3-array "^3.2.2" -vega-themes@^2.10.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/vega-themes/-/vega-themes-2.12.0.tgz#1005f67d64795ce239becc1005a605ee07a52e71" - integrity sha512-gHNYCzDgexSQDmGzQsxH57OYgFVbAOmvhIYN3MPOvVucyI+zhbUawBVIVNzG9ftucRp0MaaMVXi6ctC5HLnBsg== +vega-themes@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/vega-themes/-/vega-themes-2.15.0.tgz#cf7592efb45406957e9beb67d7033ee5f7b7a511" + integrity sha512-DicRAKG9z+23A+rH/3w3QjJvKnlGhSbbUXGjBvYGseZ1lvj9KQ0BXZ2NS/+MKns59LNpFNHGi9us/wMlci4TOA== -vega-time@^2.1.1, vega-time@~2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/vega-time/-/vega-time-2.1.1.tgz#0f1fb4e220dd5ed57401b58fb2293241f049ada0" - integrity sha512-z1qbgyX0Af2kQSGFbApwBbX2meenGvsoX8Nga8uyWN8VIbiySo/xqizz1KrP6NbB6R+x5egKmkjdnyNThPeEWA== +vega-time@^2.1.2, vega-time@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/vega-time/-/vega-time-2.1.2.tgz#0c414e74780613d6d3234fb97f19b50c0ebd9f49" + integrity sha512-6rXc6JdDt8MnCRy6UzUCsa6EeFycPDmvioMddLfKw38OYCV8pRQC5nw44gyddOwXgUTJLiCtn/sp53P0iA542A== dependencies: d3-array "^3.2.2" d3-time "^3.1.0" - vega-util "^1.17.1" + vega-util "^1.17.2" -vega-tooltip@^0.28.0: - version "0.28.0" - resolved "https://registry.yarnpkg.com/vega-tooltip/-/vega-tooltip-0.28.0.tgz#8bae2601ffae5e67622de37108f53f284e9a978b" - integrity sha512-DbK0V5zzk+p9cphZZXV91ZGeKq0zr6JIS0VndUoGTisldzw4tRgmpGQcTfMjew53o7/voeTM2ELTnJAJRzX4tg== +vega-tooltip@^0.34.0: + version "0.34.0" + resolved "https://registry.yarnpkg.com/vega-tooltip/-/vega-tooltip-0.34.0.tgz#e0aa4d9c9bcf155e257650ba7e670fad7b1ff5ab" + integrity sha512-TtxwkcLZ5aWQTvKGlfWDou8tISGuxmqAW1AgGZjrDpf75qsXvgtbPdRAAls2LZMqDxpr5T1kMEZs9XbSpiI8yw== dependencies: - vega-util "^1.17.0" + vega-util "^1.17.2" -vega-transforms@~4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/vega-transforms/-/vega-transforms-4.10.1.tgz#5e51f4f3a745d43609e0d8ba1d74a7e53014030a" - integrity sha512-0uWrUZaYl8kjWrGbvPOQSKk6kcNXQFY9moME+bUmkADAvFptphCGbaEIn/nSsG6uCxj8E3rqKmKfjSWdU5yOqA== +vega-transforms@~4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/vega-transforms/-/vega-transforms-4.12.0.tgz#6a69e0b67934b0c0a40a6f607fdb543bf749955e" + integrity sha512-bh/2Qbj85O70mjfLRgPKAsABArgSUP0k+GjmaY54zukIRxoGxKju+85nigeX/aR/INpEqNWif+5lL+NvmyWA5w== dependencies: d3-array "^3.2.2" - vega-dataflow "^5.7.5" - vega-statistics "^1.8.1" - vega-time "^2.1.1" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-statistics "^1.9.0" + vega-time "^2.1.2" + vega-util "^1.17.2" -vega-typings@~0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.24.0.tgz#e659286c43c63b68cf29a3131360829d129eeb84" - integrity sha512-FFYf67Dn5VNPbYoYHgO2T9Z1I81qcwrXjwKEe0rlJk0MX7CNWPJr9Y3VZEWfxyEx7J9anAm69hGIv0Ehb2G85A== +vega-typings@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-1.3.1.tgz#025a6031505794b44d9b6e2c49d4551b8918d4ae" + integrity sha512-j9Sdgmvowz09jkMgTFGVfiv7ycuRP/TQkdHRPXIYwt3RDgPQn7inyFcJ8C8ABFt4MiMWdjOwbneF6KWW8TRXIw== dependencies: - "@types/geojson" "^7946.0.10" + "@types/geojson" "7946.0.4" vega-event-selector "^3.0.1" - vega-expression "^5.0.1" - vega-util "^1.17.1" + vega-expression "^5.1.1" + vega-util "^1.17.2" -vega-util@^1.15.2, vega-util@^1.17.0, vega-util@^1.17.1, vega-util@~1.17.0, vega-util@~1.17.1: - version "1.17.1" - resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.17.1.tgz#717865fc6b660ceb3ae16273d21166ed471c2db4" - integrity sha512-ToPkWoBdP6awoK+bnYaFhgdqZhsNwKxWbuMnFell+4K/Cb6Q1st5Pi9I7iI5Y6n5ZICDDsd6eL7/IhBjEg1NUQ== +vega-util@^1.17.1, vega-util@^1.17.2, vega-util@~1.17.2: + version "1.17.2" + resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.17.2.tgz#f69aa09fd5d6110c19c4a0f0af9e35945b99987d" + integrity sha512-omNmGiZBdjm/jnHjZlywyYqafscDdHaELHx1q96n5UOz/FlO9JO99P4B3jZg391EFG8dqhWjQilSf2JH6F1mIw== -vega-view-transforms@~4.5.9: - version "4.5.9" - resolved "https://registry.yarnpkg.com/vega-view-transforms/-/vega-view-transforms-4.5.9.tgz#5f109555c08ee9ac23ff9183d578eb9cbac6fe61" - integrity sha512-NxEq4ZD4QwWGRrl2yDLnBRXM9FgCI+vvYb3ZC2+nVDtkUxOlEIKZsMMw31op5GZpfClWLbjCT3mVvzO2xaTF+g== +vega-view-transforms@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/vega-view-transforms/-/vega-view-transforms-4.6.0.tgz#829d56ca3c8116b0dded4ec0502f4ac70253de9a" + integrity sha512-z3z66aJTA3ZRo4oBY4iBXnn+A4KqBGZT/UrlKDbm+7Ec+Ip+hK2tF8Kmhp/WNcMsDZoUWFqLJgR2VgOgvJk9RA== dependencies: - vega-dataflow "^5.7.5" - vega-scenegraph "^4.10.2" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-scenegraph "^4.13.0" + vega-util "^1.17.2" -vega-view@~5.11.1: - version "5.11.1" - resolved "https://registry.yarnpkg.com/vega-view/-/vega-view-5.11.1.tgz#a703d7d6344489c6a6e9e9d9c7a732519bf4432c" - integrity sha512-RoWxuoEMI7xVQJhPqNeLEHCezudsf3QkVMhH5tCovBqwBADQGqq9iWyax3ZzdyX1+P3eBgm7cnLvpqtN2hU8kA== +vega-view@~5.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/vega-view/-/vega-view-5.13.0.tgz#8ea96da9fcdf42fe7c0e95fe6258933477524745" + integrity sha512-ZPAAQ3iYz6YrQjJoDT+0bcxJkXt9PKF5v4OO7Omw8PFhkIv++jFXeKlQTW1bBtyQ92dkdGGHv5lYY67Djqjf3A== dependencies: d3-array "^3.2.2" d3-timer "^3.0.1" - vega-dataflow "^5.7.5" - vega-format "^1.1.1" - vega-functions "^5.13.1" - vega-runtime "^6.1.4" - vega-scenegraph "^4.10.2" - vega-util "^1.17.1" - -vega-voronoi@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vega-voronoi/-/vega-voronoi-4.2.1.tgz#521a22d3d4c545fe1d5eea19eac0fd3ac5e58b1b" - integrity sha512-zzi+fxU/SBad4irdLLsG3yhZgXWZezraGYVQfZFWe8kl7W/EHUk+Eqk/eetn4bDeJ6ltQskX+UXH3OP5Vh0Q0Q== + vega-dataflow "^5.7.6" + vega-format "^1.1.2" + vega-functions "^5.15.0" + vega-runtime "^6.2.0" + vega-scenegraph "^4.13.0" + vega-util "^1.17.2" + +vega-voronoi@~4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/vega-voronoi/-/vega-voronoi-4.2.3.tgz#54c4bb96b9b94c3fa0160bee24695dcb9d583fe1" + integrity sha512-aYYYM+3UGqwsOx+TkVtF1IZfguy0H7AN79dR8H0nONRIc+vhk/lbnlkgwY2nSzEu0EZ4b5wZxeGoDBEVmdDEcg== dependencies: d3-delaunay "^6.0.2" - vega-dataflow "^5.7.5" - vega-util "^1.17.1" + vega-dataflow "^5.7.6" + vega-util "^1.17.2" -vega-wordcloud@~4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/vega-wordcloud/-/vega-wordcloud-4.1.4.tgz#38584cf47ef52325d6a8dc38908b5d2378cc6e62" - integrity sha512-oeZLlnjiusLAU5vhk0IIdT5QEiJE0x6cYoGNq1th+EbwgQp153t4r026fcib9oq15glHFOzf81a8hHXHSJm1Jw== +vega-wordcloud@~4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/vega-wordcloud/-/vega-wordcloud-4.1.5.tgz#789c9e67225c77f3f35a6fc052beec1c2bdc8b5e" + integrity sha512-p+qXU3cb9VeWzJ/HEdax0TX2mqDJcSbrCIfo2d/EalOXGkvfSLKobsmMQ8DxPbtVp0uhnpvfCGDyMJw+AzcI2A== dependencies: vega-canvas "^1.2.7" - vega-dataflow "^5.7.5" - vega-scale "^7.3.0" - vega-statistics "^1.8.1" - vega-util "^1.17.1" - -vega@^5.23.0: - version "5.24.0" - resolved "https://registry.yarnpkg.com/vega/-/vega-5.24.0.tgz#47ccf9288d06cf0be6f1e83bf38647de2bda3ca8" - integrity sha512-eahZ+4eryPywLuq9BpgcwWMyqiuVD3FAh7eMB3koOp7peQ4scPxAZxWdLwnh0t0kah+oE2QcXi2EHS4BabsMPg== - dependencies: - vega-crossfilter "~4.1.1" - vega-dataflow "~5.7.5" - vega-encode "~4.9.1" + vega-dataflow "^5.7.6" + vega-scale "^7.4.1" + vega-statistics "^1.9.0" + vega-util "^1.17.2" + +vega@^5.30.0: + version "5.30.0" + resolved "https://registry.yarnpkg.com/vega/-/vega-5.30.0.tgz#d12350c829878b481453ab28ce10855a954df06d" + integrity sha512-ZGoC8LdfEUV0LlXIuz7hup9jxuQYhSaWek2M7r9dEHAPbPrzSQvKXZ0BbsJbrarM100TGRpTVN/l1AFxCwDkWw== + dependencies: + vega-crossfilter "~4.1.2" + vega-dataflow "~5.7.6" + vega-encode "~4.10.1" vega-event-selector "~3.0.1" - vega-expression "~5.0.1" - vega-force "~4.2.0" - vega-format "~1.1.1" - vega-functions "~5.13.1" - vega-geo "~4.4.1" - vega-hierarchy "~4.1.1" - vega-label "~1.2.1" - vega-loader "~4.5.1" - vega-parser "~6.2.0" - vega-projection "~1.6.0" - vega-regression "~1.1.1" - vega-runtime "~6.1.4" - vega-scale "~7.3.0" - vega-scenegraph "~4.10.2" - vega-statistics "~1.8.1" - vega-time "~2.1.1" - vega-transforms "~4.10.1" - vega-typings "~0.24.0" - vega-util "~1.17.1" - vega-view "~5.11.1" - vega-view-transforms "~4.5.9" - vega-voronoi "~4.2.1" - vega-wordcloud "~4.1.4" - -vt-pbf@^3.1.1: + vega-expression "~5.1.1" + vega-force "~4.2.1" + vega-format "~1.1.2" + vega-functions "~5.15.0" + vega-geo "~4.4.2" + vega-hierarchy "~4.1.2" + vega-label "~1.3.0" + vega-loader "~4.5.2" + vega-parser "~6.4.0" + vega-projection "~1.6.1" + vega-regression "~1.3.0" + vega-runtime "~6.2.0" + vega-scale "~7.4.1" + vega-scenegraph "~4.13.0" + vega-statistics "~1.9.0" + vega-time "~2.1.2" + vega-transforms "~4.12.0" + vega-typings "~1.3.1" + vega-util "~1.17.2" + vega-view "~5.13.0" + vega-view-transforms "~4.6.0" + vega-voronoi "~4.2.3" + vega-wordcloud "~4.1.5" + +vt-pbf@^3.1.1, vt-pbf@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== @@ -8998,9 +9379,9 @@ warning@^4.0.0, warning@^4.0.3: loose-envify "^1.0.0" watchpack@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" - integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -9042,11 +9423,12 @@ webpack-cli@^5: webpack-merge "^5.7.3" webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-sources@^3.2.3: @@ -9055,20 +9437,19 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5: - version "5.91.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" - integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + version "5.95.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" + integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== dependencies: - "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1" "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.9.0" + acorn-import-attributes "^1.9.5" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.16.0" + enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -9104,12 +9485,12 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.0.3" which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" is-async-function "^2.0.0" is-date-object "^1.0.5" is-finalizationregistry "^1.0.2" @@ -9118,20 +9499,20 @@ which-builtin-type@^1.1.3: is-weakref "^1.0.2" isarray "^2.0.5" which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" + which-collection "^1.0.2" + which-typed-array "^1.1.15" -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.14, which-typed-array@^1.1.15: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -9149,7 +9530,14 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.2: +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + +wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== @@ -9157,11 +9545,11 @@ wide-align@^1.1.2: string-width "^1.0.2 || 2 || 3 || 4" wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -word-wrap@~1.2.3: +word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== @@ -9230,20 +9618,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.2.1, yargs@~17.6.2: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yargs@^17.3.1: +yargs@^17.2.1, yargs@^17.3.1, yargs@~17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -9260,3 +9635,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== diff --git a/lib/python/websummary/summarize.py b/lib/python/websummary/summarize.py index 69ddf11..496b31f 100644 --- a/lib/python/websummary/summarize.py +++ b/lib/python/websummary/summarize.py @@ -164,6 +164,9 @@ def main(argv: list[str], outfile: TextIO) -> None: elif len(argv) > 1 and argv[1] == "cmo_multi": json_file = "cr_example/cmo.json" contents_file = "cr_example/multi_summary.html" + elif len(argv) > 1 and argv[1] == "hashtag_multi": + json_file = "cr_example/hashtag.json" + contents_file = "cr_example/multi_summary.html" elif len(argv) > 1 and argv[1] == "cas_multi": json_file = "cr_example/multi_cell_annotation.json" contents_file = "cr_example/multi_summary.html" diff --git a/lib/rust/.cargo/config.toml b/lib/rust/.cargo/config.toml index 82c53a8..da10647 100644 --- a/lib/rust/.cargo/config.toml +++ b/lib/rust/.cargo/config.toml @@ -22,7 +22,7 @@ rustflags = [ "-Drust_2018_idioms", "-Dunused", # clippy categorical - "-Dclippy::complexity", + # "-Dclippy::complexity", "-Dclippy::perf", "-Dclippy::style", "-Dclippy::suspicious", diff --git a/lib/rust/Cargo.lock b/lib/rust/Cargo.lock index 22cec98..5108210 100644 --- a/lib/rust/Cargo.lock +++ b/lib/rust/Cargo.lock @@ -10,9 +10,9 @@ checksum = "415ed64958754dbe991900f3940677e6a7eefb4d7367afd70d642677b0c7d19d" [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -25,11 +25,13 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", + "const-random", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -37,29 +39,16 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] -[[package]] -name = "align_tools" -version = "0.1.12" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "bio_edit", - "debruijn", - "itertools", - "string_utils", - "vector_utils", -] - [[package]] name = "amino" -version = "0.1.7" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "debruijn", "string_utils", @@ -80,58 +69,50 @@ dependencies = [ "libc", ] -[[package]] -name = "ansi_escape" -version = "0.1.3" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "string_utils", - "vector_utils", -] - [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -139,9 +120,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" dependencies = [ "backtrace", ] @@ -166,9 +147,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -213,7 +194,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] @@ -239,29 +220,29 @@ checksum = "3c07dab4369547dbe5114677b33fbbf724971019f3818172d59a97a61c774ffd" [[package]] name = "attohttpc" -version = "0.26.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f77d243921b0979fbbd728dd2d5162e68ac8252976797c24eb5b3a6af9090dc" +checksum = "9a13149d0cf3f7f9b9261fad4ec63b2efbf9a80665f52def86282d26255e6331" dependencies = [ "flate2", "http", "log", - "rustls 0.21.10", + "rustls 0.22.4", "url", - "webpki-roots 0.25.4", + "webpki-roots", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -290,7 +271,7 @@ dependencies = [ "martian", "martian-derive", "metric", - "ordered-float", + "ordered-float 4.4.0", "pyanyhow", "pyo3", "serde", @@ -338,15 +319,15 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "basic-toml" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5" +checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" dependencies = [ "serde", ] @@ -362,21 +343,13 @@ dependencies = [ [[package]] name = "bhtsne" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "cc", "ndarray", "smart-default", ] -[[package]] -name = "binary_vec_io" -version = "0.1.12" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "itertools", -] - [[package]] name = "bincode" version = "1.3.3" @@ -386,11 +359,31 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.71", +] + [[package]] name = "bio" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dccfc5babf5a4f505ab5bdda0e18d4b5fc1600c222677c54992203632cbdf5" +checksum = "77ffe04b598449a4486a45bc15884537a01cb2015d978ce66e51a47b2740ddbe" dependencies = [ "anyhow", "approx 0.5.1", @@ -403,7 +396,6 @@ dependencies = [ "editdistancek", "enum-map", "fxhash", - "getset", "itertools", "itertools-num", "lazy_static", @@ -412,7 +404,7 @@ dependencies = [ "newtype_derive", "num-integer", "num-traits", - "ordered-float", + "ordered-float 4.4.0", "petgraph", "rand", "regex", @@ -428,9 +420,9 @@ dependencies = [ [[package]] name = "bio-types" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d45749b87f21808051025e9bf714d14ff4627f9d8ca967eade6946ea769aa4a" +checksum = "3dd588ae658a299e435a6e3bdc289b9ab3b39711c32653acebe62e729eb3c89f" dependencies = [ "derive-new", "lazy_static", @@ -442,8 +434,7 @@ dependencies = [ [[package]] name = "bio_edit" -version = "0.1.1" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "bio-types", "bit-set", @@ -472,14 +463,14 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "blas-src" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "accelerate-src", "intel-mkl-src", @@ -509,9 +500,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bv" @@ -525,15 +516,15 @@ dependencies = [ [[package]] name = "bytecount" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" [[package]] name = "byteorder" @@ -541,11 +532,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" -version = "1.5.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" dependencies = [ "serde", ] @@ -601,9 +598,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" dependencies = [ "jobserver", "libc", @@ -612,7 +609,16 @@ dependencies = [ [[package]] name = "cephes" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] [[package]] name = "cfg-if" @@ -632,14 +638,25 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "clang-sys" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +dependencies = [ + "glob", + "libc", + "libloading", ] [[package]] name = "clap" -version = "4.4.18" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" dependencies = [ "clap_builder", "clap_derive", @@ -647,34 +664,34 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.18" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.1", "terminal_size", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "clonotype_assigner" @@ -683,6 +700,7 @@ dependencies = [ "amino", "anyhow", "bio", + "cr_aggr", "cr_types", "csv", "enclone_proto", @@ -692,7 +710,6 @@ dependencies = [ "martian-derive", "martian-filetypes", "metric", - "perf_stats", "rayon", "rust-htslib", "serde", @@ -701,10 +718,18 @@ dependencies = [ "vdj_ann", "vdj_ann_ref", "vdj_asm_utils", + "vdj_filter_barcodes", "vdj_reference", "vector_utils", ] +[[package]] +name = "cloud_utils" +version = "0.1.0" +dependencies = [ + "anyhow", +] + [[package]] name = "cmake" version = "0.1.50" @@ -716,15 +741,29 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] -name = "convert_case" -version = "0.4.0" +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] [[package]] name = "core-foundation-sys" @@ -753,7 +792,6 @@ dependencies = [ "csv", "docopt", "enclone_proto", - "enclone_ranger", "itertools", "martian", "martian-derive", @@ -810,7 +848,7 @@ name = "cr_bam" version = "0.1.0" dependencies = [ "barcode", - "bitflags 2.4.2", + "bitflags 2.6.0", "rust-htslib", "shardio", "umi", @@ -880,9 +918,11 @@ dependencies = [ "ndarray-rand", "num", "orbit", - "ordered-float", + "ordered-float 4.4.0", "par_proc", "parameters_toml", + "parquet", + "parquet_derive", "rand", "rand_chacha", "rayon", @@ -897,12 +937,14 @@ dependencies = [ "strum", "strum_macros", "tempfile", + "tenx-websummary", "thiserror", "transcriptome", "tx_annotation", "umi", "vdj_reference", "vdj_types", + "websummary_build", ] [[package]] @@ -946,6 +988,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clonotype_assigner", + "cr_lib", "docopt", "enclone_core", "hdf5", @@ -964,7 +1007,7 @@ dependencies = [ "tenx-websummary", "vdj_ann", "vdj_asm_asm", - "vdj_asm_utils", + "vdj_filter_barcodes", "websummary_build", ] @@ -977,16 +1020,19 @@ dependencies = [ "csv", "hclust", "itertools", + "log", "martian-filetypes", "metric", "ndarray", - "ordered-float", + "ordered-float 4.4.0", "plotly", "regex", "serde", "serde_json", "statrs", + "tenx-websummary", "thousands", + "toml", "websummary_derive", ] @@ -996,6 +1042,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", + "cloud_utils", "cr_types", "csv", "dirs", @@ -1003,35 +1050,37 @@ dependencies = [ "hex", "itertools", "libc", - "md5", "metric", - "ordered-float", + "multi", + "ordered-float 4.4.0", "regex", "serde", "serde_json", "sha2", "shell-escape", + "slide_design", "tempfile", "terminal_size", "thiserror", "tiff", + "url", "vdj_reference", ] [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -1057,9 +1106,15 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-common" @@ -1128,7 +1183,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", + "strsim 0.10.0", "syn 1.0.109", ] @@ -1142,8 +1197,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.48", + "strsim 0.10.0", + "syn 2.0.71", ] [[package]] @@ -1165,7 +1220,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core 0.20.8", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] @@ -1224,7 +1279,7 @@ dependencies = [ "darling 0.20.8", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] @@ -1234,26 +1289,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "derive_more" -version = "0.99.17" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ - "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 1.0.109", + "syn 2.0.71", + "unicode-xid", ] [[package]] name = "diff-exp" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "anyhow", "cephes", @@ -1314,14 +1377,14 @@ dependencies = [ "lazy_static", "regex", "serde", - "strsim", + "strsim 0.10.0", ] [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "editdistancek" @@ -1331,29 +1394,22 @@ checksum = "3e02df23d5b1c6f9e69fa603b890378123b93073df998a21e6e33b9db0a32613" [[package]] name = "either" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "enclone" -version = "0.5.219" -source = "git+https://github.com/10XGenomics/enclone_ranger?branch=main#90b8c5045ec56b02a1e5a782fe4eb7bd93fefc77" +version = "0.1.0" dependencies = [ "amino", - "ansi_escape", "debruijn", "enclone_core", - "enclone_proto", "equiv", "graph_simple", - "hdf5", "io_utils", "itertools", - "pager", - "perf_stats", "petgraph", - "pretty_trace", "qd", "rayon", "stats_utils", @@ -1364,95 +1420,60 @@ dependencies = [ [[package]] name = "enclone_args" -version = "0.5.219" -source = "git+https://github.com/10XGenomics/enclone_ranger?branch=main#90b8c5045ec56b02a1e5a782fe4eb7bd93fefc77" +version = "0.1.0" dependencies = [ + "anyhow", "debruijn", "enclone_core", - "enclone_vars", - "evalexpr", - "expr_tools", - "hdf5", "io_utils", "itertools", - "mirror_sparse_matrix", - "rand", + "martian-filetypes", "rayon", - "regex", - "serde_json", "string_utils", "vdj_ann", + "vdj_types", "vector_utils", ] [[package]] name = "enclone_core" -version = "0.5.219" -source = "git+https://github.com/10XGenomics/enclone_ranger?branch=main#90b8c5045ec56b02a1e5a782fe4eb7bd93fefc77" +version = "0.1.0" dependencies = [ - "amino", - "ansi_escape", - "attohttpc", "bio_edit", "debruijn", "enclone_proto", - "evalexpr", - "hdf5", - "io_utils", - "itertools", - "lazy_static", - "mirror_sparse_matrix", - "perf_stats", "qd", "rayon", - "regex", "serde", "stats_utils", "string_utils", - "superslice", - "tables", - "tilde-expand", "vdj_ann", + "vdj_types", "vector_utils", - "zstd", ] [[package]] -name = "enclone_print" -version = "0.5.219" -source = "git+https://github.com/10XGenomics/enclone_ranger?branch=main#90b8c5045ec56b02a1e5a782fe4eb7bd93fefc77" +name = "enclone_process" +version = "0.1.0" dependencies = [ "amino", - "ansi_escape", + "anyhow", "bio_edit", - "debruijn", - "enclone_args", "enclone_core", "enclone_proto", - "enclone_vars", "equiv", - "expr_tools", - "hdf5", - "io_utils", "itertools", - "ndarray", "permutation", "qd", "rayon", - "regex", "serde_json", - "stats_utils", - "string_utils", - "tables", - "triple_accel", "vdj_ann", "vector_utils", ] [[package]] name = "enclone_proto" -version = "0.5.219" -source = "git+https://github.com/10XGenomics/enclone_ranger?branch=main#90b8c5045ec56b02a1e5a782fe4eb7bd93fefc77" +version = "0.1.0" dependencies = [ "bio_edit", "byteorder", @@ -1464,60 +1485,40 @@ dependencies = [ [[package]] name = "enclone_ranger" -version = "0.5.219" -source = "git+https://github.com/10XGenomics/enclone_ranger?branch=main#90b8c5045ec56b02a1e5a782fe4eb7bd93fefc77" +version = "0.1.0" dependencies = [ + "anyhow", "enclone", "enclone_args", "enclone_core", - "enclone_print", + "enclone_process", "enclone_stuff", - "hdf5", "rayon", - "string_utils", "vdj_ann", + "vdj_types", ] [[package]] name = "enclone_stuff" -version = "0.5.219" -source = "git+https://github.com/10XGenomics/enclone_ranger?branch=main#90b8c5045ec56b02a1e5a782fe4eb7bd93fefc77" +version = "0.1.0" dependencies = [ "amino", - "debruijn", + "anyhow", "enclone", "enclone_args", "enclone_core", - "enclone_print", - "enclone_proto", + "enclone_process", "equiv", - "evalexpr", - "hdf5", "io_utils", "itertools", - "ndarray", "qd", "rayon", - "regex", "stats_utils", "string_utils", - "tables", "vdj_ann", "vector_utils", ] -[[package]] -name = "enclone_vars" -version = "0.5.219" -source = "git+https://github.com/10XGenomics/enclone_ranger?branch=main#90b8c5045ec56b02a1e5a782fe4eb7bd93fefc77" -dependencies = [ - "io_utils", - "itertools", - "pretty_trace", - "string_utils", - "vector_utils", -] - [[package]] name = "enum-map" version = "2.7.3" @@ -1535,13 +1536,12 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "equiv" -version = "0.1.3" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" [[package]] name = "equivalent" @@ -1551,71 +1551,24 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.3.31" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" dependencies = [ "serde", + "typeid", ] [[package]] name = "errno" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] - -[[package]] -name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", ] -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "evalexpr" -version = "11.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b41cb9dd076076058a4523f009c900c582279536d0b2e45a29aa930e083cc5" - -[[package]] -name = "exons" -version = "0.1.5" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "io_utils", - "string_utils", - "vector_utils", -] - -[[package]] -name = "expr_tools" -version = "0.1.3" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "evalexpr", - "statrs", - "string_utils", - "vector_utils", -] - [[package]] name = "fast_utils" version = "0.1.0" @@ -1640,17 +1593,6 @@ dependencies = [ "sqz", ] -[[package]] -name = "fasta_tools" -version = "0.1.8" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "debruijn", - "flate2", - "io_utils", - "string_utils", -] - [[package]] name = "fastq" version = "0.6.0" @@ -1665,7 +1607,7 @@ dependencies = [ [[package]] name = "fastq_set" version = "0.5.3" -source = "git+https://github.com/10XGenomics/fastq_set?branch=master#ec583b1121fb48edba347a0b861f6a73c537cd7d" +source = "git+https://github.com/10XGenomics/fastq_set?branch=master#c8f35e2ba4d84df9bbd7c2a80e850b2fab9b2f28" dependencies = [ "anyhow", "bio", @@ -1685,9 +1627,18 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] [[package]] name = "feature-probe" @@ -1718,7 +1669,7 @@ checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "windows-sys 0.52.0", ] @@ -1730,9 +1681,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" dependencies = [ "crc32fast", "libz-sys", @@ -1790,9 +1741,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1813,9 +1764,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1825,13 +1776,23 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "graph_simple" -version = "0.1.5" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "petgraph", "vector_utils", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1840,14 +1801,14 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hclust" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "itertools", "kodama", @@ -1859,7 +1820,7 @@ dependencies = [ [[package]] name = "hdf5" version = "0.8.1" -source = "git+https://github.com/10XGenomics/hdf5-rust?branch=conda_nov2021#2d4a40b7ef75de530bc53fd2eb0fe75047e083ad" +source = "git+https://github.com/10XGenomics/hdf5-rust.git?branch=conda_nov2021#8fb465c079cabb5993c48b9766036d9134c2dcd1" dependencies = [ "bitflags 1.3.2", "cfg-if", @@ -1876,7 +1837,7 @@ dependencies = [ [[package]] name = "hdf5-derive" version = "0.8.1" -source = "git+https://github.com/10XGenomics/hdf5-rust?branch=conda_nov2021#2d4a40b7ef75de530bc53fd2eb0fe75047e083ad" +source = "git+https://github.com/10XGenomics/hdf5-rust.git?branch=conda_nov2021#8fb465c079cabb5993c48b9766036d9134c2dcd1" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1887,7 +1848,7 @@ dependencies = [ [[package]] name = "hdf5-io" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "anyhow", "hdf5", @@ -1901,7 +1862,7 @@ dependencies = [ [[package]] name = "hdf5-sys" version = "0.8.1" -source = "git+https://github.com/10XGenomics/hdf5-rust?branch=conda_nov2021#2d4a40b7ef75de530bc53fd2eb0fe75047e083ad" +source = "git+https://github.com/10XGenomics/hdf5-rust.git?branch=conda_nov2021#8fb465c079cabb5993c48b9766036d9134c2dcd1" dependencies = [ "attohttpc", "bzip2", @@ -1919,7 +1880,7 @@ dependencies = [ [[package]] name = "hdf5-types" version = "0.8.1" -source = "git+https://github.com/10XGenomics/hdf5-rust?branch=conda_nov2021#2d4a40b7ef75de530bc53fd2eb0fe75047e083ad" +source = "git+https://github.com/10XGenomics/hdf5-rust.git?branch=conda_nov2021#8fb465c079cabb5993c48b9766036d9134c2dcd1" dependencies = [ "ascii", "cfg-if", @@ -1929,15 +1890,15 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1945,32 +1906,24 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "hostname" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" dependencies = [ + "cfg-if", "libc", - "match_cfg", - "winapi", + "windows", ] [[package]] name = "hts-sys" -version = "2.1.1" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deebfb779c734d542e7f14c298597914b9b5425e4089aef482eacb5cab941915" +checksum = "e9f348d14cb4e50444e39fcd6b00302fe2ed2bc88094142f6278391d349a386d" dependencies = [ + "bindgen", "cc", "fs-utils", "glob", @@ -1980,9 +1933,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -2000,8 +1953,7 @@ dependencies = [ [[package]] name = "hyperbase" -version = "0.1.8" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "debruijn", "equiv", @@ -2056,6 +2008,20 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9007da9cacbd3e6343da136e98b0d2df013f553d35bdec8b518f07bea768e19c" +[[package]] +name = "image" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", + "zune-core", + "zune-jpeg", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -2074,7 +2040,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", + "serde", ] [[package]] @@ -2083,6 +2050,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + [[package]] name = "intel-mkl-src" version = "0.8.1" @@ -2108,16 +2081,19 @@ dependencies = [ [[package]] name = "io_utils" -version = "0.3.2" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "bincode", - "flate2", "lz4", "serde", - "string_utils", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.10.5" @@ -2138,9 +2114,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jibes_o3" @@ -2155,9 +2131,9 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] @@ -2170,9 +2146,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2184,7 +2160,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] @@ -2200,11 +2176,9 @@ dependencies = [ [[package]] name = "kmer_lookup" -version = "0.1.5" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "debruijn", - "rayon", "vector_utils", ] @@ -2238,14 +2212,20 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "leiden" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "fxhash", "num-traits", @@ -2256,9 +2236,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libdeflate-sys" @@ -2287,20 +2267,19 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "libc", - "redox_syscall", ] [[package]] name = "libz-sys" -version = "1.1.15" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "cmake", @@ -2317,15 +2296,15 @@ checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2333,25 +2312,24 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lz4" -version = "1.24.0" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +checksum = "4d1febb2b4a79ddd1980eede06a8f7902197960aa0383ffcfdd62fe723036725" dependencies = [ - "libc", "lz4-sys", ] [[package]] name = "lz4-sys" -version = "1.9.4" +version = "1.11.1+lz4-1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" dependencies = [ "cc", "libc", @@ -2360,7 +2338,7 @@ dependencies = [ [[package]] name = "martian" version = "0.26.0" -source = "git+https://github.com/martian-lang/martian-rust?branch=master#345490b52d2722fe30b042d78dcd601225aaee21" +source = "git+https://github.com/martian-lang/martian-rust?branch=master#3f70d1adea9c11ca7f3c04c39fc4761e2184be6e" dependencies = [ "anyhow", "backtrace", @@ -2377,19 +2355,19 @@ dependencies = [ [[package]] name = "martian-derive" version = "0.26.0" -source = "git+https://github.com/martian-lang/martian-rust?branch=master#345490b52d2722fe30b042d78dcd601225aaee21" +source = "git+https://github.com/martian-lang/martian-rust?branch=master#3f70d1adea9c11ca7f3c04c39fc4761e2184be6e" dependencies = [ "martian", "proc-macro2", "quote", "serde", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "martian-filetypes" version = "0.27.0" -source = "git+https://github.com/martian-lang/martian-rust?branch=master#345490b52d2722fe30b042d78dcd601225aaee21" +source = "git+https://github.com/martian-lang/martian-rust?branch=master#3f70d1adea9c11ca7f3c04c39fc4761e2184be6e" dependencies = [ "anyhow", "bincode", @@ -2403,12 +2381,6 @@ dependencies = [ "zstd", ] -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matrixmultiply" version = "0.3.8" @@ -2427,15 +2399,15 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -2460,7 +2432,7 @@ name = "metric_derive" version = "0.1.0" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] @@ -2471,9 +2443,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -2493,19 +2465,12 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", -] - -[[package]] -name = "mirror_sparse_matrix" -version = "0.1.17" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "binary_vec_io", + "simd-adler32", ] [[package]] @@ -2514,6 +2479,7 @@ version = "0.1.0" dependencies = [ "anyhow", "barcode", + "cloud_utils", "cr_types", "csv", "fastq_set", @@ -2533,20 +2499,29 @@ dependencies = [ "vdj_reference", ] +[[package]] +name = "multiconfig_converter" +version = "0.1.0" +dependencies = [ + "anyhow", + "multi", + "serde_json", +] + [[package]] name = "multimap" -version = "0.8.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" dependencies = [ "serde", ] [[package]] name = "multiversion" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2c7b9d7fe61760ce5ea19532ead98541f6b4c495d87247aff9826445cf6872a" +checksum = "c4851161a11d3ad0bf9402d90ffc3967bf231768bfd7aeb61755ad06dbf1a142" dependencies = [ "multiversion-macros", "target-features", @@ -2554,9 +2529,9 @@ dependencies = [ [[package]] name = "multiversion-macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a83d8500ed06d68877e9de1dde76c1dbb83885dcdbda4ef44ccbc3fbda2ac8" +checksum = "79a74ddee9e0c27d2578323c13905793e91622148f138ba29738f9dddb835e90" dependencies = [ "proc-macro2", "quote", @@ -2600,6 +2575,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" dependencies = [ "approx 0.4.0", + "approx 0.5.1", "cblas-sys", "libc", "matrixmultiply", @@ -2673,17 +2649,6 @@ dependencies = [ "rustc_version 0.1.7", ] -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.4.2", - "cfg-if", - "libc", -] - [[package]] name = "noisy_float" version = "0.2.0" @@ -2716,9 +2681,9 @@ dependencies = [ [[package]] name = "num" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -2730,20 +2695,19 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", "rand", @@ -2767,9 +2731,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2778,11 +2742,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -2790,9 +2753,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -2810,9 +2773,9 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -2834,9 +2797,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] @@ -2861,7 +2824,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb3293021f06540803301af45e7ab81693d50e89a7398a3420bdab139e7ba5e" dependencies = [ "base16ct", - "base64 0.22.0", + "base64 0.22.1", "chrono", "directories", "flate2", @@ -2874,7 +2837,7 @@ dependencies = [ "sha2", "tar", "thiserror", - "toml 0.8.12", + "toml", "ureq", "url", "uuid", @@ -2896,7 +2859,7 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orbit" version = "0.2.1" -source = "git+https://github.com/10XGenomics/orbit?branch=master#258340713018716df27861eb85787b31229e09d4" +source = "git+https://github.com/10XGenomics/orbit?branch=master#ee3610479b81f5cfbca62f5ce7d23c1bc0b96885" dependencies = [ "anyhow", "libc", @@ -2906,23 +2869,22 @@ dependencies = [ [[package]] name = "ordered-float" -version = "3.9.2" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" dependencies = [ "num-traits", - "rand", - "serde", ] [[package]] -name = "pager" -version = "0.16.1" +name = "ordered-float" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2599211a5c97fbbb1061d3dc751fa15f404927e4846e07c643287d6d1f462880" +checksum = "83e7ccb95e240b7c9506a3d544f10d935e142cc90b0a1d56954fb44d89ad6b97" dependencies = [ - "errno 0.2.8", - "libc", + "num-traits", + "rand", + "serde", ] [[package]] @@ -2945,14 +2907,14 @@ dependencies = [ "bazel_utils", "log", "serde", - "toml 0.7.4", + "toml", ] [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2960,22 +2922,56 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.3", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "parquet" +version = "51.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "096795d4f47f65fd3ee1ec5a98b77ab26d602f2cc785b0e4be5443add17ecc32" +dependencies = [ + "ahash", + "base64 0.22.1", + "bytes", + "chrono", + "half", + "hashbrown 0.14.5", + "num", + "num-bigint", + "paste", + "seq-macro", + "serde_json", + "thrift", + "twox-hash", + "zstd", +] + +[[package]] +name = "parquet_derive" +version = "51.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888adbb5fca213c9dc7c607e0367a9c672c03ed2301a446debbe4da247736b6d" +dependencies = [ + "parquet", + "proc-macro2", + "quote", + "syn 2.0.71", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "path-clean" @@ -2989,16 +2985,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "perf_stats" -version = "0.1.8" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "io_utils", - "libc", - "string_utils", -] - [[package]] name = "permutation" version = "0.4.1" @@ -3007,9 +2993,9 @@ checksum = "df202b0b0f5b8e389955afd5f27b007b00fb948162953f1db9c70d2c7e3157d7" [[package]] name = "pest" -version = "2.7.7" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" dependencies = [ "memchr", "thiserror", @@ -3018,9 +3004,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.7" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" +checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" dependencies = [ "pest", "pest_generator", @@ -3028,22 +3014,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.7" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" +checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "pest_meta" -version = "2.7.7" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" +checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" dependencies = [ "once_cell", "pest", @@ -3052,25 +3038,25 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 1.9.3", + "indexmap 2.2.6", ] [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plotly" -version = "0.8.4" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7174c07682d8c13cded3fcdf54d9c1d09249b4e821f26e4ab7a60eb39e9783d" +checksum = "25b8fd16c14ce31e4d48a31970530c2e3152b965e8567469e292712af7c9536f" dependencies = [ "askama", "dyn-clone", @@ -3086,14 +3072,27 @@ dependencies = [ [[package]] name = "plotly_derive" -version = "0.8.4" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2fcc11cdbc83c1a49ed868156cc485037e01c612b03128ce98519e5662ede63" +checksum = "7817cbbd497db67dc5d21206fd0f4cab0cd6974b6fd2791f012c5455245b0e65" dependencies = [ - "darling 0.14.4", + "darling 0.20.8", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.71", +] + +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", ] [[package]] @@ -3108,27 +3107,14 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "pretty_trace" -version = "0.5.24" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "backtrace", - "lazy_static", - "libc", - "nix", - "string_utils", - "vector_utils", -] - [[package]] name = "prettyplease" -version = "0.1.25" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 1.0.109", + "syn 2.0.71", ] [[package]] @@ -3157,18 +3143,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] [[package]] name = "prost" -version = "0.11.9" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" dependencies = [ "bytes", "prost-derive", @@ -3176,44 +3162,43 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.11.9" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" dependencies = [ "bytes", "heck", "itertools", - "lazy_static", "log", "multimap", + "once_cell", "petgraph", "prettyplease", "prost", "prost-types", "regex", - "syn 1.0.109", + "syn 2.0.71", "tempfile", - "which", ] [[package]] name = "prost-derive" -version = "0.11.9" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" dependencies = [ "anyhow", "itertools", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.71", ] [[package]] name = "prost-types" -version = "0.11.9" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" dependencies = [ "prost", ] @@ -3312,9 +3297,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.35" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3396,9 +3381,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3423,11 +3408,20 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", "libredox", @@ -3436,9 +3430,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", @@ -3448,9 +3442,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -3459,29 +3453,30 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "rust-htslib" -version = "0.45.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea99084ac4f6f7caff758be2f0dd4718d3e582a735f75bd5957f9c49f5802f8" +checksum = "41f1796800e73ebb282c6fc5c03f1fe160e867e01114a58a7e115ee3c1d02482" dependencies = [ "bio-types", "byteorder", @@ -3491,6 +3486,7 @@ dependencies = [ "ieee754", "lazy_static", "libc", + "libz-sys", "linear-map", "newtype_derive", "regex", @@ -3502,9 +3498,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3527,17 +3523,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.21", + "semver 1.0.23", ] [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.2", - "errno 0.3.8", + "bitflags 2.6.0", + "errno", "libc", "linux-raw-sys", "windows-sys 0.52.0", @@ -3545,51 +3541,44 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring", - "rustls-webpki 0.101.7", - "sct", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] name = "rustls" -version = "0.22.4" +version = "0.23.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" dependencies = [ "log", + "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.3", + "rustls-webpki", "subtle", "zeroize", ] [[package]] name = "rustls-pki-types" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.102.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" dependencies = [ "ring", "rustls-pki-types", @@ -3598,21 +3587,21 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safe_arch" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" dependencies = [ "bytemuck", ] @@ -3629,7 +3618,7 @@ dependencies = [ [[package]] name = "scan-rs" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "anyhow", "ball-tree", @@ -3655,7 +3644,7 @@ dependencies = [ [[package]] name = "scan-types" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "anyhow", "serde", @@ -3669,16 +3658,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "semver" version = "0.1.20" @@ -3687,44 +3666,50 @@ checksum = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" [[package]] name = "semver" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "seq-macro" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -3733,35 +3718,37 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] [[package]] name = "serde_with" -version = "2.3.2" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331bb8c3bf9b92457ab7abecf07078c13f7d270ba490103e84e8b014490cd0b0" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64 0.13.1", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", + "indexmap 2.2.6", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -3769,14 +3756,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "2.3.2" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859011bddcc11f289f07f467cc1fe01c7a941daa4d8f6c40d4d1c92eb6d9319c" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ - "darling 0.14.4", + "darling 0.20.8", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.71", ] [[package]] @@ -3804,8 +3791,7 @@ dependencies = [ [[package]] name = "shardio" version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "669590a22936d55698744e4096bc46fc8f935f492fe86b2f09cbdbb6d937b65a" +source = "git+https://github.com/10XGenomics/rust-shardio?branch=master#54f24533e416524900b95f4ffbb7d99d5bc7fbef" dependencies = [ "anyhow", "bincode", @@ -3823,6 +3809,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "simba" version = "0.6.0" @@ -3836,6 +3828,12 @@ dependencies = [ "wide", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simd_euclidean" version = "0.1.0" @@ -3859,6 +3857,7 @@ dependencies = [ "martian", "martian-derive", "martian-filetypes", + "md5", "metric", "ndarray", "numpy", @@ -3866,6 +3865,7 @@ dependencies = [ "prost-build", "pyanyhow", "pyo3", + "regex", "serde", "serde_json", "strum_macros", @@ -3873,9 +3873,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smart-default" @@ -3885,13 +3885,13 @@ checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "snoop" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" [[package]] name = "spin" @@ -3901,9 +3901,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "sprs" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bab60b0a18fb9b3e0c26e92796b3c3a278bf5fa4880f5ad5cc3bdfb843d0b1" +checksum = "704ef26d974e8a452313ed629828cd9d4e4fa34667ca1ad9d6b1fffa43c6e166" dependencies = [ "ndarray", "num-complex", @@ -3916,7 +3916,7 @@ dependencies = [ [[package]] name = "sqz" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "anyhow", "blas-src", @@ -3934,17 +3934,23 @@ dependencies = [ [[package]] name = "star-sys" version = "0.2.0" -source = "git+https://github.com/10XGenomics/orbit?branch=master#258340713018716df27861eb85787b31229e09d4" +source = "git+https://github.com/10XGenomics/orbit?branch=master#ee3610479b81f5cfbca62f5ce7d23c1bc0b96885" dependencies = [ "cc", "libc", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "statrs" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d08e5e1748192713cc281da8b16924fb46be7b0c2431854eadc785823e5696e" +checksum = "b35a062dbadac17a42e0fc64c27f419b25d6fae98572eb43c8814c9e873d7721" dependencies = [ "approx 0.5.1", "lazy_static", @@ -3964,13 +3970,11 @@ dependencies = [ [[package]] name = "stats_utils" -version = "0.1.3" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" [[package]] name = "string_utils" -version = "0.1.4" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "vector_utils", ] @@ -3981,6 +3985,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.25.0" @@ -3989,22 +3999,22 @@ checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "superslice" @@ -4025,30 +4035,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "tables" -version = "0.1.5" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" -dependencies = [ - "io_utils", - "itertools", - "string_utils", -] - [[package]] name = "tar" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" dependencies = [ "filetime", "libc", @@ -4057,26 +4057,27 @@ dependencies = [ [[package]] name = "target-features" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb5fa503293557c5158bd215fdc225695e567a77e453f5d4452a50a193969bd" +checksum = "c1bbb9f3c5c463a01705937a24fdabc5047929ac764b2d5b9cf681c1f5041ed5" [[package]] name = "target-lexicon" -version = "0.12.13" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" +checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" [[package]] name = "tempfile" -version = "3.10.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4093,9 +4094,11 @@ dependencies = [ [[package]] name = "tenx-websummary" version = "0.1.0" -source = "git+https://github.com/10XGenomics/websummary?branch=master#c4f05602e4307bb08d28068bfd22be37c5e1b594" +source = "git+https://github.com/10XGenomics/websummary?branch=master#23c176fa04b8d08e5a2b9ee68e1544c8efd9f987" dependencies = [ "anyhow", + "base64 0.13.1", + "image", "itertools", "rand", "regex", @@ -4107,7 +4110,7 @@ dependencies = [ [[package]] name = "tenx-websummary-derive" version = "0.1.0" -source = "git+https://github.com/10XGenomics/websummary?branch=master#c4f05602e4307bb08d28068bfd22be37c5e1b594" +source = "git+https://github.com/10XGenomics/websummary?branch=master#23c176fa04b8d08e5a2b9ee68e1544c8efd9f987" dependencies = [ "darling 0.14.4", "itertools", @@ -4128,22 +4131,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] @@ -4152,6 +4155,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" +[[package]] +name = "thrift" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" +dependencies = [ + "byteorder", + "integer-encoding", + "ordered-float 2.10.1", +] + [[package]] name = "tiff" version = "0.9.1" @@ -4163,20 +4177,11 @@ dependencies = [ "weezl", ] -[[package]] -name = "tilde-expand" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ab1f382b10dd7ff9926b5c33374bc4011b27c82ee890c741aef2bd3fa0d10ba" -dependencies = [ - "libc", -] - [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -4197,19 +4202,28 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -4222,61 +4236,36 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.19.10", -] - -[[package]] -name = "toml" -version = "0.8.12" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.12", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.10" +version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" -dependencies = [ - "indexmap 1.9.3", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.4.11", -] - -[[package]] -name = "toml_edit" -version = "0.22.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.6", + "winnow", ] [[package]] @@ -4290,7 +4279,7 @@ dependencies = [ "itertools", "martian-filetypes", "nom", - "ordered-float", + "ordered-float 4.4.0", "serde", "serde_json", "smallvec", @@ -4304,6 +4293,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22048bc95dfb2ffd05b1ff9a756290a009224b60b2f0e7525faeee7603851e63" +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + [[package]] name = "tx_annotation" version = "0.1.0" @@ -4326,6 +4325,12 @@ dependencies = [ "umi", ] +[[package]] +name = "typeid" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf" + [[package]] name = "typenum" version = "1.17.0" @@ -4341,7 +4346,7 @@ checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "umap-rs" version = "0.1.0" -source = "git+https://github.com/10XGenomics/scan-rs.git?branch=main#de9b1f6246beb94d7669d2082800dcd846586c70" +source = "git+https://github.com/10XGenomics/scan-rs?branch=main#74cf71fd58ccfb5f2d4d350b6a0bee716a170f36" dependencies = [ "blas-src", "log", @@ -4391,13 +4396,19 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "unindent" version = "0.1.11" @@ -4412,28 +4423,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.7" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd" +checksum = "72139d247e5f97a3eff96229a7ae85ead5328a39efe76f8bf5a06313d505b6ea" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "flate2", "log", "once_cell", - "rustls 0.22.4", + "rustls 0.23.11", "rustls-pki-types", - "rustls-webpki 0.102.3", "serde", "serde_json", "url", - "webpki-roots 0.26.1", + "webpki-roots", ] [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -4442,15 +4452,15 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.8.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", ] @@ -4463,14 +4473,11 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vdj_ann" -version = "0.4.4" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ - "align_tools", "amino", "bio_edit", "debruijn", - "fasta_tools", "hyperbase", "io_utils", "itertools", @@ -4485,16 +4492,11 @@ dependencies = [ [[package]] name = "vdj_ann_ref" -version = "0.2.1" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "debruijn", - "exons", - "fasta_tools", "flate2", "io_utils", - "perf_stats", - "pretty_trace", "sha2", "string_utils", "vdj_ann", @@ -4508,13 +4510,15 @@ dependencies = [ "anyhow", "barcode", "bio", - "bitflags 2.4.2", + "bitflags 2.6.0", "byteseq", + "cr_h5", + "cr_lib", "cr_types", "debruijn", "fastq_set", "fxhash", - "hostname", + "hdf5", "io_utils", "itertools", "json_report_derive", @@ -4526,13 +4530,13 @@ dependencies = [ "martian-filetypes", "metric", "parameters_toml", - "perf_stats", "rust-htslib", "serde", "serde_json", "string_utils", "vdj_ann", "vdj_asm_utils", + "vdj_filter_barcodes", "vdj_reference", "vdj_types", "vector_utils", @@ -4542,13 +4546,11 @@ dependencies = [ name = "vdj_asm_utils" version = "0.1.0" dependencies = [ - "align_tools", "amino", "anyhow", - "arrayref", "barcode", "bio", - "cr_types", + "bio_edit", "debruijn", "equiv", "graph_simple", @@ -4559,13 +4561,9 @@ dependencies = [ "lazy_static", "lz4", "martian", - "martian-derive", "martian-filetypes", "metric", - "num-traits", - "ordered-float", - "perf_stats", - "petgraph", + "ordered-float 4.4.0", "rand", "rayon", "rust-htslib", @@ -4574,13 +4572,39 @@ dependencies = [ "stats_utils", "string_utils", "superslice", - "tables", "tenkit2", "vdj_ann", "vdj_types", "vector_utils", ] +[[package]] +name = "vdj_filter_barcodes" +version = "0.1.0" +dependencies = [ + "anyhow", + "arrayref", + "barcode", + "bio", + "cr_types", + "debruijn", + "enclone_ranger", + "fastq_set", + "itertools", + "martian", + "martian-derive", + "martian-filetypes", + "metric", + "serde", + "strum", + "strum_macros", + "tenkit2", + "vdj_ann", + "vdj_asm_utils", + "vdj_types", + "vector_utils", +] + [[package]] name = "vdj_proto" version = "0.1.0" @@ -4619,8 +4643,7 @@ dependencies = [ [[package]] name = "vdj_types" -version = "0.2.0" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "serde", ] @@ -4636,8 +4659,7 @@ dependencies = [ [[package]] name = "vector_utils" -version = "0.1.5" -source = "git+https://github.com/10XGenomics/rust-toolbox?branch=master#6856c585a918e183fc4b3bd902b9e4f22e1f3d5f" +version = "0.1.0" dependencies = [ "permutation", "superslice", @@ -4676,9 +4698,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4686,24 +4708,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4711,34 +4733,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" - -[[package]] -name = "webpki-roots" -version = "0.25.4" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" dependencies = [ "rustls-pki-types", ] @@ -4763,8 +4779,8 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.48", - "toml 0.7.4", + "syn 2.0.71", + "toml", ] [[package]] @@ -4773,23 +4789,11 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "wide" -version = "0.7.15" +version = "0.7.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89beec544f246e679fc25490e3f8e08003bc4bf612068f325120dad4cea02c1c" +checksum = "2caba658a80831539b30698ae9862a72db6697dfdd7151e46920f5f2755c3ce2" dependencies = [ "bytemuck", "safe_arch", @@ -4813,11 +4817,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -4826,13 +4830,23 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -4850,7 +4864,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -4870,17 +4893,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -4891,9 +4915,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -4903,9 +4927,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -4915,9 +4939,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -4927,9 +4957,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -4939,9 +4969,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -4951,9 +4981,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -4963,24 +4993,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.4.11" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "656953b22bcbfb1ec8179d60734981d1904494ecc91f8a3f0ee5c7389bb8eb4b" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] @@ -5017,54 +5038,69 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.71", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zstd" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.0.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" +checksum = "fa556e971e7b568dc775c136fc9de8c779b1c2fc3a63defaafadffdbd3181afa" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.12+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" dependencies = [ "cc", "pkg-config", ] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-jpeg" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +dependencies = [ + "zune-core", +] diff --git a/lib/rust/Cargo.toml b/lib/rust/Cargo.toml index 02ec37c..1a58919 100644 --- a/lib/rust/Cargo.toml +++ b/lib/rust/Cargo.toml @@ -15,37 +15,67 @@ opt-level = 3 split-debuginfo = 'unpacked' [workspace] -members = ['barcode', 'barcode_extensions', 'barcodes_folder', 'bazel_utils', 'byteseq', 'clonotype_assigner', 'cr_aggr', 'cr_ana', 'cr_bam', 'cr_h5', 'cr_lib', 'cr_types', 'cr_vdj', 'cr_websummary', 'cr_wrap', 'fast_utils', 'jibes_o3', 'json_report_derive', 'metric', 'metric_derive', 'multi', 'par_proc', 'parameters_toml', 'pyanyhow', 'slide_design', 'stats', 'tenkit2', 'transcriptome', 'tx_annotation', 'umi', 'vdj_asm_asm', 'vdj_asm_utils', 'vdj_proto', 'vdj_reference', 'websummary_build', 'websummary_derive'] +members = ['barcode', 'barcode_extensions', 'barcodes_folder', 'bazel_utils', 'byteseq', 'clonotype_assigner', 'cloud_utils', 'cr_aggr', 'cr_ana', 'cr_bam', 'cr_h5', 'cr_lib', 'cr_types', 'cr_vdj', 'cr_websummary', 'cr_wrap', 'fast_utils', 'jibes_o3', 'json_report_derive', 'metric', 'metric_derive', 'multi', 'multiconfig_converter', 'par_proc', 'parameters_toml', 'pyanyhow', 'slide_design', 'stats', 'tenkit2', 'transcriptome', 'tx_annotation', 'umi', 'vdj_asm_asm', 'vdj_asm_utils', 'vdj_filter_barcodes', 'vdj_proto', 'vdj_reference', 'websummary_build', 'websummary_derive', 'amino', 'enclone', 'enclone_args', 'enclone_core', 'enclone_process', 'enclone_proto', 'enclone_ranger', 'enclone_stuff', 'equiv', 'graph_simple', 'hyperbase', 'io_utils', 'kmer_lookup', 'stats_utils', 'string_utils', 'vdj_ann', 'vdj_ann_ref', 'vdj_types', 'vector_utils'] resolver = '2' [workspace.dependencies] +bincode = '1.1.3' +bio = '2' +bio-types = '1' +bitflags = '2' +byteorder = '1' criterion = '0.5' +csv = '1' ctor = '0.2' -derive_more = '0.99' +debruijn = '0.3' +docopt = '1' +file_diff = '1' flate2 = '1' +fxhash = '0.2' +glob = '0.3' +heck = '0.5' +hex = '0.4' +hostname = '0.4' +indoc = '1' itertools = '0.10' +lazy_static = '1' libc = '0.2' +log = '0.4' +lz4 = '1' ndarray = '0.15' +ndarray-stats = '0.5' nom_locate = '4' -plotly = '0.8' +num-traits = '0.2' +numpy = '0.19' +parquet_derive = '51' +permutation = '0.4' +petgraph = '0.6' +plotly = '0.9' +pretty_assertions = '1' +proc-macro2 = '1' +proptest = '1' +prost = '0.13' +prost-build = '0.13' +quote = '1' rand = '0.8' +rand_chacha = '0.3' rand_distr = '0.4' rand_pcg = '0.3' +rand_xorshift = '0.3' rayon = '1' serde_json = '1' -shardio = '0.8' +sha2 = '0.10' statrs = '0.16' strum = '0.25' -strum_macros = '0.25' -toml = '0.7' - -[workspace.dependencies.align_tools] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' - -[workspace.dependencies.amino] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +strum_macros = '0.26' +superslice = '1' +syn = '2' +tempfile = '3.4' +thiserror = '1' +thousands = '0.2' +toml = '0.8' +triple_accel = '0.4' +wyhash = '0.5' [workspace.dependencies.anyhow] features = ['backtrace'] @@ -57,57 +87,50 @@ version = '0.5' [workspace.dependencies.blas-src] branch = 'main' -git = 'https://github.com/10XGenomics/scan-rs.git' +git = 'https://github.com/10XGenomics/scan-rs' [workspace.dependencies.clap] -features = ['derive', 'wrap_help'] +default-features = false +features = ['std', 'derive'] version = '4' -[workspace.dependencies.enclone_core] -branch = 'main' -git = 'https://github.com/10XGenomics/enclone_ranger' - -[workspace.dependencies.enclone_proto] -branch = 'main' -git = 'https://github.com/10XGenomics/enclone_ranger' +[workspace.dependencies.derive_more] +features = ['add', 'add_assign', 'deref', 'display'] +version = '1.0' -[workspace.dependencies.enclone_ranger] +[workspace.dependencies.diff-exp] branch = 'main' -git = 'https://github.com/10XGenomics/enclone_ranger' - -[workspace.dependencies.equiv] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +git = 'https://github.com/10XGenomics/scan-rs' [workspace.dependencies.fastq_set] branch = 'master' git = 'https://github.com/10XGenomics/fastq_set' -[workspace.dependencies.graph_simple] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +[workspace.dependencies.geo] +default-features = false +version = '0.28' + +[workspace.dependencies.geo-types] +default-features = false +version = '0.7' + +[workspace.dependencies.hclust] +branch = 'main' +git = 'https://github.com/10XGenomics/scan-rs' [workspace.dependencies.hdf5] branch = 'conda_nov2021' features = ['conda'] -git = 'https://github.com/10XGenomics/hdf5-rust' +git = 'https://github.com/10XGenomics/hdf5-rust.git' -[workspace.dependencies.hyperbase] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +[workspace.dependencies.image] +default-features = false +version = '0.25' [workspace.dependencies.insta] features = ['json', 'redactions', 'ron', 'yaml'] version = '1' -[workspace.dependencies.io_utils] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' - -[workspace.dependencies.kmer_lookup] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' - [workspace.dependencies.martian] branch = 'master' git = 'https://github.com/martian-lang/martian-rust' @@ -120,55 +143,65 @@ git = 'https://github.com/martian-lang/martian-rust' branch = 'master' git = 'https://github.com/martian-lang/martian-rust' +[workspace.dependencies.ndarray-npy] +default-features = false +version = '0.8' + [workspace.dependencies.nom] default-features = false version = '7' -[workspace.dependencies.perf_stats] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +[workspace.dependencies.ordered-float] +features = ['serde'] +version = '>=3, < 5' + +[workspace.dependencies.parquet] +default-features = false +features = ['zstd', 'json'] +version = '51' [workspace.dependencies.pyo3] features = ['extension-module', 'abi3-py310'] version = '0.19' +[workspace.dependencies.qd] +git = 'https://github.com/Barandis/qd' + +[workspace.dependencies.regex] +default-features = false +features = ['std', 'perf'] +version = '1' + [workspace.dependencies.rust-htslib] default-features = false features = ['serde_feature', 'libdeflate'] -version = '0.45' +version = '0.47' [workspace.dependencies.serde] features = ['derive'] version = '1.0' -[workspace.dependencies.stats_utils] +[workspace.dependencies.shardio] branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +git = 'https://github.com/10XGenomics/rust-shardio' -[workspace.dependencies.string_utils] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +[workspace.dependencies.sprs] +default-features = false +features = ['multi_thread'] +version = '0.11' -[workspace.dependencies.tables] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +[workspace.dependencies.sqz] +branch = 'main' +git = 'https://github.com/10XGenomics/scan-rs' [workspace.dependencies.tenx-websummary] branch = 'master' git = 'https://github.com/10XGenomics/websummary' -[workspace.dependencies.vdj_ann] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' - -[workspace.dependencies.vdj_ann_ref] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' - -[workspace.dependencies.vdj_types] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +[workspace.dependencies.uuid] +features = ['v4'] +version = '1' -[workspace.dependencies.vector_utils] -branch = 'master' -git = 'https://github.com/10XGenomics/rust-toolbox' +[workspace.dependencies.zip] +default-features = false +version = '0.6' diff --git a/lib/rust/amino/Cargo.toml b/lib/rust/amino/Cargo.toml new file mode 100644 index 0000000..22f3e94 --- /dev/null +++ b/lib/rust/amino/Cargo.toml @@ -0,0 +1,16 @@ +[dependencies] +[dependencies.debruijn] +workspace = true + +[dependencies.string_utils] +path = '../string_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'amino' +publish = false +version = '0.1.0' diff --git a/lib/rust/amino/src/lib.rs b/lib/rust/amino/src/lib.rs new file mode 100644 index 0000000..362abc7 --- /dev/null +++ b/lib/rust/amino/src/lib.rs @@ -0,0 +1,117 @@ +// Copyright (c) 2019 10x Genomics, Inc. All rights reserved. + +use debruijn::dna_string::DnaString; +use debruijn::Mer; +use string_utils::strme; + +// Test to see if a given DnaString has a start or stop codon at a given position. + +pub fn have_start(b: &DnaString, j: usize) -> bool { + let (a, g, t) = (0u8, 2u8, 3u8); + if b.get(j) == a && b.get(j + 1) == t && b.get(j + 2) == g { + return true; + } + false +} + +pub fn have_stop(b: &DnaString, j: usize) -> bool { + let (a, g, t) = (0u8, 2u8, 3u8); + if b.get(j) == t && b.get(j + 1) == a && b.get(j + 2) == g { + return true; + } + if b.get(j) == t && b.get(j + 1) == a && b.get(j + 2) == a { + return true; + } + if b.get(j) == t && b.get(j + 1) == g && b.get(j + 2) == a { + return true; + } + false +} + +pub fn codon_to_aa(codon: &[u8]) -> u8 { + assert!(codon.len() == 3); + + match codon { + b"GGT" => b'G', + b"GGC" => b'G', + b"GGA" => b'G', + b"GGG" => b'G', + b"TGG" => b'W', + b"TGT" => b'C', + b"TGC" => b'C', + b"TTT" => b'F', + b"TTC" => b'F', + b"TTA" => b'L', + b"TTG" => b'L', + b"CTT" => b'L', + b"CTC" => b'L', + b"CTA" => b'L', + b"CTG" => b'L', + b"ATT" => b'I', + b"ATC" => b'I', + b"ATA" => b'I', + b"GTT" => b'V', + b"GTC" => b'V', + b"GTA" => b'V', + b"GTG" => b'V', + b"TCT" => b'S', + b"TCC" => b'S', + b"TCA" => b'S', + b"TCG" => b'S', + b"AGT" => b'S', + b"AGC" => b'S', + b"CCT" => b'P', + b"CCC" => b'P', + b"CCA" => b'P', + b"CCG" => b'P', + b"ACT" => b'T', + b"ACC" => b'T', + b"ACA" => b'T', + b"ACG" => b'T', + b"GCT" => b'A', + b"GCC" => b'A', + b"GCA" => b'A', + b"GCG" => b'A', + b"TAT" => b'Y', + b"TAC" => b'Y', + b"CAT" => b'H', + b"CAC" => b'H', + b"CAA" => b'Q', + b"CAG" => b'Q', + b"AAT" => b'N', + b"AAC" => b'N', + b"AAA" => b'K', + b"AAG" => b'K', + b"GAT" => b'D', + b"GAC" => b'D', + b"GAA" => b'E', + b"GAG" => b'E', + b"CGT" => b'R', + b"CGC" => b'R', + b"CGA" => b'R', + b"CGG" => b'R', + b"AGA" => b'R', + b"AGG" => b'R', + b"ATG" => b'M', + b"TAG" => b'*', + b"TAA" => b'*', + b"TGA" => b'*', + _ => panic!("Unexpected codon {}.", strme(codon)), + } +} + +// Convert a given DNA sequence to amino acids, starting at a given position. + +pub fn nucleotide_to_aminoacid_sequence(dna_seq: &[u8], start: usize) -> Vec { + let mut a = Vec::::new(); + if dna_seq.len() >= 3 { + for pos in (start..dna_seq.len() - 3 + 1).step_by(3) { + if dna_seq[pos] == b'-' && dna_seq[pos + 1] == b'-' && dna_seq[pos + 2] == b'-' { + a.push(b'-'); + } else { + a.push(codon_to_aa(&dna_seq[pos..pos + 3])); + } + } + } + a +} diff --git a/lib/rust/barcode/Cargo.toml b/lib/rust/barcode/Cargo.toml index e0b1c19..0daf6b1 100644 --- a/lib/rust/barcode/Cargo.toml +++ b/lib/rust/barcode/Cargo.toml @@ -27,8 +27,7 @@ workspace = true path = '../metric' [dependencies.ordered-float] -features = ['serde'] -version = '3' +workspace = true [dependencies.pyanyhow] path = '../pyanyhow' diff --git a/lib/rust/barcode/src/cell_name.rs b/lib/rust/barcode/src/cell_name.rs new file mode 100644 index 0000000..e5598ec --- /dev/null +++ b/lib/rust/barcode/src/cell_name.rs @@ -0,0 +1,74 @@ +//! +//! Barcodes which are defined based segmented spatial cells +//! +use anyhow::ensure; +use serde::{Deserialize, Serialize}; +use std::fmt::{Display, Formatter}; +use std::str::FromStr; + +pub(crate) const CELL_ID_PREFIX: &str = "cellid"; + +#[derive(Serialize, Deserialize, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash, Debug)] +pub struct CellId { + pub id: u32, +} + +impl Display for CellId { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{CELL_ID_PREFIX}_{:09}", self.id) + } +} + +impl FromStr for CellId { + type Err = anyhow::Error; + fn from_str(s: &str) -> Result { + fn error(s: &str) -> anyhow::Error { + anyhow::anyhow!("Unable to parse {s} as a segmented cell barcode.") + } + let s = match s.split_once('-') { + Some((barcode, _gem_group)) => barcode, + None => s, + }; + let mut parts = s.split('_'); + let prefix = parts.next().ok_or_else(|| error(s))?; + ensure!( + prefix == CELL_ID_PREFIX, + "Invalid prefix {} in {}", + prefix, + s + ); + + let id = parts + .next() + .map(str::parse) + .transpose()? + .ok_or_else(|| error(s))?; + + Ok(CellId { id }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use anyhow::Result; + use proptest::proptest; + + #[test] + fn test_cell_id() -> Result<()> { + let b = CellId { id: 717 }; + println!("{b}"); + assert_eq!(b.to_string(), "cellid_000000717"); + assert_eq!(b, "cellid_000000717".parse()?); + assert_eq!(b, "cellid_000000717-1".parse()?); + Ok(()) + } + + proptest! { + #[test] + fn test_roundtrip(id in 0..999_999_999u32) { + let barcode = CellId { id }; + assert_eq!(barcode, barcode.to_string().parse().unwrap()); + } + } +} diff --git a/lib/rust/barcode/src/corrector.rs b/lib/rust/barcode/src/corrector.rs index 4d039dd..6ae5c10 100644 --- a/lib/rust/barcode/src/corrector.rs +++ b/lib/rust/barcode/src/corrector.rs @@ -102,7 +102,7 @@ pub struct Posterior { impl Default for Posterior { fn default() -> Self { Self { - max_expected_barcode_errors: std::f64::MAX, + max_expected_barcode_errors: f64::MAX, bc_confidence_threshold: BARCODE_CONFIDENCE_THRESHOLD, } } diff --git a/lib/rust/barcode/src/lib.rs b/lib/rust/barcode/src/lib.rs index ed04e84..2fa30df 100644 --- a/lib/rust/barcode/src/lib.rs +++ b/lib/rust/barcode/src/lib.rs @@ -9,6 +9,7 @@ use std::ops::Deref; use std::str::FromStr; pub mod binned; +pub mod cell_name; pub mod corrector; mod io_utils; pub mod whitelist; @@ -17,6 +18,7 @@ pub mod short_string; use anyhow::{anyhow, bail, Result}; use arrayvec::ArrayVec; use binned::{SquareBinIndex, SquareBinRowOrColumnIndex}; +use cell_name::CellId; pub use corrector::BarcodeCorrector; use fastq_set::squality::SQualityGen; use fastq_set::sseq::SSeqGen; @@ -57,6 +59,7 @@ pub type BcSegQual = SQualityGen; pub enum BarcodeContent { Sequence(BcSeq), SpatialIndex(SquareBinIndex), + CellName(CellId), } impl fmt::Display for BarcodeContent { @@ -64,6 +67,7 @@ impl fmt::Display for BarcodeContent { match self { BarcodeContent::Sequence(seq) => write!(f, "{seq}"), BarcodeContent::SpatialIndex(index) => write!(f, "{index}"), + BarcodeContent::CellName(cell_id) => write!(f, "{cell_id}"), } } } @@ -75,6 +79,8 @@ impl FromStr for BarcodeContent { fn from_str(content_str: &str) -> Result { if content_str.starts_with(binned::SQUARE_BIN_PREFIX) { Ok(BarcodeContent::SpatialIndex(content_str.parse()?)) + } else if content_str.starts_with(cell_name::CELL_ID_PREFIX) { + Ok(BarcodeContent::CellName(content_str.parse()?)) } else { Ok(BarcodeContent::Sequence(BcSeq::from_bytes( content_str.as_bytes(), @@ -95,6 +101,9 @@ impl BarcodeContent { panic!("Cannot get spatial index from sequence barcode") } BarcodeContent::SpatialIndex(index) => *index, + BarcodeContent::CellName(_) => { + panic!("Cannot get spatial index from segmented cell barcode") + } } } /// The sequence of the barcode, if it has one. Panics for @@ -105,6 +114,23 @@ impl BarcodeContent { BarcodeContent::SpatialIndex(_) => { panic!("Cannot get sequence from spatial barcode") } + BarcodeContent::CellName(_) => { + panic!("Cannot get sequence from segmented cell barcode") + } + } + } + + // The sequence of the barcode, if it has one. Panics for + /// spatial index barcodes + pub fn cell_id(&self) -> CellId { + match self { + BarcodeContent::Sequence(_) => { + panic!("Cannot get cell ID from sequence barcode") + } + BarcodeContent::SpatialIndex(_) => { + panic!("Cannot get cell ID from spatial barcode") + } + BarcodeContent::CellName(cell_id) => *cell_id, } } } @@ -118,9 +144,9 @@ impl BarcodeContent { /// by the barcode sequence. #[derive(Serialize, Deserialize, Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Debug)] pub struct Barcode { - gem_group: u16, - valid: bool, - content: BarcodeContent, + pub gem_group: u16, + pub valid: bool, + pub content: BarcodeContent, } impl Barcode { @@ -147,6 +173,15 @@ impl Barcode { } } + /// Create a barcode with a cell ID. A barcode with a spatial index is a valid barcode + pub fn with_cell_id(gem_group: u16, id: u32) -> Self { + Barcode { + gem_group, + content: BarcodeContent::CellName(CellId { id }), + valid: true, + } + } + pub fn with_content(gem_group: u16, content: BarcodeContent, valid: bool) -> Self { Barcode { gem_group, @@ -159,7 +194,7 @@ impl Barcode { } /// The sequence of the barcode, if it has one. Panics for /// spatial index barcodes - fn sequence(&self) -> &BcSeq { + pub fn sequence(&self) -> &BcSeq { self.content.sequence() } /// The sequence of the barcode as byte slice, if it has one. Panics for @@ -178,6 +213,9 @@ impl Barcode { panic!("Cannot get spatial index from sequence barcode") } BarcodeContent::SpatialIndex(index) => index, + BarcodeContent::CellName(_) => { + panic!("Cannot get spatial index from segmented cell barcode") + } } } diff --git a/lib/rust/barcode/src/whitelist.rs b/lib/rust/barcode/src/whitelist.rs index d88cdbd..317e270 100644 --- a/lib/rust/barcode/src/whitelist.rs +++ b/lib/rust/barcode/src/whitelist.rs @@ -1,8 +1,5 @@ use crate::binned::SquareBinRowOrColumnIndex; -use crate::{ - io_utils, BarcodeConstruct, BarcodeSegment, BarcodeSegmentContent, BcSegSeq, - GelBeadAndProbeConstruct, -}; +use crate::{io_utils, BarcodeConstruct, BarcodeSegment, BarcodeSegmentContent, BcSegSeq}; use anyhow::{bail, Context, Result}; use barcodes_folder::find_whitelist; pub use barcodes_folder::{find_atac_whitelist, find_slide_design}; @@ -29,6 +26,7 @@ pub enum WhitelistSpec { /// would be located in the `lib/python/cellranger/barcodes` folder. TxtFile { name: String, + translation: bool, }, /// A translation whitelist dynamically generated by the pipeline. DynamicTranslation { @@ -42,7 +40,7 @@ pub enum WhitelistSpec { impl WhitelistSpec { pub fn whitelist_name(&self) -> Option<&str> { - if let WhitelistSpec::TxtFile { name } = self { + if let WhitelistSpec::TxtFile { name, .. } = self { Some(name) } else { None @@ -58,10 +56,10 @@ impl WhitelistSpec { } /// Produce the whitelist loader corresponding to this spec. - pub fn as_source(&self, translation: bool) -> Result { + pub fn as_source(&self) -> Result { Ok(match self { - WhitelistSpec::TxtFile { name } => WhitelistSource::TxtFile { - path: find_whitelist(name, translation)?, + WhitelistSpec::TxtFile { name, translation } => WhitelistSource::TxtFile { + path: find_whitelist(name, *translation)?, }, WhitelistSpec::DynamicTranslation { translation_whitelist_path: whitelist_path, @@ -69,7 +67,7 @@ impl WhitelistSpec { path: whitelist_path.clone(), }, WhitelistSpec::SlideFile { slide, part } => WhitelistSource::SlideFile { - path: find_whitelist(slide, translation)?, + path: find_whitelist(slide, false)?, part: *part, }, }) @@ -89,6 +87,7 @@ impl AsMartianPrimaryType for WhitelistSpec { #[derive(Serialize, Deserialize, Default, MartianStruct)] struct WhitelistSpecFlat { name: Option, + translation: Option, #[mro_type = "file"] translation_whitelist_path: Option, slide: Option, @@ -98,8 +97,9 @@ struct WhitelistSpecFlat { impl From for WhitelistSpecFlat { fn from(value: WhitelistSpec) -> Self { match value { - WhitelistSpec::TxtFile { name } => Self { + WhitelistSpec::TxtFile { name, translation } => Self { name: Some(name), + translation: Some(translation), ..Self::default() }, WhitelistSpec::DynamicTranslation { @@ -123,15 +123,19 @@ impl TryFrom for WhitelistSpec { fn try_from(value: WhitelistSpecFlat) -> Result { match ( value.name, + value.translation, value.translation_whitelist_path, value.slide, value.part, ) { - (Some(name), None, None, None) => Ok(Self::TxtFile { name }), - (None, Some(path), None, None) => Ok(Self::DynamicTranslation { + (Some(name), trans, None, None, None) => Ok(Self::TxtFile { + name, + translation: trans.unwrap_or_default(), + }), + (None, None, Some(path), None, None) => Ok(Self::DynamicTranslation { translation_whitelist_path: path, }), - (None, None, Some(slide), Some(part)) => Ok(Self::SlideFile { slide, part }), + (None, None, None, Some(slide), Some(part)) => Ok(Self::SlideFile { slide, part }), too_many => bail!("too many fields set in whitelist spec: {:?}", too_many), } } @@ -162,32 +166,29 @@ pub type BarcodeId = crate::ShortString7; /// The known types of multiplexing barcode identifiers. #[derive(Debug, Copy, Clone, Display, PartialEq, Eq)] -pub enum MultiplexingBarcodeType { - CMO, +pub enum RTLMultiplexingBarcodeType { #[strum(to_string = "Gene Expression (BC)")] - RTL, + Gene, #[strum(to_string = "Antibody Capture (AB)")] Antibody, #[strum(to_string = "CRISPR Guide Capture (CR)")] Crispr, - Overhang, } /// Categorize the provided multiplexing barcode ID by type. -/// Assume that any unrecognized identifier is a (potentially user-provided) CMO ID. /// BC001-BC024 are RTL multiplexing barcodes. /// BC025-BC999 and ABxxx are antibody multiplexing barcodes. /// CRxxx are CRISPR guide multiplexing barcodes. -pub fn categorize_multiplexing_barcode_id(bc_id: &str) -> MultiplexingBarcodeType { +/// Assume any unrecognized identifier is a (potentially user-provided) CMO ID or HASHTAG ID. +pub fn categorize_rtl_multiplexing_barcode_id(bc_id: &str) -> Option { #[allow(clippy::enum_glob_use)] - use MultiplexingBarcodeType::*; + use RTLMultiplexingBarcodeType::*; match (&bc_id[..2], bc_id[2..].parse::().ok()) { - ("BC", Some(..=24)) => RTL, - ("BC", None) if matches!(bc_id.as_bytes().last(), Some(b'A'..=b'D')) => RTL, - ("BC", Some(25..)) | ("AB", Some(_)) => Antibody, - ("CR", Some(_)) => Crispr, - ("OH", Some(_)) => Overhang, - _ => CMO, + ("BC", Some(..=24)) => Some(Gene), + ("BC", None) if matches!(bc_id.as_bytes().last(), Some(b'A'..=b'D')) => Some(Gene), + ("BC", Some(25..)) | ("AB", Some(_)) => Some(Antibody), + ("CR", Some(_)) => Some(Crispr), + _ => None, } } @@ -206,29 +207,8 @@ impl WhitelistSource { } } - pub fn construct( - spec: BarcodeConstruct<&WhitelistSpec>, - gel_bead_translation: bool, - ) -> Result> { - let translation = match spec { - BarcodeConstruct::GelBeadOnly(_) => BarcodeConstruct::GelBeadOnly(gel_bead_translation), - BarcodeConstruct::GelBeadAndProbe(_) => { - assert!(!gel_bead_translation); - // A given pool of barcoded RTL probes are a mix of four barcodes to base balance - // in sequencing. We map the four barcodes in the mix to a single barcode using - // translation machinery - BarcodeConstruct::GelBeadAndProbe(GelBeadAndProbeConstruct { - gel_bead: false, - probe: true, - }) - } - BarcodeConstruct::Segmented(_) => { - assert!(!gel_bead_translation); - spec.map(|_| false) - } - }; - - spec.zip(translation).map_result(|(s, t)| s.as_source(t)) + pub fn construct(spec: BarcodeConstruct<&WhitelistSpec>) -> Result> { + spec.map_result(WhitelistSpec::as_source) } fn path(&self) -> &Path { @@ -310,6 +290,7 @@ impl WhitelistSource { .collect() } + /// Load all data and return a Whitelist. pub fn as_whitelist(&self) -> Result { if let WhitelistSource::SlideFile { path, part } = self { let spot_pitch = spot_pitch(path)?; @@ -449,7 +430,7 @@ impl WhitelistSource { } } -#[derive(Serialize)] +#[derive(Serialize, Clone)] pub enum Whitelist { Plain(TxHashSet), Trans(TxHashMap), @@ -478,19 +459,16 @@ impl Whitelist { .map_or(0..0, |(min, max)| min..max + 1) } - pub fn construct( - spec: BarcodeConstruct<&WhitelistSpec>, - gel_bead_translation: bool, - ) -> Result> { - WhitelistSource::construct(spec, gel_bead_translation)?.map_result(|x| x.as_whitelist()) + pub fn construct(spec: BarcodeConstruct<&WhitelistSpec>) -> Result> { + WhitelistSource::construct(spec)?.map_result(|x| x.as_whitelist()) } /// Given a barcode segment, check if it is in the whitelist and update the content. /// /// - If the whitelist is a translation whitelist, update the barcode segment's content - /// to the translated sequence if there is a match. + /// to the translated sequence if there is a match. /// - If the whitelist is a spatial HD whitelist, update the barcode segment's content - /// to the spatial index if there is a match. + /// to the spatial index if there is a match. pub fn check_and_update(&self, bc_segment: &mut BarcodeSegment) -> bool { let seq_in_wl = match self { Whitelist::Plain(ref whitelist) => whitelist.contains(bc_segment.sequence()), @@ -516,31 +494,50 @@ impl Whitelist { seq_in_wl } + /// Return true if sequence is an exact match to the whitelist. + /// + /// Note that for translation whitelists, this only matches against the + /// "key" barcodes, not the translated "value" barcodes. pub fn contains(&self, sequence: &BcSegSeq) -> bool { + self.exact_match_with_translation(sequence).is_some() + } + + /// If sequence exactly matches the whitelist, return the result. + /// If this is a regular whitelist, this will be the same sequence. + /// If this is a translation whitelist, this will be the translated sequence. + /// + /// Note that for translation whitelists, this only matches against the + /// "key" barcodes, not the translated "value" barcodes. + fn exact_match_with_translation(&self, sequence: &BcSegSeq) -> Option { match self { - Whitelist::Plain(ref whitelist) => whitelist.contains(sequence), - Whitelist::Trans(ref whitelist) => whitelist.contains_key(sequence), - Whitelist::SpatialHd(ref whitelist) => whitelist.contains_key(sequence), + Whitelist::Plain(ref whitelist) => whitelist.contains(sequence).then_some(*sequence), + Whitelist::Trans(ref whitelist) => whitelist.get(sequence).copied(), + Whitelist::SpatialHd(ref whitelist) => { + whitelist.contains_key(sequence).then_some(*sequence) + } } } - // - Return `sseq` if it is in the whitelist - // - If there's a single N in the barcode, check if we can can replace the N with a valid base & - // get a whitelist hit. This makes us robust to N-cycles. Return the first modified sequence if - // we found one. - // - Otherwise return None - pub fn match_to_whitelist(&self, mut sseq: BcSegSeq) -> Option { - if self.contains(&sseq) { - return Some(sseq); + /// - Return `sseq` if it is in the whitelist + /// - If there's a single N in the barcode, check if we can can replace the N with a valid base & + /// get a whitelist hit. This makes us robust to N-cycles. Return the first modified sequence if + /// we found one. + /// - Otherwise return None. + /// + /// If translate is true, return the translated sequence for a translation whitelist. + pub fn match_to_whitelist(&self, mut sseq: BcSegSeq, translate: bool) -> Option { + if let Some(seq) = self.exact_match_with_translation(&sseq) { + return if translate { Some(seq) } else { Some(sseq) }; } - let Some(pos_n) = sseq.seq().iter().position(|&base| base == b'N') else { - return None; - }; + let pos_n = sseq.seq().iter().position(|&base| base == b'N')?; b"ACGT".iter().find_map(|&base| { sseq[pos_n] = base; - self.contains(&sseq).then_some(sseq) + if let Some(seq) = self.exact_match_with_translation(&sseq) { + return if translate { Some(seq) } else { Some(sseq) }; + } + None }) } } @@ -556,14 +553,38 @@ mod test { use metric::set; let wl = Whitelist::Plain(set![BcSegSeq::from_bytes(b"ACGT")]); assert_eq!( - wl.match_to_whitelist(BcSegSeq::from_bytes(b"ACGT")), + wl.match_to_whitelist(BcSegSeq::from_bytes(b"ACGT"), false), + Some(BcSegSeq::from_bytes(b"ACGT")) + ); + assert_eq!( + wl.match_to_whitelist(BcSegSeq::from_bytes(b"ACGT"), true), + Some(BcSegSeq::from_bytes(b"ACGT")) + ); + assert_eq!( + wl.match_to_whitelist(BcSegSeq::from_bytes(b"AAAT"), false), + None + ); + assert_eq!( + wl.match_to_whitelist(BcSegSeq::from_bytes(b"ANGT"), false), Some(BcSegSeq::from_bytes(b"ACGT")) ); - assert_eq!(wl.match_to_whitelist(BcSegSeq::from_bytes(b"AAAT")), None); + } + + #[test] + fn test_match_to_whitelist_trans() { + let wl = Whitelist::Trans( + [(BcSegSeq::from_bytes(b"ACGT"), BcSegSeq::from_bytes(b"TGCA"))] + .into_iter() + .collect(), + ); assert_eq!( - wl.match_to_whitelist(BcSegSeq::from_bytes(b"ANGT")), + wl.match_to_whitelist(BcSegSeq::from_bytes(b"ACGT"), false), Some(BcSegSeq::from_bytes(b"ACGT")) ); + assert_eq!( + wl.match_to_whitelist(BcSegSeq::from_bytes(b"ACGT"), true), + Some(BcSegSeq::from_bytes(b"TGCA")) + ); } #[test] @@ -571,6 +592,7 @@ mod test { let specs = vec![ WhitelistSpec::TxtFile { name: "foo".to_string(), + translation: false, }, WhitelistSpec::DynamicTranslation { translation_whitelist_path: PathBuf::from("/test"), diff --git a/lib/rust/barcode_extensions/Cargo.toml b/lib/rust/barcode_extensions/Cargo.toml index ba91418..11a2bd6 100644 --- a/lib/rust/barcode_extensions/Cargo.toml +++ b/lib/rust/barcode_extensions/Cargo.toml @@ -24,7 +24,7 @@ path = '../metric' [dependencies.rayon] optional = true -version = '1' +workspace = true [dependencies.serde] workspace = true @@ -34,7 +34,7 @@ path = '../slide_design' [dependencies.triple_accel] optional = true -version = '0.4' +workspace = true [features] default = ['tenx_source_available'] diff --git a/lib/rust/barcodes_folder/src/lib.rs b/lib/rust/barcodes_folder/src/lib.rs index 0291deb..3d9ef09 100644 --- a/lib/rust/barcodes_folder/src/lib.rs +++ b/lib/rust/barcodes_folder/src/lib.rs @@ -6,6 +6,7 @@ use itertools::Itertools; use std::path::PathBuf; const PD_CANONICAL_SLIDE_NAME: &str = "visium_hd_rc1"; +const PD_XL_CANONICAL_SLIDE_NAME: &str = "visium_hd_rcxl1"; const CS_CANONICAL_SLIDE_NAME: &str = "visium_hd_v1"; fn search_for_whitelist( @@ -42,11 +43,15 @@ fn search_for_whitelist( pub fn find_slide_design(slide_name: &str) -> Result { let fname = if slide_name == PD_CANONICAL_SLIDE_NAME || slide_name == CS_CANONICAL_SLIDE_NAME { find_whitelist(PD_CANONICAL_SLIDE_NAME, false) - .or_else(|_|find_whitelist(CS_CANONICAL_SLIDE_NAME, false)) - .context( format!("Could not find slide files for slide designs {CS_CANONICAL_SLIDE_NAME} or {PD_CANONICAL_SLIDE_NAME}")) + .or_else(|_|find_whitelist(CS_CANONICAL_SLIDE_NAME, false).or_else(|_| find_whitelist(PD_XL_CANONICAL_SLIDE_NAME, false))) + .context( format!("Could not find slide files for slide designs {CS_CANONICAL_SLIDE_NAME} or {PD_CANONICAL_SLIDE_NAME} or {PD_XL_CANONICAL_SLIDE_NAME}")) + } else if slide_name == PD_XL_CANONICAL_SLIDE_NAME { + find_whitelist(slide_name, false) + .context("Could not find slide files for XL RC1 slide design") } else { find_whitelist(slide_name, false) }?; + if fname.extension().is_some_and(|ext| ext == "slide") { Ok(fname) } else { @@ -156,8 +161,8 @@ mod test { fn test_find_whitelist() -> Result<()> { let _ = find_whitelist("737K-august-2016", false)?; assert!(find_whitelist("737K-august-2016", true).is_err()); - let _ = find_whitelist("3M-february-2018", false)?; - let _ = find_whitelist("3M-february-2018", true)?; + let _ = find_whitelist("3M-february-2018_TRU", false)?; + let _ = find_whitelist("3M-february-2018_NXT", true)?; let _ = find_whitelist("9K-LT-march-2021", false)?; let _ = find_whitelist("9K-LT-march-2021", true)?; let _ = find_atac_whitelist("737K-arc-v1")?; diff --git a/lib/rust/bio_edit/Cargo.toml b/lib/rust/bio_edit/Cargo.toml new file mode 100644 index 0000000..a066ca3 --- /dev/null +++ b/lib/rust/bio_edit/Cargo.toml @@ -0,0 +1,15 @@ +[dependencies] +bit-set = '0.5' + +[dependencies.bio-types] +workspace = true + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'bio_edit' +publish = false +version = '0.1.0' diff --git a/lib/rust/bio_edit/src/alignment/mod.rs b/lib/rust/bio_edit/src/alignment/mod.rs new file mode 100644 index 0000000..20212a7 --- /dev/null +++ b/lib/rust/bio_edit/src/alignment/mod.rs @@ -0,0 +1,8 @@ +// Copyright 2014-2015 Johannes Köster, Vadim Nazarov, Patrick Marks +// Licensed under the MIT license (http://opensource.org/licenses/MIT) +// This file may not be copied, modified, or distributed +// except according to those terms. + +pub mod pairwise; + +pub use bio_types::alignment::*; diff --git a/lib/rust/bio_edit/src/alignment/pairwise/mod.rs b/lib/rust/bio_edit/src/alignment/pairwise/mod.rs new file mode 100644 index 0000000..e61416b --- /dev/null +++ b/lib/rust/bio_edit/src/alignment/pairwise/mod.rs @@ -0,0 +1,1489 @@ +// Copyright 2014-2015 Johannes Köster, Vadim Nazarov, Patrick Marks +// Licensed under the MIT license (http://opensource.org/licenses/MIT) +// This file may not be copied, modified, or distributed +// except according to those terms. + +//! Calculate alignments with a generalized variant of the Smith Waterman algorithm. +//! Complexity: O(n * m) for strings of length m and n. +//! +//! For quick computation of alignments and alignment scores there are 6 simple functions. +//! +//! # Example +//! +//! ``` +//! use bio_edit::alignment::pairwise::*; +//! use bio_edit::alignment::AlignmentOperation::*; +//! +//! let x = b"ACCGTGGAT"; +//! let y = b"AAAAACCGTTGAT"; +//! let score = |a: u8, b: u8| if a == b { 1i32 } else { -1i32 }; +//! // gap open score: -5, gap extension score: -1 +//! let mut aligner = Aligner::with_capacity(x.len(), y.len(), -5, -1, &score); +//! let alignment = aligner.semiglobal(x, y); +//! // x is global (target sequence) and y is local (reference sequence) +//! assert_eq!(alignment.ystart, 4); +//! assert_eq!(alignment.xstart, 0); +//! assert_eq!( +//! alignment.operations, +//! [Match, Match, Match, Match, Match, Subst, Match, Match, Match] +//! ); +//! +//! // If you don't know sizes of future sequences, you could +//! // use Aligner::new(). +//! // Global alignment: +//! let mut aligner = Aligner::new(-5, -1, &score); +//! let x = b"ACCGTGGAT"; +//! let y = b"AAAAACCGTTGAT"; +//! let alignment = aligner.global(x, y); +//! assert_eq!(alignment.ystart, 0); +//! assert_eq!(alignment.xstart, 0); +//! assert_eq!(aligner.local(x, y).score, 7); +//! +//! // In addition to the standard modes (Global, Semiglobal and Local), a custom alignment +//! // mode is supported which supports a user-specified clipping penalty. Clipping is a +//! // special boundary condition where you are allowed to clip off the beginning/end of +//! // the sequence for a fixed penalty. As a starting example, we can use the custom mode +//! // for achieving the three standard modes as follows. +//! +//! // scoring for semiglobal mode +//! let scoring = Scoring::new(-5, -1, &score) // Gap open, gap extend and match score function +//! .xclip(MIN_SCORE) // Clipping penalty for x set to 'negative infinity', hence global in x +//! .yclip(0); // Clipping penalty for y set to 0, hence local in y +//! let mut aligner = Aligner::with_scoring(scoring); +//! let alignment = aligner.custom(x, y); // The custom aligner invocation +//! assert_eq!(alignment.ystart, 4); +//! assert_eq!(alignment.xstart, 0); +//! // Note that in the custom mode, the clips are explicitly mentioned in the operations +//! assert_eq!( +//! alignment.operations, +//! [ +//! Yclip(4), +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Subst, +//! Match, +//! Match, +//! Match +//! ] +//! ); +//! +//! // scoring for global mode +//! // scoring can also be created using from_scores if the match and mismatch scores are constants +//! let scoring = Scoring::from_scores(-5, -1, 1, -1) // Gap open, extend, match, mismatch score +//! .xclip(MIN_SCORE) // Clipping penalty for x set to 'negative infinity', hence global in x +//! .yclip(MIN_SCORE); // Clipping penalty for y set to 'negative infinity', hence global in y +//! let mut aligner = Aligner::with_scoring(scoring); +//! let alignment = aligner.custom(x, y); // The custom aligner invocation +//! assert_eq!(alignment.ystart, 0); +//! assert_eq!(alignment.xstart, 0); +//! // Note that in the custom mode, the clips are explicitly mentioned in the operations +//! assert_eq!( +//! alignment.operations, +//! [Del, Del, Del, Del, Match, Match, Match, Match, Match, Subst, Match, Match, Match] +//! ); +//! +//! // Similarly if the clip penalties are both set to 0, we have local alignment mode. The scoring +//! // struct also lets users set different penalties for prefix/suffix clipping, thereby letting +//! // users have the flexibility to create a wide variety of boundary conditions. The xclip() and +//! // yclip() methods sets the prefix and suffix penalties to be equal. The scoring struct can be +//! // explicitly constructed for full flexibility. +//! +//! // The following example considers a modification of the semiglobal mode where you are allowed +//! // to skip a prefix of the target sequence x, for a penalty of -10, but you have to consume +//! // the rest of the string in the alignment +//! +//! let scoring = Scoring { +//! gap_open: -5, +//! gap_extend: -1, +//! match_fn: |a: u8, b: u8| if a == b { 1i32 } else { -3i32 }, +//! match_scores: Some((1, -3)), +//! xclip_prefix: -10, +//! xclip_suffix: MIN_SCORE, +//! yclip_prefix: 0, +//! yclip_suffix: 0, +//! }; +//! let x = b"GGGGGGACGTACGTACGT"; +//! let y = b"AAAAACGTACGTACGTAAAA"; +//! let mut aligner = Aligner::with_capacity_and_scoring(x.len(), y.len(), scoring); +//! let alignment = aligner.custom(x, y); +//! assert_eq!(alignment.score, 2); +//! assert_eq!( +//! alignment.operations, +//! [ +//! Yclip(4), +//! Xclip(6), +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Match, +//! Yclip(4) +//! ] +//! ); +//! ``` + +use crate::alignment::{Alignment, AlignmentMode, AlignmentOperation}; +use crate::utils::TextSlice; +use std::cmp::max; +use std::iter::repeat; + +/// Value to use as a 'negative infinity' score. Should be close to `i32::MIN`, +/// but avoid underflow when used with reasonable scoring parameters or even +/// adding two negative infinities. Use ~ `0.4 * i32::MIN` +pub const MIN_SCORE: i32 = -858_993_459; + +/// Trait required to instantiate a Scoring instance +pub trait MatchFunc { + fn score(&self, a: u8, b: u8) -> i32; +} + +/// A concrete data structure which implements trait MatchFunc with constant +/// match and mismatch scores +#[derive(Debug, Clone)] +pub struct MatchParams { + pub match_score: i32, + pub mismatch_score: i32, +} + +impl MatchParams { + /// Create new MatchParams instance with given match and mismatch scores + /// + /// # Arguments + /// + /// * `match_score` - the score for a match (should not be negative) + /// * `mismatch_score` - the score for a mismatch (should not be positive) + pub fn new(match_score: i32, mismatch_score: i32) -> Self { + assert!(match_score >= 0, "match_score can't be negative"); + assert!(mismatch_score <= 0, "mismatch_score can't be positive"); + MatchParams { + match_score, + mismatch_score, + } + } +} + +impl MatchFunc for MatchParams { + #[inline] + fn score(&self, a: u8, b: u8) -> i32 { + if a == b { + self.match_score + } else { + self.mismatch_score + } + } +} + +/// The trait Matchfunc is also implemented for Fn(u8, u8) -> i32 so that Scoring +/// can be instantiated using closures and custom user defined functions +impl MatchFunc for F +where + F: Fn(u8, u8) -> i32, +{ + fn score(&self, a: u8, b: u8) -> i32 { + (self)(a, b) + } +} + +/// Details of scoring are encapsulated in this structure. +/// +/// An [affine gap score model](https://en.wikipedia.org/wiki/Gap_penalty#Affine) +/// is used so that the gap score for a length `k` is: +/// `GapScore(k) = gap_open + gap_extend * k` +#[derive(Debug, Clone)] +pub struct Scoring { + pub gap_open: i32, + pub gap_extend: i32, + pub match_fn: F, + pub match_scores: Option<(i32, i32)>, + pub xclip_prefix: i32, + pub xclip_suffix: i32, + pub yclip_prefix: i32, + pub yclip_suffix: i32, +} + +impl Scoring { + /// Create new Scoring instance with given gap open, gap extend penalties + /// match and mismatch scores. The clip penalties are set to `MIN_SCORE` by default + /// + /// # Arguments + /// + /// * `gap_open` - the score for opening a gap (should not be positive) + /// * `gap_extend` - the score for extending a gap (should not be positive) + /// * `match_score` - the score for a match + /// * `mismatch_score` - the score for a mismatch + pub fn from_scores( + gap_open: i32, + gap_extend: i32, + match_score: i32, + mismatch_score: i32, + ) -> Self { + assert!(gap_open <= 0, "gap_open can't be positive"); + assert!(gap_extend <= 0, "gap_extend can't be positive"); + + Scoring { + gap_open, + gap_extend, + match_fn: MatchParams::new(match_score, mismatch_score), + match_scores: Some((match_score, mismatch_score)), + xclip_prefix: MIN_SCORE, + xclip_suffix: MIN_SCORE, + yclip_prefix: MIN_SCORE, + yclip_suffix: MIN_SCORE, + } + } +} + +impl Scoring { + /// Create new Scoring instance with given gap open, gap extend penalties + /// and the score function. The clip penalties are set to [`MIN_SCORE`](constant.MIN_SCORE.html) by default + /// + /// # Arguments + /// + /// * `gap_open` - the score for opening a gap (should not be positive) + /// * `gap_extend` - the score for extending a gap (should not be positive) + /// * `match_fn` - function that returns the score for substitutions + /// (see also [`bio_edit::alignment::pairwise::Scoring`](struct.Scoring.html)) + pub fn new(gap_open: i32, gap_extend: i32, match_fn: F) -> Self { + assert!(gap_open <= 0, "gap_open can't be positive"); + assert!(gap_extend <= 0, "gap_extend can't be positive"); + + Scoring { + gap_open, + gap_extend, + match_fn, + match_scores: None, + xclip_prefix: MIN_SCORE, + xclip_suffix: MIN_SCORE, + yclip_prefix: MIN_SCORE, + yclip_suffix: MIN_SCORE, + } + } + + /// Sets the prefix and suffix clipping penalties for x to the input value + /// + /// # Arguments + /// + /// * `penalty` - Clipping penalty for x (both prefix and suffix, should not be positive) + /// + /// ```rust + /// use bio_edit::alignment::pairwise::{Scoring, MIN_SCORE}; + /// let scoring = Scoring::from_scores(0, -2, 1, -2).xclip(-5); + /// assert!(scoring.xclip_prefix == -5); + /// assert!(scoring.yclip_prefix == MIN_SCORE); + /// assert!(scoring.xclip_suffix == -5); + /// assert!(scoring.yclip_suffix == MIN_SCORE); + /// ``` + pub fn xclip(mut self, penalty: i32) -> Self { + assert!(penalty <= 0, "Clipping penalty can't be positive"); + self.xclip_prefix = penalty; + self.xclip_suffix = penalty; + self + } + + /// Sets the prefix clipping penalty for x to the input value + /// + /// # Arguments + /// + /// * `penalty` - Prefix clipping penalty for x (should not be positive) + /// + /// # Example + /// ```rust + /// use bio_edit::alignment::pairwise::{Scoring, MIN_SCORE}; + /// let scoring = Scoring::from_scores(0, -2, 1, -2).xclip_prefix(-5); + /// assert!(scoring.xclip_prefix == -5); + /// assert!(scoring.yclip_prefix == MIN_SCORE); + /// assert!(scoring.xclip_suffix == MIN_SCORE); + /// assert!(scoring.yclip_suffix == MIN_SCORE); + /// ``` + pub fn xclip_prefix(mut self, penalty: i32) -> Self { + assert!(penalty <= 0, "Clipping penalty can't be positive"); + self.xclip_prefix = penalty; + self + } + + /// Sets the suffix clipping penalty for x to the input value + /// + /// # Arguments + /// + /// * `penalty` - Suffix clipping penalty for x (should not be positive) + /// + /// ```rust + /// use bio_edit::alignment::pairwise::{Scoring, MIN_SCORE}; + /// let scoring = Scoring::from_scores(0, -2, 1, -2).xclip_suffix(-5); + /// assert!(scoring.xclip_prefix == MIN_SCORE); + /// assert!(scoring.yclip_prefix == MIN_SCORE); + /// assert!(scoring.xclip_suffix == -5); + /// assert!(scoring.yclip_suffix == MIN_SCORE); + /// ``` + pub fn xclip_suffix(mut self, penalty: i32) -> Self { + assert!(penalty <= 0, "Clipping penalty can't be positive"); + self.xclip_suffix = penalty; + self + } + + /// Sets the prefix and suffix clipping penalties for y to the input value + /// + /// # Arguments + /// + /// * `penalty` - Clipping penalty for y (both prefix and suffix, should not be positive) + /// + /// ```rust + /// use bio_edit::alignment::pairwise::{Scoring, MIN_SCORE}; + /// let scoring = Scoring::from_scores(0, -2, 1, -2).yclip(-5); + /// assert!(scoring.xclip_prefix == MIN_SCORE); + /// assert!(scoring.yclip_prefix == -5); + /// assert!(scoring.xclip_suffix == MIN_SCORE); + /// assert!(scoring.yclip_suffix == -5); + /// ``` + pub fn yclip(mut self, penalty: i32) -> Self { + assert!(penalty <= 0, "Clipping penalty can't be positive"); + self.yclip_prefix = penalty; + self.yclip_suffix = penalty; + self + } + + /// Sets the prefix clipping penalty for y to the input value + /// + /// # Arguments + /// + /// * `penalty` - Prefix clipping penalty for y (should not be positive) + /// + /// ```rust + /// use bio_edit::alignment::pairwise::{Scoring, MIN_SCORE}; + /// let scoring = Scoring::from_scores(0, -2, 1, -2).yclip_prefix(-5); + /// assert_eq!(scoring.xclip_prefix, MIN_SCORE); + /// assert_eq!(scoring.yclip_prefix, -5); + /// assert_eq!(scoring.xclip_suffix, MIN_SCORE); + /// assert_eq!(scoring.yclip_suffix, MIN_SCORE); + /// ``` + pub fn yclip_prefix(mut self, penalty: i32) -> Self { + assert!(penalty <= 0, "Clipping penalty can't be positive"); + self.yclip_prefix = penalty; + self + } + + /// Sets the suffix clipping penalty for y to the input value + /// + /// # Arguments + /// + /// * `penalty` - Suffix clipping penalty for y (should not be positive) + /// + /// ```rust + /// use bio_edit::alignment::pairwise::{Scoring, MIN_SCORE}; + /// let scoring = Scoring::from_scores(0, -2, 1, -2).yclip_suffix(-5); + /// assert!(scoring.xclip_prefix == MIN_SCORE); + /// assert!(scoring.yclip_prefix == MIN_SCORE); + /// assert!(scoring.xclip_suffix == MIN_SCORE); + /// assert!(scoring.yclip_suffix == -5); + /// ``` + pub fn yclip_suffix(mut self, penalty: i32) -> Self { + assert!(penalty <= 0, "Clipping penalty can't be positive"); + self.yclip_suffix = penalty; + self + } +} + +/// A generalized Smith-Waterman aligner. +/// +/// `M(i,j)` is the best score such that `x[i]` and `y[j]` ends in a match (or substitution) +/// ```ignore +/// .... A G x_i +/// .... C G y_j +/// ``` +/// `I(i,j)` is the best score such that `x[i]` is aligned with a gap +/// ```ignore +/// .... A G x_i +/// .... G y_j - +/// ``` +/// This is interpreted as an insertion into `x` w.r.t reference `y` +/// +/// `D(i,j)` is the best score such that `y[j]` is aligned with a gap +/// ```ignore +/// .... A x_i - +/// .... G G y_j +/// ``` +/// This is interpreted as a deletion from `x` w.r.t reference `y` +/// +/// `S(i,j)` is the best score for prefixes `x[0..i]`, `y[0..j]` +/// +/// To save space, only two columns of these matrices are stored at +/// any point - the current column and the previous one. Moreover +/// `M(i,j)` is not explicitly stored +/// +/// `Lx` is the optimal x suffix clipping lengths from each position of the +/// sequence y +/// +/// `Ly` is the optimal y suffix clipping lengths from each position of the +/// sequence x +/// +/// `Sn` is the last column of the matrix. This is needed to keep track of +/// suffix clipping scores +/// +/// `traceback` - see [`bio_edit::alignment::pairwise::TracebackCell`](struct.TracebackCell.html) +/// +/// `scoring` - see [`bio_edit::alignment::pairwise::Scoring`](struct.Scoring.html) +#[allow(non_snake_case)] +pub struct Aligner { + I: [Vec; 2], + D: [Vec; 2], + S: [Vec; 2], + Lx: Vec, + Ly: Vec, + Sn: Vec, + traceback: Traceback, + scoring: Scoring, +} + +const DEFAULT_ALIGNER_CAPACITY: usize = 200; + +impl Aligner { + /// Create new aligner instance with given gap open and gap extend penalties + /// and the score function. + /// + /// # Arguments + /// + /// * `gap_open` - the score for opening a gap (should be negative) + /// * `gap_extend` - the score for extending a gap (should be negative) + /// * `match_fn` - function that returns the score for substitutions + /// (see also [`bio_edit::alignment::pairwise::Scoring`](struct.Scoring.html)) + pub fn new(gap_open: i32, gap_extend: i32, match_fn: F) -> Self { + Aligner::with_capacity( + DEFAULT_ALIGNER_CAPACITY, + DEFAULT_ALIGNER_CAPACITY, + gap_open, + gap_extend, + match_fn, + ) + } + + /// Create new aligner instance. The size hints help to + /// avoid unnecessary memory allocations. + /// + /// # Arguments + /// + /// * `m` - the expected size of x + /// * `n` - the expected size of y + /// * `gap_open` - the score for opening a gap (should be negative) + /// * `gap_extend` - the score for extending a gap (should be negative) + /// * `match_fn` - function that returns the score for substitutions + /// (see also [`bio_edit::alignment::pairwise::Scoring`](struct.Scoring.html)) + pub fn with_capacity(m: usize, n: usize, gap_open: i32, gap_extend: i32, match_fn: F) -> Self { + assert!(gap_open <= 0, "gap_open can't be positive"); + assert!(gap_extend <= 0, "gap_extend can't be positive"); + + Aligner { + I: [Vec::with_capacity(m + 1), Vec::with_capacity(m + 1)], + D: [Vec::with_capacity(m + 1), Vec::with_capacity(m + 1)], + S: [Vec::with_capacity(m + 1), Vec::with_capacity(m + 1)], + Lx: Vec::with_capacity(n + 1), + Ly: Vec::with_capacity(m + 1), + Sn: Vec::with_capacity(m + 1), + traceback: Traceback::with_capacity(m, n), + scoring: Scoring::new(gap_open, gap_extend, match_fn), + } + } + + /// Create new aligner instance with given the scoring struct + /// + /// # Arguments + /// + /// * `scoring` - the scoring struct (see bio_edit::alignment::pairwise::Scoring) + pub fn with_scoring(scoring: Scoring) -> Self { + Aligner::with_capacity_and_scoring( + DEFAULT_ALIGNER_CAPACITY, + DEFAULT_ALIGNER_CAPACITY, + scoring, + ) + } + + /// Create new aligner instance with scoring and size hint. The size hints help to + /// avoid unnecessary memory allocations. + /// + /// # Arguments + /// + /// * `m` - the expected size of x + /// * `n` - the expected size of y + /// * `scoring` - the scoring struct + pub fn with_capacity_and_scoring(m: usize, n: usize, scoring: Scoring) -> Self { + assert!(scoring.gap_open <= 0, "gap_open can't be positive"); + assert!(scoring.gap_extend <= 0, "gap_extend can't be positive"); + assert!( + scoring.xclip_prefix <= 0, + "Clipping penalty (x prefix) can't be positive" + ); + assert!( + scoring.xclip_suffix <= 0, + "Clipping penalty (x suffix) can't be positive" + ); + assert!( + scoring.yclip_prefix <= 0, + "Clipping penalty (y prefix) can't be positive" + ); + assert!( + scoring.yclip_suffix <= 0, + "Clipping penalty (y suffix) can't be positive" + ); + + Aligner { + I: [Vec::with_capacity(m + 1), Vec::with_capacity(m + 1)], + D: [Vec::with_capacity(m + 1), Vec::with_capacity(m + 1)], + S: [Vec::with_capacity(m + 1), Vec::with_capacity(m + 1)], + Lx: Vec::with_capacity(n + 1), + Ly: Vec::with_capacity(m + 1), + Sn: Vec::with_capacity(m + 1), + traceback: Traceback::with_capacity(m, n), + scoring, + } + } + + /// The core function to compute the alignment + /// + /// # Arguments + /// + /// * `x` - Textslice + /// * `y` - Textslice + pub fn custom(&mut self, x: TextSlice<'_>, y: TextSlice<'_>) -> Alignment { + let (m, n) = (x.len(), y.len()); + self.traceback.init(m, n); + + // Set the initial conditions + // We are repeating some work, but that's okay! + for k in 0..2 { + self.I[k].clear(); + self.D[k].clear(); + self.S[k].clear(); + + self.D[k].extend(repeat(MIN_SCORE).take(m + 1)); + self.I[k].extend(repeat(MIN_SCORE).take(m + 1)); + self.S[k].extend(repeat(MIN_SCORE).take(m + 1)); + + self.S[k][0] = 0; + + if k == 0 { + let mut tb = TracebackCell::new(); + tb.set_all(TB_START); + self.traceback.set(0, 0, tb); + self.Lx.clear(); + self.Lx.extend(repeat(0usize).take(n + 1)); + self.Ly.clear(); + self.Ly.extend(repeat(0usize).take(m + 1)); + self.Sn.clear(); + self.Sn.extend(repeat(MIN_SCORE).take(m + 1)); + self.Sn[0] = self.scoring.yclip_suffix; + self.Ly[0] = n; + } + + for i in 1..=m { + let mut tb = TracebackCell::new(); + tb.set_all(TB_START); + if i == 1 { + self.I[k][i] = self.scoring.gap_open + self.scoring.gap_extend; + tb.set_i_bits(TB_START); + } else { + // Insert all i characters + let i_score = self.scoring.gap_open + self.scoring.gap_extend * (i as i32); + let c_score = + self.scoring.xclip_prefix + self.scoring.gap_open + self.scoring.gap_extend; // Clip then insert + if i_score > c_score { + self.I[k][i] = i_score; + tb.set_i_bits(TB_INS); + } else { + self.I[k][i] = c_score; + tb.set_i_bits(TB_XCLIP_PREFIX); + } + } + + if i == m { + tb.set_s_bits(TB_XCLIP_SUFFIX); + } else { + self.S[k][i] = MIN_SCORE; + } + + if self.I[k][i] > self.S[k][i] { + self.S[k][i] = self.I[k][i]; + tb.set_s_bits(TB_INS); + } + + if self.scoring.xclip_prefix > self.S[k][i] { + self.S[k][i] = self.scoring.xclip_prefix; + tb.set_s_bits(TB_XCLIP_PREFIX); + } + + // Track the score if we do a suffix clip (x) after this character + if i != m && self.S[k][i] + self.scoring.xclip_suffix > self.S[k][m] { + self.S[k][m] = self.S[k][i] + self.scoring.xclip_suffix; + self.Lx[0] = m - i; + } + + if k == 0 { + self.traceback.set(i, 0, tb); + } + // Track the score if we do suffix clip (y) from here + if self.S[k][i] + self.scoring.yclip_suffix > self.Sn[i] { + self.Sn[i] = self.S[k][i] + self.scoring.yclip_suffix; + self.Ly[i] = n; + } + } + } + + for j in 1..=n { + let curr = j % 2; + let prev = 1 - curr; + + { + // Handle i = 0 case + let mut tb = TracebackCell::new(); + self.I[curr][0] = MIN_SCORE; + + if j == 1 { + self.D[curr][0] = self.scoring.gap_open + self.scoring.gap_extend; + tb.set_d_bits(TB_START); + } else { + // Delete all j characters + let d_score = self.scoring.gap_open + self.scoring.gap_extend * (j as i32); + let c_score = + self.scoring.yclip_prefix + self.scoring.gap_open + self.scoring.gap_extend; + if d_score > c_score { + self.D[curr][0] = d_score; + tb.set_d_bits(TB_DEL); + } else { + self.D[curr][0] = c_score; + tb.set_d_bits(TB_YCLIP_PREFIX); + } + } + if self.D[curr][0] > self.scoring.yclip_prefix { + self.S[curr][0] = self.D[curr][0]; + tb.set_s_bits(TB_DEL); + } else { + self.S[curr][0] = self.scoring.yclip_prefix; + tb.set_s_bits(TB_YCLIP_PREFIX); + } + + if j == n && self.Sn[0] > self.S[curr][0] { + // Check if the suffix clip score is better + self.S[curr][0] = self.Sn[0]; + tb.set_s_bits(TB_YCLIP_SUFFIX); + // Track the score if we do suffix clip (y) from here + } else if self.S[curr][0] + self.scoring.yclip_suffix > self.Sn[0] { + self.Sn[0] = self.S[curr][0] + self.scoring.yclip_suffix; + self.Ly[0] = n - j; + } + + self.traceback.set(0, j, tb); + } + + for i in 1..=m { + self.S[curr][i] = MIN_SCORE; + } + + let q = y[j - 1]; + let xclip_score = self.scoring.xclip_prefix + + max( + self.scoring.yclip_prefix, + self.scoring.gap_open + self.scoring.gap_extend * (j as i32), + ); + for i in 1..m + 1 { + let p = x[i - 1]; + let mut tb = TracebackCell::new(); + + let m_score = self.S[prev][i - 1] + self.scoring.match_fn.score(p, q); + + let i_score = self.I[curr][i - 1] + self.scoring.gap_extend; + let s_score = self.S[curr][i - 1] + self.scoring.gap_open + self.scoring.gap_extend; + let best_i_score; + if i_score > s_score { + best_i_score = i_score; + tb.set_i_bits(TB_INS); + } else { + best_i_score = s_score; + tb.set_i_bits(self.traceback.get(i - 1, j).get_s_bits()); + } + + let d_score = self.D[prev][i] + self.scoring.gap_extend; + let s_score = self.S[prev][i] + self.scoring.gap_open + self.scoring.gap_extend; + let best_d_score; + if d_score > s_score { + best_d_score = d_score; + tb.set_d_bits(TB_DEL); + } else { + best_d_score = s_score; + tb.set_d_bits(self.traceback.get(i, j - 1).get_s_bits()); + } + + tb.set_s_bits(TB_XCLIP_SUFFIX); + let mut best_s_score = self.S[curr][i]; + + if m_score > best_s_score { + best_s_score = m_score; + tb.set_s_bits(if p == q { TB_MATCH } else { TB_SUBST }); + } + + if best_i_score > best_s_score { + best_s_score = best_i_score; + tb.set_s_bits(TB_INS); + } + + if best_d_score > best_s_score { + best_s_score = best_d_score; + tb.set_s_bits(TB_DEL); + } + + if xclip_score > best_s_score { + best_s_score = xclip_score; + tb.set_s_bits(TB_XCLIP_PREFIX); + } + + let yclip_score = self.scoring.yclip_prefix + + self.scoring.gap_open + + self.scoring.gap_extend * (i as i32); + if yclip_score > best_s_score { + best_s_score = yclip_score; + tb.set_s_bits(TB_YCLIP_PREFIX); + } + + self.S[curr][i] = best_s_score; + self.I[curr][i] = best_i_score; + self.D[curr][i] = best_d_score; + + // Track the score if we do suffix clip (x) from here + if self.S[curr][i] + self.scoring.xclip_suffix > self.S[curr][m] { + self.S[curr][m] = self.S[curr][i] + self.scoring.xclip_suffix; + self.Lx[j] = m - i; + } + + // Track the score if we do suffix clip (y) from here + if self.S[curr][i] + self.scoring.yclip_suffix > self.Sn[i] { + self.Sn[i] = self.S[curr][i] + self.scoring.yclip_suffix; + self.Ly[i] = n - j; + } + + self.traceback.set(i, j, tb); + } + } + + // Handle suffix clipping in the j=n case + for i in 0..=m { + let j = n; + let curr = j % 2; + if self.Sn[i] > self.S[curr][i] { + self.S[curr][i] = self.Sn[i]; + self.traceback.get_mut(i, j).set_s_bits(TB_YCLIP_SUFFIX); + } + if self.S[curr][i] + self.scoring.xclip_suffix > self.S[curr][m] { + self.S[curr][m] = self.S[curr][i] + self.scoring.xclip_suffix; + self.Lx[j] = m - i; + self.traceback.get_mut(m, j).set_s_bits(TB_XCLIP_SUFFIX); + } + } + + // Since there could be a change in the last column of S, + // recompute the last column of I as this could also change + for i in 1..=m { + let j = n; + let curr = j % 2; + let s_score = self.S[curr][i - 1] + self.scoring.gap_open + self.scoring.gap_extend; + if s_score > self.I[curr][i] { + self.I[curr][i] = s_score; + let s_bit = self.traceback.get(i - 1, j).get_s_bits(); + self.traceback.get_mut(i, j).set_i_bits(s_bit); + } + if s_score > self.S[curr][i] { + self.S[curr][i] = s_score; + self.traceback.get_mut(i, j).set_s_bits(TB_INS); + if self.S[curr][i] + self.scoring.xclip_suffix > self.S[curr][m] { + self.S[curr][m] = self.S[curr][i] + self.scoring.xclip_suffix; + self.Lx[j] = m - i; + self.traceback.get_mut(m, j).set_s_bits(TB_XCLIP_SUFFIX); + } + } + } + + let mut i = m; + let mut j = n; + let mut operations = Vec::with_capacity(x.len()); + let mut xstart: usize = 0usize; + let mut ystart: usize = 0usize; + let mut xend = m; + let mut yend = n; + + let mut last_layer = self.traceback.get(i, j).get_s_bits(); + + loop { + let next_layer: u16; + match last_layer { + TB_START => break, + TB_INS => { + operations.push(AlignmentOperation::Ins); + next_layer = self.traceback.get(i, j).get_i_bits(); + i -= 1; + } + TB_DEL => { + operations.push(AlignmentOperation::Del); + next_layer = self.traceback.get(i, j).get_d_bits(); + j -= 1; + } + TB_MATCH => { + operations.push(AlignmentOperation::Match); + next_layer = self.traceback.get(i - 1, j - 1).get_s_bits(); + i -= 1; + j -= 1; + } + TB_SUBST => { + operations.push(AlignmentOperation::Subst); + next_layer = self.traceback.get(i - 1, j - 1).get_s_bits(); + i -= 1; + j -= 1; + } + TB_XCLIP_PREFIX => { + operations.push(AlignmentOperation::Xclip(i)); + xstart = i; + i = 0; + next_layer = self.traceback.get(0, j).get_s_bits(); + } + TB_XCLIP_SUFFIX => { + operations.push(AlignmentOperation::Xclip(self.Lx[j])); + i -= self.Lx[j]; + xend = i; + next_layer = self.traceback.get(i, j).get_s_bits(); + } + TB_YCLIP_PREFIX => { + operations.push(AlignmentOperation::Yclip(j)); + ystart = j; + j = 0; + next_layer = self.traceback.get(i, 0).get_s_bits(); + } + TB_YCLIP_SUFFIX => { + operations.push(AlignmentOperation::Yclip(self.Ly[i])); + j -= self.Ly[i]; + yend = j; + next_layer = self.traceback.get(i, j).get_s_bits(); + } + _ => panic!("Dint expect this!"), + } + last_layer = next_layer; + } + + operations.reverse(); + Alignment { + score: self.S[n % 2][m], + ystart, + xstart, + yend, + xend, + ylen: n, + xlen: m, + operations, + mode: AlignmentMode::Custom, + } + } + + /// Modified version of the core function that allows gap open and gap extend penalties to + /// be specified as a function of the position the second sequence y. These functions are + /// one-based and specified as vectors that have y.len() + 1 elements. In this form of the + /// function, the values of gap_open and gap_extend are ignored. + /// + /// The code for this is a copy of the custom function, with each instance of gap_open and + /// gap_extend replaced by a function reference. + /// + /// It would be more appealing to provide equivalent functionality using bona fide functions + /// (allowing for closures), but it is not clear how to do this without breaking existing + /// functionality and possibly impacting performance in the case where the gap penalties + /// are not functions. + /// + /// # Arguments + /// + /// * `x` - Textslice + /// * `y` - Textslice + /// * `gap_open_fn` - [i32] + /// * `gap_extend_fn` - [i32] + pub fn custom_with_gap_fns( + &mut self, + x: TextSlice<'_>, + y: TextSlice<'_>, + gap_open_fn: &[i32], + gap_extend_fn: &[i32], + ) -> Alignment { + let (m, n) = (x.len(), y.len()); + self.traceback.init(m, n); + + // Set the initial conditions + // We are repeating some work, but that's okay! + for k in 0..2 { + self.I[k].clear(); + self.D[k].clear(); + self.S[k].clear(); + + self.D[k].extend(repeat(MIN_SCORE).take(m + 1)); + self.I[k].extend(repeat(MIN_SCORE).take(m + 1)); + self.S[k].extend(repeat(MIN_SCORE).take(m + 1)); + + self.S[k][0] = 0; + + if k == 0 { + let mut tb = TracebackCell::new(); + tb.set_all(TB_START); + self.traceback.set(0, 0, tb); + self.Lx.clear(); + self.Lx.extend(repeat(0usize).take(n + 1)); + self.Ly.clear(); + self.Ly.extend(repeat(0usize).take(m + 1)); + self.Sn.clear(); + self.Sn.extend(repeat(MIN_SCORE).take(m + 1)); + self.Sn[0] = self.scoring.yclip_suffix; + self.Ly[0] = n; + } + + for i in 1..=m { + let j = 1; + let mut tb = TracebackCell::new(); + tb.set_all(TB_START); + if i == 1 { + self.I[k][i] = gap_open_fn[j] + gap_extend_fn[j]; + tb.set_i_bits(TB_START); + } else { + // Insert all i characters + let i_score = gap_open_fn[j] + gap_extend_fn[j] * (i as i32); + let c_score = self.scoring.xclip_prefix + gap_open_fn[j] + gap_extend_fn[j]; // Clip then insert + if i_score > c_score { + self.I[k][i] = i_score; + tb.set_i_bits(TB_INS); + } else { + self.I[k][i] = c_score; + tb.set_i_bits(TB_XCLIP_PREFIX); + } + } + + if i == m { + tb.set_s_bits(TB_XCLIP_SUFFIX); + } else { + self.S[k][i] = MIN_SCORE; + } + + if self.I[k][i] > self.S[k][i] { + self.S[k][i] = self.I[k][i]; + tb.set_s_bits(TB_INS); + } + + if self.scoring.xclip_prefix > self.S[k][i] { + self.S[k][i] = self.scoring.xclip_prefix; + tb.set_s_bits(TB_XCLIP_PREFIX); + } + + // Track the score if we do a suffix clip (x) after this character + if i != m && self.S[k][i] + self.scoring.xclip_suffix > self.S[k][m] { + self.S[k][m] = self.S[k][i] + self.scoring.xclip_suffix; + self.Lx[0] = m - i; + } + + if k == 0 { + self.traceback.set(i, 0, tb); + } + // Track the score if we do suffix clip (y) from here + if self.S[k][i] + self.scoring.yclip_suffix > self.Sn[i] { + self.Sn[i] = self.S[k][i] + self.scoring.yclip_suffix; + self.Ly[i] = n; + } + } + } + + for j in 1..=n { + let curr = j % 2; + let prev = 1 - curr; + + { + // Handle i = 0 case + let mut tb = TracebackCell::new(); + self.I[curr][0] = MIN_SCORE; + + if j == 1 { + self.D[curr][0] = gap_open_fn[j] + gap_extend_fn[j]; + tb.set_d_bits(TB_START); + } else { + // Delete all j characters + let d_score = gap_open_fn[j] + gap_extend_fn[j] * (j as i32); + let c_score = self.scoring.yclip_prefix + gap_open_fn[j] + gap_extend_fn[j]; + if d_score > c_score { + self.D[curr][0] = d_score; + tb.set_d_bits(TB_DEL); + } else { + self.D[curr][0] = c_score; + tb.set_d_bits(TB_YCLIP_PREFIX); + } + } + if self.D[curr][0] > self.scoring.yclip_prefix { + self.S[curr][0] = self.D[curr][0]; + tb.set_s_bits(TB_DEL); + } else { + self.S[curr][0] = self.scoring.yclip_prefix; + tb.set_s_bits(TB_YCLIP_PREFIX); + } + + if j == n && self.Sn[0] > self.S[curr][0] { + // Check if the suffix clip score is better + self.S[curr][0] = self.Sn[0]; + // tb.set_s_bits(TB_YCLIP_SUFFIX); + // Track the score if we do suffix clip (y) from here + } else if self.S[curr][0] + self.scoring.yclip_suffix > self.Sn[0] { + self.Sn[0] = self.S[curr][0] + self.scoring.yclip_suffix; + self.Ly[0] = n - j; + } + + self.traceback.set(0, j, tb); + } + + for i in 1..=m { + self.S[curr][i] = MIN_SCORE; + } + + let q = y[j - 1]; + let xclip_score = self.scoring.xclip_prefix + + max( + self.scoring.yclip_prefix, + gap_open_fn[j] + gap_extend_fn[j] * (j as i32), + ); + for i in 1..m + 1 { + let p = x[i - 1]; + let mut tb = TracebackCell::new(); + + let m_score = self.S[prev][i - 1] + self.scoring.match_fn.score(p, q); + + let i_score = self.I[curr][i - 1] + gap_extend_fn[j]; + let s_score = self.S[curr][i - 1] + gap_open_fn[j] + gap_extend_fn[j]; + let best_i_score; + if i_score > s_score { + best_i_score = i_score; + tb.set_i_bits(TB_INS); + } else { + best_i_score = s_score; + tb.set_i_bits(self.traceback.get(i - 1, j).get_s_bits()); + } + + let d_score = self.D[prev][i] + gap_extend_fn[j]; + let s_score = self.S[prev][i] + gap_open_fn[j] + gap_extend_fn[j]; + let best_d_score; + if d_score > s_score { + best_d_score = d_score; + tb.set_d_bits(TB_DEL); + } else { + best_d_score = s_score; + tb.set_d_bits(self.traceback.get(i, j - 1).get_s_bits()); + } + + tb.set_s_bits(TB_XCLIP_SUFFIX); + let mut best_s_score = self.S[curr][i]; + + if m_score > best_s_score { + best_s_score = m_score; + tb.set_s_bits(if p == q { TB_MATCH } else { TB_SUBST }); + } + + if best_i_score > best_s_score { + best_s_score = best_i_score; + tb.set_s_bits(TB_INS); + } + + if best_d_score > best_s_score { + best_s_score = best_d_score; + tb.set_s_bits(TB_DEL); + } + + if xclip_score > best_s_score { + best_s_score = xclip_score; + tb.set_s_bits(TB_XCLIP_PREFIX); + } + + let yclip_score = + self.scoring.yclip_prefix + gap_open_fn[j] + gap_extend_fn[j] * (i as i32); + if yclip_score > best_s_score { + best_s_score = yclip_score; + tb.set_s_bits(TB_YCLIP_PREFIX); + } + + self.S[curr][i] = best_s_score; + self.I[curr][i] = best_i_score; + self.D[curr][i] = best_d_score; + + // Track the score if we do suffix clip (x) from here + if self.S[curr][i] + self.scoring.xclip_suffix > self.S[curr][m] { + self.S[curr][m] = self.S[curr][i] + self.scoring.xclip_suffix; + self.Lx[j] = m - i; + } + + // Track the score if we do suffix clip (y) from here + if self.S[curr][i] + self.scoring.yclip_suffix > self.Sn[i] { + self.Sn[i] = self.S[curr][i] + self.scoring.yclip_suffix; + self.Ly[i] = n - j; + } + + self.traceback.set(i, j, tb); + } + } + + // Handle suffix clipping in the j=n case + for i in 0..=m { + let j = n; + let curr = j % 2; + if self.Sn[i] > self.S[curr][i] { + self.S[curr][i] = self.Sn[i]; + // self.traceback.get_mut(i, j).set_s_bits(TB_YCLIP_SUFFIX); + } + if self.S[curr][i] + self.scoring.xclip_suffix > self.S[curr][m] { + self.S[curr][m] = self.S[curr][i] + self.scoring.xclip_suffix; + self.Lx[j] = m - i; + self.traceback.get_mut(m, j).set_s_bits(TB_XCLIP_SUFFIX); + } + } + + // Since there could be a change in the last column of S, + // recompute the last column of I as this could also change + for i in 1..=m { + let j = n; + let curr = j % 2; + let s_score = self.S[curr][i - 1] + gap_open_fn[j] + gap_extend_fn[j]; + if s_score > self.I[curr][i] { + self.I[curr][i] = s_score; + let s_bit = self.traceback.get(i - 1, j).get_s_bits(); + self.traceback.get_mut(i, j).set_i_bits(s_bit); + } + if s_score > self.S[curr][i] { + self.S[curr][i] = s_score; + self.traceback.get_mut(i, j).set_s_bits(TB_INS); + if self.S[curr][i] + self.scoring.xclip_suffix > self.S[curr][m] { + self.S[curr][m] = self.S[curr][i] + self.scoring.xclip_suffix; + self.Lx[j] = m - i; + self.traceback.get_mut(m, j).set_s_bits(TB_XCLIP_SUFFIX); + } + } + } + + let mut i = m; + let mut j = n; + let mut operations = Vec::with_capacity(x.len()); + let mut xstart: usize = 0usize; + let mut ystart: usize = 0usize; + let mut xend = m; + let mut yend = n; + + let mut last_layer = self.traceback.get(i, j).get_s_bits(); + + loop { + let next_layer: u16; + match last_layer { + TB_START => break, + TB_INS => { + operations.push(AlignmentOperation::Ins); + next_layer = self.traceback.get(i, j).get_i_bits(); + i -= 1; + } + TB_DEL => { + operations.push(AlignmentOperation::Del); + next_layer = self.traceback.get(i, j).get_d_bits(); + j -= 1; + } + TB_MATCH => { + operations.push(AlignmentOperation::Match); + next_layer = self.traceback.get(i - 1, j - 1).get_s_bits(); + i -= 1; + j -= 1; + } + TB_SUBST => { + operations.push(AlignmentOperation::Subst); + next_layer = self.traceback.get(i - 1, j - 1).get_s_bits(); + i -= 1; + j -= 1; + } + TB_XCLIP_PREFIX => { + operations.push(AlignmentOperation::Xclip(i)); + xstart = i; + i = 0; + next_layer = self.traceback.get(0, j).get_s_bits(); + } + TB_XCLIP_SUFFIX => { + operations.push(AlignmentOperation::Xclip(self.Lx[j])); + i -= self.Lx[j]; + xend = i; + next_layer = self.traceback.get(i, j).get_s_bits(); + } + TB_YCLIP_PREFIX => { + operations.push(AlignmentOperation::Yclip(j)); + ystart = j; + j = 0; + next_layer = self.traceback.get(i, 0).get_s_bits(); + } + TB_YCLIP_SUFFIX => { + operations.push(AlignmentOperation::Yclip(self.Ly[i])); + j -= self.Ly[i]; + yend = j; + next_layer = self.traceback.get(i, j).get_s_bits(); + } + _ => panic!("Dint expect this!"), + } + last_layer = next_layer; + } + + operations.reverse(); + Alignment { + score: self.S[n % 2][m], + ystart, + xstart, + yend, + xend, + ylen: n, + xlen: m, + operations, + mode: AlignmentMode::Custom, + } + } + + /// Calculate global alignment of x against y. + pub fn global(&mut self, x: TextSlice<'_>, y: TextSlice<'_>) -> Alignment { + // Store the current clip penalties + let clip_penalties = [ + self.scoring.xclip_prefix, + self.scoring.xclip_suffix, + self.scoring.yclip_prefix, + self.scoring.yclip_suffix, + ]; + + // Temporarily Over-write the clip penalties + self.scoring.xclip_prefix = MIN_SCORE; + self.scoring.xclip_suffix = MIN_SCORE; + self.scoring.yclip_prefix = MIN_SCORE; + self.scoring.yclip_suffix = MIN_SCORE; + + // Compute the alignment + let mut alignment = self.custom(x, y); + alignment.mode = AlignmentMode::Global; + + // Set the clip penalties to the original values + self.scoring.xclip_prefix = clip_penalties[0]; + self.scoring.xclip_suffix = clip_penalties[1]; + self.scoring.yclip_prefix = clip_penalties[2]; + self.scoring.yclip_suffix = clip_penalties[3]; + + alignment + } + + /// Calculate semiglobal alignment of x against y (x is global, y is local). + pub fn semiglobal(&mut self, x: TextSlice<'_>, y: TextSlice<'_>) -> Alignment { + // Store the current clip penalties + let clip_penalties = [ + self.scoring.xclip_prefix, + self.scoring.xclip_suffix, + self.scoring.yclip_prefix, + self.scoring.yclip_suffix, + ]; + + // Temporarily Over-write the clip penalties + self.scoring.xclip_prefix = MIN_SCORE; + self.scoring.xclip_suffix = MIN_SCORE; + self.scoring.yclip_prefix = 0; + self.scoring.yclip_suffix = 0; + + // Compute the alignment + let mut alignment = self.custom(x, y); + alignment.mode = AlignmentMode::Semiglobal; + + // Filter out Xclip and Yclip from alignment.operations + alignment.filter_clip_operations(); + + // Set the clip penalties to the original values + self.scoring.xclip_prefix = clip_penalties[0]; + self.scoring.xclip_suffix = clip_penalties[1]; + self.scoring.yclip_prefix = clip_penalties[2]; + self.scoring.yclip_suffix = clip_penalties[3]; + + alignment + } + + /// Calculate local alignment of x against y. + pub fn local(&mut self, x: TextSlice<'_>, y: TextSlice<'_>) -> Alignment { + // Store the current clip penalties + let clip_penalties = [ + self.scoring.xclip_prefix, + self.scoring.xclip_suffix, + self.scoring.yclip_prefix, + self.scoring.yclip_suffix, + ]; + + // Temporarily Over-write the clip penalties + self.scoring.xclip_prefix = 0; + self.scoring.xclip_suffix = 0; + self.scoring.yclip_prefix = 0; + self.scoring.yclip_suffix = 0; + + // Compute the alignment + let mut alignment = self.custom(x, y); + alignment.mode = AlignmentMode::Local; + + // Filter out Xclip and Yclip from alignment.operations + alignment.filter_clip_operations(); + + // Set the clip penalties to the original values + self.scoring.xclip_prefix = clip_penalties[0]; + self.scoring.xclip_suffix = clip_penalties[1]; + self.scoring.yclip_prefix = clip_penalties[2]; + self.scoring.yclip_suffix = clip_penalties[3]; + + alignment + } +} + +/// Packed representation of one cell of a Smith-Waterman traceback matrix. +/// Stores the I, D and S traceback matrix values in two bytes. +/// Possible traceback moves include : start, insert, delete, match, substitute, +/// prefix clip and suffix clip for x & y. So we need 4 bits each for matrices I, D, S +/// to keep track of these 9 moves. +#[derive(Copy, Clone, Default)] +pub struct TracebackCell { + v: u16, +} + +// Traceback bit positions (LSB) +const I_POS: u8 = 0; // Meaning bits 0,1,2,3 corresponds to I and so on +const D_POS: u8 = 4; +const S_POS: u8 = 8; + +// Traceback moves +const TB_START: u16 = 0b0000; +const TB_INS: u16 = 0b0001; +const TB_DEL: u16 = 0b0010; +const TB_SUBST: u16 = 0b0011; +const TB_MATCH: u16 = 0b0100; + +const TB_XCLIP_PREFIX: u16 = 0b0101; // prefix clip of x +const TB_XCLIP_SUFFIX: u16 = 0b0110; // suffix clip of x +const TB_YCLIP_PREFIX: u16 = 0b0111; // prefix clip of y +const TB_YCLIP_SUFFIX: u16 = 0b1000; // suffix clip of y + +const TB_MAX: u16 = 0b1000; // Useful in checking that the + // TB value we got is a valid one + +impl TracebackCell { + /// Initialize a blank traceback cell + #[inline(always)] + pub fn new() -> TracebackCell { + Default::default() + } + + /// Sets 4 bits [pos, pos+4) with the 4 LSBs of value + #[inline(always)] + fn set_bits(&mut self, pos: u8, value: u16) { + let bits: u16 = (0b1111) << pos; + assert!( + value <= TB_MAX, + "Expected a value <= TB_MAX while setting traceback bits" + ); + self.v = (self.v & !bits) // First clear the bits + | (value << pos); // And set the bits + } + + #[inline(always)] + pub fn set_i_bits(&mut self, value: u16) { + // Traceback corresponding to matrix I + self.set_bits(I_POS, value); + } + + #[inline(always)] + pub fn set_d_bits(&mut self, value: u16) { + // Traceback corresponding to matrix D + self.set_bits(D_POS, value); + } + + #[inline(always)] + pub fn set_s_bits(&mut self, value: u16) { + // Traceback corresponding to matrix S + self.set_bits(S_POS, value); + } + + // Gets 4 bits [pos, pos+4) of v + #[inline(always)] + fn get_bits(self, pos: u8) -> u16 { + (self.v >> pos) & (0b1111) + } + + #[inline(always)] + pub fn get_i_bits(self) -> u16 { + self.get_bits(I_POS) + } + + #[inline(always)] + pub fn get_d_bits(self) -> u16 { + self.get_bits(D_POS) + } + + #[inline(always)] + pub fn get_s_bits(self) -> u16 { + self.get_bits(S_POS) + } + + /// Set all matrices to the same value. + pub fn set_all(&mut self, value: u16) { + self.set_i_bits(value); + self.set_d_bits(value); + self.set_s_bits(value); + } +} + +/// Internal traceback. +struct Traceback { + rows: usize, + cols: usize, + matrix: Vec, +} + +impl Traceback { + fn with_capacity(m: usize, n: usize) -> Self { + let rows = m + 1; + let cols = n + 1; + Traceback { + rows, + cols, + matrix: Vec::with_capacity(rows * cols), + } + } + + fn init(&mut self, m: usize, n: usize) { + self.matrix.clear(); + let mut start = TracebackCell::new(); + start.set_all(TB_START); + // set every cell to start + self.resize(m, n, start); + } + + #[inline(always)] + fn set(&mut self, i: usize, j: usize, v: TracebackCell) { + debug_assert!(i < self.rows); + debug_assert!(j < self.cols); + self.matrix[i * self.cols + j] = v; + } + + #[inline(always)] + fn get(&self, i: usize, j: usize) -> &TracebackCell { + debug_assert!(i < self.rows); + debug_assert!(j < self.cols); + &self.matrix[i * self.cols + j] + } + + fn get_mut(&mut self, i: usize, j: usize) -> &mut TracebackCell { + debug_assert!(i < self.rows); + debug_assert!(j < self.cols); + &mut self.matrix[i * self.cols + j] + } + + fn resize(&mut self, m: usize, n: usize, v: TracebackCell) { + self.rows = m + 1; + self.cols = n + 1; + self.matrix.resize(self.rows * self.cols, v); + } +} diff --git a/lib/rust/bio_edit/src/alphabets/mod.rs b/lib/rust/bio_edit/src/alphabets/mod.rs new file mode 100644 index 0000000..6ec062a --- /dev/null +++ b/lib/rust/bio_edit/src/alphabets/mod.rs @@ -0,0 +1,77 @@ +// Copyright 2014-2015 Johannes Köster, Peer Aramillo Irizar. +// Licensed under the MIT license (http://opensource.org/licenses/MIT) +// This file may not be copied, modified, or distributed +// except according to those terms. + +use std::borrow::Borrow; + +use bit_set::BitSet; + +#[derive(Debug, PartialEq, Eq)] +pub struct Alphabet { + pub symbols: BitSet, +} + +impl Alphabet { + pub fn new(symbols: T) -> Self + where + C: Borrow, + T: IntoIterator, + { + let mut s = BitSet::new(); + s.extend(symbols.into_iter().map(|c| *c.borrow() as usize)); + + Alphabet { symbols: s } + } + + pub fn insert(&mut self, a: u8) { + self.symbols.insert(a as usize); + } + + pub fn is_word(&self, text: T) -> bool + where + C: Borrow, + T: IntoIterator, + { + text.into_iter() + .all(|c| self.symbols.contains(*c.borrow() as usize)) + } + + pub fn max_symbol(&self) -> Option { + self.symbols.iter().max().map(|a| a as u8) + } + + pub fn len(&self) -> usize { + self.symbols.len() + } + + pub fn is_empty(&self) -> bool { + self.symbols.is_empty() + } + + pub fn intersection(&self, other: &Alphabet) -> Self { + return Alphabet { + symbols: self.symbols.intersection(&other.symbols).collect(), + }; + } + + pub fn difference(&self, other: &Alphabet) -> Self { + return Alphabet { + symbols: self.symbols.difference(&other.symbols).collect(), + }; + } + + pub fn union(&self, other: &Alphabet) -> Self { + return Alphabet { + symbols: self.symbols.union(&other.symbols).collect(), + }; + } +} + +pub fn english_ascii_lower_alphabet() -> Alphabet { + Alphabet::new(&b"abcdefghijklmnopqrstuvwxyz"[..]) +} + +pub fn english_ascii_upper_alphabet() -> Alphabet { + Alphabet::new(&b"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[..]) +} diff --git a/lib/rust/bio_edit/src/lib.rs b/lib/rust/bio_edit/src/lib.rs new file mode 100644 index 0000000..7d59535 --- /dev/null +++ b/lib/rust/bio_edit/src/lib.rs @@ -0,0 +1,8 @@ +// Copyright 2014-2016 Johannes Köster. +// Licensed under the MIT license (http://opensource.org/licenses/MIT) +// This file may not be copied, modified, or distributed +// except according to those terms. + +pub mod alignment; +pub mod alphabets; +pub mod utils; diff --git a/lib/rust/bio_edit/src/utils/mod.rs b/lib/rust/bio_edit/src/utils/mod.rs new file mode 100644 index 0000000..2e914a0 --- /dev/null +++ b/lib/rust/bio_edit/src/utils/mod.rs @@ -0,0 +1,24 @@ +// Copyright 2014-2016 Johannes Köster. +// Licensed under the MIT license (http://opensource.org/licenses/MIT) +// This file may not be copied, modified, or distributed +// except according to those terms. + +mod text; +pub use self::text::{trim_newline, Text, TextSlice}; + +pub fn scan T>(a: &mut [T], op: F) { + let mut s = a[0]; + for v in a.iter_mut().skip(1) { + s = op(s, *v); + *v = s; + } +} + +pub fn prescan T>(a: &mut [T], neutral: T, op: F) { + let mut s = neutral; + for v in a.iter_mut() { + let t = *v; + *v = s; + s = op(s, t); + } +} diff --git a/lib/rust/bio_edit/src/utils/text.rs b/lib/rust/bio_edit/src/utils/text.rs new file mode 100644 index 0000000..5bea3aa --- /dev/null +++ b/lib/rust/bio_edit/src/utils/text.rs @@ -0,0 +1,11 @@ +/// Type alias for an owned text, i.e. ``Vec``. +pub type Text = Vec; +/// Type alias for a text slice, i.e. ``&[u8]``. +pub type TextSlice<'a> = &'a [u8]; + +/// Remove a trailing newline from the given string in place. +pub fn trim_newline(s: &mut String) { + if s.ends_with('\n') { + s.pop(); + } +} diff --git a/lib/rust/byteseq/Cargo.toml b/lib/rust/byteseq/Cargo.toml index 31e2ef5..3657fa9 100644 --- a/lib/rust/byteseq/Cargo.toml +++ b/lib/rust/byteseq/Cargo.toml @@ -1,5 +1,6 @@ [dependencies] -lazy_static = '1' +[dependencies.lazy_static] +workspace = true [lib] test = false diff --git a/lib/rust/clonotype_assigner/Cargo.toml b/lib/rust/clonotype_assigner/Cargo.toml index 7214e38..1d440b8 100644 --- a/lib/rust/clonotype_assigner/Cargo.toml +++ b/lib/rust/clonotype_assigner/Cargo.toml @@ -1,25 +1,30 @@ [dependencies] -bio = '1' -csv = '1' -rayon = '1' - [dependencies.amino] -workspace = true +path = '../amino' [dependencies.anyhow] workspace = true +[dependencies.bio] +workspace = true + +[dependencies.cr_aggr] +path = '../cr_aggr' + [dependencies.cr_types] path = '../cr_types' -[dependencies.enclone_proto] +[dependencies.csv] workspace = true +[dependencies.enclone_proto] +path = '../enclone_proto' + [dependencies.enclone_ranger] -workspace = true +path = '../enclone_ranger' [dependencies.io_utils] -workspace = true +path = '../io_utils' [dependencies.martian] workspace = true @@ -33,7 +38,7 @@ workspace = true [dependencies.metric] path = '../metric' -[dependencies.perf_stats] +[dependencies.rayon] workspace = true [dependencies.rust-htslib] @@ -46,22 +51,25 @@ workspace = true workspace = true [dependencies.string_utils] -workspace = true +path = '../string_utils' [dependencies.vdj_ann] -workspace = true +path = '../vdj_ann' [dependencies.vdj_ann_ref] -workspace = true +path = '../vdj_ann_ref' [dependencies.vdj_asm_utils] path = '../vdj_asm_utils' +[dependencies.vdj_filter_barcodes] +path = '../vdj_filter_barcodes' + [dependencies.vdj_reference] path = '../vdj_reference' [dependencies.vector_utils] -workspace = true +path = '../vector_utils' [lib] test = false diff --git a/lib/rust/clonotype_assigner/src/assigner.rs b/lib/rust/clonotype_assigner/src/assigner.rs index d3d1237..1b2284c 100644 --- a/lib/rust/clonotype_assigner/src/assigner.rs +++ b/lib/rust/clonotype_assigner/src/assigner.rs @@ -1,15 +1,20 @@ //! Martian stage RUN_ENCLONE +// // Note: this lint needs to be disabled until https://github.com/martian-lang/martian-rust/pull/497 +// is merged and cellranger is updated. +#![allow(clippy::needless_update)] + use anyhow::Result; use bio::alignment::{Alignment, AlignmentOperation}; use enclone_proto::proto_io::read_proto; use enclone_proto::types::EncloneOutputs; -use enclone_ranger::main_enclone::main_enclone_ranger; +use enclone_ranger::main_enclone::{ + main_enclone_ranger, CellrangerOpt, InputSpec, VdjReceptor as EncloneRangerVdjReceptor, +}; use martian::prelude::*; use martian_derive::{make_mro, martian_filetype, MartianStruct}; use martian_filetypes::json_file::JsonFile; use martian_filetypes::FileTypeWrite; -use perf_stats::{elapsed, peak_mem_usage_gb}; use rust_htslib::bam; use rust_htslib::bam::index; use rust_htslib::bam::record::CigarString; @@ -21,7 +26,7 @@ use std::process::Command; use std::time::Instant; use string_utils::TextUtils; use vdj_ann::annotate::ContigAnnotation; -use vdj_asm_utils::filter_log::FilterSwitch; +use vdj_filter_barcodes::filter_log::FilterSwitch; use vdj_reference::VdjReceptor; use vector_utils::next_diff; @@ -132,92 +137,52 @@ pub(crate) fn replace_sam_by_indexed_bam(sam_name: &Path) { // The allowed mem_gb is based on observed mem 3.59 GB for lena 180517. // Note that by using -4, in local mode, this forces this process to use the entire server. // This is not necessarily desirable. -#[make_mro(mem_gb = 5, threads = -4, stage_name = RUN_ENCLONE)] +#[make_mro(mem_gb = 5, vmem_gb = 12, threads = -4, stage_name = RUN_ENCLONE)] impl MartianMain for Assigner { type StageInputs = ClonotypeAssignerStageInputs; type StageOutputs = ClonotypeAssignerStageOutputs; fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { - // Set up logging. - let t0 = Instant::now(); - // Cap number of threads. - // let nthreads = max(4, min(rover.get_threads(), 96)); // NOTE: This could panic in local mode. - let nthreads = min(rover.get_threads(), 96); - - // Call enclone. We instruct it to generate a binary output file, and print nothing. - // Need to bound number of threads used by enclone. - let mut argsx = vec!["enclone".to_string()]; let contig_annotations = args.contig_annotations.as_ref().to_str().unwrap(); - argsx.push(format!( - "{}={}", - match args.receptor { - VdjReceptor::TR => "TCR", - VdjReceptor::TRGD => "TCRGD", - VdjReceptor::IG => "BCR", - }, - contig_annotations.rev_before("/") - )); - let fasta_path = args - .vdj_reference_path - .join("fasta/regions.fa") - .to_str() - .unwrap() - .to_string(); let enclone_output: ProtoBinFile = rover.make_path("enclone_output"); let donor_ref_fa: FaFile = rover.make_path("donor_ref"); let barcode_fate: JsonFile<()> = rover.make_path("barcode_fate"); - argsx.push("PRE=".to_string()); - argsx.push(format!("REF={fasta_path}")); - argsx.push("NOPRINT".to_string()); - argsx.push("CELLRANGER".to_string()); - argsx.push("NOPAGER".to_string()); - argsx.push("FORCE_EXTERNAL".to_string()); - argsx.push(format!("MAX_CORES={nthreads}")); - argsx.push(format!( - "PROTO={}", - enclone_output.as_ref().to_str().unwrap() - )); - argsx.push(format!( - "DONOR_REF_FILE={}", - donor_ref_fa.as_ref().to_str().unwrap() - )); - argsx.push(format!( - "FATE_FILE={}", - barcode_fate.as_ref().to_str().unwrap() - )); - if args.receptor == VdjReceptor::TRGD { - argsx.push("GAMMA_DELTA".to_string()); - } - - // Option to split clonotypes that have 4 chains or more. - // These are most likely false joins due to a shared chain - argsx.push("SPLIT_MAX_CHAINS=4".to_string()); - - let FilterSwitch { - asm_shared_contig: _, - enclone_shared_contig, - enclone_umi, - enclone_multiplet, - } = args.filter_switch; - - // ! because we want the filter to be off when the boolean is false - if !enclone_shared_contig { - argsx.push("NGRAPH_FILTER".to_string()); - } - if !enclone_multiplet { - argsx.extend(["NWEAK_CHAINS", "NFOURSIE_KILL", "NDOUBLET", "NSIG"].map(String::from)); - } + let mut opt = CellrangerOpt { + input: Some(InputSpec::Explicit( + match args.receptor { + VdjReceptor::TR => EncloneRangerVdjReceptor::TR, + VdjReceptor::TRGD => EncloneRangerVdjReceptor::TRGD, + VdjReceptor::IG => EncloneRangerVdjReceptor::IG, + }, + contig_annotations.rev_before("/").to_string(), + )), + refname: args + .vdj_reference_path + .join("fasta/regions.fa") + .to_str() + .unwrap() + .to_string(), + max_cores: Some(min(rover.get_threads(), 96)), + proto: enclone_output.to_str().unwrap().to_string(), + dref_file: donor_ref_fa.to_str().unwrap().to_string(), + fate_file: barcode_fate.to_str().unwrap().to_string(), + // Option to split clonotypes that have 4 chains or more. + // These are most likely false joins due to a shared chain + split_max_chains: 4, + ..Default::default() + }; - if !enclone_umi { - argsx.extend(["NUMI", "NUMI_RATIO"].map(String::from)); - } + args.filter_switch.update_enclone_args(&mut opt.filter); - println!("Invoking enclone:\n{}", argsx.join(" ")); - main_enclone_ranger(&argsx).unwrap(); - println!("used {:.2} seconds up through enclone", elapsed(&t0)); + println!("Invoking enclone:\n{opt:?}"); + main_enclone_ranger(opt).unwrap(); + println!( + "used {:.2} seconds up through enclone", + t0.elapsed().as_secs_f64() + ); // Read back in the enclone output file. let enclone_outs: EncloneOutputs = read_proto(&enclone_output)?; @@ -267,12 +232,6 @@ impl MartianMain for Assigner { raw_cdrs_per_bc_histogram, })?; - println!( - "used {:.2} seconds total, peak mem = {:.2} GB", - elapsed(&t0), - peak_mem_usage_gb() - ); - // Return outputs. Ok(ClonotypeAssignerStageOutputs { summary, diff --git a/lib/rust/clonotype_assigner/src/fill_clonotype_info.rs b/lib/rust/clonotype_assigner/src/fill_clonotype_info.rs index c031b2b..395743a 100644 --- a/lib/rust/clonotype_assigner/src/fill_clonotype_info.rs +++ b/lib/rust/clonotype_assigner/src/fill_clonotype_info.rs @@ -15,7 +15,7 @@ use vdj_reference::VdjRegion; #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct FillClonotypeInfoStageInputs { - pub sample_number: Option, + pub sample_id: Option, pub contig_annotations: JsonFile>, pub enclone_output: Option, } @@ -98,7 +98,7 @@ impl MartianMain for FillClonotypeInfo { let chain = chain_info.chain; // now this is an ExactSubClonotypeChain let clonotype_id = ClonotypeId { id: i + 1, - sample_number: args.sample_number, + sample_id: args.sample_id.as_deref(), }; let fields = FieldsToFill { raw_clonotype_id: clonotype_id.to_string(), diff --git a/lib/rust/clonotype_assigner/src/handle_no_clonotyping.rs b/lib/rust/clonotype_assigner/src/handle_no_clonotyping.rs index 1d65f6d..acdb8ab 100644 --- a/lib/rust/clonotype_assigner/src/handle_no_clonotyping.rs +++ b/lib/rust/clonotype_assigner/src/handle_no_clonotyping.rs @@ -7,10 +7,37 @@ use martian_filetypes::json_file::JsonFile; use serde::{Deserialize, Serialize}; use vdj_ann::annotate::ContigAnnotation; +#[derive(Debug, Clone, Deserialize, MartianStruct)] +pub struct ContigAnnotationSource { + merged_liblevel: Option>>, + post_cell_filtering: Option>>, + post_clonotyping: Option>>, +} + +impl ContigAnnotationSource { + fn get_annotation(self, disable_clonotyping: bool) -> JsonFile> { + match ( + self.merged_liblevel, + self.post_cell_filtering, + self.post_clonotyping, + disable_clonotyping, + ) { + // Cellranger vdj OR Cellranger multi sample-level + (None, Some(_), Some(annot), false) => annot, + // Cellranger vdj denovo mode OR Cellranger multi sample-level with skip-clonotyping + (None, Some(annot), None, true) => annot, + // Cellranger multi library-level + (Some(annot), None, None, true) => annot, + (_, _, _, _) => unreachable!( + "Incompatibe combination of contig annotations and disable_clonotyping boolean!" + ), + } + } +} + #[derive(Debug, Clone, Deserialize, MartianStruct)] pub struct HandleNoClonotypingStageInputs { - asm_contig_json: JsonFile>, - clonotype_contig_json: Option>>, + contigs: ContigAnnotationSource, disable_clonotyping: bool, } @@ -27,12 +54,9 @@ impl MartianMain for HandleNoClonotyping { type StageInputs = HandleNoClonotypingStageInputs; type StageOutputs = HandleNoClonotypingStageOutputs; fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { - assert!(args.disable_clonotyping ^ args.clonotype_contig_json.is_some()); + let src = args.contigs.get_annotation(args.disable_clonotyping); let dest: JsonFile<_> = rover.make_path("all_contig_annotations.json"); - - let src = args.clonotype_contig_json.unwrap_or(args.asm_contig_json); - std::fs::copy(&src, &dest).with_context(|| { format!( "Error: unable to copy {} to {}", diff --git a/lib/rust/clonotype_assigner/src/lib.rs b/lib/rust/clonotype_assigner/src/lib.rs index c7546f0..5c51ef0 100644 --- a/lib/rust/clonotype_assigner/src/lib.rs +++ b/lib/rust/clonotype_assigner/src/lib.rs @@ -49,6 +49,7 @@ pub mod assigner; pub use assigner::Assigner; pub mod fill_clonotype_info; pub mod handle_no_clonotyping; +pub mod run_enclone_aggr; pub mod write_clonotype_outs; pub mod write_concat_ref_outs; pub mod write_consensus_bam; diff --git a/lib/rust/cr_aggr/src/run_enclone_aggr.rs b/lib/rust/clonotype_assigner/src/run_enclone_aggr.rs similarity index 65% rename from lib/rust/cr_aggr/src/run_enclone_aggr.rs rename to lib/rust/clonotype_assigner/src/run_enclone_aggr.rs index c6b6005..6b02e20 100644 --- a/lib/rust/cr_aggr/src/run_enclone_aggr.rs +++ b/lib/rust/clonotype_assigner/src/run_enclone_aggr.rs @@ -1,8 +1,8 @@ //! RunEncloneAggr stage code -use crate::setup_vdj_aggr::{EncloneMetaRow, EncloneProtoMetaFormat}; use anyhow::Result; -use enclone_ranger::main_enclone::main_enclone_ranger; +use cr_aggr::setup_vdj_aggr::{EncloneMetaRow, EncloneProtoMetaFormat}; +use enclone_ranger::main_enclone::{main_enclone_ranger, CellrangerOpt, InputSpec}; use martian::prelude::*; use martian_derive::{make_mro, martian_filetype, MartianStruct}; use martian_filetypes::json_file::JsonFile; @@ -10,6 +10,7 @@ use martian_filetypes::tabular_file::CsvFile; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use vdj_ann::annotate::ContigAnnotation; +use vdj_filter_barcodes::filter_log::FilterSwitch; martian_filetype! {ProtoFile, "pb"} martian_filetype! {FaFile, "fa"} @@ -22,64 +23,62 @@ pub struct RunEncloneAggrStageInputs { enclone_input_csv: CsvFile, enclone_gem_well_meta: EncloneProtoMetaFormat, vdj_reference_path: PathBuf, + filter_switch: FilterSwitch, + mix_donors: bool, } #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct RunEncloneAggrStageOutputs { enclone_output: ProtoFile, donor_ref_fa: FaFile, + barcode_fate: JsonFile<()>, } // This is our stage struct pub struct RunEncloneAggr; -#[make_mro(mem_gb = 9, threads = 4)] +#[make_mro(mem_gb = 16, threads = 4)] impl MartianMain for RunEncloneAggr { type StageInputs = RunEncloneAggrStageInputs; type StageOutputs = RunEncloneAggrStageOutputs; fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { - // Call enclone. We instruct it to generate a proto output file, and print nothing. - // Need to bound number of threads used by enclone. - - let mut argsx = vec!["enclone".to_string()]; - let fasta_path = args.vdj_reference_path.join("fasta/regions.fa"); - let enclone_output: ProtoFile = rover.make_path("enclone_outputs"); let donor_ref_fa: FaFile = rover.make_path("donor_ref"); - argsx.push("PRE=".to_string()); - argsx.push("CELLRANGER".to_string()); - argsx.push(format!( - "META={}", - args.enclone_input_csv.as_ref().to_str().unwrap() - )); - argsx.push(format!("REF={}", fasta_path.to_str().unwrap())); - argsx.push("NOPRINT".to_string()); - argsx.push("NOPAGER".to_string()); - argsx.push("NOPRETTY".to_string()); - argsx.push("FORCE_EXTERNAL".to_string()); // do not test for internal run - argsx.push(format!("MAX_CORES={}", rover.get_threads())); - argsx.push(format!( - "PROTO={}", - enclone_output.as_ref().to_str().unwrap() - )); - argsx.push(format!( - "PROTO_METADATA={}", - args.enclone_gem_well_meta.as_ref().to_str().unwrap() - )); - argsx.push(format!( - "DONOR_REF_FILE={}", - donor_ref_fa.as_ref().to_str().unwrap() - )); - argsx.push(format!("MAX_CORES={}", rover.get_threads())); - - println!("{}", argsx.join(" ")); - main_enclone_ranger(&argsx).unwrap(); + let barcode_fate: JsonFile<()> = rover.make_path("barcode_fate"); + + let mut opt = CellrangerOpt { + input: Some(InputSpec::MetaFile( + args.enclone_input_csv.to_str().unwrap().to_string(), + )), + refname: args + .vdj_reference_path + .join("fasta/regions.fa") + .to_str() + .unwrap() + .to_string(), + max_cores: Some(rover.get_threads()), + proto: enclone_output.to_str().unwrap().to_string(), + proto_metadata: args.enclone_gem_well_meta.to_str().unwrap().to_string(), + dref_file: donor_ref_fa.to_str().unwrap().to_string(), + fate_file: barcode_fate.to_str().unwrap().to_string(), + // Option to split clonotypes that have 4 chains or more. + // These are most likely false joins due to a shared chain + split_max_chains: 4, + mix_donors: args.mix_donors, + ..Default::default() + }; + + args.filter_switch.update_enclone_args(&mut opt.filter); + + println!("Invoking enclone:\n{opt:?}"); + main_enclone_ranger(opt).unwrap(); println!("Done with enclone!"); Ok(RunEncloneAggrStageOutputs { enclone_output, donor_ref_fa, + barcode_fate, }) } } @@ -87,8 +86,8 @@ impl MartianMain for RunEncloneAggr { #[cfg(test)] mod tests { use super::*; - use crate::process_vdj_proto::make_test_library; - use crate::setup_vdj_aggr::{SetupVdjAggr, SetupVdjAggrStageInputs}; + use cr_aggr::process_vdj_proto::make_test_library; + use cr_aggr::setup_vdj_aggr::{SetupVdjAggr, SetupVdjAggrStageInputs}; use enclone_proto::proto_io::read_proto; use martian_filetypes::FileTypeRead; use vdj_reference::VdjReceptor; @@ -119,6 +118,8 @@ mod tests { enclone_input_csv: write_outs.enclone_input_csv, enclone_gem_well_meta: write_outs.enclone_gem_well_meta.clone(), vdj_reference_path: write_outs.vdj_reference_path, + filter_switch: FilterSwitch::default(), + mix_donors: false, }; let tempdir2 = tempfile::tempdir()?; diff --git a/lib/rust/clonotype_assigner/src/write_clonotype_outs.rs b/lib/rust/clonotype_assigner/src/write_clonotype_outs.rs index 9afc085..3a5ad9f 100644 --- a/lib/rust/clonotype_assigner/src/write_clonotype_outs.rs +++ b/lib/rust/clonotype_assigner/src/write_clonotype_outs.rs @@ -1,7 +1,7 @@ //! WriteClonotypeOuts stage code use crate::assigner::ProtoBinFile; -use amino::aa_seq; +use amino::nucleotide_to_aminoacid_sequence; use anyhow::Result; use cr_types::clonotype::ClonotypeId; use enclone_proto::proto_io::read_proto; @@ -29,7 +29,7 @@ pub struct ClonotypesCsvRow { #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct WriteClonotypeOutsStageInputs { - pub sample_number: Option, + pub sample_id: Option, pub receptor: VdjReceptor, pub enclone_output: ProtoBinFile, } @@ -101,7 +101,7 @@ impl MartianMain for WriteClonotypeOuts { cdr3s_aa.push(format!( "{}:{}", chain.chain_type, - str::from_utf8(&aa_seq(cdr3_nt, 0)).unwrap() + str::from_utf8(&nucleotide_to_aminoacid_sequence(cdr3_nt, 0)).unwrap() )); } let (inkt_evidence, mait_evidence) = match args.receptor { @@ -109,8 +109,8 @@ impl MartianMain for WriteClonotypeOuts { let mut inkt_evidences = Vec::new(); let mut mait_evidences = Vec::new(); for ex_cl in &clonotype.exact_clonotypes { - inkt_evidences.push(ex_cl.inkt_evidence.clone()); - mait_evidences.push(ex_cl.mait_evidence.clone()); + inkt_evidences.push(ex_cl.inkt_evidence); + mait_evidences.push(ex_cl.mait_evidence); } ( Some(invariant_evidence_display(&inkt_evidences)), @@ -124,7 +124,7 @@ impl MartianMain for WriteClonotypeOuts { let row = ClonotypesCsvRow { clonotype_id: ClonotypeId { id: i + 1, - sample_number: args.sample_number, + sample_id: args.sample_id.as_deref(), } .to_string(), frequency: clonotype.frequency as usize, diff --git a/lib/rust/clonotype_assigner/src/write_concat_ref_outs.rs b/lib/rust/clonotype_assigner/src/write_concat_ref_outs.rs index 7314b01..eab7c69 100644 --- a/lib/rust/clonotype_assigner/src/write_concat_ref_outs.rs +++ b/lib/rust/clonotype_assigner/src/write_concat_ref_outs.rs @@ -26,7 +26,7 @@ martian_filetype!(FastaFaiFile, "fasta.fai"); #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct WriteConcatRefOutsStageInputs { - pub sample_number: Option, + pub sample_id: Option, pub enclone_output: ProtoBinFile, pub all_contig_annotations_json: JsonFile>, } @@ -44,7 +44,7 @@ pub struct WriteConcatRefOuts; const CONCAT_REF: &str = "concat_ref"; -#[make_mro(mem_gb = 5, threads = 4)] +#[make_mro(mem_gb = 12, threads = 4)] impl MartianMain for WriteConcatRefOuts { type StageInputs = WriteConcatRefOutsStageInputs; type StageOutputs = WriteConcatRefOutsStageOutputs; @@ -80,7 +80,7 @@ impl MartianMain for WriteConcatRefOuts { for (i, x) in enclone_outs.clonotypes.iter().enumerate() { let clonotype_id = ClonotypeId { id: i + 1, - sample_number: args.sample_number, + sample_id: args.sample_id.as_deref(), }; for j in 0..x.chains.len() { let record_name = clonotype_id.concat_ref_name(j + 1); @@ -133,7 +133,7 @@ impl MartianMain for WriteConcatRefOuts { let x = &enclone_outs.clonotypes[i]; let clonotype_id = ClonotypeId { id: i + 1, - sample_number: args.sample_number, + sample_id: args.sample_id.as_deref(), }; for j in 0..x.exact_clonotypes.len() { let barcodes: &Vec = &x.exact_clonotypes[j].cell_barcodes; diff --git a/lib/rust/clonotype_assigner/src/write_consensus_bam.rs b/lib/rust/clonotype_assigner/src/write_consensus_bam.rs index 7ac86e1..a05d870 100644 --- a/lib/rust/clonotype_assigner/src/write_consensus_bam.rs +++ b/lib/rust/clonotype_assigner/src/write_consensus_bam.rs @@ -12,7 +12,6 @@ use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::json_file::JsonFile; use martian_filetypes::LazyFileTypeIO; -use perf_stats::elapsed; use rayon::prelude::*; use rust_htslib::bam; use serde::{Deserialize, Serialize}; @@ -23,7 +22,7 @@ use vdj_asm_utils::bam_utils::add_ref_to_bam_header; #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct WriteConsensusBamStageInputs { - pub sample_number: Option, + pub sample_id: Option, pub enclone_output: ProtoBinFile, pub all_contig_annotations_json: JsonFile>, } @@ -79,7 +78,7 @@ impl MartianMain for WriteConsensusBam { &mut header, &ClonotypeId { id: i + 1, - sample_number: args.sample_number, + sample_id: args.sample_id.as_deref(), } .consensus_name(j + 1), seq.len(), @@ -141,7 +140,10 @@ impl MartianMain for WriteConsensusBam { } } } - println!("used {:.2} seconds building consensus sam", elapsed(&t)); + println!( + "used {:.2} seconds building consensus sam", + t.elapsed().as_secs_f64() + ); // Make the indexed bam. diff --git a/lib/rust/clonotype_assigner/src/write_consensus_txt.rs b/lib/rust/clonotype_assigner/src/write_consensus_txt.rs index a398647..bbe0528 100644 --- a/lib/rust/clonotype_assigner/src/write_consensus_txt.rs +++ b/lib/rust/clonotype_assigner/src/write_consensus_txt.rs @@ -2,7 +2,7 @@ use crate::assigner::ProtoBinFile; use crate::write_concat_ref_outs::{FastaFaiFile, FastaFile}; -use amino::aa_seq; +use amino::nucleotide_to_aminoacid_sequence; use anyhow::Result; use cr_types::clonotype::ClonotypeId; use enclone_proto::proto_io::read_proto; @@ -65,7 +65,7 @@ pub struct ConsensusAnnotationCsvRow { #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct WriteConsensusTxtStageInputs { - pub sample_number: Option, + pub sample_id: Option, pub enclone_output: ProtoBinFile, } @@ -116,7 +116,7 @@ impl MartianMain for WriteConsensusTxt { let clonotype_id = ClonotypeId { id: i + 1, - sample_number: args.sample_number, + sample_id: args.sample_id.as_deref(), }; let row = ConsensusAnnotationCsvRow { clonotype_id: clonotype_id.to_string(), @@ -143,7 +143,7 @@ impl MartianMain for WriteConsensusTxt { cdr2_nt: cdr2_region.as_ref().map(|r| &r.nt_seq).cloned(), fwr3: fwr3_region.as_ref().map(|r| &r.aa_seq).cloned(), fwr3_nt: fwr3_region.as_ref().map(|r| &r.nt_seq).cloned(), - cdr3: stringme(&aa_seq(&cdr3_nt, 0)), + cdr3: stringme(&nucleotide_to_aminoacid_sequence(&cdr3_nt, 0)), cdr3_nt: stringme(&cdr3_nt), fwr4: fwr4_region.as_ref().map(|r| &r.aa_seq).cloned(), fwr4_nt: fwr4_region.as_ref().map(|r| &r.nt_seq).cloned(), @@ -184,7 +184,7 @@ impl MartianMain for WriteConsensusTxt { for (i, clonotype) in enclone_outs.clonotypes.iter().enumerate() { let clonotype_id = ClonotypeId { id: i + 1, - sample_number: args.sample_number, + sample_id: args.sample_id.as_deref(), }; for (j, chain) in clonotype.chains.iter().enumerate() { let record_name = clonotype_id.consensus_name(j + 1); diff --git a/lib/rust/cloud_utils/Cargo.toml b/lib/rust/cloud_utils/Cargo.toml new file mode 100644 index 0000000..91deda2 --- /dev/null +++ b/lib/rust/cloud_utils/Cargo.toml @@ -0,0 +1,13 @@ +[dependencies] +[dependencies.anyhow] +workspace = true + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'cloud_utils' +publish = false +version = '0.1.0' diff --git a/lib/rust/cloud_utils/src/lib.rs b/lib/rust/cloud_utils/src/lib.rs new file mode 100644 index 0000000..792b1d5 --- /dev/null +++ b/lib/rust/cloud_utils/src/lib.rs @@ -0,0 +1,19 @@ +//! +//! Module for supporting pipeline - 10x Cloud Analysis interaction. +//! + +use anyhow::Result; +use std::env; +use std::path::Path; + +pub const CELL_ANNOTATION_HOMEDIR_MSG: &str = "Could not find a 10x cloud token in the default user directory. In order to enable cell annotation, run cellranger cloud auth setup, or please supply a --tenx-cloud-token-path argument."; + +pub fn default_token_path() -> Result { + let homedir = env::var("HOME")?; + let credentials_path = format!("{homedir}/.config/txg/credentials"); + let credentials_path_obj = Path::new(credentials_path.as_str()); + if !credentials_path_obj.exists() { + return Err(anyhow::anyhow!("Default credentials file not found.")); + } + Ok(credentials_path) +} diff --git a/lib/rust/cr_aggr/Cargo.toml b/lib/rust/cr_aggr/Cargo.toml index 787d7e7..18d757c 100644 --- a/lib/rust/cr_aggr/Cargo.toml +++ b/lib/rust/cr_aggr/Cargo.toml @@ -3,10 +3,7 @@ name = 'cr_aggr' test = false [dependencies] -csv = '1' -docopt = '1' path-clean = '1' -thiserror = '1' [dependencies.anyhow] workspace = true @@ -23,12 +20,15 @@ path = '../cr_types' [dependencies.cr_websummary] path = '../cr_websummary' -[dependencies.enclone_proto] +[dependencies.csv] workspace = true -[dependencies.enclone_ranger] +[dependencies.docopt] workspace = true +[dependencies.enclone_proto] +path = '../enclone_proto' + [dependencies.itertools] workspace = true @@ -56,11 +56,14 @@ workspace = true [dependencies.serde_json] workspace = true +[dependencies.thiserror] +workspace = true + [dependencies.umi] path = '../umi' [dependencies.vdj_ann] -workspace = true +path = '../vdj_ann' [dependencies.vdj_asm_asm] default-features = false diff --git a/lib/rust/cr_aggr/src/bin/cr_aggr.rs b/lib/rust/cr_aggr/src/bin/cr_aggr.rs index 57fe789..07196ad 100644 --- a/lib/rust/cr_aggr/src/bin/cr_aggr.rs +++ b/lib/rust/cr_aggr/src/bin/cr_aggr.rs @@ -81,7 +81,6 @@ fn main() -> Result<()> { cr_aggr::merge_molecules::MergeMolecules, cr_aggr::process_vdj_proto::ProcessVdjProto, cr_aggr::setup_vdj_aggr::SetupVdjAggr, - cr_aggr::run_enclone_aggr::RunEncloneAggr, cr_aggr::parse_aggr_csv::ParseAggrCsv, cr_aggr::write_contig_proto::WriteContigProto, cr_aggr::match_vdj_outs::MatchVdjOuts, diff --git a/lib/rust/cr_aggr/src/lib.rs b/lib/rust/cr_aggr/src/lib.rs index ed218f8..4102eb5 100644 --- a/lib/rust/cr_aggr/src/lib.rs +++ b/lib/rust/cr_aggr/src/lib.rs @@ -7,7 +7,6 @@ pub mod merge_molecules; pub mod create_antigen_clonotype_clustermap; pub mod parse_aggr_csv; pub mod process_vdj_proto; -pub mod run_enclone_aggr; pub mod setup_vdj_aggr; pub mod websummary; pub mod write_aggr_ann; diff --git a/lib/rust/cr_aggr/src/match_vdj_outs.rs b/lib/rust/cr_aggr/src/match_vdj_outs.rs index c8edef9..c906745 100644 --- a/lib/rust/cr_aggr/src/match_vdj_outs.rs +++ b/lib/rust/cr_aggr/src/match_vdj_outs.rs @@ -1,6 +1,6 @@ //! MatchVdjOuts stage code -use crate::run_enclone_aggr::FaFile; +use crate::write_contig_proto::ProtoFile; use anyhow::Result; use martian::prelude::*; use martian_derive::{make_mro, martian_filetype, MartianStruct}; @@ -10,8 +10,10 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; use vdj_reference::VdjReceptor; +martian_filetype!(FaFile, "fa"); martian_filetype!(FastaFile, "fasta"); martian_filetype!(VdjLoupeFile, "vloupe"); +martian_filetype! {HtmlFile, "html"} #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct VdjAggrResults { @@ -23,6 +25,8 @@ pub struct VdjAggrResults { consensus_annotations_csv: CsvFile<()>, web_summary_data: JsonFile<()>, vloupe: Option, + filter_summary: HtmlFile, + enclone_output: ProtoFile, } #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] @@ -48,6 +52,8 @@ pub struct MatchVdjOutsStageInputs { antigen_analysis: Vec>, antigen_aggr_web_summary_data_in: Vec>>, airr_rearrangements: Vec>, + filter_summaries: Vec, + enclone_outputs: Vec, } impl MatchVdjOutsStageInputs { @@ -61,6 +67,8 @@ impl MatchVdjOutsStageInputs { consensus_annotations_csv: self.consensus_annotations_csvs[i].clone(), web_summary_data: self.web_summary_data[i].clone(), vloupe: self.vloupes.as_ref().map(|v| v[i].clone()), + filter_summary: self.filter_summaries[i].clone(), + enclone_output: self.enclone_outputs[i].clone(), }) } } diff --git a/lib/rust/cr_aggr/src/merge_molecules.rs b/lib/rust/cr_aggr/src/merge_molecules.rs index 77378b1..7e12cb5 100644 --- a/lib/rust/cr_aggr/src/merge_molecules.rs +++ b/lib/rust/cr_aggr/src/merge_molecules.rs @@ -9,7 +9,7 @@ use cr_types::{aggr, LibraryInfo}; use itertools::Itertools; use martian::prelude::*; use martian_derive::{make_mro, martian_filetype, MartianStruct}; -use metric::JsonReporter; +use metric::{JsonReporter, TxHashSet}; use ndarray::s; use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -72,10 +72,6 @@ impl MartianStage for MergeMolecules { // In the worst case (when no barcodes are trimmed) that's the sum of // the length of all barcodes. // set up a lower bound on the allocation - // TODO Even thought memory consumption should be dominated by merged barcodes - // length there are extra allocations happening (probably in HDF5) which are leading to - // increased memory consumption. Failed analysis worked with ~2GB, bumping minimum to - // 3 GB to play safe. // From CELLRANGER-5358: analysing QA runs for aggr show that 2.1x the barcode mem // is sufficient for the join stage. let bc_mem_sum: usize = bc_mem.iter().sum(); @@ -265,15 +261,14 @@ impl MartianStage for MergeMolecules { lib_idx_maps.push(lib_idx_map); metrics.push(out_metrics); - MoleculeInfoReader::read_gem_groups(&in_h5)? - .into_iter() - .unique() - .for_each(|x| { - gem_group_barcode_ranges.insert( - gg_map[x as usize].to_string(), - vec![barcode_idx_offset as u64, barcode_idx_end as u64], - ); - }); + let unique_gem_groups: TxHashSet<_> = + MoleculeInfoReader::iter_gem_groups(&in_h5)?.collect::>()?; + for x in unique_gem_groups { + gem_group_barcode_ranges.insert( + gg_map[x as usize].to_string(), + vec![barcode_idx_offset as u64, barcode_idx_end as u64], + ); + } gg_maps.push(gg_map); diff --git a/lib/rust/cr_aggr/src/parse_aggr_csv.rs b/lib/rust/cr_aggr/src/parse_aggr_csv.rs index 7857738..fa6bbdd 100644 --- a/lib/rust/cr_aggr/src/parse_aggr_csv.rs +++ b/lib/rust/cr_aggr/src/parse_aggr_csv.rs @@ -147,8 +147,8 @@ fn process_multi_libraries( disable_vdj_aggr = false; // Check if meta contains origin and donor let mut vdj_meta = mlib.meta.clone(); - let donor = vdj_meta.remove(&DONOR_HEADER.to_string()); - let origin = vdj_meta.remove(&ORIGIN_HEADER.to_string()); + let donor = vdj_meta.remove(DONOR_HEADER); + let origin = vdj_meta.remove(ORIGIN_HEADER); if donor.is_none() || origin.is_none() { return Err(ParseAggrCsvErrors::ErrorParsingMultiVdjSample { sample_id: mlib.sample_id.clone(), @@ -183,8 +183,8 @@ fn process_multi_libraries( disable_vdj_aggr = false; // Check if meta contains origin and donor let mut vdj_meta = mlib.meta.clone(); - let donor = vdj_meta.remove(&DONOR_HEADER.to_string()); - let origin = vdj_meta.remove(&ORIGIN_HEADER.to_string()); + let donor = vdj_meta.remove(DONOR_HEADER); + let origin = vdj_meta.remove(ORIGIN_HEADER); if donor.is_none() || origin.is_none() { return Err(ParseAggrCsvErrors::ErrorParsingMultiVdjSample { sample_id: mlib.sample_id.clone(), @@ -758,6 +758,7 @@ impl MartianMain for ParseAggrCsv { #[cfg(test)] mod tests { use super::*; + use insta::{assert_debug_snapshot, assert_json_snapshot, assert_snapshot}; use martian_filetypes::json_file::JsonFile; use martian_filetypes::tabular_file::CsvFile; use martian_filetypes::FileTypeRead; @@ -776,7 +777,7 @@ mod tests { fn test_roundtrip_and_representation(input: &str) -> Result<()> { let input_file = JsonFile::from(input); let sample_defs: Vec = input_file.read()?; - insta::assert_debug_snapshot!(sample_defs); + assert_debug_snapshot!(sample_defs); let out = serde_json::to_string(&sample_defs)?; assert_eq!( serde_json::from_str::(&out)?, @@ -1726,7 +1727,7 @@ mod tests { // Settings for insta to force sorting of maps let mut settings = insta::Settings::clone_current(); settings.set_sort_maps(true); - settings.bind(|| insta::assert_json_snapshot!(parser.build_sample_def(row).unwrap())); + settings.bind(|| assert_json_snapshot!(parser.build_sample_def(row).unwrap())); } #[test] @@ -1830,7 +1831,7 @@ mod tests { #[test] fn test_text_field_validation() { - insta::assert_display_snapshot!(validate_text_value("Hello>world").unwrap_err()); + assert_snapshot!(validate_text_value("Hello>world").unwrap_err()); assert_eq!(validate_text_value("hEllO_123").unwrap(), "hEllO_123"); assert!(validate_text_value("hE`llO{}123").is_err()); } diff --git a/lib/rust/cr_aggr/src/process_vdj_proto.rs b/lib/rust/cr_aggr/src/process_vdj_proto.rs index 9e95a3b..422896e 100644 --- a/lib/rust/cr_aggr/src/process_vdj_proto.rs +++ b/lib/rust/cr_aggr/src/process_vdj_proto.rs @@ -171,11 +171,10 @@ impl MartianMain for ProcessVdjProto { } } -#[cfg(test)] pub fn make_test_library(key: &'static str) -> VdjAggrCsvLibrary { VdjAggrCsvLibrary { library_id: key.into(), - vdj_contig_info: format!("test_resources/vdj_contig_info/{key}.pb").into(), + vdj_contig_info: format!("../cr_aggr/test_resources/vdj_contig_info/{key}.pb").into(), donor: "Donor".into(), origin: "Origin".into(), meta: HashMap::new(), @@ -187,6 +186,7 @@ mod tests { use super::*; use dui_tests::stage_test::StageFailTest; use dui_tests::{stage_fail_dui_test, DuiTest}; + use insta::assert_yaml_snapshot; #[test] fn test_conflicting_reference() -> Result<()> { @@ -247,7 +247,7 @@ mod tests { count_gem_well_map: Some(count_gem_well_map), }; let outs = ProcessVdjProto.test_run_tmpdir(args)?; - insta::assert_yaml_snapshot!(&outs); + assert_yaml_snapshot!(&outs); Ok(()) } @@ -262,7 +262,7 @@ mod tests { count_gem_well_map: None, }; let outs = ProcessVdjProto.test_run_tmpdir(args)?; - insta::assert_yaml_snapshot!(&outs); + assert_yaml_snapshot!(&outs); Ok(()) } } diff --git a/lib/rust/cr_aggr/src/setup_vdj_aggr.rs b/lib/rust/cr_aggr/src/setup_vdj_aggr.rs index 348e269..4720edc 100644 --- a/lib/rust/cr_aggr/src/setup_vdj_aggr.rs +++ b/lib/rust/cr_aggr/src/setup_vdj_aggr.rs @@ -218,6 +218,7 @@ impl MartianStage for SetupVdjAggr { mod tests { use super::*; use crate::process_vdj_proto::make_test_library; + use insta::assert_yaml_snapshot; use martian_filetypes::FileTypeRead; use pretty_assertions::assert_eq; @@ -370,7 +371,7 @@ mod tests { let mut settings = insta::Settings::clone_current(); settings.set_sort_maps(true); settings.bind(|| { - insta::assert_yaml_snapshot!(&metadata); + assert_yaml_snapshot!(&metadata); }); Ok(()) diff --git a/lib/rust/cr_aggr/src/websummary/annotation_card.rs b/lib/rust/cr_aggr/src/websummary/annotation_card.rs index 7369b90..5fe1e01 100644 --- a/lib/rust/cr_aggr/src/websummary/annotation_card.rs +++ b/lib/rust/cr_aggr/src/websummary/annotation_card.rs @@ -95,7 +95,11 @@ impl From for CardWithMetric { } CardWithMetric { - table: GenericTable { header: None, rows }, + table: GenericTable { + header: None, + rows, + grouping_header: None, + }, help: TitleWithTermDesc { title: ANNOTATION_TABLE_TITLE.into(), data: term_descs, @@ -125,11 +129,11 @@ mod tests { "rows": [ [ "Cells With Productive V-J Spanning Pair", - "66.67%" + "66.7%" ], [ "Cells With Productive V-J Spanning (TRA, TRB) Pair", - "66.67%" + "66.7%" ] ] }, @@ -176,15 +180,15 @@ mod tests { "rows": [ [ "Cells With Productive V-J Spanning Pair", - "66.67%" + "66.7%" ], [ "Cells With Productive V-J Spanning (IGK, IGH) Pair", - "50.00%" + "50.0%" ], [ "Cells With Productive V-J Spanning (IGL, IGH) Pair", - "16.67%" + "16.7%" ] ] }, diff --git a/lib/rust/cr_aggr/src/websummary/cdr3_table.rs b/lib/rust/cr_aggr/src/websummary/cdr3_table.rs index 9f438b4..4f3c094 100644 --- a/lib/rust/cr_aggr/src/websummary/cdr3_table.rs +++ b/lib/rust/cr_aggr/src/websummary/cdr3_table.rs @@ -54,6 +54,7 @@ fn to_named_table(rows: Vec, category: &str) -> NamedTable "Total Number of Cells".into(), ]), rows: rows.into_iter().map(Into::into).collect(), + grouping_header: None, }, } } diff --git a/lib/rust/cr_aggr/src/websummary/cells_card.rs b/lib/rust/cr_aggr/src/websummary/cells_card.rs index 22d7285..4212694 100644 --- a/lib/rust/cr_aggr/src/websummary/cells_card.rs +++ b/lib/rust/cr_aggr/src/websummary/cells_card.rs @@ -23,6 +23,7 @@ impl From for CardWithTable { "Diversity".into(), ]), rows: src.0.into_iter().map(Into::into).collect(), + grouping_header: None, }; let help = TitleWithHelp { title: CARD_TITLE.into(), diff --git a/lib/rust/cr_aggr/src/websummary/clonotype_hist.rs b/lib/rust/cr_aggr/src/websummary/clonotype_hist.rs index 25b5976..adfad05 100644 --- a/lib/rust/cr_aggr/src/websummary/clonotype_hist.rs +++ b/lib/rust/cr_aggr/src/websummary/clonotype_hist.rs @@ -1,5 +1,4 @@ use crate::websummary::{ChartWithHelp, PlotlyChart, TitleWithHelp}; -use plotly::common::Title; use plotly::layout::{Axis, AxisType, BarMode, HoverMode, Margin}; use plotly::{Bar, Layout}; use serde::Serialize; @@ -22,12 +21,8 @@ impl From for ChartWithHelp { .show_legend(true) .bar_mode(BarMode::Stack) .hover_mode(HoverMode::Closest) - .x_axis( - Axis::new() - .type_(AxisType::Category) - .title(Title::new(XLABEL)), - ) - .y_axis(Axis::new().title(Title::new(YLABEL)).tick_format(",.2%")) + .x_axis(Axis::new().type_(AxisType::Category).title(XLABEL)) + .y_axis(Axis::new().title(YLABEL).tick_format(",.2%")) .margin(Margin::new().left(60).right(40).top(25)); let ids = hist.ids; diff --git a/lib/rust/cr_aggr/src/websummary/clonotype_table.rs b/lib/rust/cr_aggr/src/websummary/clonotype_table.rs index fed56bd..7de5e9f 100644 --- a/lib/rust/cr_aggr/src/websummary/clonotype_table.rs +++ b/lib/rust/cr_aggr/src/websummary/clonotype_table.rs @@ -40,7 +40,7 @@ mod tests { "3", "IGH:CAVSDLEPNSSASKIIF
IGK:CASSFSTCSANYGYTF", "4", - "4.40%" + "4.4%" ]"#, ); } @@ -79,13 +79,13 @@ mod tests { "1", "IGH:CASSFSTCSANYGYTF", "43", - "47.25%" + "47.3%" ], [ "3", "IGH:CAVSDLEPNSSASKIIF
IGK:CASSFSTCSANYGYTF", "4", - "4.40%" + "4.4%" ] ] }, diff --git a/lib/rust/cr_aggr/src/websummary/mod.rs b/lib/rust/cr_aggr/src/websummary/mod.rs index 57b09f3..19c66eb 100644 --- a/lib/rust/cr_aggr/src/websummary/mod.rs +++ b/lib/rust/cr_aggr/src/websummary/mod.rs @@ -34,6 +34,7 @@ impl From for GenericTable { TableRow::two_col("Number of Donors", info.num_donors), TableRow::two_col("Number of Origins", info.num_origins), ], + grouping_header: None, } } } @@ -253,8 +254,8 @@ mod tests { fn test_pretty_metric() { assert_eq!(PrettyMetric::integer(100).0, "100"); assert_eq!(PrettyMetric::integer(1000).0, "1,000"); - assert_eq!(PrettyMetric::percent(0.10).0, "10.00%"); - assert_eq!(PrettyMetric::percent(0.114567).0, "11.46%"); + assert_eq!(PrettyMetric::percent(0.10).0, "10.0%"); + assert_eq!(PrettyMetric::percent(0.114567).0, "11.5%"); assert_eq!(PrettyMetric::decimal(0.114567).0, "0.11"); assert_eq!(PrettyMetric::decimal(11.4567).0, "11.46"); assert_eq!(PrettyMetric::decimal(10011.4567).0, "10,011.46"); diff --git a/lib/rust/cr_aggr/src/write_contig_proto.rs b/lib/rust/cr_aggr/src/write_contig_proto.rs index 3805831..8d9ae8a 100644 --- a/lib/rust/cr_aggr/src/write_contig_proto.rs +++ b/lib/rust/cr_aggr/src/write_contig_proto.rs @@ -1,7 +1,7 @@ //! WriteContigProto stage code use anyhow::Result; -use cr_types::MetricsFile; +use cr_types::{BarcodeMultiplexingType, CellLevel, MetricsFile, ReadLevel}; use martian::prelude::*; use martian_derive::{make_mro, martian_filetype, MartianStruct}; use martian_filetypes::json_file::JsonFile; @@ -28,6 +28,7 @@ pub struct WriteContigProtoStageInputs { sample_desc: String, multi_config_sha: Option, barcode_brief: BarcodeDataBriefFile, + multiplexing_method: Option, } #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] @@ -48,6 +49,16 @@ impl MartianMain for WriteContigProto { let reference = VdjReferenceRaw::new(&args.vdj_reference_path)?; let cell_barcodes = args.cell_barcodes.read()?; + let multiplexing_method = match args.multiplexing_method { + None => vdj_proto::types::MultiplexingMethod::None, + Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::OH)) => { + vdj_proto::types::MultiplexingMethod::Ocm + } + Some(BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag)) => { + vdj_proto::types::MultiplexingMethod::Hashtag + } + Some(_) => panic!("Unsupported Vdj multiplexing method!"), + }; let metadata = VdjMetadata { reference_fasta_hash: reference.fasta_hash(), pipeline_version: rover.pipelines_version(), @@ -58,6 +69,7 @@ impl MartianMain for WriteContigProto { sample_desc: args.sample_desc, multi_config_sha: args.multi_config_sha.unwrap_or_default(), protobuf_version: String::from(PROTOBUF_VERSION), + multiplexing_method: multiplexing_method.into(), }; let metrics = MetricsSummary::from_metrics_json(&args.metrics_summary_json)?; @@ -122,6 +134,7 @@ mod tests { multi_config_sha: None, metrics_summary_json, barcode_brief: barcode_data_brief_file, + multiplexing_method: None, }; let outs = WriteContigProto.test_run(&dir, args)?; diff --git a/lib/rust/cr_aggr/src/write_ws_json.rs b/lib/rust/cr_aggr/src/write_ws_json.rs index 8203778..647d50b 100644 --- a/lib/rust/cr_aggr/src/write_ws_json.rs +++ b/lib/rust/cr_aggr/src/write_ws_json.rs @@ -171,7 +171,7 @@ impl MartianMain for WriteWsJson { .into_iter() .take(TOP_N) .map(|r| VdjAggrClonotypeRow { - id: r.clonotype_id.parse::().unwrap().id, + id: ClonotypeId::parse(&r.clonotype_id).unwrap().id, cdr3_aas: r.cdr3s_aa.split(';').map(Into::into).collect(), num_cells: r.frequency, proportion: Percent::Float(r.proportion), diff --git a/lib/rust/cr_ana/Cargo.toml b/lib/rust/cr_ana/Cargo.toml index 6ae24e6..0eda5dd 100644 --- a/lib/rust/cr_ana/Cargo.toml +++ b/lib/rust/cr_ana/Cargo.toml @@ -3,13 +3,7 @@ name = 'cr_ana' test = false [dependencies] -itertools = '0.10' -log = '0.4' -ndarray = '0.15' -ndarray-stats = '0.5' noisy_float = '0.2' -num-traits = '0.2' -rayon = '1' [dependencies.anyhow] workspace = true @@ -19,49 +13,57 @@ branch = 'main' git = 'https://github.com/10XGenomics/scan-rs' [dependencies.clap] -default-features = false -features = ['std', 'derive'] -version = '4' +workspace = true [dependencies.cr_types] path = '../cr_types' [dependencies.diff-exp] -branch = 'main' -git = 'https://github.com/10XGenomics/scan-rs' +workspace = true [dependencies.hclust] -branch = 'main' -git = 'https://github.com/10XGenomics/scan-rs' +workspace = true [dependencies.hdf5] -branch = 'conda_nov2021' -features = ['conda'] -git = 'https://github.com/10XGenomics/hdf5-rust.git' +workspace = true [dependencies.hdf5-io] branch = 'main' git = 'https://github.com/10XGenomics/scan-rs' +[dependencies.itertools] +workspace = true + [dependencies.leiden] branch = 'main' git = 'https://github.com/10XGenomics/scan-rs' +[dependencies.log] +workspace = true + [dependencies.martian] -branch = 'master' -git = 'https://github.com/martian-lang/martian-rust' +workspace = true [dependencies.martian-derive] -branch = 'master' -git = 'https://github.com/martian-lang/martian-rust' +workspace = true [dependencies.martian-filetypes] -branch = 'master' -git = 'https://github.com/martian-lang/martian-rust' +workspace = true + +[dependencies.ndarray] +workspace = true [dependencies.ndarray-npy] -default-features = false -version = '0.8' +workspace = true + +[dependencies.ndarray-stats] +workspace = true + +[dependencies.num-traits] +workspace = true + +[dependencies.rayon] +workspace = true [dependencies.scan-rs] branch = 'main' @@ -72,17 +74,13 @@ branch = 'main' git = 'https://github.com/10XGenomics/scan-rs' [dependencies.serde] -features = ['derive'] -version = '1' +workspace = true [dependencies.sprs] -default-features = false -features = ['multi_thread'] -version = '0.11' +workspace = true [dependencies.sqz] -branch = 'main' -git = 'https://github.com/10XGenomics/scan-rs' +workspace = true [dependencies.umap-rs] branch = 'main' diff --git a/lib/rust/cr_ana/src/bin/cr_ana.rs b/lib/rust/cr_ana/src/bin/cr_ana.rs index ee22555..0026980 100644 --- a/lib/rust/cr_ana/src/bin/cr_ana.rs +++ b/lib/rust/cr_ana/src/bin/cr_ana.rs @@ -73,7 +73,7 @@ fn main() -> Result<()> { cr_ana::stages::hierarchical_clustering::HierarchicalClusteringStage, cr_ana::stages::pca::PcaStage, cr_ana::stages::pca2::Pca2Stage, - cr_ana::stages::tsne::TsneStage, + cr_ana::stages::tsne::RunTsne, cr_ana::stages::umap::UmapStage, ]; diff --git a/lib/rust/cr_ana/src/io/h5.rs b/lib/rust/cr_ana/src/io/h5.rs index d29b8ec..d076df8 100644 --- a/lib/rust/cr_ana/src/io/h5.rs +++ b/lib/rust/cr_ana/src/io/h5.rs @@ -10,7 +10,6 @@ use itertools::FoldWhile::{Continue, Done}; use itertools::Itertools; use ndarray::{s, Array2}; use std::collections::BTreeMap; -use std::path::Path; const VERSION_DS: &str = "version"; const VERSION: i64 = 2; @@ -27,13 +26,6 @@ pub(crate) fn make_fixed_ascii32(s: &str) -> Result { Ok(FA32::from_ascii(s)?) } -pub(crate) fn matrix_nnz(matrix: &Path) -> Result { - Ok(hdf5::File::open(matrix)? - .group("matrix")? - .dataset("data")? - .size()) -} - pub(crate) mod matrix { pub(crate) const GROUP: &str = "matrix"; pub(crate) const SHAPE: &str = "shape"; @@ -41,18 +33,16 @@ pub(crate) mod matrix { pub(crate) const FEATURE_TYPE: &str = "feature_type"; } -pub(crate) fn matrix_shape(matrix: impl AsRef) -> Result<(isize, isize)> { - let arr = hdf5::File::open(&matrix)? - .group(matrix::GROUP)? - .dataset(matrix::SHAPE)? - .read_1d::()?; - Ok((arr[0], arr[1])) +/// Return (num_features, num_barcodes, nnz). +pub(crate) fn matrix_shape(matrix: &H5File) -> Result<(isize, isize, isize)> { + let matrix = hdf5::File::open(matrix)?.group(matrix::GROUP)?; + let shape = matrix.dataset(matrix::SHAPE)?.read_1d::()?; + let nnz = matrix.dataset("data")?.size() as isize; + Ok((shape[0], shape[1], nnz)) } -pub(crate) fn matrix_feature_types( - matrix: impl AsRef, -) -> Result> { - let dataset = hdf5::File::open(&matrix)? +pub(crate) fn matrix_feature_types(matrix: &H5File) -> Result> { + let dataset = hdf5::File::open(matrix)? .group(matrix::GROUP)? .group(matrix::FEATURE_GROUP)? .dataset(matrix::FEATURE_TYPE)?; @@ -72,8 +62,15 @@ pub(crate) fn matrix_feature_types( } /// Estimate the memory (GiB) required to load a matrix from the number of non-zero entries (NNZ). -pub(crate) fn estimate_mem_gib_from_nnz(matrix: &Path) -> Result { - Ok(20e-9 * matrix_nnz(matrix)? as f64) +pub(crate) fn estimate_mem_gib_from_nnz(matrix: &H5File) -> Result { + let (_num_features, _num_cells, nnz) = matrix_shape(matrix)?; + Ok(20e-9 * nnz as f64) +} + +/// Estimate the memory (GiB) required to store the PCA outputs. +pub(crate) fn estimate_mem_gib_for_pca_outs(matrix: &H5File, num_pcs: usize) -> Result { + let (num_features, num_cells, _nnz) = matrix_shape(matrix)?; + Ok(20e-9 * ((num_features + num_cells) * num_pcs as isize) as f64) } pub(crate) mod pca { @@ -106,11 +103,11 @@ pub(crate) struct PcaMatrixShape { } pub(crate) fn load_transformed_pca( - pca_h5: impl AsRef, + pca_h5: &H5File, feature_type: FeatureType, input_pcs: Option, ) -> Result<(hdf5::Group, PcaMatrixShape)> { - let file = hdf5::File::open(&pca_h5)?; + let file = hdf5::File::open(pca_h5)?; let group = file.group(pca::GROUP)?; let n_components = feature_group(group, feature_type)?; let sh = n_components.dataset(pca::MATRIX)?.shape(); @@ -127,7 +124,7 @@ pub(crate) fn load_transformed_pca( } pub(crate) fn load_transformed_pca_matrix( - pca_h5: impl AsRef, + pca_h5: &H5File, feature_type: FeatureType, input_pcs: Option, ) -> Result> { diff --git a/lib/rust/cr_ana/src/stage_testing.rs b/lib/rust/cr_ana/src/stage_testing.rs index 10b1b5d..97930ef 100644 --- a/lib/rust/cr_ana/src/stage_testing.rs +++ b/lib/rust/cr_ana/src/stage_testing.rs @@ -2,7 +2,7 @@ use anyhow::Result; use martian::prelude::*; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; /// Create a directory within the rover, run the given stage in /// that directory and return the stage outputs @@ -23,12 +23,6 @@ where Ok(outs) } -/// A trait to copy files within self to the specified folder and -/// return `Self` containing the updated paths. -pub trait CopyInto: Sized { - fn copy_into(self, folder: &Path) -> Result; -} - /* /// A trait useful for setting up a test for a stage from a ground truth pipestance. diff --git a/lib/rust/cr_ana/src/stages/diff_exp_stage.rs b/lib/rust/cr_ana/src/stages/diff_exp_stage.rs index 50805fe..e5811b9 100644 --- a/lib/rust/cr_ana/src/stages/diff_exp_stage.rs +++ b/lib/rust/cr_ana/src/stages/diff_exp_stage.rs @@ -77,7 +77,7 @@ pub struct DiffExpChunkOutputs { pub struct DiffExpStage; -#[make_mro(stage_name = RUN_DIFFERENTIAL_EXPRESSION_NG, volatile = strict)] +#[make_mro(stage_name = RUN_DIFFERENTIAL_EXPRESSION_NG, mem_gb = 2, volatile = strict)] impl MartianStage for DiffExpStage { type StageInputs = DiffExpStageInputs; type StageOutputs = DiffExpStageOutputs; @@ -121,7 +121,7 @@ impl MartianStage for DiffExpStage { rover: MartianRover, ) -> Result { rayon::ThreadPoolBuilder::new() - .num_threads(1) + .num_threads(rover.get_threads()) .build_global()?; let clusterings: HashMap<_, _> = h5::load_clusterings(&args.clustering_h5, args.is_antibody_only)? @@ -173,7 +173,7 @@ impl MartianStage for DiffExpStage { rover: MartianRover, ) -> Result { rayon::ThreadPoolBuilder::new() - .num_threads(1) + .num_threads(rover.get_threads()) .build_global()?; let retained = if args.is_antibody_only { Some(FeatureType::Barcode(FeatureBarcodeType::Antibody).to_string()) diff --git a/lib/rust/cr_ana/src/stages/graph_clustering.rs b/lib/rust/cr_ana/src/stages/graph_clustering.rs index 056f76e..3bf244d 100644 --- a/lib/rust/cr_ana/src/stages/graph_clustering.rs +++ b/lib/rust/cr_ana/src/stages/graph_clustering.rs @@ -83,7 +83,7 @@ pub struct GraphClusteringChunkInputs { pub struct GraphClusteringStage; -#[make_mro(stage_name = RUN_GRAPH_CLUSTERING_NG, volatile = strict)] +#[make_mro(stage_name = RUN_GRAPH_CLUSTERING, volatile = strict)] impl MartianStage for GraphClusteringStage { type StageInputs = GraphClusteringStageInputs; type StageOutputs = GraphClusteringStageOutputs; diff --git a/lib/rust/cr_ana/src/stages/hierarchical_clustering.rs b/lib/rust/cr_ana/src/stages/hierarchical_clustering.rs index e7f705c..9b3f3a2 100644 --- a/lib/rust/cr_ana/src/stages/hierarchical_clustering.rs +++ b/lib/rust/cr_ana/src/stages/hierarchical_clustering.rs @@ -53,7 +53,7 @@ impl MartianStage for HierarchicalClusteringStage { args: Self::StageInputs, _rover: MartianRover, ) -> Result> { - let mem_gib = (2.0 + h5::estimate_mem_gib_from_nnz(&args.matrix_h5)?.ceil()) as isize; + let mem_gib = (4.0 + h5::estimate_mem_gib_from_nnz(&args.matrix_h5)?.ceil()) as isize; let feature_types = h5::matrix_feature_types(&args.matrix_h5)?; Ok(ACTIVE_FEATURE_TYPES diff --git a/lib/rust/cr_ana/src/stages/pca.rs b/lib/rust/cr_ana/src/stages/pca.rs index b9798a6..eff7608 100644 --- a/lib/rust/cr_ana/src/stages/pca.rs +++ b/lib/rust/cr_ana/src/stages/pca.rs @@ -57,7 +57,11 @@ impl MartianStage for PcaStage { args: Self::StageInputs, _rover: MartianRover, ) -> Result> { - let mem_gib = 3 + h5::estimate_mem_gib_from_nnz(&args.matrix_h5)?.ceil() as isize; + let num_pcs = args.num_principal_comps.unwrap_or(PCA_COMPONENTS); + let mem_gib = 3 + + (h5::estimate_mem_gib_from_nnz(&args.matrix_h5)?.ceil() + + h5::estimate_mem_gib_for_pca_outs(&args.matrix_h5, num_pcs)?.ceil()) + as isize; let pca_map = args.pca_map.unwrap_or_default(); Ok(h5::matrix_feature_types(&args.matrix_h5)? @@ -70,7 +74,7 @@ impl MartianStage for PcaStage { .map(|(feature_type, _)| { ( Self::ChunkInputs { feature_type }, - Resource::with_mem_gb(mem_gib).threads(4), + Resource::with_mem_gb(mem_gib).threads(1), ) }) .collect()) @@ -83,7 +87,7 @@ impl MartianStage for PcaStage { rover: MartianRover, ) -> Result { rayon::ThreadPoolBuilder::new() - .num_threads(1) + .num_threads(rover.get_threads()) .build_global()?; let retained = Some(chunk_args.feature_type.to_string()); let FBM { diff --git a/lib/rust/cr_ana/src/stages/pca2.rs b/lib/rust/cr_ana/src/stages/pca2.rs index b664488..091d786 100644 --- a/lib/rust/cr_ana/src/stages/pca2.rs +++ b/lib/rust/cr_ana/src/stages/pca2.rs @@ -43,11 +43,11 @@ impl MartianStage for Pca2Stage { args: Self::StageInputs, _rover: MartianRover, ) -> Result> { - let nnz = h5::matrix_nnz(&args.matrix_h5)?; + let (num_features, num_cells, nnz) = h5::matrix_shape(&args.matrix_h5)?; let mem_gib = 10 + 72 * nnz / 1024 / 1024 / 1024; - println!("nnz={nnz},mem_gib={mem_gib}"); + println!("num_features={num_features},num_cells={num_cells},nnz={nnz},mem_gib={mem_gib}"); Ok(StageDef::with_join_resource( - Resource::with_mem_gb(mem_gib as isize).threads(4), + Resource::with_mem_gb(mem_gib).threads(4), )) } diff --git a/lib/rust/cr_ana/src/stages/tsne.rs b/lib/rust/cr_ana/src/stages/tsne.rs index 8ab4752..edabe05 100644 --- a/lib/rust/cr_ana/src/stages/tsne.rs +++ b/lib/rust/cr_ana/src/stages/tsne.rs @@ -1,4 +1,4 @@ -//! t-SNE stage code +//! Martian stage RUN_TSNE use crate::io::{csv, h5}; use crate::types::{EmbeddingResult, EmbeddingType, H5File}; @@ -55,10 +55,10 @@ pub struct TsneChunkOutputs { tsne_csv: PathBuf, } -pub struct TsneStage; +pub struct RunTsne; -#[make_mro(stage_name = RUN_TSNE_NG, volatile = strict)] -impl MartianStage for TsneStage { +#[make_mro(volatile = strict)] +impl MartianStage for RunTsne { type StageInputs = TsneStageInputs; type StageOutputs = TsneStageOutputs; type ChunkInputs = TsneChunkInputs; @@ -69,9 +69,8 @@ impl MartianStage for TsneStage { args: Self::StageInputs, _rover: MartianRover, ) -> Result> { - let (_, ncells) = h5::matrix_shape(&args.matrix_h5)?; + let (_nfeatures, ncells, _nnz) = h5::matrix_shape(&args.matrix_h5)?; let ncells_mem_gib = (8e-6 * ncells as f64).ceil() as isize; - let matrix_mem_gib = (0.5 + h5::estimate_mem_gib_from_nnz(&args.matrix_h5)?).ceil() as isize; @@ -111,7 +110,7 @@ impl MartianStage for TsneStage { rover: MartianRover, ) -> Result { rayon::ThreadPoolBuilder::new() - .num_threads(1) + .num_threads(rover.get_threads()) .build_global()?; let mut tsne = BarnesHutTSNE::default(); tsne.seed = args.random_seed.or(RANDOM_SEED); diff --git a/lib/rust/cr_ana/src/stages/umap.rs b/lib/rust/cr_ana/src/stages/umap.rs index 74fde62..1bec099 100644 --- a/lib/rust/cr_ana/src/stages/umap.rs +++ b/lib/rust/cr_ana/src/stages/umap.rs @@ -72,7 +72,7 @@ impl MartianStage for UmapStage { _rover: MartianRover, ) -> Result> { let mut stage_def = StageDef::new(); - let (_, ncells) = h5::matrix_shape(&args.matrix_h5)?; + let (_nfeatures, ncells, _nnz) = h5::matrix_shape(&args.matrix_h5)?; let feature_types = h5::matrix_feature_types(&args.matrix_h5)?; let threads = match args.implementation { diff --git a/lib/rust/cr_bam/Cargo.toml b/lib/rust/cr_bam/Cargo.toml index 4b83cc6..0d277c2 100644 --- a/lib/rust/cr_bam/Cargo.toml +++ b/lib/rust/cr_bam/Cargo.toml @@ -1,10 +1,10 @@ [dependencies] -bitflags = '2' -wyhash = '0.5' - [dependencies.barcode] path = '../barcode' +[dependencies.bitflags] +workspace = true + [dependencies.rust-htslib] workspace = true @@ -14,6 +14,9 @@ workspace = true [dependencies.umi] path = '../umi' +[dependencies.wyhash] +workspace = true + [lib] test = false diff --git a/lib/rust/cr_bam/src/bam.rs b/lib/rust/cr_bam/src/bam.rs index 6faea04..bbe7416 100644 --- a/lib/rust/cr_bam/src/bam.rs +++ b/lib/rust/cr_bam/src/bam.rs @@ -219,7 +219,7 @@ pub struct BamPosSort; // fxhash has issues with the least bytes of byte arrays, use siphash fn hash32(v: &T) -> u32 { let h = hash64(v); - let mask = std::u32::MAX as u64; + let mask = u32::MAX as u64; (h & mask) as u32 ^ ((h >> 32) & mask) as u32 } diff --git a/lib/rust/cr_bam/src/bam_tags.rs b/lib/rust/cr_bam/src/bam_tags.rs index cebb75d..6d783ad 100644 --- a/lib/rust/cr_bam/src/bam_tags.rs +++ b/lib/rust/cr_bam/src/bam_tags.rs @@ -8,6 +8,7 @@ pub const FEATURE_QUAL_TAG: &[u8] = b"fq"; pub const FEATURE_SEQ_TAG: &[u8] = b"fb"; pub const FEATURE_IDS_TAG: &[u8] = b"fx"; pub const PROBE_TAG: &[u8] = b"pr"; +pub const GAP_COORDINATES_TAG: &[u8] = b"gc"; pub const EXTRA_FLAGS_TAG: &[u8] = b"xf"; pub const RAW_UMI_SEQ_TAG: &[u8] = b"UR"; diff --git a/lib/rust/cr_h5/src/feature_reference_io.rs b/lib/rust/cr_h5/src/feature_reference_io.rs index 96accc3..117913d 100644 --- a/lib/rust/cr_h5/src/feature_reference_io.rs +++ b/lib/rust/cr_h5/src/feature_reference_io.rs @@ -294,7 +294,7 @@ pub fn from_h5(group: &Group) -> Result { } pub fn encode_ascii_xml(s: &str) -> Cow<'_, str> { - if s.chars().all(|c| c.is_ascii()) { + if s.is_ascii() { return Cow::Borrowed(s); } let mut t = String::new(); @@ -409,7 +409,7 @@ mod tests { // read from reference path let fr_new = FeatureReference::from_paths( - &refdata_path("GRCh38-3.0.0/"), + Some(&refdata_path("GRCh38-3.0.0/")), None, None, None, @@ -443,7 +443,6 @@ mod tests { fn gex_abs_features() -> Result<()> { test_feature_io( "test/feature/pbmc_1k_protein_v3.csv", - refdata_path("GRCh38-3.0.0/"), Some( showroom_path("pbmc_1k_protein_v3/filtered_feature_bc_matrix.h5") .to_str() @@ -454,25 +453,12 @@ mod tests { #[test] fn test_extra_cols_csv() -> Result<()> { - test_feature_io( - "test/feature/extra_commas.csv", - refdata_path("GRCh38-3.0.0/"), - None, - ) + test_feature_io("test/feature/extra_commas.csv", None) } - fn test_feature_io( - feature_csv: impl AsRef, - reference: impl AsRef, - legacy_mat_h5: Option<&str>, - ) -> Result<()> { - if !refdata_available() { - return Ok(()); - } - - // read from reference path + fn test_feature_io(feature_csv: impl AsRef, legacy_mat_h5: Option<&str>) -> Result<()> { let fr_new = FeatureReference::from_paths( - reference.as_ref(), + None, Some(&FeatureReferenceFile::from(feature_csv.as_ref())), None, None, @@ -507,11 +493,7 @@ mod tests { #[test] fn gex_featuretest_features() -> Result<()> { - test_feature_io( - "test/feature/featuretest.csv", - refdata_path("GRCh38-3.0.0/"), - None, - ) + test_feature_io("test/feature/featuretest.csv", None) } #[test] @@ -522,7 +504,7 @@ mod tests { // read from reference path let fr_orig = FeatureReference::from_paths( - &refdata_path("GRCh38-3.0.0/"), + Some(&refdata_path("GRCh38-3.0.0/")), Some(&FeatureReferenceFile::from(Path::new( "test/feature/crispr_features.csv", ))), diff --git a/lib/rust/cr_h5/src/iter.rs b/lib/rust/cr_h5/src/iter.rs new file mode 100644 index 0000000..5c54f4a --- /dev/null +++ b/lib/rust/cr_h5/src/iter.rs @@ -0,0 +1,265 @@ +//! A generalized approach for streaming 1D data from HDF5 using chunked reads. +//! +//! This could be further optimized to pre-fetch the next buffer asynchronously +//! in a worker thread. +//! +//! TODO: refactor MoleculeInfoIterator to use this as the underlying backing. + +use anyhow::Result; +use hdf5::{Dataset, H5Type}; +use ndarray::Array1; +use std::cmp::min; +use std::sync::mpsc::{sync_channel, Receiver}; +use std::thread; + +struct H5Buffer { + /// Index of the end of the buffer in the origin dataset. + end: usize, + /// Loaded data. + data: Array1, +} + +impl H5Buffer { + fn new(dataset: &Dataset, start: usize, end: usize) -> Result { + Ok(Self { + end, + data: dataset.read_slice_1d(start..end)?, + }) + } +} + +/// A chunked-loading iterator over a single HDF5 dataset. +pub struct H5Iterator { + buf: Option>, + /// Current iteration index into the dataset. + index: usize, + /// Total elements in the dataset. + size: usize, + /// The size of each chunk to read. + chunk_size: usize, + /// Have we returned a read error? + read_error_returned: bool, + dataset: Dataset, +} + +impl H5Iterator { + /// Create an iterator over the provided dataset, loading chunk_size elements at a time. + pub fn new(dataset: Dataset, chunk_size: usize) -> Self { + let size = dataset.size(); + Self { + buf: None, + index: 0, + size, + chunk_size, + read_error_returned: false, + dataset, + } + } +} + +impl Iterator for H5Iterator { + type Item = Result; + fn next(&mut self) -> Option { + if self.read_error_returned || self.index >= self.size { + return None; + } + + if self.buf.is_none() { + match H5Buffer::new( + &self.dataset, + self.index, + min(self.index + self.chunk_size, self.size), + ) { + Ok(buf) => { + self.buf = Some(buf); + } + Err(err) => { + self.read_error_returned = true; + return Some(Err(err)); + } + } + } + + let (clear_buf, cur_data) = { + let buf = self.buf.as_ref().unwrap(); + let cur_index = self.index % self.chunk_size; + self.index += 1; + (self.index >= buf.end, buf.data[cur_index].clone()) + }; + if clear_buf { + self.buf = None; + } + + Some(Ok(cur_data)) + } + + fn size_hint(&self) -> (usize, Option) { + let remaining = if self.index < self.size { + self.size - self.index + } else { + 0 + }; + (remaining, Some(remaining)) + } +} + +/// Spawn a thread to read chunks asynchronously. +/// Chunks are sent back to the calling thread on a channel bounded to hold no +/// more than max_chunks. +fn read_chunks_async( + dataset: Dataset, + chunk_size: usize, + max_chunks: usize, +) -> Receiver>> { + let (sender, receiver) = sync_channel(max_chunks); + thread::spawn(move || { + let size = dataset.size(); + let mut start = 0; + loop { + if start >= size { + return; + } + let end = (start + chunk_size).min(size); + let read_result = H5Buffer::new(&dataset, start, end); + if sender.send(read_result).is_err() { + // Receiver hung up, stop reading. + return; + } + start = end; + } + }); + receiver +} + +/// A threaded chunked-loading iterator over a single HDF5 1D dataset. +/// Spawns a thread to load chunks in the background, buffering a fixed number. +pub struct ThreadedH5Iterator { + dataset: Dataset, + chunk_size: usize, + max_chunks: usize, + /// Channel receiver from reader thread. + /// Lazily initialized on the first call to the iterator. + receiver: Option>>>, + /// Iterator over the last chunk receieved from the reader. + cur_iter: Option< as std::iter::IntoIterator>::IntoIter>, + /// Current iteration index into the dataset. + index: usize, + /// Total elements in the dataset. + size: usize, + /// Have we returned a read error? + read_error_returned: bool, +} + +#[allow(unused)] +impl ThreadedH5Iterator { + fn new(dataset: Dataset, chunk_size: usize, max_chunks: usize) -> Self { + let size = dataset.size(); + Self { + dataset, + chunk_size, + max_chunks, + receiver: None, + cur_iter: None, + index: 0, + size, + read_error_returned: false, + } + } +} + +impl Iterator for ThreadedH5Iterator { + type Item = Result; + fn next(&mut self) -> Option { + loop { + if self.read_error_returned { + return None; + } + + // Lazily initialize receiver thread. + if self.receiver.is_none() { + self.receiver = Some(read_chunks_async( + self.dataset.clone(), + self.chunk_size, + self.max_chunks, + )); + } + + if self.cur_iter.is_none() { + match self.receiver.as_mut().unwrap().recv() { + Ok(Ok(buf)) => { + self.cur_iter = Some(buf.data.into_iter()); + } + Ok(Err(err)) => { + self.read_error_returned = true; + return Some(Err(err)); + } + Err(_) => { + // Sending thread terminated - no more data to read. + return None; + } + } + } + + match self.cur_iter.as_mut().unwrap().next() { + Some(item) => { + self.index += 1; + return Some(Ok(item)); + } + None => { + // We've exhausted this iterator; load another chunk. + self.cur_iter = None; + } + } + } + } + + fn size_hint(&self) -> (usize, Option) { + let remaining = if self.index < self.size { + self.size - self.index + } else { + 0 + }; + (remaining, Some(remaining)) + } +} + +#[cfg(test)] +mod test { + use super::*; + use hdf5::File; + use std::path::Path; + + #[test] + fn test_h5_iter() -> Result<()> { + let path = Path::new("test/h5/pbmc_1k_v2_molecule_info.h5"); + + let file = File::open(path)?; + + let items: Vec<_> = + H5Iterator::::new(file.dataset("barcode_idx")?, 1024).collect::>()?; + + assert_eq!(items.len(), 4303635); + + // Ensure chunked loading produces same results as loading entire collection. + assert_eq!(items, file.dataset("barcode_idx")?.read_raw::()?); + + Ok(()) + } + + #[test] + fn test_threaded_h5_iter() -> Result<()> { + let path = Path::new("test/h5/pbmc_1k_v2_molecule_info.h5"); + + let file = File::open(path)?; + + let items: Vec<_> = ThreadedH5Iterator::::new(file.dataset("barcode_idx")?, 1024, 1) + .collect::>()?; + + assert_eq!(items.len(), 4303635); + + // Ensure chunked loading produces same results as loading entire collection. + assert_eq!(items, file.dataset("barcode_idx")?.read_raw::()?); + + Ok(()) + } +} diff --git a/lib/rust/cr_h5/src/lib.rs b/lib/rust/cr_h5/src/lib.rs index 5aa31ce..941e12c 100644 --- a/lib/rust/cr_h5/src/lib.rs +++ b/lib/rust/cr_h5/src/lib.rs @@ -4,6 +4,7 @@ use hdf5::{Dataset, Extents, Group, H5Type}; pub mod compare; pub mod count_matrix; pub mod feature_reference_io; +pub mod iter; pub mod molecule_info; pub mod probe_reference_io; diff --git a/lib/rust/cr_h5/src/molecule_info.rs b/lib/rust/cr_h5/src/molecule_info.rs index 19fed2a..a54d5fc 100644 --- a/lib/rust/cr_h5/src/molecule_info.rs +++ b/lib/rust/cr_h5/src/molecule_info.rs @@ -1,3 +1,4 @@ +use crate::iter::H5Iterator; use crate::{ extend_dataset, feature_reference_io, make_column_ds, probe_reference_io, scalar_attribute, write_column_ds, @@ -500,6 +501,10 @@ impl MoleculeInfoReader { Ok(Self::open(path)?.dataset(BARCODE_DATASET_NAME)?.size()) } + pub fn read_gem_groups_size(path: &Path) -> Result { + Ok(Self::open(path)?.dataset(GEM_GROUP_COL_NAME)?.size()) + } + pub fn read_filtered_barcode_ids(path: &Path) -> Result> { let (barcode_info_pass_filter, _) = MoleculeInfoReader::read_barcode_info(path)?; Ok(barcode_info_pass_filter @@ -556,6 +561,14 @@ impl MoleculeInfoReader { .read_1d::()?) } + /// Return an iterator over gem groups. + pub fn iter_gem_groups(path: &Path) -> Result> { + Ok(H5Iterator::new( + Self::open(path)?.dataset(GEM_GROUP_COL_NAME)?, + ITERATOR_CHUNK_SIZE, + )) + } + pub fn nrows(path: &Path) -> Result { Ok(Self::open(path)?.dataset(GEM_GROUP_COL_NAME)?.size()) } diff --git a/lib/rust/cr_h5/src/probe_reference_io.rs b/lib/rust/cr_h5/src/probe_reference_io.rs index f2db458..7d0c2d4 100644 --- a/lib/rust/cr_h5/src/probe_reference_io.rs +++ b/lib/rust/cr_h5/src/probe_reference_io.rs @@ -1,11 +1,12 @@ use crate::feature_reference_io::encode_ascii_xml; use anyhow::{Context, Result}; -use cr_types::probe_set::{Probe, ProbeRegion}; +use cr_types::probe_set::{Probe, ProbeRegion, ProbeType}; use hdf5::types::FixedAscii; use hdf5::Group; -use itertools::izip; use std::boxed::Box; +use std::convert::AsRef; use std::iter::Iterator; +use std::str::FromStr; use transcriptome::Gene; pub const PROBE_DATA_LEN: usize = 64; @@ -15,6 +16,10 @@ const PROBE_FEATURE_ID: &str = "feature_id"; const PROBE_REGION: &str = "region"; const FILTERED_PROBES_NAME: &str = "filtered_probes"; const INCLUDED_PROBES_NAME: &str = "included_probes"; +const PROBE_TYPE: &str = "probe_type"; +const PROBE_REF_NAME: &str = "ref_name"; +const PROBE_REF_POS: &str = "ref_pos"; +const PROBE_CIGAR: &str = "cigar"; pub fn to_h5(probes: &[Probe], filtered_probes: &[bool], group: &mut Group) -> Result<()> { let item = probes @@ -24,72 +29,92 @@ pub fn to_h5(probes: &[Probe], filtered_probes: &[bool], group: &mut Group) -> R .as_ref(); if item.is_some() { //if one probe has a region annotation, they should all have annotations. - let regions: Vec<_> = probes - .iter() - .map(|probe| probe.region.as_ref().unwrap().to_string()) - .collect(); - mk_string_col(group, PROBE_REGION, regions)?; + mk_string_col(group, PROBE_REGION, probes, |probe| { + probe.region.as_ref().unwrap().to_string() + })?; }; - let (ids, gene_names, gene_ids, includeds): (Vec<_>, Vec<_>, Vec<_>, Vec<_>) = - itertools::multiunzip(probes.iter().map(|probe| { - ( - probe.probe_id.clone(), - probe.gene.name.clone(), - probe.gene.id.clone(), - probe.included, - ) - })); - mk_string_col(group, PROBE_ID, ids)?; - mk_string_col(group, PROBE_FEATURE_NAME, gene_names)?; - mk_string_col(group, PROBE_FEATURE_ID, gene_ids)?; + mk_string_col(group, PROBE_ID, probes, |probe| probe.probe_id.clone())?; + mk_string_col(group, PROBE_FEATURE_NAME, probes, |probe| { + probe.gene.name.clone() + })?; + mk_string_col(group, PROBE_FEATURE_ID, probes, |probe| { + probe.gene.id.clone() + })?; + mk_string_col(group, PROBE_TYPE, probes, |probe| { + probe.probe_type.as_ref().to_owned() + })?; + mk_string_col(group, PROBE_REF_NAME, probes, |probe| { + probe.ref_sequence_name.clone() + })?; + mk_string_col(group, PROBE_REF_POS, probes, |probe| { + probe + .ref_sequence_pos + .map(|x| x.to_string()) + .unwrap_or_default() + })?; + mk_string_col(group, PROBE_CIGAR, probes, |probe| { + probe.cigar_string.clone() + })?; + mk_bool_col(group, FILTERED_PROBES_NAME, filtered_probes)?; - mk_bool_col(group, INCLUDED_PROBES_NAME, &includeds)?; + let includes: Vec = probes.iter().map(|probe| probe.included).collect(); + mk_bool_col(group, INCLUDED_PROBES_NAME, &includes)?; Ok(()) } pub fn from_h5(group: &Group) -> Result> { //region is only optionally present let ds = group.dataset(PROBE_REGION); - let regions: Box>> = if ds.is_ok() { + let mut regions: Box>> = if ds.is_ok() { let regions_arr = ds.unwrap().read_1d::>()?; Box::new(regions_arr.into_iter().map(|x| Some(ProbeRegion::new(&x)))) } else { Box::new(std::iter::repeat(None)) }; + // Included is only optionally present. - let includeds: Box> = + let mut includeds: Box> = if let Ok(dataset) = group.dataset(INCLUDED_PROBES_NAME) { Box::new(dataset.read_1d::()?.into_iter()) } else { Box::new(std::iter::repeat(true)) }; - let ds = group.dataset(PROBE_ID)?; - let ids = ds.read_1d::>()?; - let ids: Vec = ids.into_iter().map(|x| x.to_string()).collect(); - - let ds = group.dataset(PROBE_FEATURE_NAME)?; - let gene_names = ds.read_1d::>()?; - let gene_names: Vec = gene_names.into_iter().map(|x| x.to_string()).collect(); - - let ds = group.dataset(PROBE_FEATURE_ID)?; - let gene_ids = ds.read_1d::>()?; - let gene_ids = gene_ids.into_iter().map(|x| x.to_string()); - - let output: Vec<_> = izip!(regions, includeds, ids, gene_names, gene_ids) - .map(|(region, included, probe_id, gene_name, gene_id)| { - let gene = Gene { - id: gene_id, - name: gene_name, - }; - Probe { - probe_id, - gene, - included, - region, - } - }) - .collect(); + + let ids = read_str_col(group, PROBE_ID)?; + let mut gene_names = read_str_col(group, PROBE_FEATURE_NAME)?; + let mut gene_ids = read_str_col(group, PROBE_FEATURE_ID)?; + + let mut probe_types = read_str_col(group, PROBE_TYPE)? + .map(|x| ProbeType::from_str(x.as_ref()).unwrap_or_default()); + let mut ref_sequence_names = read_str_col(group, PROBE_REF_NAME)?; + let mut ref_sequence_positions = read_str_col(group, PROBE_REF_POS)?; + let mut cigar_strings = read_str_col(group, PROBE_CIGAR)?; + + let mut output = Vec::new(); + for probe_id in ids { + let probe = Probe { + probe_id, + gene: Gene { + id: gene_ids + .next() + .expect("Error while loading probeset from h5"), + name: gene_names + .next() + .expect("Error while loading probeset from h5"), + }, + included: includeds.next().unwrap(), + region: regions.next().unwrap(), + probe_type: probe_types.next().unwrap(), + ref_sequence_name: ref_sequence_names.next().unwrap(), + ref_sequence_pos: ref_sequence_positions + .next() + .map(|num| num.parse::().ok()) + .unwrap(), + cigar_string: cigar_strings.next().unwrap(), + }; + output.push(probe); + } Ok(output) } @@ -105,7 +130,13 @@ fn mk_bool_col(group: &mut Group, name: &str, data: &[bool]) -> Result<()> { Ok(()) } -fn mk_string_col(group: &mut Group, name: &str, data: Vec) -> Result<()> { +fn mk_string_col( + group: &mut Group, + name: &str, + probes: &[Probe], + func: impl Fn(&Probe) -> String, +) -> Result<()> { + let data: Vec = probes.iter().map(func).collect(); let mut strings = Vec::with_capacity(data.len()); for datapoint in data { @@ -133,3 +164,15 @@ fn make_fixed_ascii(s: &str) -> Result> { let res = FixedAscii::::from_ascii(s.as_bytes()).with_context(|| probe_err)?; Ok(res) } + +fn read_str_col(group: &Group, name: &str) -> Result>> { + if let Ok(ds) = group.dataset(name) { + Ok(Box::new( + ds.read_1d::>()? + .map(std::string::ToString::to_string) + .into_iter(), + )) + } else { + Ok(Box::new(std::iter::repeat(String::new()))) + } +} diff --git a/lib/rust/cr_lib/Cargo.toml b/lib/rust/cr_lib/Cargo.toml index 1b58434..5e94387 100644 --- a/lib/rust/cr_lib/Cargo.toml +++ b/lib/rust/cr_lib/Cargo.toml @@ -5,22 +5,9 @@ test = false [dependencies] assert_approx_eq = '1' base64 = '0.13' -bio = '1' -csv = '1' -derive_more = '0.99' -docopt = '1' -file_diff = '1' -fxhash = '0.2' -hostname = '0.3' -lazy_static = '1' -log = '0.4' ndarray-rand = '0.14' num = '0.4' -rand_chacha = '0.3' -sha2 = '0.10' slice-group-by = '0.3' -tempfile = '3' -thiserror = '1' [dependencies.anyhow] workspace = true @@ -34,6 +21,9 @@ path = '../barcode_extensions' [dependencies.bazel_utils] path = '../bazel_utils' +[dependencies.bio] +workspace = true + [dependencies.cr_bam] path = '../cr_bam' @@ -46,24 +36,48 @@ path = '../cr_types' [dependencies.cr_websummary] path = '../cr_websummary' +[dependencies.csv] +workspace = true + +[dependencies.derive_more] +workspace = true + +[dependencies.docopt] +workspace = true + [dependencies.fastq_set] workspace = true +[dependencies.file_diff] +workspace = true + [dependencies.flate2] workspace = true +[dependencies.fxhash] +workspace = true + [dependencies.hdf5] workspace = true +[dependencies.hostname] +workspace = true + [dependencies.itertools] workspace = true [dependencies.json_report_derive] path = '../json_report_derive' +[dependencies.lazy_static] +workspace = true + [dependencies.libc] workspace = true +[dependencies.log] +workspace = true + [dependencies.martian] workspace = true @@ -90,8 +104,7 @@ branch = 'master' git = 'https://github.com/10XGenomics/orbit' [dependencies.ordered-float] -features = ['serde'] -version = '3' +workspace = true [dependencies.par_proc] path = '../par_proc' @@ -99,16 +112,23 @@ path = '../par_proc' [dependencies.parameters_toml] path = '../parameters_toml' +[dependencies.parquet] +workspace = true + +[dependencies.parquet_derive] +workspace = true + [dependencies.rand] workspace = true +[dependencies.rand_chacha] +workspace = true + [dependencies.rayon] workspace = true [dependencies.regex] -default-features = false -features = ['std', 'perf'] -version = '1' +workspace = true [dependencies.rust-htslib] workspace = true @@ -119,6 +139,9 @@ workspace = true [dependencies.serde_json] workspace = true +[dependencies.sha2] +workspace = true + [dependencies.shardio] workspace = true @@ -131,6 +154,16 @@ workspace = true [dependencies.strum_macros] workspace = true +[dependencies.tempfile] +workspace = true + +[dependencies.tenx-websummary] +features = ['derive', 'image_base64_encode', 'image_proc'] +workspace = true + +[dependencies.thiserror] +workspace = true + [dependencies.transcriptome] path = '../transcriptome' @@ -144,7 +177,10 @@ path = '../umi' path = '../vdj_reference' [dependencies.vdj_types] -workspace = true +path = '../vdj_types' + +[dependencies.websummary_build] +path = '../websummary_build' [features] default = ['tenx_source_available'] diff --git a/lib/rust/cr_lib/src/align_homopolymer.rs b/lib/rust/cr_lib/src/align_homopolymer.rs index edf6893..78ad968 100644 --- a/lib/rust/cr_lib/src/align_homopolymer.rs +++ b/lib/rust/cr_lib/src/align_homopolymer.rs @@ -26,8 +26,13 @@ fn construct_score_vector(nt: u8, seq: &[u8]) -> Vec { /// Find the best scoring 3' homopolymer run. pub fn align_homopolymer_threeprime(nt: u8, seq: &[u8]) -> Range { + if seq.is_empty() { + return 0..0; + } + let score_vec = construct_score_vector(nt, seq); - if *score_vec.last().unwrap() <= 0 { + + if score_vec.is_empty() || (*score_vec.last().unwrap() <= 0) { return 0..0; } @@ -45,20 +50,28 @@ pub fn count_homopolymer_matches_threeprime(nt: u8, seq: &[u8]) -> usize { /// Find the best scoring homopolymer run. pub fn align_homopolymer(nt: u8, seq: &[u8]) -> Range { - let score_vec = construct_score_vector(nt, seq); - let max_score = *score_vec.iter().max().unwrap(); - if max_score <= 0 { + if seq.is_empty() { return 0..0; } - // Backtrack - // TODO: Return the longest match when there are multiple matches with the best score. - let end = 1 + score_vec.iter().rposition(|&x| x == max_score).unwrap(); - let start = score_vec[0..end] + let score_vec = construct_score_vector(nt, seq); + let max_score = *score_vec .iter() - .rposition(|&x| x < 0) - .map_or(0, |x| 1 + x); - start..end + .max() + .expect("The score vec did not have a max."); + + if max_score > 0 { + // Backtrack + // TODO: Return the longest match when there are multiple matches with the best score. + let end = 1 + score_vec.iter().rposition(|&x| x == max_score).unwrap(); + let start = score_vec[0..end] + .iter() + .rposition(|&x| x < 0) + .map_or(0, |x| 1 + x); + start..end + } else { + 0..0 + } } /// Count the number of matches in the longest homopolymer run, allowing for mismatches. diff --git a/lib/rust/cr_lib/src/align_metrics.rs b/lib/rust/cr_lib/src/align_metrics.rs index 7524ba5..4012b96 100644 --- a/lib/rust/cr_lib/src/align_metrics.rs +++ b/lib/rust/cr_lib/src/align_metrics.rs @@ -1,7 +1,9 @@ use crate::aligner::BarcodeSummary; use anyhow::Result; use barcode::Barcode; -use cr_types::probe_set::{MAPQ_HALF_MAPPED, MAPQ_SPLIT_MAPPED}; +use cr_types::probe_set::{ + MAPQ_GAP_MAPPED_NOT_WITHIN_MAX_ERR, MAPQ_HALF_MAPPED, MAPQ_SPLIT_MAPPED, +}; use cr_types::rna_read::RnaRead; use cr_types::{GenomeName, LibraryType}; use fxhash::FxHashMap; @@ -410,6 +412,9 @@ pub struct PerMappingStatusMetrics { /// Split-mapped probe reads (MAPQ = 3) pub split_mapped: CountMetric, + + /// LHS and RHS map, but the gap sequence is not within max error of expected gap(MAPQ = 5) + pub gap_mapped_not_within_max_error: CountMetric, } #[derive(Clone, Default, Metric, Serialize, Deserialize)] @@ -464,6 +469,9 @@ impl VisitorMetrics { match mapq { MAPQ_HALF_MAPPED => metric.half_mapped.increment(), MAPQ_SPLIT_MAPPED => metric.split_mapped.increment(), + MAPQ_GAP_MAPPED_NOT_WITHIN_MAX_ERR => { + metric.gap_mapped_not_within_max_error.increment(); + } _ => (), }; } @@ -486,6 +494,9 @@ impl VisitorMetrics { match mapq { MAPQ_HALF_MAPPED => metric.half_mapped.increment(), MAPQ_SPLIT_MAPPED => metric.split_mapped.increment(), + MAPQ_GAP_MAPPED_NOT_WITHIN_MAX_ERR => { + metric.gap_mapped_not_within_max_error.increment(); + } _ => (), } } @@ -697,7 +708,10 @@ impl AnnotatedReadVisitor for AlignAndCountVisitor { fn visit_every_read(&mut self, read: &RnaRead) { self.metrics.total_reads.increment(); - if read.barcode.is_valid_and_at_least_one_segment_corrected() { + if read + .segmented_barcode + .is_valid_and_at_least_one_segment_corrected() + { self.metrics.barcode_corrected_sequenced_reads.increment(); } } @@ -851,6 +865,9 @@ struct RegionMetrics { /// Split-mapped probe reads (MAPQ = 3) split_mapped_reads: PercentMetric, + + /// LHS and RHS map, but the gap sequence is not within max error of expected gap (MAPQ = 5) + gap_mapped_not_within_max_error_reads: PercentMetric, } impl RegionMetrics { @@ -862,6 +879,7 @@ impl RegionMetrics { conf_mapped_bc, half_mapped, split_mapped, + gap_mapped_not_within_max_error, }: PerMappingStatusMetrics, ) -> Self { RegionMetrics { @@ -870,6 +888,10 @@ impl RegionMetrics { conf_mapped_barcoded_reads: PercentMetric::from_parts(conf_mapped_bc, total), half_mapped_reads: PercentMetric::from_parts(half_mapped, total), split_mapped_reads: PercentMetric::from_parts(split_mapped, total), + gap_mapped_not_within_max_error_reads: PercentMetric::from_parts( + gap_mapped_not_within_max_error, + total, + ), } } @@ -1139,6 +1161,10 @@ mod tests { expected.insert(format!("{gm}_conf_mapped_barcoded_reads_frac"), 0.0f64); expected.insert(format!("{gm}_half_mapped_reads_frac"), 0.0f64); expected.insert(format!("{gm}_split_mapped_reads_frac"), 0.0f64); + expected.insert( + format!("{gm}_gap_mapped_not_within_max_error_reads_frac"), + 0.0f64, + ); } for ts in TargetingStatus::iter() { let tm = TargetedMapping::new(g.clone(), MappingRegion::Transcriptome, ts); @@ -1147,6 +1173,10 @@ mod tests { expected.insert(format!("{tm}_conf_mapped_barcoded_reads_frac"), 0.0f64); expected.insert(format!("{tm}_half_mapped_reads_frac"), 0.0f64); expected.insert(format!("{tm}_split_mapped_reads_frac"), 0.0f64); + expected.insert( + format!("{tm}_gap_mapped_not_within_max_error_reads_frac"), + 0.0f64, + ); } } assert_eq!(actual, expected); diff --git a/lib/rust/cr_lib/src/aligner.rs b/lib/rust/cr_lib/src/aligner.rs index 9344e0c..9fdf6f0 100644 --- a/lib/rust/cr_lib/src/aligner.rs +++ b/lib/rust/cr_lib/src/aligner.rs @@ -3,6 +3,7 @@ use crate::stages::align_and_count; use crate::types::AnnSpillFormat; use anyhow::Result; use barcode::{Barcode, BarcodeContent}; +use cr_types::chemistry::ChemistryDefsExt; use cr_types::constants::ILLUMINA_QUAL_OFFSET; use cr_types::probe_set::ProbeSetReference; use cr_types::reference::feature_extraction::{FeatureData, FeatureExtractor}; @@ -210,13 +211,12 @@ impl TrimResults { } } -/// #[derive(Clone)] pub struct Aligner { aligner: Option, extractor: Arc, reference: Arc, - annotator: Arc, + annotator: Option>, target_panel_reference: Option>, read_chunks: Vec, filter_umis: bool, @@ -243,6 +243,10 @@ fn barcode_seeded_rng(barcode: Barcode) -> ChaCha20Rng { let seed = ((index.row as u64) << 32) + index.col as u64; ChaCha20Rng::seed_from_u64(seed) } + BarcodeContent::CellName(cell_id) => { + let seed = cell_id.id as u64; + ChaCha20Rng::seed_from_u64(seed) + } } } @@ -252,7 +256,7 @@ impl Aligner { aligner: Option, reference: FeatureReference, feature_dist: Vec, - annotator: ReadAnnotator, + annotator: Option, read_chunks: Vec, spill_folder: PathBuf, targeted_umi_min_read_count: Option, @@ -265,7 +269,7 @@ impl Aligner { aligner, extractor: Arc::new(extractor), reference, - annotator: Arc::new(annotator), + annotator: annotator.map(Arc::new), read_chunks, filter_umis: true, spill_folder, @@ -305,6 +309,7 @@ impl Aligner { annotations.push(ann)?; } + let chemistry_name = args.chemistry_defs.primary().name; let dup_marker: HashMap<_, _> = dup_builder .into_iter() .map(|(library_type, builder)| { @@ -312,7 +317,9 @@ impl Aligner { library_type, builder.build( self.filter_umis, - match library_type.is_fb_type(FeatureBarcodeType::Multiplexing) { + match library_type.is_fb_type(FeatureBarcodeType::Multiplexing) + && !(chemistry_name.is_sc_3p_v4() || chemistry_name.is_sc_5p_v3()) + { true => UmiCorrection::Disable, false => UmiCorrection::Enable, }, @@ -346,7 +353,7 @@ impl Aligner { let qual = read.r1_qual(); let panel_ref = self.target_panel_reference.as_ref().unwrap(); let mapped_probe = panel_ref.align_probe_read(seq); - let recs = if args.no_bam { + let recs = if args.no_bam || args.reference_path.is_none() { let mut record = Aligner::new_unmapped_records(&read).0; if let (true, Some(lhs), Some(rhs)) = ( args.is_pd, @@ -414,6 +421,8 @@ impl Aligner { matched_tso: trim_results.matched_tso(), ..self .annotator + .as_ref() + .unwrap() .annotate_read_pe(read, recs1, recs2, umi_info) } } @@ -454,7 +463,11 @@ impl Aligner { // Annotate the alignments. ReadAnnotations { matched_tso: trim_results.matched_tso(), - ..self.annotator.annotate_read_se(read, read_recs, umi_info) + ..self + .annotator + .as_ref() + .unwrap() + .annotate_read_se(read, read_recs, umi_info) } } } @@ -670,7 +683,7 @@ impl<'a> Iterator for AnnotationIter<'a> { match self.store.next() { Some(Ok(mut ann)) => { assert!(ann.dup_info.is_none()); - ann.dup_info = if ann.read.barcode().is_valid() { + ann.dup_info = if ann.read.barcode_is_valid() { self.dup_marker .get_mut(&ann.read.library_type) .unwrap() @@ -734,6 +747,7 @@ mod tests { let qual = b"ABCDEFGHI"; let mut recs = vec![Record::new()]; + recs[0].unset_flags(); recs[0].set( b"123", Some(&CigarString(vec![Cigar::SoftClip(1), Cigar::Match(2)])), @@ -754,7 +768,7 @@ mod tests { Cigar::Match(2), Cigar::SoftClip(4) ]) - .into_view(0) + .into_view(-1) ); recs[0].set( @@ -776,7 +790,7 @@ mod tests { Cigar::Match(2), Cigar::SoftClip(3) ]) - .into_view(0) + .into_view(-1) ); } } diff --git a/lib/rust/cr_lib/src/barcode_correction_metrics.rs b/lib/rust/cr_lib/src/barcode_correction_metrics.rs index ec19eb8..6c82009 100644 --- a/lib/rust/cr_lib/src/barcode_correction_metrics.rs +++ b/lib/rust/cr_lib/src/barcode_correction_metrics.rs @@ -67,17 +67,17 @@ impl ReadVisitor for BarcodeCorrectionVisitor { let metrics = InnerBarcodeCorrectionMetrics { // This visitor visits only uncorrected invalid barcodes. // The barcode is valid now if and only if it was corrected. - corrected_bc: read.barcode().is_valid().into(), + corrected_bc: read.barcode_is_valid().into(), corrected_bc_in: read - .segmented_barcode() + .segmented_barcode .segments() .map(|seg| { PercentMetric::from(seg.state == BarcodeSegmentState::ValidAfterCorrection) }) .into(), - good_bc: read.barcode().is_valid().into(), + good_bc: read.barcode_is_valid().into(), good_bc_in: read - .segmented_barcode() + .segmented_barcode .segments_valid() .map(PercentMetric::from) .into(), diff --git a/lib/rust/cr_lib/src/barcode_sort.rs b/lib/rust/cr_lib/src/barcode_sort.rs index c573f86..0e5e9fb 100644 --- a/lib/rust/cr_lib/src/barcode_sort.rs +++ b/lib/rust/cr_lib/src/barcode_sort.rs @@ -1,19 +1,34 @@ use anyhow::Result; use barcode::{Barcode, BarcodeConstruct, BarcodeConstructMetric, Whitelist}; -use cr_bam::constants::{ALN_BC_DISK_CHUNK_SZ, ALN_BC_ITEM_BUFFER_SZ, ALN_BC_SEND_BUFFER_SZ}; +use cr_bam::constants::{ALN_BC_DISK_CHUNK_SZ, ALN_BC_ITEM_BUFFER_SZ}; +use cr_types::mempool::{MemPool, PoolMember}; use cr_types::rna_read::{RnaChunk, RnaProcessor, RnaRead}; -use fastq_set::read_pair::ReadPair; +use fastq_set::read_pair::{ReadPair, ReadPairStorage}; use fastq_set::{FastqProcessor, ProcessResult}; use metric::{CountMetric, Metric}; -use shardio::{ShardSender, ShardWriter, SortKey}; -use std; +use shardio::{BufHandler, SortAndWriteHandler, SortKey}; use std::borrow::Cow; use std::marker::PhantomData; -use std::path::Path; +use std::path::PathBuf; +use std::sync::mpsc::{channel, Receiver, Sender}; -// 1GiB if above holds +/// The maximum number of reads we will pre-buffer in the fastq reader. const BG_FASTA_READAHEAD: usize = 1024; +/// The largest size of each buffer sent to a shard writer. +/// shardio splits the requested item buffer size into two ping-pong buffers, +/// so we match the previous implementation's buffer size by dividing by 2. +const MAX_READ_BUF_SIZE: usize = ALN_BC_ITEM_BUFFER_SZ / 2; + +/// Use a much smaller buffer for invalid reads, to ensure we are promptly +/// writing them into shards and releasing shared backing read memory. +/// This will result in larger overhead when reading the invalid shards, but +/// this should not be an issue for the vast majority of analyses. +/// The ratio of the invalid and valid read buffers will be dynamically adjusted +/// to balance high-quality sharding vs. the need to promptly release shared +/// memory backing the reads. +const INITIAL_INVALID_READ_BUF_SIZE: usize = MAX_READ_BUF_SIZE / 16; + pub trait ReadVisitor { type ReadType; fn visit_processed_read(&mut self, read: &mut Self::ReadType) -> Result<()>; @@ -33,139 +48,309 @@ impl ReadVisitor for DefaultVisitor { } } -pub struct BarcodeSortWorkflow { - sorter: BarcodeAwareSorter, - processor: RnaProcessor, -} +pub fn execute_barcode_sort_with_visitor>( + chunk: RnaChunk, + valid_path: PathBuf, + invalid_path: PathBuf, + whitelist: BarcodeConstruct, + max_iters: Option, + visitor: &mut V, +) -> Result { + let mut metrics = BarcodeSortMetrics::default(); -impl BarcodeSortWorkflow { - pub fn new( - chunk: RnaChunk, - valid_path: &Path, - invalid_path: &Path, - whitelist: BarcodeConstruct, - ) -> Result { - let sorter = BarcodeAwareSorter::new(valid_path, invalid_path)?; - Ok(BarcodeSortWorkflow { - processor: RnaProcessor::new(chunk, whitelist), - sorter, - }) - } - - pub fn execute_workflow_with_visitor( - &mut self, - max_iters: Option, - visitor: &mut V, - ) -> Result<()> - where - V: ReadVisitor, - { - let mut nreads = 0; - for read_result in self - .processor - .iter_background(BG_FASTA_READAHEAD)? - .take(max_iters.unwrap_or(std::usize::MAX)) + let (send_err, recv_err) = channel(); + + let mut nreads = 0; + + // Spawn shard writer threads. + std::thread::scope(|s| { + let (send_valid, recv_valid) = channel(); + let (send_invalid, recv_invalid) = channel(); + + let mut read_buffers = ReadBuffers::new(send_valid, send_invalid); + + s.spawn(|| { + if let Err(err) = process_read_buffers(valid_path, recv_valid) { + let _ = send_err.send(err); + } + }); + s.spawn(|| { + if let Err(err) = process_read_buffers(invalid_path, recv_invalid) { + let _ = send_err.send(err); + } + }); + + let processor = RnaProcessor::new(chunk, whitelist); + + for read_result in processor + .iter_background_with_storage(BG_FASTA_READAHEAD, ReadPairStorage::SharedBuffer) + .unwrap() + .take(max_iters.unwrap_or(usize::MAX)) { nreads += 1; + match read_result? { ProcessResult::Processed(mut read) => { visitor.visit_processed_read(&mut read)?; - self.sorter.process(read)?; + metrics.valid_items_in.merge( + read.segmented_barcode + .segments_valid() + .map(CountMetric::from) + .into(), + ); + + if (if read.barcode_is_valid() { + metrics.valid_items += 1; + read_buffers.put_valid(read) + } else { + metrics.invalid_items += 1; + read_buffers.put_invalid(read) + }) + .is_err() + { + // one of the processors hung up, stop sending and wait + // for error + break; + } } ProcessResult::Unprocessed { read, reason } => { visitor.visit_unprocessed_read(read, reason)?; } } } - println!("Processed {nreads} reads"); - self.sorter.finish() - } + Ok::<(), anyhow::Error>(()) + })?; - pub fn num_valid_items(&self) -> i64 { - self.sorter.valid_items + // Check for processor error. + if let Ok(err) = recv_err.try_recv() { + return Err(err); } - pub fn num_valid_segments(&self) -> BarcodeConstructMetric { - self.sorter.valid_items_in - } + println!("Processed {nreads} reads"); - pub fn num_invalid_items(&self) -> i64 { - self.sorter.invalid_items - } + Ok(metrics) } pub struct BarcodeOrder; impl SortKey for BarcodeOrder { type Key = Barcode; fn sort_key(v: &RnaRead) -> Cow<'_, Barcode> { + // Note: we do not use shardio's default sorting mechanism for + // MAKE_SHARD because sorting RnaReads using merge sort results in too + // much memcpy. Instead we use a cached key sort. Cow::Owned(v.barcode()) } } -struct BarcodeAwareSorter { - // note: sender must appear before writers, because senders - // must be dropped before writers. - valid_sender: ShardSender, - valid_writer: ShardWriter, - invalid_sender: ShardSender, - invalid_writer: ShardWriter, - valid_items: i64, - valid_items_in: BarcodeConstructMetric, - invalid_items: i64, +#[derive(Copy, Clone, Default)] +pub struct BarcodeSortMetrics { + pub valid_items: i64, + pub valid_items_in: BarcodeConstructMetric, + pub invalid_items: i64, +} + +struct ReadBuffer { + pool: MemPool>, + buf: Option>>, + /// The maximum number of items to buffer before sending. + /// + /// This can be changed dynamically, but buffer allocations will only + /// grow. Capacity will not be reclaimed if shrunk. + pub size: usize, + send: Sender>>, } -impl BarcodeAwareSorter { - fn new(valid_path: &Path, invalid_path: &Path) -> Result { - let valid_writer: ShardWriter = ShardWriter::new( - valid_path, - ALN_BC_SEND_BUFFER_SZ, - ALN_BC_DISK_CHUNK_SZ, - ALN_BC_ITEM_BUFFER_SZ, - )?; - let valid_sender = valid_writer.get_sender(); - - let invalid_writer: ShardWriter = ShardWriter::new( - invalid_path, - ALN_BC_SEND_BUFFER_SZ, - ALN_BC_DISK_CHUNK_SZ, - ALN_BC_ITEM_BUFFER_SZ, - )?; - let invalid_sender = invalid_writer.get_sender(); - - Ok(BarcodeAwareSorter { - valid_writer, - valid_sender, - invalid_writer, - invalid_sender, - valid_items: 0, - valid_items_in: BarcodeConstructMetric::default(), - invalid_items: 0, - }) - } - - fn process(&mut self, read: RnaRead) -> Result<()> { - self.valid_items_in.merge( - read.segmented_barcode() - .segments_valid() - .map(CountMetric::from) - .into(), - ); - - if read.barcode().is_valid() { - self.valid_items += 1; - self.valid_sender.send(read)?; +impl ReadBuffer { + pub fn new(size: usize, send: Sender>>) -> Self { + Self { + // Use two read buffers, to allow pre-buffering reads while the other + // buffer is being processed by the writer. + pool: MemPool::new(2, || Vec::with_capacity(size)), + send, + buf: None, + size, + } + } + + /// Put a read in this buffer. + /// Send the buffer if full. + /// Fetch a new buffer if necessary. + /// + /// Return Err if a send operation failed due to the processor hanging up. + pub fn put(&mut self, read: RnaRead) -> Result<()> { + let mut buf = self.buf.take().unwrap_or_else(|| { + let mut buf = self.pool.fetch(); + buf.clear(); + buf + }); + buf.push(read); + if buf.len() >= self.size { + self.send.send(buf)?; } else { - self.invalid_items += 1; - self.invalid_sender.send(read)?; + self.buf = Some(buf); } Ok(()) } +} - fn finish(&mut self) -> Result<()> { - self.valid_sender.finished()?; - self.invalid_sender.finished()?; - self.valid_writer.finish()?; - self.invalid_writer.finish()?; - Ok(()) +impl Drop for ReadBuffer { + /// Send any remaining reads when dropped. + fn drop(&mut self) { + if let Some(buf) = self.buf.take() { + self.send.send(buf).unwrap(); + } + } +} + +fn process_read_buffers(path: PathBuf, recv: Receiver>>) -> Result<()> { + let mut handler: SortAndWriteHandler = + SortAndWriteHandler::new(ALN_BC_DISK_CHUNK_SZ, &path)?; + for mut buf in &recv { + // RnaRead structs are quite large - sort_by_cached_key generates a vec + // of just the keys+indices and sorts that, then performs the final + // re-arrangement of the read data itself in an O(N) operation. This + // results in drastically lower CPU time wasted in memcpy. This also + // avoids recomputing the barcode for each comparision operation, as in + // the default shardio implementation. + buf.sort_by_cached_key(RnaRead::barcode); + handler.process_buf(&mut buf)?; + } + handler.write_index()?; + Ok(()) +} + +/// Own the read buffers and balance their sizes based on read quality. +struct ReadBuffers { + valid: ReadBuffer, + invalid: ReadBuffer, + frac: ValidFrac, +} + +impl ReadBuffers { + pub fn new( + send_valid: Sender>>, + send_invalid: Sender>>, + ) -> Self { + Self { + valid: ReadBuffer::new(MAX_READ_BUF_SIZE, send_valid), + invalid: ReadBuffer::new(INITIAL_INVALID_READ_BUF_SIZE, send_invalid), + frac: ValidFrac::new(MAX_READ_BUF_SIZE / 4), + } + } + + fn update_buf_sizes(&mut self, valid: bool) { + let new_buffer_sizing = self.frac.observe(valid); + if new_buffer_sizing { + let (valid_buf_scale, invalid_buf_scale) = self.frac.valid_to_invalid_read_buf_ratio(); + self.valid.size = MAX_READ_BUF_SIZE / valid_buf_scale; + self.invalid.size = MAX_READ_BUF_SIZE / invalid_buf_scale; + println!("Adjusting buffer ratios: valid: {valid_buf_scale}, invalid: {invalid_buf_scale}. Valid rate: {:.2}", self.frac.prev_valid as f64 / self.frac.chunk_size as f64); + } + } + + pub fn put_valid(&mut self, read: RnaRead) -> Result<()> { + self.update_buf_sizes(true); + self.valid.put(read) + } + + pub fn put_invalid(&mut self, read: RnaRead) -> Result<()> { + self.update_buf_sizes(false); + self.invalid.put(read) + } +} + +/// Track a crude chunked average of the fraction of valid reads. +struct ValidFrac { + valid: usize, + total: usize, + /// The number of reads to observe before updating the valid frac. + chunk_size: usize, + /// The number of reads in the last chunk that were valid. + /// + /// Initialized as the chunk size, so we start out assuming that all reads + /// are valid. + prev_valid: usize, +} + +impl ValidFrac { + fn new(chunk_size: usize) -> Self { + Self { + valid: 0, + total: 0, + chunk_size, + prev_valid: chunk_size, + } + } + + /// Observe a count. + /// + /// Return true if we filled a chunk and updated our estimate of the rate. + fn observe(&mut self, valid: bool) -> bool { + self.total += 1; + if valid { + self.valid += 1; + } + // We've observed an entire chunk; save the valid count and reset. + if self.total == self.chunk_size { + self.prev_valid = self.valid; + self.total = 0; + self.valid = 0; + return true; + } + false + } + + /// Return a suggested ratio for the size of the valid vs invalid read + /// buffer. + /// + /// Return (valid_buffer_reduction_factor, invalid_buffer_reduction_factor). + /// + /// This should allow us to promptly release shared memory for the case + /// where we have few invalid reads, but avoid creating many small, poorly- + /// collated invalid read shards for the case where we have many invalid + /// reads (and vice-versa for very poor sequencing data). + /// + /// We constrain these buffer scaling factors to be + /// - no larger 1 + /// - no smaller than 1/16 + /// - scaled by powers of 2 + /// + /// These values were chosen fairly arbitrarily and have not been empirically tuned. + fn valid_to_invalid_read_buf_ratio(&self) -> (usize, usize) { + let prev_invalid = self.chunk_size - self.prev_valid; + + let invalid_ratio = if self.prev_valid == 0 { + f64::MAX + } else { + prev_invalid as f64 / self.prev_valid as f64 + }; + + // Use the largest buffer size for whichever track has the larger + // fraction of reads; shrink the other track's buffers proportionate to + // that. + if invalid_ratio < 1.0 { + // More valid than invalid reads. + (1, buffer_scaling_factor(invalid_ratio)) + } else { + // More invalid than valid reads. + (buffer_scaling_factor(1.0 / invalid_ratio), 1) + } + } +} + +fn buffer_scaling_factor(ratio: f64) -> usize { + // We need to take the inverse/swap the scaling if we have more than half of + // whatever read category this is. + assert!(ratio <= 1.0); + if ratio > 1. / 2. { + 1 + } else if ratio > 1. / 4. { + 2 + } else if ratio > 1. / 8. { + 4 + } else if ratio > 1. / 16. { + 8 + } else { + 16 } } diff --git a/lib/rust/cr_lib/src/bin/cr_lib.rs b/lib/rust/cr_lib/src/bin/cr_lib.rs index 05a949c..4ba20e5 100644 --- a/lib/rust/cr_lib/src/bin/cr_lib.rs +++ b/lib/rust/cr_lib/src/bin/cr_lib.rs @@ -96,7 +96,9 @@ fn main() -> Result<()> { cr_lib::stages::demux_probe_bc_matrix::DemuxProbeBcMatrix, cr_lib::stages::detect_chemistry::DetectChemistry, cr_lib::stages::detect_vdj_receptor::DetectVdjReceptor, + cr_lib::stages::expect_single_barcode_whitelist::ExpectSingleBarcodeWhitelist, cr_lib::stages::extract_single_chemistry::ExtractSingleChemistry, + cr_lib::stages::generate_cas_websummary::GenerateCasWebsummary, cr_lib::stages::get_chemistry_def::GetChemistryDef, cr_lib::stages::get_gdna_metrics::GetGdnaMetrics, cr_lib::stages::logic_not::LogicNot, diff --git a/lib/rust/cr_lib/src/cell_annotation_ws_parameters.rs b/lib/rust/cr_lib/src/cell_annotation_ws_parameters.rs new file mode 100644 index 0000000..633e4de --- /dev/null +++ b/lib/rust/cr_lib/src/cell_annotation_ws_parameters.rs @@ -0,0 +1,264 @@ +use anyhow::{Ok, Result}; +use martian_filetypes::json_file::JsonFile; +use martian_filetypes::FileTypeRead; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use tenx_websummary::components::{ + DifferentialExpressionTable, InlineHelp, TableMetric, TitleWithHelp, VegaLitePlot, WithTitle, +}; +use tenx_websummary::{Alert, AlertLevel}; + +const CELL_ANNOTATION_DISCLAIMER_STRING: &str = r#"

Important Note
+Cell type annotation is currently in beta and relies on the Chan Zuckerberg CELL by GENE reference. +As this reference is community-driven it may not cover all tissue types, which could impact your results. For further details, please visit the +10x support site. +

"#; + +const CELL_ANNOTATION_BROAD_MODEL: &str = + "Annotation was performed using a model that was co-developed by 10x Genomics and the Cellarium AI Lab at the Data Sciences Platform of the Broad Institute."; + +const CELL_ANNOTATION_FAILURE_TITLE: &str = "No cell annotations produced!"; + +const CELL_ANNOTATION_FAILURE_MESSAGE: &str = r#"

Please check your cellranger annotate logs. +If you wish to attempt cell type annotation again please use +cellranger annotate.

"#; + +const CELL_ANNOTATION_DE_WARN_TITLE: &str = "Cell type differential expression not run"; +const CELL_ANNOTATION_DE_WARN_MESSAGE: &str = "Too few cell types to run differential expression."; + +const CELL_ANNOTATION_BC_MISMATCH_WARN_TITLE: &str = + "Barcodes in cloupe file and feature barcode matrix do not match"; + +const CELL_ANNOTATION_METRICS_TABLE_TITLE: &str = "Cell Annotation Summary"; +const CELL_ANNOTATION_METRICS_TABLE_HELP: &str = "Pipeline version
+The version of Cell Ranger used to generate this annotation.
+Cell annotation model
+The model used to generate cell type annotations."; + +const CELL_ANNOTATION_INTERACTIVE_BARCHART_TITLE: &str = "Cell Type Composition"; +const CELL_ANNOTATION_INTERACTIVE_BARCHART_HELP: &str = "This plot shows the major cell types in your sample. To view sub-type annotations, click on a bar. +Only major classifications with at least 10 cells are shown.
+Left-hand bar chart: This bar chart shows the annotated cell types on the y-axis and the number of barcodes annotated with them on the x-axis.
+Right-hand table: This table shows the sub-types within a selected major cell type. Fractions of barcodes shown are the percentage of cells relative to +this selected cell type—not the entire sample."; + +const CELL_ANNOTATION_VIOLIN_PLOT_TITLE: &str = "UMI distribution by cell type"; +const CELL_ANNOTATION_VIOLIN_PLOT_HELP: &str = + "Box plot showing the distribution of (UMI+1) by annotated cell types.
+ Only cell types with >= 10 barcodes included. Y-axis is log scale"; + +const CELL_ANNOTATION_UMAP_PLOT_TITLE: &str = "UMAP projection of cell types"; +const CELL_ANNOTATION_UMAP_PLOT_HELP: &str = + "UMAP projection of annotated cells. Click legend to highlight
+ a single cell type. Shift+Click to highlight multiple cell types.
+ Double-click to reset plot."; + +const CELL_ANNOTATION_DIFFEXP_TITLE: &str = "Top Features by Cell Type"; +const CELL_ANNOTATION_DIFFEXP_HELP: &str = + "Differential expression analysis identifies, for each cell type, genes that are more highly expressed in that cell type relative to the rest of the sample.
+ Log2 Fold-Change (L2FC): An estimate of the log2 ratio of expression of a gene in a cell type to the mean of all other cell types. A value of 1 indicates + 2-fold greater expression in the cell type of interest.
+ P-Value: A measure of the statistical significance of the expression difference, after correcting for multiple tests to avoid false positives.
+ How to use this table: Click on any column to sort data by that feature. Genes not meeting our criteria (L2FC < 0 or FDR-adjusted p-value >= 0.10) + are shown in gray. For a complete look at the data, check the 'differential_expression.csv' files from our analysis pipeline."; + +const CELL_TYPING_CLOUPE_NAME: &str = "Cell Types"; +const CELL_TYPING_BETA_SUFFIX: &str = "(beta)"; +#[derive(Serialize, Deserialize, Clone)] +pub struct CellAnnotationMetrics { + pub cell_annotation_model: String, + pub cell_annotation_tree_version_used: String, + pub cell_annotation_display_map_version_used: String, + pub cell_annotation_frac_returned_bcs: Option, + pub cell_annotation_success: Option, + pub cell_annotation_differential_expression: Option, + pub cell_annotation_beta_model: bool, + pub cell_annotation_model_developer: String, + pub pipeline_version: String, +} + +impl CellAnnotationMetrics { + pub fn get_table(&self) -> Vec<(String, String)> { + vec![ + ( + "Pipeline version".to_string(), + self.pipeline_version.clone(), + ), + ( + "Cell annotation model".to_string(), + self.cell_annotation_model.clone(), + ), + ] + } + + pub(crate) fn generate_disclaiming_banner(&self) -> Option { + if self.cell_annotation_beta_model { + let disclaimer = if self.cell_annotation_model_developer.contains("Broad") { + format!("{CELL_ANNOTATION_DISCLAIMER_STRING}\n{CELL_ANNOTATION_BROAD_MODEL}") + } else { + CELL_ANNOTATION_DISCLAIMER_STRING.to_string() + }; + + Some(InlineHelp::with_content(disclaimer)) + } else { + None + } + } + + pub(crate) fn generate_disclaimer_html_fragment(&self) -> Option { + if self.cell_annotation_beta_model { + let disclaimer = if self.cell_annotation_model_developer.contains("Broad") { + format!("{CELL_ANNOTATION_DISCLAIMER_STRING}\n{CELL_ANNOTATION_BROAD_MODEL}") + } else { + CELL_ANNOTATION_DISCLAIMER_STRING.to_string() + }; + + Some(disclaimer) + } else { + None + } + } + + pub(crate) fn get_cloupe_track_name(&self) -> String { + if self.cell_annotation_beta_model { + format!("{CELL_TYPING_CLOUPE_NAME} {CELL_TYPING_BETA_SUFFIX}") + } else { + CELL_TYPING_CLOUPE_NAME.to_string() + } + } +} + +pub(crate) fn generate_cell_type_barcharts_from_json( + json_file: &JsonFile, +) -> Result> { + generate_cell_type_barchart_from_value(json_file.read()?) +} +pub(crate) fn generate_cell_type_barchart_from_value( + value: Value, +) -> Result> { + Ok(WithTitle { + title: TitleWithHelp { + title: CELL_ANNOTATION_INTERACTIVE_BARCHART_TITLE.to_string(), + help: CELL_ANNOTATION_INTERACTIVE_BARCHART_HELP.to_string(), + } + .into(), + inner: VegaLitePlot { + spec: value, + actions: Some(Value::Bool(false)), + renderer: None, + }, + }) +} + +pub(crate) fn generate_cell_type_violin_plot_from_json( + json_file: &JsonFile, +) -> Result> { + generate_cell_type_violin_plot_from_value(json_file.read()?) +} +pub(crate) fn generate_cell_type_violin_plot_from_value( + value: Value, +) -> Result> { + Ok(WithTitle { + title: TitleWithHelp { + title: CELL_ANNOTATION_VIOLIN_PLOT_TITLE.to_string(), + help: CELL_ANNOTATION_VIOLIN_PLOT_HELP.to_string(), + } + .into(), + inner: VegaLitePlot { + spec: value, + actions: Some(Value::Bool(false)), + renderer: None, + }, + }) +} + +pub(crate) fn generate_cell_type_umap_plot_from_json( + json_file: &JsonFile, +) -> Result> { + generate_cell_type_umap_plot_from_value(json_file.read()?) +} +pub(crate) fn generate_cell_type_umap_plot_from_value( + value: Value, +) -> Result> { + Ok(WithTitle { + title: TitleWithHelp { + title: CELL_ANNOTATION_UMAP_PLOT_TITLE.to_string(), + help: CELL_ANNOTATION_UMAP_PLOT_HELP.to_string(), + } + .into(), + inner: VegaLitePlot { + spec: value, + actions: Some(Value::Bool(false)), + renderer: None, + }, + }) +} + +pub(crate) fn generate_cell_type_diffexp_from_json( + json_file: &JsonFile, +) -> Result> { + generate_cell_type_diffexp_from_value(json_file.read()?) +} +pub(crate) fn generate_cell_type_diffexp_from_value( + value: DifferentialExpressionTable, +) -> Result> { + Ok(WithTitle { + title: TitleWithHelp { + title: CELL_ANNOTATION_DIFFEXP_TITLE.to_string(), + help: CELL_ANNOTATION_DIFFEXP_HELP.to_string(), + } + .into(), + inner: value, + }) +} + +pub(crate) fn generate_cell_type_metrics( + cell_annotation_metrics: CellAnnotationMetrics, +) -> Result> { + Ok(WithTitle { + title: TitleWithHelp { + title: CELL_ANNOTATION_METRICS_TABLE_TITLE.to_string(), + help: CELL_ANNOTATION_METRICS_TABLE_HELP.to_string(), + } + .into(), + inner: TableMetric { + rows: cell_annotation_metrics.get_table(), + }, + }) +} + +pub(crate) fn generate_cell_type_parameter_table( + cell_annotation_metrics: CellAnnotationMetrics, +) -> Result { + Ok(TableMetric { + rows: cell_annotation_metrics.get_table(), + }) +} + +pub(crate) fn generate_cas_failure_alert() -> Alert { + Alert { + level: AlertLevel::Error, + title: CELL_ANNOTATION_FAILURE_TITLE.to_string(), + formatted_value: None, + message: CELL_ANNOTATION_FAILURE_MESSAGE.to_string(), + } +} + +pub(crate) fn generate_cas_de_warn_alert() -> Alert { + Alert { + level: AlertLevel::Error, + title: CELL_ANNOTATION_DE_WARN_TITLE.to_string(), + formatted_value: None, + message: CELL_ANNOTATION_DE_WARN_MESSAGE.to_string(), + } +} + +pub(crate) fn generate_cas_bc_mismatch_alert(alert_string: String) -> Alert { + Alert { + level: AlertLevel::Warn, + title: CELL_ANNOTATION_BC_MISMATCH_WARN_TITLE.to_string(), + formatted_value: None, + message: alert_string, + } +} diff --git a/lib/rust/cr_lib/src/detect_chemistry/chemistry_filter.rs b/lib/rust/cr_lib/src/detect_chemistry/chemistry_filter.rs index 8cb9656..0d53a6a 100644 --- a/lib/rust/cr_lib/src/detect_chemistry/chemistry_filter.rs +++ b/lib/rust/cr_lib/src/detect_chemistry/chemistry_filter.rs @@ -118,7 +118,13 @@ impl DetectChemistryUnit { let mut read_sampler = ReservoirSampler::new(detect_chemistry_sample_reads, RANDOM_SEED); for fastq in &self.fastqs { - for read_pair in ReadPairIter::from_fastq_files(fastq)? { + let read_pair_iter = ReadPairIter::from_fastq_files(fastq)?; + if read_pair_iter.get_is_single_ended() { + println!("{self} is a single-end library!"); + } else { + println!("{self} is a paired-end library!"); + } + for read_pair in read_pair_iter { read_sampler.add(read_pair?); if read_sampler.num_items_seen() >= detect_chemistry_total_reads { return Ok(read_sampler.done()); @@ -128,14 +134,15 @@ impl DetectChemistryUnit { Ok(read_sampler.done()) } - pub fn check_read_identity(&self) -> Result> { + pub fn check_read_identity(&self) -> Result> { const MAX_READ_PAIRS: usize = 100; let mut result = vec![]; for fastq in &self.fastqs { let read_pairs: Vec<_> = ReadPairIter::from_fastq_files(fastq)? .take(MAX_READ_PAIRS) .try_collect()?; - result.push(check_read_identity(self, read_pairs.as_slice())?); + let (r1_hash, r2_hash) = check_read_identity(self, read_pairs.as_slice())?; + result.push((fastq, (r1_hash, r2_hash))); } Ok(result) } diff --git a/lib/rust/cr_lib/src/detect_chemistry/errors.rs b/lib/rust/cr_lib/src/detect_chemistry/errors.rs index 7086d8b..5193c95 100644 --- a/lib/rust/cr_lib/src/detect_chemistry/errors.rs +++ b/lib/rust/cr_lib/src/detect_chemistry/errors.rs @@ -8,7 +8,7 @@ use fastq_set::WhichRead; use itertools::{multizip, Itertools}; use metric::{TxHashMap, TxHashSet}; use ordered_float::NotNan; -use std::cmp::Ordering; +use std::cmp::Reverse; use std::fmt; use std::iter::Iterator; @@ -73,9 +73,10 @@ impl fmt::Display for DetectChemistryErrors { unit, } => format!( "There were not enough reads to auto detect the chemistry: {unit}\n\ - Note that you can avoid auto detection by specifying the specific chemistry type and version.\n\ - - Minimum number of required reads = {min_reads}\n\ - - Number of reads available = {num_reads}" + Note that you can avoid auto detection by specifying the specific chemistry type \ + and version.\n\ + - Minimum number of required reads = {min_reads}\n\ + - Number of reads available = {num_reads}" ), ChemistryNotAllowed { input, allowed } => format!( "The chemistry name '{input}' is not allowed in this pipeline. Allowed values:\n{}", @@ -125,13 +126,13 @@ impl fmt::Display for DetectChemistryErrors { } else { let frac_matches_str = frac_matches .iter() - .sorted_by_key(|(k, &v)| (NotNan::new(-v).unwrap(), *k)) + .sorted_by_key(|(&k, &v)| (Reverse(NotNan::new(v).unwrap()), k)) .map(|(k, v)| format!("- {:.1}% for chemistry {k}", 100.0 * v)) - .join("\n"); + .format("\n"); format!( - "An extremely low rate of correct barcodes was observed for all the \ - candidate chemistry choices for the input: {unit}. Please check your input data.\ - \n{frac_matches_str}" + "An extremely low rate of correct barcodes was observed for \ + all the candidate chemistry choices for the input: {unit}. \ + Please check your input data.\n{frac_matches_str}" ) } } @@ -145,14 +146,15 @@ impl fmt::Display for DetectChemistryErrors { multizip((units, per_unit_chems)) .map(|(u, c)| format!( "One of [{}] is compatible with {u}", - c.iter().sorted().join(", ") + c.iter().sorted().format(", ") )) - .join("\n -") + .format("\n -") ), NotEnoughMapping { stats, unit, chems } => format!( - "Unable to distinguish between [{}] chemistries based on the R2 read mapping for {unit}.\n{stats}\ - \n\n{}\n\nPlease validate the inputs and/or specify the chemistry via the --chemistry argument.\n", - chems.iter().sorted().join(", "), + "Unable to distinguish between [{}] chemistries based on the R2 read \ + mapping for {unit}.\n{stats}\n\n{}\n\nPlease validate the inputs and/or specify \ + the chemistry via the --chemistry argument.", + chems.iter().sorted().format(", "), MappingStats::help_text(), ), NotEnoughReadLength { @@ -161,23 +163,22 @@ impl fmt::Display for DetectChemistryErrors { chems, max_lengths, } => format!( - "The read lengths are incompatible with all the chemistries for {}.\n{}\n\ - The minimum read length for different chemistries are:\n{}\n\nWe expect that at \ - least 50% of the reads exceed the minimum length.\n{}", - unit, - stats, + "The read lengths are incompatible with all the chemistries for {unit}.\n\ + {stats}\n\ + The minimum read length for different chemistries are:\n{}\n\n\ + We expect that at least 50% of the reads exceed the minimum length.\n{}", chems .iter() .sorted() - .map(|c| { - let def = ChemistryDef::named(*c); - let read_len_str = WHICH_LEN_READS + .map(|&c| { + let def = ChemistryDef::named(c); + let read_lengths = WHICH_LEN_READS .iter() - .map(|which| format!("{which}: {}", def.min_read_length(*which))) - .join(", "); - format!("{:8} - {read_len_str}", c.to_string()) + .map(|&which| format!("{which}: {}", def.min_read_length(which))) + .format(", "); + format!("{c:8} - {read_lengths}") }) - .join("\n"), + .format("\n"), if max_lengths.is_empty() { String::new() } else { @@ -186,7 +187,7 @@ impl fmt::Display for DetectChemistryErrors { WHICH_LEN_READS .iter() .filter_map(|r| max_lengths.get(r).map(|l| format!("- {r}: {l} bases"))) - .join("\n") + .format("\n") ) } ), @@ -197,28 +198,21 @@ impl fmt::Display for DetectChemistryErrors { min_lengths, max_lengths, } => format!( - "The read lengths are incompatible with all features described in the feature reference for {}.\n{}\n\ - The minimum read length for different feature types are:\n{}\n\nWe expect that at \ - least 50% of the reads exceed the minimum length.\n{}", - unit, - stats, + "The read lengths are incompatible with all features described in the \ + feature reference for {unit}.\n{stats}\n\ + The minimum read length for different feature types are:\n{}\n\n\ + We expect that at least 50% of the reads exceed the minimum length.\n{}", min_lengths .iter() - .sorted_by_key(|x| x.0) - .flat_map(|(&ft, m)| { - m.iter() - .sorted_by(|(&a, _), (&b, _)| { - if a == b { - Ordering::Equal - } else if a == WhichRead::R1 { - Ordering::Less - } else { - Ordering::Greater - } - }) - .map(move |(&wr, &sz)| format!("{:26} - {sz}", format!("{ft}/{wr}"))) + .sorted_by_key(|&(feature_type, _min_lengths)| feature_type) + .flat_map(|(feature_type, min_lengths)| { + min_lengths.iter() + .sorted_by_key(|&(&which_read, _)| which_read as usize) + .map(move |(which_read, length)| + format!("{:26} - {length}", format!("{feature_type}/{which_read}")) + ) }) - .join("\n"), + .format("\n"), if max_lengths.is_empty() { String::new() } else { @@ -227,7 +221,7 @@ impl fmt::Display for DetectChemistryErrors { WHICH_LEN_READS .iter() .filter_map(|r| max_lengths.get(r).map(|l| format!("- {r}: {l} bases"))) - .join("\n") + .format("\n") ) }, ), @@ -236,11 +230,11 @@ impl fmt::Display for DetectChemistryErrors { ), ProbeBarcodeMixture { mixture, unit } => format!( "We detected multiple probe barcodes in: {}\n\ - Singleplex Fixed RNA Profiling chemistry is invalid with >1 probe barcode. \ - If this is a multiplex Fixed RNA Profiling library please include a [samples] section defining the inputs.\n\ - The following top probe barcodes were observed: {}.\n", + Singleplex Flex chemistry is invalid with >1 probe barcode. If this is a \ + multiplex Flex library please include a [samples] section defining the inputs.\n\ + The following top probe barcodes were observed: {}.\n", unit, - mixture.iter().sorted().join(", ") + mixture.iter().sorted().format(", ") ), }; write!(f, "{msg}") diff --git a/lib/rust/cr_lib/src/detect_chemistry/identity_check.rs b/lib/rust/cr_lib/src/detect_chemistry/identity_check.rs index 29838ee..bcdae6f 100644 --- a/lib/rust/cr_lib/src/detect_chemistry/identity_check.rs +++ b/lib/rust/cr_lib/src/detect_chemistry/identity_check.rs @@ -1,6 +1,4 @@ -//! -//! A module to check that R1 != R2 (detect accidental duplication of fastqs) -//! +//! Detect accidental duplication of FASTQ files. use super::chemistry_filter::DetectChemistryUnit; use anyhow::{bail, Result}; @@ -8,6 +6,7 @@ use fastq_set::read_pair::{ReadPair, ReadPart, WhichRead}; use metric::{TxHashMap, TxHasher}; use std::collections::hash_map::Entry; use std::hash::Hasher; +use std::path::Path; pub(crate) fn check_read_identity( unit: &DetectChemistryUnit, @@ -15,8 +14,8 @@ pub(crate) fn check_read_identity( ) -> Result<(u64, u64)> { use ReadPart::{Header, Qual, Seq}; use WhichRead::{R1, R2}; - let mut r1_hasher = TxHasher::default(); - let mut r2_hasher = TxHasher::default(); + let mut r1_hasher = TxHasher::hasher(); + let mut r2_hasher = TxHasher::hasher(); for read_pair in read_pairs { let _ = read_pair.get(R1, Header).map(|x| r1_hasher.write(x)); let _ = read_pair.get(R1, Seq).map(|x| r1_hasher.write(x)); @@ -44,15 +43,33 @@ pub(crate) fn check_read_identity( } pub(crate) fn check_fastq_identity(units: &[DetectChemistryUnit]) -> Result<()> { + fn format_unit_fastq( + unit: &DetectChemistryUnit, + fastq: &fastq_set::read_pair_iter::InputFastqs, + ) -> String { + format!( + "{}\"{}\"", + match unit.group { + Some(ref g) => format!("{g} in "), + None => String::new(), + }, + Path::new(&fastq.r1).parent().unwrap().display(), + ) + } let mut hashes = TxHashMap::default(); for unit in units { - for pair_hash in unit.check_read_identity()? { + for (fastq, pair_hash) in unit.check_read_identity()? { match hashes.entry(pair_hash) { - Entry::Occupied(o) => { - bail!("Duplicate FASTQs found between {} and {}", unit, o.get()); - } Entry::Vacant(v) => { - v.insert(unit); + v.insert((unit, fastq)); + } + Entry::Occupied(o) => { + let (o_unit, o_fastq) = o.get(); + bail!( + "duplicate FASTQs found between {} and {}", + format_unit_fastq(unit, fastq), + format_unit_fastq(o_unit, o_fastq), + ); } } } diff --git a/lib/rust/cr_lib/src/detect_chemistry/length_filter.rs b/lib/rust/cr_lib/src/detect_chemistry/length_filter.rs index c37b8c6..98f902e 100644 --- a/lib/rust/cr_lib/src/detect_chemistry/length_filter.rs +++ b/lib/rust/cr_lib/src/detect_chemistry/length_filter.rs @@ -79,7 +79,9 @@ impl<'a> ChemistryFilter<'a> for LengthFilter<'a> { &self, mut result: TxHashSet, ) -> Result, DetectChemistryErrors> { - use ChemistryName::{FivePrimePE, FivePrimePEV3, FivePrimeR2, FivePrimeR2V3, VdjPE, VdjR2}; + use ChemistryName::{ + FivePrimePE, FivePrimePEV3, FivePrimeR2, FivePrimeR2V3, VdjPE, VdjPEV3, VdjR2, VdjR2V3, + }; if result.contains(&FivePrimePE) { result.remove(&FivePrimeR2); } @@ -89,6 +91,9 @@ impl<'a> ChemistryFilter<'a> for LengthFilter<'a> { if result.contains(&VdjPE) { result.remove(&VdjR2); } + if result.contains(&VdjPEV3) { + result.remove(&VdjR2V3); + } Ok(result) } } @@ -136,7 +141,7 @@ impl<'a> LengthFilter<'a> { let mut read_length_histograms = TxHashMap::default(); for rp in read_pairs { for &which_read in &WHICH_LEN_READS { - let max_len = max_lengths.get(&which_read).unwrap_or(&std::usize::MAX); + let max_len = max_lengths.get(&which_read).unwrap_or(&usize::MAX); read_length_histograms .entry(which_read) .or_insert_with(SimpleHistogram::default) diff --git a/lib/rust/cr_lib/src/detect_chemistry/mapping_filter.rs b/lib/rust/cr_lib/src/detect_chemistry/mapping_filter.rs index 965dcaa..34d60cf 100644 --- a/lib/rust/cr_lib/src/detect_chemistry/mapping_filter.rs +++ b/lib/rust/cr_lib/src/detect_chemistry/mapping_filter.rs @@ -40,8 +40,8 @@ const MIN_MARGIN: i64 = 2; impl MappingStats { pub(crate) fn compatible_chemistries(&self) -> TxHashSet { use ChemistryName::{ - FivePrimeHT, FivePrimePE, FivePrimePEV3, FivePrimeR2, ThreePrimeV2, ThreePrimeV3, - ThreePrimeV3HT, ThreePrimeV3LT, + FivePrimeHT, FivePrimePE, FivePrimePEV3, FivePrimeR2, ThreePrimeV2, ThreePrimeV3CS1, + ThreePrimeV3HTCS1, ThreePrimeV3HTPolyA, ThreePrimeV3LT, ThreePrimeV3PolyA, }; if (self.conf_mapped_reads < MIN_CONF_MAPPED_READS as i64) || ((self.conf_mapped_reads as f64) @@ -49,7 +49,14 @@ impl MappingStats { { set![] } else if self.sense_reads > MIN_MARGIN * self.antisense_reads { - set![ThreePrimeV2, ThreePrimeV3, ThreePrimeV3LT, ThreePrimeV3HT] + set![ + ThreePrimeV2, + ThreePrimeV3PolyA, + ThreePrimeV3CS1, + ThreePrimeV3LT, + ThreePrimeV3HTPolyA, + ThreePrimeV3HTCS1 + ] } else if self.antisense_reads > MIN_MARGIN * self.sense_reads { set![FivePrimeR2, FivePrimePE, FivePrimePEV3, FivePrimeHT] } else { diff --git a/lib/rust/cr_lib/src/detect_chemistry/probe_bc_check.rs b/lib/rust/cr_lib/src/detect_chemistry/probe_bc_check.rs index 1f7682e..e68344a 100644 --- a/lib/rust/cr_lib/src/detect_chemistry/probe_bc_check.rs +++ b/lib/rust/cr_lib/src/detect_chemistry/probe_bc_check.rs @@ -52,7 +52,7 @@ pub(crate) fn validate_no_probe_bc_mixture_in_sfrp( let chem_def = ChemistryDef::named(chemistry); let bc_range = chem_def.barcode_range().probe(); - let whitelist_source = chem_def.barcode_whitelist().probe().as_source(true)?; + let whitelist_source = chem_def.barcode_whitelist().probe().as_source()?; let id_map = whitelist_source.as_raw_seq_to_id()?; let whitelist = whitelist_source.as_whitelist()?; @@ -62,7 +62,7 @@ pub(crate) fn validate_no_probe_bc_mixture_in_sfrp( .filter_map(|read_pair| { read_pair .get_range(bc_range, ReadPart::Seq) - .and_then(|seq| whitelist.match_to_whitelist(BcSegSeq::from_bytes(seq))) + .and_then(|seq| whitelist.match_to_whitelist(BcSegSeq::from_bytes(seq), false)) .map(|bc_in_wl| &id_map[&bc_in_wl]) }) .collect(); @@ -70,9 +70,10 @@ pub(crate) fn validate_no_probe_bc_mixture_in_sfrp( let num_valid_bcs = bc_counts.raw_counts().sum(); if usize::try_from(num_valid_bcs)? < MIN_VALID_PROBE_BCS { print!( - "Skipping probe BC check in {unit}, because there were not enough reads with valid probe barcodes to confirm singleplex Fixed RNA Profiling chemistry.\n\ - - Minimum number of required reads with valid probe barcodes = {MIN_VALID_PROBE_BCS}\n\ - - Number of reads with valid probe barcodes available = {num_valid_bcs}\n", + "Skipping probe BC check in {unit}, because there were not enough reads with valid \ + probe barcodes to confirm singleplex Flex chemistry.\n\ + - Minimum number of required reads with valid probe barcodes = {MIN_VALID_PROBE_BCS}\n\ + - Number of reads with valid probe barcodes available = {num_valid_bcs}\n", ); continue; } diff --git a/lib/rust/cr_lib/src/detect_chemistry/probe_bc_pairing.rs b/lib/rust/cr_lib/src/detect_chemistry/probe_bc_pairing.rs index a482894..abb54a5 100644 --- a/lib/rust/cr_lib/src/detect_chemistry/probe_bc_pairing.rs +++ b/lib/rust/cr_lib/src/detect_chemistry/probe_bc_pairing.rs @@ -5,7 +5,9 @@ use crate::barcode_overlap::{ ProbeBarcodeGelBeadGrouper, }; use anyhow::Result; -use barcode::whitelist::{categorize_multiplexing_barcode_id, BarcodeId, MultiplexingBarcodeType}; +use barcode::whitelist::{ + categorize_rtl_multiplexing_barcode_id, BarcodeId, RTLMultiplexingBarcodeType, +}; use barcode::{BarcodeConstruct, BcSegSeq, WhitelistSource}; use cr_types::chemistry::ChemistryDefs; use cr_types::LibraryType; @@ -39,7 +41,7 @@ pub fn detect_probe_barcode_pairing( .map(|(library_type, chemistry_def)| { anyhow::Ok(( library_type, - WhitelistSource::construct(chemistry_def.barcode_whitelist(), false)?, + WhitelistSource::construct(chemistry_def.barcode_whitelist())?, )) }) .try_collect()?; @@ -69,7 +71,7 @@ pub fn detect_probe_barcode_pairing( .map(|seqs| seqs.map(BcSegSeq::from_bytes)) .filter_map(move |seqs| { seqs.zip(whitelist) - .map_option(|(seq, whitelist)| whitelist.match_to_whitelist(seq)) + .map_option(|(seq, whitelist)| whitelist.match_to_whitelist(seq, false)) }) .map(|barcode_components| match barcode_components { BarcodeConstruct::GelBeadAndProbe(x) => x, @@ -129,13 +131,15 @@ pub fn get_rtl_and_ab_barcode_from_row( row: &FRPGemBarcodeOverlapRow, ) -> Option<(BarcodeId, BarcodeId)> { match ( - categorize_multiplexing_barcode_id(&row.barcode1_id), - categorize_multiplexing_barcode_id(&row.barcode2_id), + categorize_rtl_multiplexing_barcode_id(&row.barcode1_id) + .expect("Missing Multiplexing Barcode!"), + categorize_rtl_multiplexing_barcode_id(&row.barcode2_id) + .expect("Missing Multiplexing Barcode!"), ) { - (MultiplexingBarcodeType::RTL, MultiplexingBarcodeType::Antibody) => { + (RTLMultiplexingBarcodeType::Gene, RTLMultiplexingBarcodeType::Antibody) => { Some((row.barcode1_id, row.barcode2_id)) } - (MultiplexingBarcodeType::Antibody, MultiplexingBarcodeType::RTL) => { + (RTLMultiplexingBarcodeType::Antibody, RTLMultiplexingBarcodeType::Gene) => { Some((row.barcode2_id, row.barcode1_id)) } _ => None, diff --git a/lib/rust/cr_lib/src/detect_chemistry/whitelist_filter.rs b/lib/rust/cr_lib/src/detect_chemistry/whitelist_filter.rs index 2a499d5..4a37bff 100644 --- a/lib/rust/cr_lib/src/detect_chemistry/whitelist_filter.rs +++ b/lib/rust/cr_lib/src/detect_chemistry/whitelist_filter.rs @@ -1,7 +1,7 @@ use super::chemistry_filter::{ChemistryFilter, DetectChemistryUnit}; use super::errors::DetectChemistryErrors; use anyhow::Result; -use barcode::{BarcodeConstruct, BcSegSeq, Whitelist, WhitelistSpec}; +use barcode::{BarcodeConstruct, BcSegSeq, Whitelist, WhitelistSource, WhitelistSpec}; use cr_types::chemistry::{ChemistryDef, ChemistryName}; use fastq_set::read_pair::{ReadPair, ReadPart, RpRange}; use itertools::Itertools; @@ -40,6 +40,7 @@ impl<'a> WhitelistMatchFilter<'a> { .iter() .map(|def| (def.name, index_map[&def.barcode_whitelist()])) .collect(); + Ok(WhitelistMatchFilter { allowed_chems, chem_defs, @@ -155,7 +156,14 @@ pub struct WhitelistMatcher { impl WhitelistMatcher { pub fn new(barcode_whitelist: BarcodeConstruct<&WhitelistSpec>) -> Result { Ok(WhitelistMatcher { - whitelist: Whitelist::construct(barcode_whitelist, false)?, + // Load this whitelist as a "plain" whitelist, regardless of type. + // + // This is sufficient for checking membership in the whitelist, but neglects + // all translation information. Using this method instead of as_whitelist + // reduces memory consumption since we are working in a context where + // we only care about matching to the whitelist, but not using translation. + whitelist: WhitelistSource::construct(barcode_whitelist)? + .map_result(|source| Ok(Whitelist::Plain(source.as_set()?)))?, }) } @@ -177,18 +185,12 @@ impl WhitelistMatcher { stats } - pub fn match_to_whitelist( - &self, - seqs: BarcodeConstruct<&[u8]>, - ) -> Option> { - self.whitelist - .as_ref() - .zip(seqs) - .map_option(|(wl, seq)| wl.match_to_whitelist(BcSegSeq::from_bytes(seq))) - } - fn contains(&self, sseq: BarcodeConstruct<&[u8]>) -> bool { // NOTE: This is robust to a single N cycle - self.match_to_whitelist(sseq).is_some() + self.whitelist + .as_ref() + .zip(sseq) + .map_option(|(wl, seq)| wl.match_to_whitelist(BcSegSeq::from_bytes(seq), false)) + .is_some() } } diff --git a/lib/rust/cr_lib/src/gdna_utils.rs b/lib/rust/cr_lib/src/gdna_utils.rs index 85172e0..4d2ceac 100644 --- a/lib/rust/cr_lib/src/gdna_utils.rs +++ b/lib/rust/cr_lib/src/gdna_utils.rs @@ -4,11 +4,11 @@ use anyhow::Result; use barcode::Barcode; use cr_h5::molecule_info::MoleculeInfoIterator; use cr_types::probe_set::{ProbeRegion, ProbeSetReference}; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::types::PROBE_IDX_SENTINEL_VALUE; use cr_types::utils::calculate_median_of_sorted; use cr_types::{CountShardFile, ProbeBarcodeCount}; use itertools::{process_results, Itertools}; -use martian_filetypes::tabular_file::CsvFile; use metric::{MeanMetric, TxHashMap, TxHashSet}; use ndarray::prelude::*; use ndarray::Array2; @@ -48,13 +48,11 @@ pub struct MetricsComputed { /// used. pub fn compute_gdna_metrics( mol_info_path: &Path, - probe_set_path: &Path, - reference_path: &Path, -) -> MetricsComputed { + probe_set_path: &TargetSetFile, +) -> Result { // Reading the probe set reference let probe_set_reference: ProbeSetReference = - ProbeSetReference::from_path(probe_set_path, reference_path, 1) - .expect("ProbeSetReference could not be made from path"); + ProbeSetReference::from_path(probe_set_path, None, 1)?; let probes = &probe_set_reference.sorted_probes(); // Dictionary with number of spliced probes that every gene has @@ -180,13 +178,13 @@ pub fn compute_gdna_metrics( as f64 / total_number_of_umis as f64; - MetricsComputed { + Ok(MetricsComputed { unspliced_counts: data_to_fit.get_unspliced_counts(), spliced_counts: data_to_fit.get_spliced_counts(), estimated_gdna_per_probe, estimated_percentage_of_gdna_umi, estimated_model, - } + }) } /// Struct to store spliced and unspliced counts corresponding @@ -205,8 +203,8 @@ struct SplicedUnsplicedCounts { fn collate_probe_metrics( probe_barcode_path: &[CountShardFile], filtered_barcodes: &TxHashSet, - probe_set_path: &CsvFile<()>, - reference_path: &Path, + probe_set_path: &TargetSetFile, + reference_path: Option<&Path>, ) -> Result> { // Read in the probe set reference and get them in sorted order - the order of the probe_idx let psr: ProbeSetReference = ProbeSetReference::from_path(probe_set_path, reference_path, 1) @@ -251,6 +249,10 @@ fn collate_probe_metrics( gene_name: probe.gene.name.clone(), pass_filter: !probe.is_excluded_probe(), probe_idx, + probe_type: probe.probe_type, + ref_sequence_name: probe.ref_sequence_name.clone(), + ref_sequence_pos: probe.ref_sequence_pos, + cigar_string: probe.cigar_string.clone(), }) .collect()) } @@ -376,8 +378,8 @@ fn compute_filtered_probes(per_probe_metrics: Vec) -> Result, - probe_set: &CsvFile<()>, - reference_path: &Path, + probe_set: &TargetSetFile, + reference_path: Option<&Path>, ) -> Result> { let raw_per_probe_metrics = collate_probe_metrics( probe_barcode_counts, diff --git a/lib/rust/cr_lib/src/lib.rs b/lib/rust/cr_lib/src/lib.rs index db44412..71bedf6 100644 --- a/lib/rust/cr_lib/src/lib.rs +++ b/lib/rust/cr_lib/src/lib.rs @@ -49,6 +49,11 @@ #[macro_use] extern crate itertools; +use martian_derive::martian_filetype; +use serde::{Deserialize, Serialize}; + +martian_filetype! {HtmlFile, "html"} + mod align_and_count_metrics; pub mod align_metrics; @@ -67,6 +72,9 @@ mod barcode_overlap; /// Barcode sorting workflow used by MAKE_SHARD pub mod barcode_sort; +/// Struct containing cell annotation metrics for all figures +mod cell_annotation_ws_parameters; + pub mod detect_chemistry; /// Read environment variables. @@ -84,6 +92,9 @@ mod macros; /// Metrics for MAKE_SHARD pub mod make_shard_metrics; +/// Parquet file IO +pub mod parquet_file; + /// Preflight checks and utilities pub mod preflight; diff --git a/lib/rust/cr_lib/src/make_shard_metrics.rs b/lib/rust/cr_lib/src/make_shard_metrics.rs index 8644400..54e679e 100644 --- a/lib/rust/cr_lib/src/make_shard_metrics.rs +++ b/lib/rust/cr_lib/src/make_shard_metrics.rs @@ -1,12 +1,11 @@ use crate::barcode_sort::ReadVisitor; +use crate::SequencingMetrics; use anyhow::Result; use barcode::{Barcode, BarcodeConstruct, BarcodeConstructMetric, BcSegSeq}; use cr_types::chemistry::ChemistryDef; use cr_types::reference::feature_extraction::FeatureExtractor; use cr_types::reference::feature_reference::FeatureReference; use cr_types::rna_read::{RnaChunk, RnaRead}; -use cr_websummary::multi::tables::SequencingMetricsRow; -use cr_websummary::PercentF1; use fastq_set::metric_utils::{PatternCheck, ILLUMINA_QUAL_OFFSET}; use fastq_set::read_pair::{ReadPair, ReadPart, WhichRead}; use json_report_derive::JsonReport; @@ -87,6 +86,10 @@ pub struct MakeShardMetrics { /// Total read pairs per library #[json_report(skip)] total_read_pairs_per_library: TxHashMap, + + /// Fraction of outstanding unknown feature barcode sequences + #[json_report(block)] + unknown_feature_bcs: Option>, } impl MakeShardMetrics { @@ -106,26 +109,44 @@ impl MakeShardMetrics { metrics } - pub fn sequencing_metrics_row(&self, fastq_id: String) -> SequencingMetricsRow { + pub fn sequencing_metrics_for_fastq(&self, fastq_id: String) -> SequencingMetrics { // Only populate muli-part barcode metrics if both GEM and probe barcode are present let (q30_gem, q30_probe) = match self.bc_bases_with_q30_in.inner() { - Some(BarcodeConstruct::GelBeadAndProbe(c)) => ( - Some(PercentF1::from(c.gel_bead)), - Some(PercentF1::from(c.probe)), - ), + Some(BarcodeConstruct::GelBeadAndProbe(c)) => (Some(c.gel_bead), Some(c.probe)), _ => (None, None), }; - SequencingMetricsRow { - fastq_id: Some(fastq_id), - number_of_reads: Some(self.sequenced_reads.count() as usize), - q30_barcode: Some(self.bc_bases_with_q30.into()), + SequencingMetrics { + fastq_id, + number_of_reads: self.sequenced_reads.count() as usize, + q30_barcode: self.bc_bases_with_q30, q30_gem_barcode: q30_gem, q30_probe_barcode: q30_probe, - q30_umi: Some(self.umi_bases_with_q30.into()), - q30_read1: Some(self.read_bases_with_q30.into()), - unprocessed_reads: Some(self.unprocessed_read_pairs as usize), - q30_read2: self.read2_bases_with_q30.map(Into::into), + q30_umi: self.umi_bases_with_q30, + q30_read1: self.read_bases_with_q30, + unprocessed_reads: self.unprocessed_read_pairs as usize, + q30_read2: self.read2_bases_with_q30, + } + } + + pub fn report_unknown_fbc( + &mut self, + library_id: u16, + hist: SimpleHistogram, + min_frac: f64, + ) { + // Report unknown feature barcode sequences that represent a non-trivial fraction of reads per library. + if let Some(total_read_pairs) = self.total_read_pairs_per_library.get(&library_id) { + for (seq, read_count) in &hist { + let frac_reads: f64 = read_count.count() as f64 / *total_read_pairs as f64; + if frac_reads >= min_frac { + self.unknown_feature_bcs + .get_or_insert_with(Default::default) + .insert(seq.clone(), frac_reads); + } + } + } else { + eprintln!("No total read pairs data available for library: {library_id}"); } } } @@ -135,6 +156,7 @@ pub struct MakeShardHistograms { pub(crate) valid_bc_counts: SimpleHistogram, pub(crate) valid_bc_segment_counts: BarcodeConstruct>, pub(crate) r1_lengths: SimpleHistogram, + pub(crate) unknown_feature_bcs: SimpleHistogram, } impl MakeShardHistograms { @@ -143,6 +165,7 @@ impl MakeShardHistograms { valid_bc_counts: SimpleHistogram::default(), r1_lengths: SimpleHistogram::default(), valid_bc_segment_counts: barcode_construct.map(|()| SimpleHistogram::default()), + unknown_feature_bcs: SimpleHistogram::default(), } } @@ -159,9 +182,11 @@ impl MakeShardHistograms { valid_bc_counts, valid_bc_segment_counts, r1_lengths, + unknown_feature_bcs, } = other; self.valid_bc_counts.merge(valid_bc_counts); self.r1_lengths.merge(r1_lengths); + self.unknown_feature_bcs.merge(unknown_feature_bcs); self.valid_bc_segment_counts .as_mut_ref() .zip(valid_bc_segment_counts) @@ -169,14 +194,14 @@ impl MakeShardHistograms { .for_each(|(this, that)| this.merge(that)); } fn observe(&mut self, rna_read: &RnaRead) { - if rna_read.barcode().is_valid() { + if rna_read.barcode_is_valid() { self.valid_bc_counts.observe_owned(rna_read.barcode()); } if let Some(r1) = rna_read.read.get(WhichRead::R1, ReadPart::Seq) { self.r1_lengths.observe(&r1.len()); } rna_read - .segmented_barcode() + .segmented_barcode .segments() .zip(self.valid_bc_segment_counts.as_mut_ref()) .iter() @@ -319,7 +344,7 @@ impl<'a> ReadVisitor for MakeShardVisitor<'a> { .sseq() .has_polyt_suffix(UMI_POLYT_SUFFIX_LENGTH) .into(), - miss_whitelist_barcode_property: (!rna_read.barcode().is_valid()).into(), + miss_whitelist_barcode_property: (!rna_read.barcode_is_valid()).into(), sequenced_reads: 1.into(), vdj_total_read_pairs: i64::from(rna_read.library_type.is_vdj()), total_read_pairs_per_library: std::iter::once(( @@ -327,6 +352,7 @@ impl<'a> ReadVisitor for MakeShardVisitor<'a> { 1, )) .collect(), + unknown_feature_bcs: Default::default(), unprocessed_read_pairs: 0, }; @@ -341,6 +367,11 @@ impl<'a> ReadVisitor for MakeShardVisitor<'a> { { if res.ids.len() == 1 { self.feature_counts[res.ids[0].0] += 1; + } else { + let raw_feature_bc = String::from_utf8(res.barcode).unwrap(); + self.histograms + .unknown_feature_bcs + .observe_owned(raw_feature_bc); } } diff --git a/lib/rust/cr_lib/src/parquet_file.rs b/lib/rust/cr_lib/src/parquet_file.rs new file mode 100644 index 0000000..c370ce6 --- /dev/null +++ b/lib/rust/cr_lib/src/parquet_file.rs @@ -0,0 +1,440 @@ +use anyhow::Result; +use martian::MartianFileType; +use martian_derive::martian_filetype; +use parquet::basic::{Compression, ZstdLevel}; +use parquet::file::metadata::ParquetMetaData; +use parquet::file::properties::WriterProperties; +use parquet::file::reader::FileReader; +use parquet::file::serialized_reader::SerializedFileReader; +use parquet::file::writer::SerializedFileWriter; +use parquet::record::{RecordReader, RecordWriter, Row}; +use parquet_derive::ParquetRecordWriter; +use serde::{Deserialize, Serialize}; +use std::fs::File; +use std::io::BufWriter; + +martian_filetype! {ParquetFile, "parquet"} + +impl ParquetFile { + /// Instantiate a writer with a row group size. + /// + /// The row group size should be chosen based on a balance between the amount of chunking and + /// compression/buffering. + /// From https://parquet.apache.org/docs/file-format/configurations/#row-group-size + /// Larger row groups allow for larger column chunks which makes it possible to do larger + /// sequential IO. Larger groups also require more buffering in the write path + /// (or a two pass write). We recommend large row groups (512MB - 1GB). + pub fn writer(&self, row_group_size: usize) -> Result> + where + for<'a> &'a [T]: RecordWriter, + { + assert!(row_group_size > 0); + // T::schema() would have been a better design in ParquetRecordWriter + let empty: &[T] = &[]; + Ok(ParquetWriter { + writer: Some(SerializedFileWriter::new( + self.buf_writer()?, + empty.schema()?, + WriterProperties::builder() + .set_compression(Compression::ZSTD(ZstdLevel::try_new(3)?)) + .build() + .into(), + )?), + row_group_size, + cache: Vec::with_capacity(row_group_size), + }) + } + + /// Instantiate a reader. It is often better to use polars or similar libraries for reading + /// parquet files. + /// + /// This struct exists in case it is more convenient to operate on a vec of struct rather than + /// a dataframe. + pub fn reader(&self) -> Result> + where + Vec: RecordReader, + { + let reader = SerializedFileReader::try_from(File::open(self.as_ref())?)?; + Ok(ParquetReader::new(reader)) + } + + pub fn metadata(&self) -> Result { + let reader = SerializedFileReader::try_from(File::open(self.as_ref())?)?; + Ok(reader.metadata().clone()) + } +} + +pub struct ParquetWriter +where + for<'a> &'a [T]: RecordWriter, +{ + writer: Option>>, + row_group_size: usize, + cache: Vec, +} + +impl ParquetWriter +where + for<'a> &'a [T]: RecordWriter, +{ + pub fn push(&mut self, item: T) -> Result<()> { + self.cache.push(item); + if self.cache.len() >= self.row_group_size { + self.write_and_clear_cache()?; + } + Ok(()) + } + + pub fn push_all(&mut self, items: I) -> Result<()> + where + I: IntoIterator, + { + for item in items { + self.push(item)?; + } + Ok(()) + } + + fn write_and_clear_cache(&mut self) -> Result<()> { + if !self.cache.is_empty() { + Self::write_to_new_row_group(self.writer.as_mut().unwrap(), &self.cache)?; + self.cache.clear(); + } + Ok(()) + } + + fn write_to_new_row_group( + writer: &mut SerializedFileWriter>, + items: &[T], + ) -> Result<()> { + let mut row_group = writer.next_row_group()?; + items.write_to_row_group(&mut row_group)?; + row_group.close()?; + Ok(()) + } + + pub fn write_all(&mut self, items: &[T]) -> Result<()> { + for item_chunk in items.chunks(self.row_group_size) { + Self::write_to_new_row_group(self.writer.as_mut().unwrap(), item_chunk)?; + } + Ok(()) + } + fn finish(&mut self) -> Result<()> { + self.write_and_clear_cache()?; + if let Some(writer) = self.writer.take() { + writer.close()?; + } + Ok(()) + } + pub fn close(mut self) -> Result<()> { + self.finish()?; + Ok(()) + } +} + +impl Drop for ParquetWriter +where + for<'a> &'a [T]: RecordWriter, +{ + fn drop(&mut self) { + self.finish().unwrap(); + } +} + +pub struct ParquetReader +where + Vec: RecordReader, +{ + reader: SerializedFileReader, + next_row_group_idx: usize, + num_row_groups: usize, + cache: std::vec::IntoIter, +} + +impl ParquetReader +where + Vec: RecordReader, +{ + pub fn new(reader: SerializedFileReader) -> Self { + let num_row_groups = reader.num_row_groups(); + ParquetReader { + reader, + next_row_group_idx: 0, + num_row_groups, + cache: Vec::new().into_iter(), + } + } + + fn read_next_row_group(&mut self) -> Result<()> { + if self.next_row_group_idx >= self.num_row_groups { + return Ok(()); + } + let mut row_group = self.reader.get_row_group(self.next_row_group_idx)?; + self.next_row_group_idx += 1; + let num_rows = row_group.metadata().num_rows() as usize; + let mut cache: Vec = Vec::with_capacity(num_rows); + cache.read_from_row_group(&mut *row_group, num_rows)?; + self.cache = cache.into_iter(); + + Ok(()) + } +} + +impl Iterator for ParquetReader +where + Vec: RecordReader, +{ + type Item = Result; + + fn next(&mut self) -> Option { + if let Some(item) = self.cache.next() { + return Some(Ok(item)); + } + if self.next_row_group_idx >= self.num_row_groups { + return None; + } + match self.read_next_row_group() { + Ok(()) => self.next(), + Err(e) => Some(Err(e)), + } + } +} + +/// A row in the per-read gap alignment table. +/// +/// This table contains the gap sequence between two gap align probes for reads +/// that have been aligned to gap align probes. +/// Since ParquetRecordReader does not support Option<>, we use Deserialize +#[derive(ParquetRecordWriter, Deserialize)] +pub struct PerReadGapAlignRow { + pub barcode: String, + pub is_valid_barcode: bool, + pub umi: String, + pub left_probe_id: String, + pub right_probe_id: String, + pub probe_type: String, + pub read_gap_sequence: String, + pub read_gap_len: usize, + pub expected_gap_sequence: Option, + pub gap_levenshtein_distance: Option, + pub gap_within_max_error: Option, + pub gap_exactly_matches_expected: Option, + // Alignment (gap and expected gap) stats + pub num_matches: Option, + pub num_mismatches: Option, + pub num_insertions: Option, + pub num_deletions: Option, + pub ends_with_insertion: Option, + pub ends_with_deletion: Option, + pub starts_with_insertion: Option, + pub starts_with_deletion: Option, +} + +impl PerReadGapAlignRow { + // About 200bytes per row, 1M rows would mean that each row group size is about 200MB + pub const ROW_GROUP_SIZE: usize = 1_000_000; + + pub fn from_row(row: Row) -> Self { + serde_json::from_value(row.to_json_value()).unwrap() + } +} + +/// A row in the per-umi gap alignment table +/// +/// This table contains the consensus gap sequence from based on reads from this UMI +/// and includes alignment statistics. +/// Since ParquetRecordReader does not support Option<>, we use Deserialize +#[derive(ParquetRecordWriter, Deserialize)] +pub struct PerUmiGapAlignRow { + pub barcode: String, + pub is_valid_barcode: bool, + pub sample_id: Option, + pub umi: String, + pub left_probe_id: String, + pub right_probe_id: String, + pub probe_type: String, + pub umi_gap_sequence: String, + pub umi_gap_len: usize, + pub expected_gap_sequence: Option, + pub gap_levenshtein_distance: Option, + pub gap_within_max_error: Option, + pub gap_exactly_matches_expected: Option, + // Alignment (consensun gap and expected gap) stats + pub num_matches: Option, + pub num_mismatches: Option, + pub num_insertions: Option, + pub num_deletions: Option, + pub ends_with_insertion: Option, + pub ends_with_deletion: Option, + pub starts_with_insertion: Option, + pub starts_with_deletion: Option, + // Aggregate read level info + pub num_gap_reads: usize, // num reads within max error of most common gap seq + pub num_wasted_reads: usize, + // Sum of read level alignment info + pub num_reads_with_aligned_gap: usize, + pub num_reads_with_correct_gap: usize, + pub num_read_gaps_with_mimatches: usize, + pub num_read_gaps_starting_with_insertion: usize, + pub num_read_gaps_starting_with_deletion: usize, + pub num_read_gaps_ending_with_insertion: usize, + pub num_read_gaps_ending_with_deletion: usize, +} + +impl PerUmiGapAlignRow { + pub const ROW_GROUP_SIZE: usize = PerReadGapAlignRow::ROW_GROUP_SIZE; + + pub fn from_row(row: Row) -> Self { + serde_json::from_value(row.to_json_value()).unwrap() + } +} + +/// A row in the per-bc vdj cell filter table +/// +#[derive(ParquetRecordWriter, Deserialize)] +pub struct PerBarcodeFilter { + pub barcode: String, + pub is_cell: bool, + pub is_gex_cell: Option, + pub is_asm_cell: Option, + pub low_umi: bool, + pub no_v_region: bool, + pub low_junction_support: bool, + pub no_conf_contig: bool, + pub low_rpu: bool, + pub non_dominant_junction: bool, + pub weak_junction: bool, + pub chimeric: bool, + pub common_clone: bool, + pub gel_bead_contamination: bool, + pub gel_bead_indel: Option, + pub enclone_fate: Option, + pub insert_priming: bool, +} + +impl PerBarcodeFilter { + // About 60bytes per row, 1M rows would mean that each row group size is 60MB + pub const ROW_GROUP_SIZE: usize = 1_000_000; + + pub fn from_row(row: Row) -> Self { + serde_json::from_value(row.to_json_value()).unwrap() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use itertools::Itertools; + use martian::MartianTempFile; + use parquet::file::reader::FileReader; + use parquet::file::serialized_reader::SerializedFileReader; + use parquet::record::Field; + use parquet_derive::ParquetRecordReader; + use pretty_assertions::assert_eq; + use proptest::arbitrary::any; + use proptest::collection::vec; + use proptest::proptest; + + #[derive(ParquetRecordWriter, ParquetRecordReader, PartialEq, Debug)] + struct BarcodeUmi { + barcode: String, + umi: String, + } + + impl BarcodeUmi { + fn test_data() -> Vec { + vec![ + BarcodeUmi { + barcode: "ACGT".to_string(), + umi: "AA".to_string(), + }, + BarcodeUmi { + barcode: "TAGC".to_string(), + umi: "AC".to_string(), + }, + BarcodeUmi { + barcode: "TAGG".to_string(), + umi: "AT".to_string(), + }, + ] + } + } + + #[test] + fn test_parquet_file_writer() -> Result<()> { + let file = ParquetFile::tempfile()?; + let mut writer = file.writer::(2)?; + writer.write_all(&BarcodeUmi::test_data())?; + writer.close()?; + + let reader = SerializedFileReader::try_from(file.as_ref().as_ref())?; + + assert_eq!(reader.num_row_groups(), 2); + + let entries = reader + .into_iter() + .map(|row| { + row.unwrap() + .get_column_iter() + .map(|col| (col.0.clone(), col.1.clone())) + .collect_vec() + }) + .collect::>(); + + let f = |x: &str| Field::Str(x.to_string()); + assert_eq!( + entries, + vec![ + vec![ + ("barcode".to_string(), f("ACGT")), + ("umi".to_string(), f("AA")) + ], + vec![ + ("barcode".to_string(), f("TAGC")), + ("umi".to_string(), f("AC")) + ], + vec![ + ("barcode".to_string(), f("TAGG")), + ("umi".to_string(), f("AT")) + ] + ] + ); + + Ok(()) + } + + #[test] + fn test_parquet_file_reader() -> Result<()> { + let data = BarcodeUmi::test_data(); + let file = ParquetFile::tempfile()?; + { + let mut writer = file.writer::(2)?; + writer.write_all(&data)?; + writer.close()?; + } + + let reader = file.reader::()?; + let entries = reader.collect::>>()?; + + assert_eq!(entries, data); + Ok(()) + } + + proptest! { + #[test] + fn prop_test_parquet_roundtrip( + items in vec(any::<(String, String)>(), 0usize..10_000usize), + row_group_size in 1..10_000usize, + ) { + let data = items.into_iter().map(|(barcode, umi)| BarcodeUmi { barcode, umi }).collect::>(); + let file = ParquetFile::tempfile().unwrap(); + let mut writer = file.writer::(row_group_size).unwrap(); + writer.write_all(&data).unwrap(); + writer.close().unwrap(); + + let reader = file.reader::().unwrap(); + let entries = reader.collect::>>().unwrap(); + assert_eq!(entries, data); + } + } +} diff --git a/lib/rust/cr_lib/src/preflight.rs b/lib/rust/cr_lib/src/preflight.rs index ea1b595..4159b96 100644 --- a/lib/rust/cr_lib/src/preflight.rs +++ b/lib/rust/cr_lib/src/preflight.rs @@ -3,7 +3,8 @@ use bio::alphabets::dna::revcomp; use cr_h5::probe_reference_io::PROBE_DATA_LEN; use cr_types::probe_set::ProbeSetReferenceMetadata; use cr_types::reference::feature_reference::{FeatureReference, FeatureType}; -use cr_types::reference::reference_info::MULTI_GENOME_SEPARATOR; +use cr_types::reference::probe_set_reference::TargetSetFile; +use cr_types::reference::reference_info::{ReferenceInfo, MULTI_GENOME_SEPARATOR}; use cr_types::types::FeatureBarcodeType; use cr_types::{GenomeName, TargetingMethod}; use itertools::Itertools; @@ -15,7 +16,6 @@ use libc::{getrlimit64 as getrlimit, rlimit64 as rlimit, RLIMIT_NOFILE}; use metric::{TxHashMap, TxHashSet}; use multi::config::preflight::check_file; use regex::bytes::Regex; -use std::collections::HashSet; use std::fs::File; use std::io::{BufRead, BufReader, Read}; use std::path::Path; @@ -87,16 +87,16 @@ pub fn check_resource_limits() -> Result<()> { } } -const METADATA_KEY_PANEL_NAME: &str = "panel_name"; -const METADATA_KEY_REFERENCE_GENOME: &str = "reference_genome"; - +/// Required probe set CSV metadata. const REQUIRED_METADATA_ARRAY: [&str; 4] = [ - METADATA_KEY_REFERENCE_GENOME, - "reference_version", + "panel_name", "panel_type", - METADATA_KEY_PANEL_NAME, + "reference_genome", + "reference_version", ]; -const HEADERS: [&str; 7] = [ + +/// Probe set CSV headers. +const HEADERS: [&str; 8] = [ "gene_id", "bait_seq", "bait_id", @@ -104,14 +104,17 @@ const HEADERS: [&str; 7] = [ "probe_id", "included", "region", + "gene_name", ]; + +/// Minimum number of genes in a target set. const MIN_TARGET_PANEL_LENGTH: usize = 10; lazy_static! { static ref REQUIRED_METADATA: TxHashSet<&'static str> = REQUIRED_METADATA_ARRAY.iter().copied().collect(); static ref ALLOWED_HEADERS: TxHashSet<&'static str> = HEADERS.iter().copied().collect(); - static ref BAIT_SEQ: Regex = Regex::new("^[ACGTN]+$").unwrap(); + static ref BAIT_SEQ: Regex = Regex::new("^[ACGTN-]+$").unwrap(); // "-" used as separator between probe halves (and if present gap) } fn make_required_headers(method: TargetingMethod) -> TxHashSet<&'static str> { @@ -138,12 +141,12 @@ fn validate_probe_field(field_name: &str, field_value: &str) -> Result<()> { Ok(()) } +/// checks that genome ref name & version match in the target panel and the reference pub fn check_target_panel( - transcriptome: &Transcriptome, - genomes: Vec, - probe_set: &Path, + transcriptome: Option<&Transcriptome>, + ref_info: Option<&ReferenceInfo>, + probe_set: &TargetSetFile, targeting_method: TargetingMethod, - is_pd: bool, ) -> Result> { use TargetingMethod::{HybridCapture, TemplatedLigation}; @@ -154,13 +157,19 @@ pub fn check_target_panel( probe_set.display(), ); - // Read the transcriptome GTF to map gene IDs to gene names. - let gene_name_to_id: TxHashMap<_, _> = transcriptome - .genes - .iter() - .map(|x| (x.name.as_str(), x.id.as_str())) - .collect(); - let gene_ids: TxHashSet<_> = transcriptome.genes.iter().map(|x| x.id.as_str()).collect(); + // Read the transcriptome GTF to map gene names to gene IDs, used for hybcap. + let gene_ids: TxHashSet<_> = transcriptome + .map(|transcriptome| transcriptome.genes.iter().map(|x| x.id.as_str()).collect()) + .unwrap_or_default(); + let gene_name_to_id: TxHashMap<_, _> = if let Some(transcriptome) = transcriptome { + transcriptome + .genes + .iter() + .map(|x| (x.name.as_str(), x.id.as_str())) + .collect() + } else { + TxHashMap::default() + }; let metadata = ProbeSetReferenceMetadata::load_from(probe_set)?; let metadata_fields = metadata.keys().map(String::as_str).collect(); @@ -175,7 +184,7 @@ pub fn check_target_panel( missing_metadata_fields.into_iter().join("\", \""), ); - let panel_name = &metadata[METADATA_KEY_PANEL_NAME]; + let panel_name = metadata.panel_name(); ensure!( !panel_name.contains('/'), "The character \"/\" cannot appear in the probe set CSV panel name: {panel_name}" @@ -210,8 +219,8 @@ pub fn check_target_panel( file_format_version.parse::(), file_format_version.contains('.'), ) { - (Ok(v), true) if v > 2.0 => bail!( - "The probe set CSV file contains unknown #{}={}. Must be 2.0 or less.", + (Ok(v), true) if v > 3.0 => bail!( + "The probe set CSV file contains unknown #{}={}. Must be 3.0 or less.", file_format, file_format_version ), @@ -224,19 +233,23 @@ pub fn check_target_panel( _ => (), } - // Block barnyard genomes for RTL - if targeting_method == TemplatedLigation { - if !is_pd && genomes.len() > 1 { - bail!("Barnyard references are unsupported with probe set CSV!"); - } - let probe_set_ref = &metadata[METADATA_KEY_REFERENCE_GENOME]; - let probe_set_genomes: HashSet<&str> = - probe_set_ref.split(MULTI_GENOME_SEPARATOR).collect(); - let genomes_set: HashSet<&str> = genomes.iter().map(GenomeName::as_str).collect(); - if genomes_set != probe_set_genomes { - bail!( - "Reference genome \"{}\" does not match probe set CSV reference \"{probe_set_ref}\"", - genomes.iter().format(MULTI_GENOME_SEPARATOR), + if let (Some(ref_info), TemplatedLigation) = (ref_info, targeting_method) { + let probe_set_genome = metadata.reference_genome(); + ensure!( + itertools::equal( + ref_info.genomes.iter().map(GenomeName::as_str).sorted(), + probe_set_genome.split(MULTI_GENOME_SEPARATOR).sorted() + ), + "Reference genome \"{}\" does not match probe set CSV reference \"{probe_set_genome}\"", + ref_info.genomes.iter().format(MULTI_GENOME_SEPARATOR), + ); + + if let Some(reference_version) = &ref_info.version { + let probe_set_ref_version = metadata.reference_version(); + ensure!( + probe_set_ref_version == reference_version, + "Reference version \"{reference_version}\" does not match \ + probe set CSV reference version \"{probe_set_ref_version}\"", ); } } @@ -349,7 +362,9 @@ pub fn check_target_panel( TemplatedLigation => gene_id, HybridCapture => { let gene = gene_id.split('.').next().unwrap(); - if gene_ids.contains(gene) { + if transcriptome.is_none() { + gene_id + } else if gene_ids.contains(gene) { gene } else if let Some(&gene_id) = gene_name_to_id.get(gene) { gene_id @@ -371,7 +386,7 @@ pub fn check_target_panel( ensure!( BAIT_SEQ.is_match(probe_seq.as_bytes()), "The probe set CSV file contains an invalid probe sequence on row {row}: \ - \"{probe_seq}\". May only contain \"ACGTN\"", + \"{probe_seq}\". May only contain \"ACGTN-\"", ); } } @@ -414,6 +429,29 @@ pub fn check_target_panel( } } + if let Some(&gene_name_index) = hdr_to_idx.get("gene_name") { + let gene_id = &record[gene_id_idx]; + let Some(gene_name) = record.get(gene_name_index) else { + bail!("gene_name must not be empty for {gene_id} on row {row}"); + }; + ensure!( + !gene_name.is_empty(), + "gene_name must not be empty for {gene_id} on row {row}", + ); + validate_probe_field("gene_name", gene_name)?; + if let Some(transcriptome) = transcriptome { + if let Some(gene_index) = transcriptome.gene_id_to_idx.get(gene_id) { + let transcriptome_gene_name = + transcriptome.genes[gene_index.0 as usize].name.as_str(); + ensure!( + gene_name == transcriptome_gene_name, + "The gene_name {gene_name} of gene_id {gene_id} on row {row} does not \ + match the gene name {transcriptome_gene_name} in the transcriptome", + ); + } + } + } + n += 1; } @@ -646,37 +684,28 @@ pub fn check_vdj_known_enrichment_primers( #[cfg(test)] mod tests { use super::*; - use cr_types::reference::reference_info::ReferenceInfo; use glob::glob; - use test_refdata::{refdata_available, refdata_path}; + use insta::assert_debug_snapshot; #[test] fn test_invalid_target_panels() -> Result<()> { - if !refdata_available() { - return Ok(()); - } - let ref_path = refdata_path("GRCh38-2020-A/"); - let txome = Transcriptome::from_reference_path(&ref_path)?; - let genomes = ReferenceInfo::from_reference_path(&ref_path)?.genomes; - let mut target_panels: Vec<_> = - glob("test/target_panels/invalid_csvs/*.csv")?.try_collect()?; - target_panels.sort(); + let target_panels: Vec<_> = glob("test/target_panels/invalid_csvs/*.csv")?.try_collect()?; let outs: Vec<_> = target_panels .iter() + .sorted() .map(|target_panel| { ( target_panel, check_target_panel( - &txome, - genomes.clone(), - target_panel, + None, + None, + &TargetSetFile::from(target_panel), TargetingMethod::HybridCapture, - false, ), ) }) .collect(); - insta::assert_debug_snapshot!(outs); + assert_debug_snapshot!(outs); Ok(()) } diff --git a/lib/rust/cr_lib/src/probe_barcode_matrix.rs b/lib/rust/cr_lib/src/probe_barcode_matrix.rs index 1a20cb1..71b3807 100644 --- a/lib/rust/cr_lib/src/probe_barcode_matrix.rs +++ b/lib/rust/cr_lib/src/probe_barcode_matrix.rs @@ -5,8 +5,9 @@ use barcode::Barcode; use cr_h5::count_matrix::{write_barcodes_column, MAT_H5_BUF_SZ}; use cr_h5::feature_reference_io::{make_fixed_ascii, write_target_set_group, FA_LEN}; use cr_h5::{extend_dataset, make_column_ds, write_column_ds}; -use cr_types::probe_set::{is_deprecated_probe, Probe, ProbeRegion, ProbeSetReference}; +use cr_types::probe_set::{is_deprecated_probe, Probe, ProbeRegion, ProbeSetReference, ProbeType}; use cr_types::reference::feature_reference::TargetSet; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::{BarcodeIndex, CountShardFile, ProbeBarcodeCount}; use hdf5::types::FixedAscii; use hdf5::{File, Group}; @@ -40,6 +41,10 @@ pub struct ProbeCounts { pub umis_in_all_barcodes: usize, pub umis_in_filtered_barcodes: usize, pub pass_filter: bool, + pub probe_type: ProbeType, + pub ref_sequence_name: String, + pub ref_sequence_pos: Option, + pub cigar_string: String, } impl ProbeCounts { @@ -71,6 +76,10 @@ impl From for Probe { }, included: probe.included, region: probe.region, + probe_type: probe.probe_type, + ref_sequence_name: probe.ref_sequence_name, + ref_sequence_pos: probe.ref_sequence_pos, + cigar_string: probe.cigar_string, } } } @@ -273,8 +282,8 @@ fn write_probe_matrix_h5_helper( /// filtered_probes_set is a Set of the probe_ids of probes that are filtered /// Uses a barcode index of barcodes to include in the H5 matrix pub fn write_probe_bc_matrix( - probe_set_path: &Path, - reference_path: &Path, + probe_set_path: &TargetSetFile, + reference_path: Option<&Path>, probe_barcode_path: &[CountShardFile], h5_path: &Path, bc_index: &BarcodeIndex, diff --git a/lib/rust/cr_lib/src/read_level_multiplexing.rs b/lib/rust/cr_lib/src/read_level_multiplexing.rs index 0ba200d..8fbfaf3 100644 --- a/lib/rust/cr_lib/src/read_level_multiplexing.rs +++ b/lib/rust/cr_lib/src/read_level_multiplexing.rs @@ -9,7 +9,7 @@ use std::collections::HashMap; use std::ops::Range; /// Return the ID of this read-level multiplexing sequence. -fn map_multiplexing_seq_to_id( +pub fn map_multiplexing_seq_to_id( barcode: &BarcodeWithGemGroup, seq_to_id_map: &TxHashMap, multiplexing_seq_range: &Range, diff --git a/lib/rust/cr_lib/src/stages/align_and_count.rs b/lib/rust/cr_lib/src/stages/align_and_count.rs index 1942a58..8219f39 100644 --- a/lib/rust/cr_lib/src/stages/align_and_count.rs +++ b/lib/rust/cr_lib/src/stages/align_and_count.rs @@ -4,6 +4,7 @@ use crate::align_and_count_metrics::StageVisitor; use crate::align_metrics::{BarcodeMetrics, LibFeatThenBarcodeOrder}; use crate::aligner::{Aligner, BarcodeSummary, MAX_ANNOTATIONS_IN_MEM}; use crate::barcode_sort::BarcodeOrder; +use crate::parquet_file::{ParquetFile, ParquetWriter, PerReadGapAlignRow}; #[cfg(feature = "tenx_internal")] use crate::stages::internal::get_barcode_subsampling; #[cfg(feature = "tenx_source_available")] @@ -19,9 +20,11 @@ use cr_bam::constants::{ ALN_BC_DISK_CHUNK_SZ, ALN_BC_GIB, ALN_BC_ITEM_BUFFER_SZ, ALN_BC_SEND_BUFFER_SZ, }; use cr_types::chemistry::{ChemistryDefs, ChemistryDefsExt}; -use cr_types::probe_set::{ProbeSetReference, ProbeSetReferenceMetadata}; +use cr_types::probe_set::{ + MappedGap, MappedGapAlignmentInfo, ProbeSetReference, ProbeSetReferenceMetadata, +}; use cr_types::reference::feature_checker::compute_feature_dist; -use cr_types::reference::feature_reference::TargetSetFile; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::rna_read::{RnaChunk, RnaRead, HIGH_CONF_MAPQ}; use cr_types::spill_vec::SpillVec; use cr_types::types::{ @@ -56,7 +59,10 @@ use std::collections::{BTreeMap, BinaryHeap}; use std::fs::File; use std::io::Write; use std::path::{Path, PathBuf}; -use tx_annotation::read::{AnnotationFiles, AnnotationInfo, ReadAnnotationsFormat, ReadAnnotator}; +use tx_annotation::read::{ + AnnotationFiles, AnnotationInfo, ReadAnnotations, ReadAnnotationsFormat, ReadAnnotator, + RecordAnnotation, +}; use tx_annotation::visitor::AnnotatedReadVisitor; /// Default value for the stage parameter transcriptome_min_score, STAR parameter --outFilterScoreMin. @@ -87,7 +93,7 @@ pub struct AlignAndCountMetrics { pub struct StageInputs { pub gem_well: GemWell, pub read_chunks: Vec, - pub reference_path: PathBuf, + pub reference_path: Option, pub read_shards: ReadShards, @@ -159,6 +165,7 @@ pub struct ChunkOutputs { annotation_files: Option, metrics_shard: BarcodeMetricsShardFile, no_star_alignments: bool, + per_read_gap_align: Vec, } #[derive(Serialize, MartianStruct)] @@ -187,6 +194,9 @@ pub struct StageOutputs { /// Annotation files for consumption by a PD stage pub annotation_files: Option, + /// parquet files containing gap align information + pub per_read_gap_align: Vec, + /// Metrics computed per barcode sorted by (library type, barcode) pub per_barcode_metrics: Vec, @@ -209,7 +219,7 @@ pub const READS_PER_CHUNK: usize = 15_000_000; pub struct AlignAndCount; /// A list of shard files that contains all the reads that need to be processed: -/// - `valid_reads`: A list of iles containing`RnaRead`s with a valid barcode +/// - `valid_reads`: A list of files containing`RnaRead`s with a valid barcode /// - `corrected_reads`: A list of files containing `RnaRead`s which originally had an invalid /// barcode, but we were able to correct it to a barcode in our whitelist /// - `invalid_reads`: a list of files containing `RnaRead`s with an invalid barcode @@ -261,6 +271,7 @@ where bc_umi_info_sender: ShardSender, bc_counts_sender: ShardSender, bc_probe_counts_sender: Option>, + per_read_gap_align_writer: Option>, pos_reads_sender: ShardSender, visitor: V, // set of barcodes to align/annotate @@ -269,6 +280,81 @@ where barcode_subsample_rate: Option, } +impl AlignThreadProcessor +where + V: AnnotatedReadVisitor, +{ + fn handle_gap_align_annotation( + per_read_gap_align_writer: &mut Option>, + ann: &ReadAnnotations, + ) -> Result<()> { + if let Some(writer) = per_read_gap_align_writer { + if let RecordAnnotation::Probe(_, mapped_probe) = &ann.primary { + if let Some(gap_info) = mapped_probe.gap_info() { + let read = &ann.read; + assert!( + !read.r2_exists(), + "Paired end reads not expected in gap align!" + ); + let read_gap_sequence = + String::from_utf8(gap_info.gap_seq(read.r1_seq()).to_vec()).unwrap(); + let gap = mapped_probe.gap(); + let mgi = gap.as_ref().and_then(|x| { + if x.gap_within_max_error() { + Some(MappedGapAlignmentInfo { + gap_seq: x.gap_seq.clone(), + expected_gap_seq: x.expected_gap_seq.clone(), + alignment_operations: x.get_alignment().operations.clone(), + }) + } else { + None + } + }); + + writer.push(PerReadGapAlignRow { + barcode: read.barcode().to_string(), + is_valid_barcode: ann.read.barcode_is_valid(), + umi: read.umi().to_string(), + probe_type: gap_info.probe_type.to_string(), + left_probe_id: mapped_probe.lhs_probe().unwrap().probe_id.to_string(), + right_probe_id: mapped_probe.rhs_probe().unwrap().probe_id.to_string(), + read_gap_sequence: read_gap_sequence.clone(), + read_gap_len: read_gap_sequence.len(), + expected_gap_sequence: gap.as_ref().map(MappedGap::get_expected_gap_seq), + gap_levenshtein_distance: gap + .as_ref() + .map(MappedGap::get_gap_levenshtein_distance), + gap_within_max_error: gap.as_ref().map(MappedGap::gap_within_max_error), + gap_exactly_matches_expected: gap + .map(|x| read_gap_sequence == x.expected_gap_seq), + num_matches: mgi.as_ref().map(MappedGapAlignmentInfo::get_num_matches), + num_mismatches: mgi + .as_ref() + .map(MappedGapAlignmentInfo::get_num_mismatches), + num_deletions: mgi.as_ref().map(MappedGapAlignmentInfo::get_num_deletions), + num_insertions: mgi + .as_ref() + .map(MappedGapAlignmentInfo::get_num_insertions), + starts_with_deletion: mgi + .as_ref() + .map(MappedGapAlignmentInfo::starts_with_deletion), + starts_with_insertion: mgi + .as_ref() + .map(MappedGapAlignmentInfo::starts_with_insertion), + ends_with_deletion: mgi + .as_ref() + .map(MappedGapAlignmentInfo::ends_with_deletion), + ends_with_insertion: mgi + .as_ref() + .map(MappedGapAlignmentInfo::ends_with_insertion), + })?; + } + } + } + Ok(()) + } +} + impl Proc for AlignThreadProcessor where V: AnnotatedReadVisitor, @@ -304,6 +390,7 @@ where } self.visitor.visit_read_annotation(&ann); + Self::handle_gap_align_annotation(&mut self.per_read_gap_align_writer, &ann)?; for r in ann.records() { self.pos_reads_sender.send(r)?; } @@ -438,7 +525,7 @@ fn make_dummy_header_for_probes(n_probes: usize) -> HeaderView { let mut header = Header::new(); for i in 0..n_probes { let mut header_rec = HeaderRecord::new(b"SQ"); - header_rec.push_tag(b"SN", &format!("PROBE{i}")); + header_rec.push_tag(b"SN", format!("PROBE{i}")); header_rec.push_tag(b"LN", n_probes + 1); header.push_record(&header_rec); } @@ -474,9 +561,11 @@ impl MartianStage for AlignAndCount { // The memory used by the Hurtle reference is non-zero, but it's less than the // wiggle room added to mem_gb below. 0.0 - } else { - let settings = star_settings(&args.reference_path, args.transcriptome_min_score)?; + } else if let Some(reference_path) = &args.reference_path { + let settings = star_settings(reference_path, args.transcriptome_min_score)?; settings.est_mem()? as f64 / ALN_BC_GIB + } else { + 0.0 }; let barcode_counts: BTreeMap = @@ -569,7 +658,7 @@ impl MartianStage for AlignAndCount { let probe_set_reference = if choose_aligner_from_args(&args)? == AlignerParam::Hurtle { Some(ProbeSetReference::from_path( args.target_set.as_ref().unwrap(), - &args.reference_path, + args.reference_path.as_deref(), args.transcriptome_min_score .unwrap_or(DEFAULT_TRANSCRIPTOME_MIN_SCORE), )?) @@ -581,14 +670,16 @@ impl MartianStage for AlignAndCount { let star_reference = if is_targeted_rtl && args.no_bam { // For probe assays, STAR is needed only to produce alignments for the BAM file. None - } else { + } else if let Some(reference_path) = &args.reference_path { // load up the aligner and annotator // do this first because Orbit loads the reference in the background // with mmap, so we want to start this ASAP. Some(StarReference::load(star_settings( - &args.reference_path, + reference_path, args.transcriptome_min_score, )?)?) + } else { + None }; let reader = args.read_shards.reader()?; @@ -658,12 +749,35 @@ impl MartianStage for AlignAndCount { let feature_dist = compute_feature_dist(args.feature_counts.read()?, &feature_reference)?; let target_genes = feature_reference.target_genes(); - let annotator = ReadAnnotator::new( - &args.reference_path, - args.chemistry_defs.primary(), - args.include_exons, - args.include_introns, - )?; + let annotator = if let Some(reference_path) = &args.reference_path { + Some(ReadAnnotator::new( + reference_path, + args.chemistry_defs.primary(), + args.include_exons, + args.include_introns, + )?) + } else { + None + }; + + let n_threads = rover.get_threads().max(1); + + let per_read_gap_align_files = match &probe_set_reference { + Some(probe_set_ref) if probe_set_ref.has_gap_probes => (0..n_threads) + .map(|i| { + Some(rover.make_path::(format!("per_read_gap_alignments_{i}"))) + }) + .collect(), + _ => vec![None; n_threads], + }; + let per_read_gap_align_writers: Vec<_> = per_read_gap_align_files + .iter() + .map(|f| { + f.as_ref() + .map(|f| f.writer(PerReadGapAlignRow::ROW_GROUP_SIZE)) + .transpose() + }) + .try_collect()?; let mut subsample_rate = chunk_args.read_ann_subsample_rate; @@ -688,7 +802,6 @@ impl MartianStage for AlignAndCount { probe_set_reference, )?; - let n_threads = rover.get_threads().max(1); let ann_files: Vec = (0..n_threads) .map(|i| rover.make_path(format!("read_annotations_{i}"))) .collect(); @@ -701,10 +814,9 @@ impl MartianStage for AlignAndCount { // - An Arc which is the shared reference data structure used by STAR // - Shared FeatureReference and ReadAnnotator structs used to let is_pd = args.is_pd; - let processors = ann_files - .iter() + let processors = izip!(&ann_files, per_read_gap_align_writers) .enumerate() - .map(|(idx, f)| { + .map(|(idx, (ann_file, per_read_gap_align_writer))| { anyhow::Ok(AlignThreadProcessor { args: args.clone(), aligner: aligner.clone(), @@ -712,12 +824,13 @@ impl MartianStage for AlignAndCount { bc_counts_sender: bc_counts.get_sender(), pos_reads_sender: pos_reads.get_sender(), bc_probe_counts_sender: bc_probe_counts.as_mut().map(|x| x.get_sender()), + per_read_gap_align_writer, visitor: if is_pd { let rng = ChaCha20Rng::seed_from_u64(idx as u64); StageVisitor::with_ann_writer_sample( metrics_writer.get_sender(), target_genes.clone(), - f.lazy_writer()?, + ann_file.lazy_writer()?, subsample_rate, rng, ) @@ -783,6 +896,7 @@ impl MartianStage for AlignAndCount { } else { None }, + per_read_gap_align: per_read_gap_align_files.into_iter().flatten().collect(), metrics_shard, no_star_alignments, }) @@ -865,6 +979,10 @@ impl MartianStage for AlignAndCount { } else { None }, + per_read_gap_align: chunk_outs + .iter() + .flat_map(|x| x.per_read_gap_align.clone()) + .collect(), per_barcode_metrics: chunk_outs.iter().map(|x| x.metrics_shard.clone()).collect(), summary, no_star_alignments: chunk_outs[0].no_star_alignments, @@ -881,7 +999,9 @@ mod test { #[test] fn test_choose_aligner() -> Result<()> { - use cr_types::chemistry::ChemistryName::{SpatialThreePrimeV1, ThreePrimeV3, MFRP_RNA}; + use cr_types::chemistry::ChemistryName::{ + SpatialThreePrimeV1, ThreePrimeV3PolyA, MFRP_RNA, + }; use AlignerParam::{Hurtle, Star}; let hybcap_file = "test/target_panels/Immunology_targeting_hybrid.csv".into(); @@ -906,12 +1026,15 @@ mod test { // Test chemistry and target_panel_file_format. let spatial_is_rtl = SpatialThreePrimeV1.is_rtl(); - assert_eq!(choose_aligner(None, ThreePrimeV3.is_rtl(), hybcap)?, Star); + assert_eq!( + choose_aligner(None, ThreePrimeV3PolyA.is_rtl(), hybcap)?, + Star + ); assert!(choose_aligner(None, MFRP_RNA.is_rtl(), hybcap).is_err()); assert_eq!(choose_aligner(None, spatial_is_rtl, hybcap)?, Star); // Test chemistry and probe_set_file_format. - assert_eq!(choose_aligner(None, ThreePrimeV3.is_rtl(), rtl)?, Star); + assert_eq!(choose_aligner(None, ThreePrimeV3PolyA.is_rtl(), rtl)?, Star); assert_eq!(choose_aligner(None, MFRP_RNA.is_rtl(), rtl)?, Hurtle); assert_eq!(choose_aligner(None, spatial_is_rtl, rtl)?, Hurtle); diff --git a/lib/rust/cr_lib/src/stages/barcode_correction.rs b/lib/rust/cr_lib/src/stages/barcode_correction.rs index 8a1fb6c..b1fab7f 100644 --- a/lib/rust/cr_lib/src/stages/barcode_correction.rs +++ b/lib/rust/cr_lib/src/stages/barcode_correction.rs @@ -16,17 +16,18 @@ use cr_bam::constants::{ALN_BC_DISK_CHUNK_SZ, ALN_BC_ITEM_BUFFER_SZ, ALN_BC_SEND use cr_types::chemistry::{BarcodeExtraction, ChemistryDefs}; use cr_types::rna_read::RnaRead; use cr_types::types::{ - BcCountDataType, BcCountFormat, BcSegmentCountFormat, GemWell, LibraryType, TotalBcCountFormat, + BcCountDataType, BcCountFormat, BcSegmentCountFormat, GemWell, TotalBcCountFormat, }; use cr_types::MetricsFile; use fastq_set::read_pair::{ReadPair, ReadPart, RpRange}; use itertools::Itertools; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; +use martian_filetypes::json_file::JsonFile; use martian_filetypes::{FileTypeRead, FileTypeWrite}; -use metric::{self, JsonReport, Metric, SimpleHistogram, TxHashMap, TxHashSet}; +use metric::{self, JsonReport, JsonReporter, Metric, SimpleHistogram, TxHashMap}; use serde::{Deserialize, Serialize}; -use shardio::{Range, ShardReader, ShardWriter}; +use shardio::{ShardWriter, UnsortedShardReader}; #[derive(Deserialize, Clone, MartianStruct)] pub struct BarcodeCorrectionStageInputs { @@ -36,17 +37,17 @@ pub struct BarcodeCorrectionStageInputs { pub barcode_segment_counts: BcSegmentCountFormat, pub barcode_counts: BcCountFormat, pub valid_read_metrics: BarcodeCorrectionMetricsFormat, - pub libraries_to_translate: TxHashSet, pub correction_map: Option, // Counts for all barcodes over this amount will be // be reported in the total_barcode_counts output. pub min_reads_to_report_bc: i64, + pub barcodes_under_tissue: Option>>, } #[derive(Serialize, Deserialize, Clone, MartianStruct)] pub struct BarcodeCorrectionChunkInputs { - #[mro_type = "map"] - range: shardio::Range, + index: usize, + count: usize, } #[derive(Serialize, Deserialize, MartianStruct)] @@ -73,7 +74,8 @@ pub const MIN_BC_CORRECT_READ_PAIRS_PER_CHUNK: usize = 500_000; /// Correct sequencing errors in barcodes, up to one mismatch. pub struct BarcodeCorrection; -fn correct_barcode_in_read( +/// function to correct barcode in read +pub fn correct_barcode_in_read( rna_read: &mut RnaRead, extractor: Option<&BarcodeExtraction>, corrector_and_length_range: BarcodeConstruct<&( @@ -88,7 +90,7 @@ fn correct_barcode_in_read( match extractor { Some(BarcodeExtraction::Independent) | None => { for (segment, qual, corrector) in izip!( - rna_read.segmented_barcode_mut().segments_mut(), + rna_read.segmented_barcode.segments_mut(), bc_qual, corrector ) { @@ -114,8 +116,7 @@ fn correct_barcode_in_read( .map(|dist| (range, bc, dist)) }) } - let segmented_barcode = rna_read.segmented_barcode(); - let valid = segmented_barcode.segments_valid().array_vec(); + let valid = rna_read.segmented_barcode.segments_valid().array_vec(); let corrector_and_length = corrector_and_length_range.segments().array_vec(); let bc_range = rna_read.bc_range(); @@ -154,7 +155,11 @@ fn correct_barcode_in_read( .min_by_key(|(_, _, dist)| *dist) { *rna_read.bc_range.as_mut_ref().segments().segment2 = range; - *rna_read.barcode.segments_mut().segments().segment2 = segment; + *rna_read + .segmented_barcode + .segments_mut() + .segments() + .segment2 = segment; }; } (false, true) => { @@ -179,7 +184,11 @@ fn correct_barcode_in_read( .min_by_key(|(_, _, dist)| *dist) { *rna_read.bc_range.as_mut_ref().segments().segment1 = range; - *rna_read.barcode.segments_mut().segments().segment1 = segment; + *rna_read + .segmented_barcode + .segments_mut() + .segments() + .segment1 = segment; } } (false, false) => { @@ -221,14 +230,15 @@ fn correct_barcode_in_read( .zip(corrected) .map(|(default, new)| new.map_or(default, |x| x.0)); let barcode = SegmentedBarcode::new( - rna_read.barcode.gem_group(), - segmented_barcode + rna_read.segmented_barcode.gem_group(), + rna_read + .segmented_barcode .segments() .zip(corrected) .map(|(default, new)| new.map_or(default, |x| x.1)), ); rna_read.bc_range = bc_range; - rna_read.barcode = barcode; + rna_read.segmented_barcode = barcode; } } } @@ -236,7 +246,7 @@ fn correct_barcode_in_read( } } -#[make_mro(mem_gb = 4, volatile = strict)] +#[make_mro(volatile = strict)] impl MartianStage for BarcodeCorrection { type StageInputs = BarcodeCorrectionStageInputs; type StageOutputs = BarcodeCorrectionStageOutputs; @@ -249,15 +259,20 @@ impl MartianStage for BarcodeCorrection { _rover: MartianRover, ) -> Result> { // Figure out how many chunks to create. - let reader: ShardReader = - ShardReader::open_set(&args.invalid_uncorrected)?; - let n = reader.len(); + let n = UnsortedShardReader::::len(&args.invalid_uncorrected)?; let num_chunks = (n / MIN_BC_CORRECT_READ_PAIRS_PER_CHUNK).clamp(1, MAX_BC_CORRECT_CHUNKS_PER_GG); - Ok(reader - .make_chunks(num_chunks, &Range::all()) - .into_iter() - .map(|range| BarcodeCorrectionChunkInputs { range }) + let chunk_size = n.div_ceil(num_chunks); + Ok((0..num_chunks) + .map(|n| { + ( + BarcodeCorrectionChunkInputs { + index: n, + count: chunk_size, + }, + Resource::with_mem_gb(5), + ) + }) .collect::>() .join_resource(Resource::with_mem_gb(6))) } @@ -271,8 +286,12 @@ impl MartianStage for BarcodeCorrection { let valid_shard: ReadShardFile = rover.make_path("valid_shard"); let invalid_shard: ReadShardFile = rover.make_path("invalid_shard"); - let reader: ShardReader = - ShardReader::open_set(&args.invalid_uncorrected)?; + let mut reader = + UnsortedShardReader::::open_set(&args.invalid_uncorrected); + + // Seek to the start of this chunk. + reader.skip_lazy(chunk_args.index * chunk_args.count)?; + let mut valid_writer: ShardWriter = ShardWriter::new( &valid_shard, ALN_BC_SEND_BUFFER_SZ, @@ -305,10 +324,7 @@ impl MartianStage for BarcodeCorrection { .map(|(library_type, v)| { let chemistry_def = &args.chemistry_defs[&library_type]; let extractor = chemistry_def.barcode_extraction(); - let whitelist = Whitelist::construct( - chemistry_def.barcode_whitelist(), - args.libraries_to_translate.contains(&library_type), - )?; + let whitelist = Whitelist::construct(chemistry_def.barcode_whitelist())?; anyhow::Ok(( library_type, @@ -325,7 +341,7 @@ impl MartianStage for BarcodeCorrection { .try_collect()?; let mut visitor = BarcodeCorrectionVisitor::new(); - for rna_read in reader.iter_range(&chunk_args.range)? { + for rna_read in reader.take(chunk_args.count) { let mut rna_read = rna_read?; let (extractor, corrector) = &extractors_and_correctors[&rna_read.library_type]; correct_barcode_in_read(&mut rna_read, *extractor, corrector.as_ref()); @@ -423,9 +439,8 @@ impl MartianStage for BarcodeCorrection { } }) .collect(); - let barcode_diversity_metrics: TxHashMap<_, _> = bc_counts_corrected - .into_iter() + .iter() .map(|(lib_type, bc_counts)| { ( if lib_type.is_vdj() { @@ -441,10 +456,28 @@ impl MartianStage for BarcodeCorrection { }) .collect(); + let total_barcodes_detected: usize = bc_counts_corrected + .into_values() + .flatten() + .map(|(k, _)| k) + .chain( + args.barcodes_under_tissue + .as_ref() + .map(martian_filetypes::FileTypeRead::read) + .transpose()? + .unwrap_or_default() + .into_iter() + .map(|x| x.parse().unwrap()), + ) + .unique() + .count(); + let summary = MetricsFile::from_reporter( &rover, "summary", - &(metrics.to_json_reporter() + barcode_diversity_metrics.to_json_reporter()), + &(metrics.to_json_reporter() + + barcode_diversity_metrics.to_json_reporter() + + JsonReporter::from(("total_barcodes_detected", total_barcodes_detected))), )?; let (valid_corrected, invalid) = chunk_outs diff --git a/lib/rust/cr_lib/src/stages/build_per_sample_vdj_ws_contents.rs b/lib/rust/cr_lib/src/stages/build_per_sample_vdj_ws_contents.rs index 8aaa43a..40bd52f 100644 --- a/lib/rust/cr_lib/src/stages/build_per_sample_vdj_ws_contents.rs +++ b/lib/rust/cr_lib/src/stages/build_per_sample_vdj_ws_contents.rs @@ -1,45 +1,70 @@ //! Martian stage BUILD_PER_SAMPLE_VDJ_WS_CONTENTS - use crate::stages::parse_multi_config::VdjGenInputs; use crate::SequencingMetricsFormat; use anyhow::Result; -use cr_types::{LibraryType, MetricsFile, SampleAssignment}; +use cr_types::{ + BarcodeMultiplexingType, CellLevel, CrMultiGraph, LibraryType, MetricsFile, ReadLevel, + SampleAssignment, +}; use cr_websummary::multi::tables::{ - SequencingMetricsTable, VdjBEnrichmentMetricsTable, VdjBSampleAnnotationMetricsTable, - VdjBSampleHeroMetricsTable, VdjLibraryCellMetricsTable, VdjPhysicalLibraryMetricsTable, - VdjTEnrichmentMetricsTable, VdjTSampleAnnotationMetricsTable, VdjTSampleHeroMetricsTable, - VdjTgdEnrichmentMetricsTable, VdjTgdSampleAnnotationMetricsTable, VdjTgdSampleHeroMetricsTable, + SequencingMetricsTable, VdjBEnrichmentMetricsTable, VdjBLibraryCellMetricsTable, + VdjBSampleAnnotationMetricsTable, VdjBSampleHeroMetricsTable, VdjLibraryMetricsPerHashtagIdRow, + VdjLibraryMetricsPerHashtagIdTable, VdjLibraryMetricsPerOcmBarcodeRow, + VdjLibraryMetricsPerOcmBarcodeTable, VdjPhysicalLibraryMetricsTable, + VdjTEnrichmentMetricsTable, VdjTLibraryCellMetricsTable, VdjTSampleAnnotationMetricsTable, + VdjTSampleHeroMetricsTable, VdjTgdEnrichmentMetricsTable, VdjTgdLibraryCellMetricsTable, + VdjTgdSampleAnnotationMetricsTable, VdjTgdSampleHeroMetricsTable, }; use cr_websummary::multi::websummary::{ ClonotypeInfo, LibraryVdjWebSummary, SampleVdjWebSummary, VdjChainTypeSpecific, VdjDiagnostics, - VdjEnrichmentMetricsTable, VdjParametersTable, VdjSampleAnnotationMetricsTable, - VdjSampleHeroMetricsTable, + VdjEnrichmentMetricsTable, VdjLibraryCellMetricsTable, VdjParametersTable, + VdjSampleAnnotationMetricsTable, VdjSampleHeroMetricsTable, }; -use cr_websummary::{ChartWithHelp, TitleWithHelp}; +use cr_websummary::{ChartWithHelp, CountAndPercent, TitleWithHelp}; use martian::prelude::*; use martian_derive::{make_mro, martian_filetype, MartianStruct}; use martian_filetypes::json_file::{JsonFile, JsonFormat}; use martian_filetypes::{FileTypeRead, FileTypeWrite}; +use metric::{PercentMetric, TxHashMap}; use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; use std::iter::zip; use vdj_reference::VdjReceptor; +const VDJ_BARCODE_RANK_PLOT_TITLE: &str = "V(D)J Barcode Rank Plot"; +const VDJ_BARCODE_RANK_PLOT_HELP: &str = "The plot shows the count of filtered UMIs mapped to each barcode. A barcode must have a contig that aligns to a V segment to be identified as a targeted cell. (In the denovo case, the only requirement is a contig's presence.) There must also be at least three filtered UMIs with at least two read pairs each. It is possible that a barcode with at least as many filtered UMIs as another cell-associated barcode is not identified as a targeted cell. The color of the graph is based on the local density of cell-associated barcodes. Hovering over the plot displays the total number and percentage of barcodes in that region called as cells along with the number of UMI counts for those barcodes and barcode rank, ordered in descending order of UMI counts."; +const VDJ_CLONOTYPE_INFO_PLOT_TITLE: &str = "Top 10 Clonotypes"; +const VDJ_CLONOTYPE_INFO_PLOT_HELP: &str = r#"The histogram displays the fraction of cells (percentage of cells) occupied by the 10 most abundant clonotypes in this sample. The clonotype IDs on the X axis correspond to the clonotype IDs listed in the table. The table lists the CDR3 sequence of the first exact subclonotype of the 10 most abundant clonotypes in this sample. For each of the top 10 clonotypes, the constant region, number of cells (frequency), and what percentage of the dataset those cells occupy (proportion) are also displayed. For the full table and more details, please refer to the "clonotypes.csv" and "consensus_annotations.csv" files produced by the pipeline."#; + #[derive(Clone, Serialize, Deserialize)] -pub struct VdjWsContents { - pub chemistry: String, - pub receptor: VdjReceptor, - pub vdj_reference: String, - pub vdj_reference_path: String, +pub struct VdjWsLibraryContents { pub sequencing_metrics_table: SequencingMetricsTable, + pub physical_library_metrics_table: VdjPhysicalLibraryMetricsTable, pub cell_metrics_table: VdjLibraryCellMetricsTable, pub enrichment_metrics_table: VdjEnrichmentMetricsTable, - pub physical_library_metrics_table: VdjPhysicalLibraryMetricsTable, + pub barcode_rank_plot: Option, + pub metrics_per_ocm_barcode_table: Option, + pub metrics_per_hashtag_id_table: Option, +} + +#[derive(Clone, Serialize, Deserialize)] +pub struct VdjWsSampleContents { pub hero_metrics: VdjSampleHeroMetricsTable, pub annotation_metrics_table: VdjSampleAnnotationMetricsTable, - pub barcode_rank_plot: Option, + pub enrichment_metrics_table: Option, pub clonotype_info: Option, + pub barcode_rank_plot: Option, +} + +#[derive(Clone, Serialize, Deserialize)] +pub struct VdjWsContents { + pub receptor: VdjReceptor, + pub chemistry: String, + pub vdj_reference: String, + pub vdj_reference_path: String, + pub lib_contents: VdjWsLibraryContents, + pub sample_contents: VdjWsSampleContents, pub filter_metrics: Option, } @@ -52,11 +77,19 @@ impl VdjWsContents { vdj_reference_path: self.vdj_reference_path, gamma_delta: self.receptor == VdjReceptor::TRGD, }, - sequencing_metrics_table: self.sequencing_metrics_table.into(), - cell_metrics_table: self.cell_metrics_table.into(), - enrichment_metrics_table: self.enrichment_metrics_table.into(), - physical_library_metrics_table: self.physical_library_metrics_table.into(), - barcode_rank_plot: self.barcode_rank_plot, + sequencing_metrics_table: self.lib_contents.sequencing_metrics_table.into(), + cell_metrics_table: self.lib_contents.cell_metrics_table.into(), + enrichment_metrics_table: self.lib_contents.enrichment_metrics_table.into(), + physical_library_metrics_table: self.lib_contents.physical_library_metrics_table.into(), + barcode_rank_plot: self.lib_contents.barcode_rank_plot, + metrics_per_ocm_barcode_table: self + .lib_contents + .metrics_per_ocm_barcode_table + .map(Into::into), + metrics_per_hashtag_id_table: self + .lib_contents + .metrics_per_hashtag_id_table + .map(Into::into), } } @@ -74,10 +107,14 @@ impl VdjWsContents { vdj_reference_path: self.vdj_reference_path, gamma_delta: self.receptor == VdjReceptor::TRGD, }, - hero_metrics: self.hero_metrics.into(), - annotation_metrics_table: self.annotation_metrics_table.into(), - clonotype_info: self.clonotype_info, - barcode_rank_plot: None, + hero_metrics: self.sample_contents.hero_metrics.into(), + annotation_metrics_table: self.sample_contents.annotation_metrics_table.into(), + enrichment_metrics_table: self + .sample_contents + .enrichment_metrics_table + .map(Into::into), + clonotype_info: self.sample_contents.clonotype_info, + barcode_rank_plot: self.sample_contents.barcode_rank_plot, } } } @@ -87,14 +124,18 @@ pub type VdjWsContentsFormat = JsonFormat<_VdjWsContentsFile, VdjWsContents>; #[derive(Deserialize, MartianStruct)] pub struct BuildPerSampleVdjWsContentsStageInputs { - pub lib_level_metrics: MetricsFile, - pub per_sample_metrics: HashMap, pub receptor: VdjReceptor, pub physical_library_id: String, + pub multiplexing_method: Option, + pub lib_level_metrics: MetricsFile, + pub per_sample_metrics: HashMap, pub vdj_gen_inputs: VdjGenInputs, pub sequencing_metrics: SequencingMetricsFormat, - pub vdj_ws_json: HashMap>, // Web summary JSON for the vdj pipeline + pub lib_level_vdj_ws_json: JsonFile, // Web summary JSON from cellranger vdj pipeline + pub per_sample_vdj_ws_json: HashMap>, // Web summary JSON from cellranger vdj pipeline pub filter_metrics: HashMap>>, + pub multi_graph: JsonFile, + pub vdj_cells_per_tag_json: Option>>, } #[derive(Debug, Serialize, Deserialize, Clone, MartianStruct)] @@ -114,6 +155,134 @@ pub struct BuildPerSampleVdjWsContentsStageOutputs { pub struct BuildPerSampleVdjWsContents; +fn generate_barcore_rank_plot(value: &Value) -> Option { + let cells = &value["summary"]["summary_tab"]["cells"]; + cells.get("barcode_knee_plot").map(|plot| ChartWithHelp { + plot: { + let mut plot = plot.clone(); + plot["layout"].as_object_mut().unwrap().remove("title"); + serde_json::from_value(plot).unwrap() + }, + help: TitleWithHelp { + help: VDJ_BARCODE_RANK_PLOT_HELP.to_string(), + title: VDJ_BARCODE_RANK_PLOT_TITLE.to_string(), + }, + }) +} + +fn generate_clonotype_info_plot(value: &Value) -> Option { + if let Some(analysis_tab) = value["summary"].get("vdj_analysis_tab") { + let clonotype_info = ClonotypeInfo { + table: serde_json::from_value(analysis_tab["vdj_clonotype"]["table"].clone()).unwrap(), + plot: serde_json::from_value(analysis_tab["vdj_clonotype_hist"]["plot"].clone()) + .unwrap(), + help: TitleWithHelp { + help: VDJ_CLONOTYPE_INFO_PLOT_HELP.to_string(), + title: VDJ_CLONOTYPE_INFO_PLOT_TITLE.to_string(), + }, + }; + Some(clonotype_info) + } else { + None + } +} + +fn build_metrics_per_tag( + multi_graph: &CrMultiGraph, + vdj_cells_per_tag: Option>>, +) -> (TxHashMap, TxHashMap, i64) { + let tag_id_to_sample_id = multi_graph + .get_tag_name_to_sample_id_map() + .unwrap() + .into_iter() + .map(|(u, v)| (u.to_string(), v.0.to_string())) + .collect(); + + let vdj_cells_per_tag: TxHashMap = vdj_cells_per_tag + .unwrap() + .read() + .unwrap() + .into_iter() + .map(|(id, n)| (id.clone(), n as i64)) + .collect(); + + let vdj_cells_in_library: i64 = vdj_cells_per_tag.values().sum(); + (tag_id_to_sample_id, vdj_cells_per_tag, vdj_cells_in_library) +} +fn build_metrics_per_hashtag_id_table( + multi_graph: &CrMultiGraph, + vdj_cells_per_tag: Option>>, +) -> Option { + if multi_graph.barcode_multiplexing_type() + != Some(BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag)) + { + return None; + } + let (tag_id_to_sample_id, vdj_cells_per_tag, vdj_cells_in_library) = + build_metrics_per_tag(multi_graph, vdj_cells_per_tag); + + let rows: Vec = vdj_cells_per_tag + .into_iter() + .map(|(tag_id, cells)| { + let sample_id = tag_id_to_sample_id.get(&tag_id).cloned(); + let fraction_cells_per_tag = Some(CountAndPercent(PercentMetric::from_parts( + cells, + vdj_cells_in_library, + ))); + match sample_id { + Some(x) => VdjLibraryMetricsPerHashtagIdRow { + hashtag_id: Some(tag_id.to_string()), + sample_id: Some(x.to_string()), + vdj_cells_per_tag: fraction_cells_per_tag, + }, + None => VdjLibraryMetricsPerHashtagIdRow { + hashtag_id: Some(tag_id.to_string()), + sample_id: None, + vdj_cells_per_tag: fraction_cells_per_tag, + }, + } + }) + .collect(); + Some(VdjLibraryMetricsPerHashtagIdTable(rows)) +} + +fn build_metrics_per_ocm_barcode_table( + multi_graph: &CrMultiGraph, + vdj_cells_per_tag: Option>>, +) -> Option { + if multi_graph.barcode_multiplexing_type() + != Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::OH)) + { + return None; + } + let (tag_id_to_sample_id, vdj_cells_per_tag, vdj_cells_in_library) = + build_metrics_per_tag(multi_graph, vdj_cells_per_tag); + + let rows: Vec = vdj_cells_per_tag + .into_iter() + .map(|(tag_id, cells)| { + let sample_id = tag_id_to_sample_id.get(&tag_id).cloned(); + let fraction_cells_per_tag = Some(CountAndPercent(PercentMetric::from_parts( + cells, + vdj_cells_in_library, + ))); + match sample_id { + Some(x) => VdjLibraryMetricsPerOcmBarcodeRow { + ocm_barcode_id: Some(tag_id.to_string()), + sample_id: Some(x.to_string()), + vdj_cells_per_tag: fraction_cells_per_tag, + }, + None => VdjLibraryMetricsPerOcmBarcodeRow { + ocm_barcode_id: Some(tag_id.to_string()), + sample_id: None, + vdj_cells_per_tag: fraction_cells_per_tag, + }, + } + }) + .collect(); + Some(VdjLibraryMetricsPerOcmBarcodeTable(rows)) +} + #[make_mro(volatile = strict)] impl MartianStage for BuildPerSampleVdjWsContents { type StageInputs = BuildPerSampleVdjWsContentsStageInputs; @@ -145,50 +314,36 @@ impl MartianStage for BuildPerSampleVdjWsContents { // For now, we will extract the bacode knee plot and the clonotype table/hist // from the vdj web summary json. // TODO: This is not very pretty. Cleanup in the future. - let vdj_ws_json = args.vdj_ws_json.get(&sample).unwrap().read()?; - let cells_value = &vdj_ws_json["summary"]["summary_tab"]["cells"]; - let barcode_rank_plot = cells_value.get("barcode_knee_plot").map(|plot| ChartWithHelp { - plot: { - let mut plot = plot.clone(); - plot["layout"].as_object_mut().unwrap().remove("title"); - serde_json::from_value(plot).unwrap() - }, - help: TitleWithHelp { - help: "The plot shows the count of filtered UMIs mapped to each barcode. A barcode must have a contig that aligns to a V segment to be identified as a targeted cell. (In the denovo case, the only requirement is a contig's presence.) There must also be at least three filtered UMIs with at least two read pairs each. It is possible that a barcode with at least as many filtered UMIs as another cell-associated barcode is not identified as a targeted cell. The color of the graph is based on the local density of cell-associated barcodes. Hovering over the plot displays the total number and percentage of barcodes in that region called as cells along with the number of UMI counts for those barcodes and barcode rank, ordered in descending order of UMI counts.".into(), - title: "V(D)J Barcode Rank Plot".into(), - } - }); - let clonotype_info = if let Some(analysis_tab) = - &vdj_ws_json["summary"].get("vdj_analysis_tab") - { - let clonotype_info = ClonotypeInfo { - plot: serde_json::from_value(analysis_tab["vdj_clonotype_hist"]["plot"].clone())?, - table: serde_json::from_value(analysis_tab["vdj_clonotype"]["table"].clone())?, - help: TitleWithHelp { - help: r#"The histogram displays the fraction of cells (percentage of cells) occupied by the 10 most abundant clonotypes in this sample. The clonotype IDs on the X axis correspond to the clonotype IDs listed in the table. The table lists the CDR3 sequence of the first exact subclonotype of the 10 most abundant clonotypes in this sample. For each of the top 10 clonotypes, the constant region, number of cells (frequency), and what percentage of the dataset those cells occupy (proportion) are also displayed. For the full table and more details, please refer to the "clonotypes.csv" and "consensus_annotations.csv" files produced by the pipeline."#.into(), - title: "Top 10 Clonotypes".into(), - } - }; - Some(clonotype_info) - } else { - None - }; + let lib_vdj_ws_json = args.lib_level_vdj_ws_json.read()?; + let lib_bc_rank_plot = generate_barcore_rank_plot(&lib_vdj_ws_json); + + let sample_vdj_ws_json = args.per_sample_vdj_ws_json.get(&sample).unwrap().read()?; + let sample_bc_rank_plot = generate_barcore_rank_plot(&sample_vdj_ws_json); + let clonotype_info_plot = generate_clonotype_info_plot(&sample_vdj_ws_json); // End of extraction from vdj web summary json - let mut library_metrics: Value = args.lib_level_metrics.read()?; - library_metrics.as_object_mut().unwrap().insert( + let mut library_metrics: HashMap = args.lib_level_metrics.read()?; + library_metrics.insert( "physical_library_id".to_string(), args.physical_library_id.into(), ); - let sample_metrics: Value = args.per_sample_metrics.get(&sample).unwrap().read()?; + let sample_metrics: HashMap = + args.per_sample_metrics.get(&sample).unwrap().read()?; let vdj_ref_version = match library_metrics["vdj_reference_version"].as_str() { Some(x) => format!("-{x}"), None => String::default(), }; + let is_read_level_multiplexed = matches!( + args.multiplexing_method, + Some(BarcodeMultiplexingType::ReadLevel(_)) + ); + + let multi_graph = args.multi_graph.read()?; + let contents = VdjWsContents { receptor: args.receptor, chemistry: library_metrics["chemistry_description"] @@ -206,51 +361,91 @@ impl MartianStage for BuildPerSampleVdjWsContents { .unwrap() .display() .to_string(), - cell_metrics_table: VdjLibraryCellMetricsTable::from_json_value(&library_metrics), - enrichment_metrics_table: match args.receptor { - VdjReceptor::TR => VdjChainTypeSpecific::VdjT( - VdjTEnrichmentMetricsTable::from_json_value(&library_metrics), + lib_contents: VdjWsLibraryContents { + sequencing_metrics_table: SequencingMetricsTable( + args.sequencing_metrics + .read()? + // CELLRANGER-7889 this may need to be updated eventually + .remove(&LibraryType::VdjAuto) + .unwrap() + .into_iter() + .map(Into::into) + .collect(), ), - VdjReceptor::TRGD => VdjChainTypeSpecific::VdjTgd( - VdjTgdEnrichmentMetricsTable::from_json_value(&library_metrics), + physical_library_metrics_table: VdjPhysicalLibraryMetricsTable::from_metrics( + &library_metrics, + )?, + cell_metrics_table: match args.receptor { + VdjReceptor::TR => VdjChainTypeSpecific::VdjT( + VdjTLibraryCellMetricsTable::from_metrics(&library_metrics)?, + ), + VdjReceptor::TRGD => VdjChainTypeSpecific::VdjTgd( + VdjTgdLibraryCellMetricsTable::from_metrics(&library_metrics)?, + ), + VdjReceptor::IG => VdjChainTypeSpecific::VdjB( + VdjBLibraryCellMetricsTable::from_metrics(&library_metrics)?, + ), + }, + enrichment_metrics_table: match args.receptor { + VdjReceptor::TR => VdjChainTypeSpecific::VdjT( + VdjTEnrichmentMetricsTable::from_metrics(&library_metrics)?, + ), + VdjReceptor::TRGD => VdjChainTypeSpecific::VdjTgd( + VdjTgdEnrichmentMetricsTable::from_metrics(&library_metrics)?, + ), + VdjReceptor::IG => VdjChainTypeSpecific::VdjB( + VdjBEnrichmentMetricsTable::from_metrics(&library_metrics)?, + ), + }, + barcode_rank_plot: lib_bc_rank_plot, + metrics_per_ocm_barcode_table: build_metrics_per_ocm_barcode_table( + &multi_graph, + args.vdj_cells_per_tag_json.clone(), ), - VdjReceptor::IG => VdjChainTypeSpecific::VdjB( - VdjBEnrichmentMetricsTable::from_json_value(&library_metrics), + metrics_per_hashtag_id_table: build_metrics_per_hashtag_id_table( + &multi_graph, + args.vdj_cells_per_tag_json.clone(), ), }, - physical_library_metrics_table: VdjPhysicalLibraryMetricsTable::from_json_value( - &library_metrics, - ), - hero_metrics: match args.receptor { - VdjReceptor::TR => VdjChainTypeSpecific::VdjT( - VdjTSampleHeroMetricsTable::from_json_value(&sample_metrics), - ), - VdjReceptor::TRGD => VdjChainTypeSpecific::VdjTgd( - VdjTgdSampleHeroMetricsTable::from_json_value(&sample_metrics), - ), - VdjReceptor::IG => VdjChainTypeSpecific::VdjB( - VdjBSampleHeroMetricsTable::from_json_value(&sample_metrics), - ), - }, - annotation_metrics_table: match args.receptor { - VdjReceptor::TR => VdjChainTypeSpecific::VdjT( - VdjTSampleAnnotationMetricsTable::from_json_value(&sample_metrics), - ), - VdjReceptor::TRGD => VdjChainTypeSpecific::VdjTgd( - VdjTgdSampleAnnotationMetricsTable::from_json_value(&sample_metrics), - ), - VdjReceptor::IG => VdjChainTypeSpecific::VdjB( - VdjBSampleAnnotationMetricsTable::from_json_value(&sample_metrics), + sample_contents: VdjWsSampleContents { + hero_metrics: match args.receptor { + VdjReceptor::TR => VdjChainTypeSpecific::VdjT( + VdjTSampleHeroMetricsTable::from_metrics(&sample_metrics)?, + ), + VdjReceptor::TRGD => VdjChainTypeSpecific::VdjTgd( + VdjTgdSampleHeroMetricsTable::from_metrics(&sample_metrics)?, + ), + VdjReceptor::IG => VdjChainTypeSpecific::VdjB( + VdjBSampleHeroMetricsTable::from_metrics(&sample_metrics)?, + ), + }, + annotation_metrics_table: match args.receptor { + VdjReceptor::TR => VdjChainTypeSpecific::VdjT( + VdjTSampleAnnotationMetricsTable::from_metrics(&sample_metrics)?, + ), + VdjReceptor::TRGD => VdjChainTypeSpecific::VdjTgd( + VdjTgdSampleAnnotationMetricsTable::from_metrics(&sample_metrics)?, + ), + VdjReceptor::IG => VdjChainTypeSpecific::VdjB( + VdjBSampleAnnotationMetricsTable::from_metrics(&sample_metrics)?, + ), + }, + enrichment_metrics_table: is_read_level_multiplexed.then_some( + match args.receptor { + VdjReceptor::TR => VdjChainTypeSpecific::VdjT( + VdjTEnrichmentMetricsTable::from_metrics(&sample_metrics).unwrap(), + ), + VdjReceptor::TRGD => VdjChainTypeSpecific::VdjTgd( + VdjTgdEnrichmentMetricsTable::from_metrics(&sample_metrics).unwrap(), + ), + VdjReceptor::IG => VdjChainTypeSpecific::VdjB( + VdjBEnrichmentMetricsTable::from_metrics(&sample_metrics).unwrap(), + ), + }, ), + clonotype_info: clonotype_info_plot, + barcode_rank_plot: sample_bc_rank_plot, }, - sequencing_metrics_table: args - .sequencing_metrics - .read()? - // CELLRANGER-7889 this may need to be updated eventually - .remove(&LibraryType::VdjAuto) - .unwrap(), - barcode_rank_plot, - clonotype_info, filter_metrics: args .filter_metrics .get(&sample) diff --git a/lib/rust/cr_lib/src/stages/call_tags_overhang.rs b/lib/rust/cr_lib/src/stages/call_tags_overhang.rs index bf8797c..f70e270 100644 --- a/lib/rust/cr_lib/src/stages/call_tags_overhang.rs +++ b/lib/rust/cr_lib/src/stages/call_tags_overhang.rs @@ -22,6 +22,7 @@ use std::collections::HashMap; pub struct CallTagsOHStageInputs { pub chemistry_defs: ChemistryDefs, pub raw_feature_bc_matrix: CountMatrixFile, + pub filtered_feature_bc_matrix: CountMatrixFile, } /// The Martian stage outputs. @@ -43,6 +44,9 @@ pub struct CallTagsOHMetrics { /// The number of valid barcodes per overhang valid_barcodes_per_overhang: TxHashMap, + + /// The number of filtered barcodes per overhang. + filtered_barcodes_per_overhang: TxHashMap, } impl CallTagsOHMetrics { @@ -50,15 +54,21 @@ impl CallTagsOHMetrics { fn new( umi_per_overhang: TxHashMap, barcodes_per_overhang: TxHashMap>, + filtered_barcodes_per_overhang: TxHashMap>, ) -> Self { let valid_barcodes_per_overhang = barcodes_per_overhang .iter() .map(|(overhang_id, gel_bead_barcodes)| (*overhang_id, gel_bead_barcodes.len() as i64)) .collect(); - + // Get the number of filtered barcodes per overhang from the list of filtered barcodes per overhang. + let filtered_barcodes_per_overhang = filtered_barcodes_per_overhang + .iter() + .map(|(overhang_id, gel_bead_barcodes)| (*overhang_id, gel_bead_barcodes.len() as i64)) + .collect(); Self { umi_per_overhang, valid_barcodes_per_overhang, + filtered_barcodes_per_overhang, } } } @@ -96,7 +106,7 @@ impl MartianMain for CallTagsOH { let whitelist_sources: Vec<_> = overhang_barcodes .into_values() - .map(|x| x.whitelist().as_source(true)) + .map(|x| x.whitelist().as_source()) .try_collect()?; // TODO(CELLRANGER-7847): Factor out duplicated seq_to_id code @@ -113,6 +123,14 @@ impl MartianMain for CallTagsOH { &overhang_seq_to_id, &overhang_range, )?; + + let filtered_matrix = args.filtered_feature_bc_matrix.read()?; + let filtered_barcodes_per_overhang = get_barcodes_per_multiplexing_identifier( + &filtered_matrix, + &overhang_seq_to_id, + &overhang_range, + )?; + let barcodes_per_tag_file: JsonFile<_> = rover.make_path("barcodes_per_tag"); barcodes_per_tag_file.write(&barcodes_per_overhang)?; @@ -124,9 +142,11 @@ impl MartianMain for CallTagsOH { ); let summary: JsonFile<_> = rover.make_path("summary"); + summary.write(&CallTagsOHMetrics::new( umi_per_overhang, barcodes_per_overhang, + filtered_barcodes_per_overhang, ))?; Ok(Self::StageOutputs { diff --git a/lib/rust/cr_lib/src/stages/call_tags_rtl.rs b/lib/rust/cr_lib/src/stages/call_tags_rtl.rs index ba7ab60..8082287 100644 --- a/lib/rust/cr_lib/src/stages/call_tags_rtl.rs +++ b/lib/rust/cr_lib/src/stages/call_tags_rtl.rs @@ -9,7 +9,9 @@ use crate::read_level_multiplexing::{ get_barcodes_per_multiplexing_identifier, get_umi_per_multiplexing_identifier, }; use anyhow::Result; -use barcode::whitelist::{categorize_multiplexing_barcode_id, BarcodeId, MultiplexingBarcodeType}; +use barcode::whitelist::{ + categorize_rtl_multiplexing_barcode_id, BarcodeId, RTLMultiplexingBarcodeType, +}; use barcode::{BarcodeConstruct, BcSegSeq, GelBeadAndProbeConstruct}; use cr_h5::count_matrix::{CountMatrix, CountMatrixFile, LazyCountMatrix}; use cr_types::chemistry::ChemistryDefs; @@ -183,12 +185,7 @@ impl MartianStage for CallTagsRTL { // TODO(CELLRANGER-7847): Factor out duplicated seq_to_id code let probe_barcode_seq_to_id: TxHashMap<_, _> = barcode_constructs .into_values() - .map(|x| { - x.probe - .whitelist() - .as_source(true)? - .as_translation_seq_to_id() - }) + .map(|x| x.probe.whitelist().as_source()?.as_translation_seq_to_id()) .flatten_ok() .try_collect()?; @@ -229,7 +226,9 @@ impl MartianStage for CallTagsRTL { translated_tag_names .iter() .filter(|x| { - categorize_multiplexing_barcode_id(x) == MultiplexingBarcodeType::Antibody + categorize_rtl_multiplexing_barcode_id(x) + .expect("Missing Multiplexing Barcode!") + == RTLMultiplexingBarcodeType::Antibody }) .at_most_one() .unwrap() @@ -421,8 +420,8 @@ fn detect_suspicious_rtl_ab_pairings( // probe barcodes are not associated with a sample, they should never // end up being called as cells. assert_eq!( - categorize_multiplexing_barcode_id(probe_id), - MultiplexingBarcodeType::Antibody, + categorize_rtl_multiplexing_barcode_id(probe_id).unwrap(), + RTLMultiplexingBarcodeType::Antibody, "probe ID {probe_id} was expected to be an antibody probe barcode", ); // Remove all gel beads with counts below the threshold. @@ -460,7 +459,8 @@ fn detect_suspicious_rtl_ab_pairings( }) .map(|mut row| { // Canonicalize so pairings are always ordered as RTL+AB. - if categorize_multiplexing_barcode_id(&row.barcode1_id) != MultiplexingBarcodeType::RTL + if categorize_rtl_multiplexing_barcode_id(&row.barcode1_id).unwrap() + != RTLMultiplexingBarcodeType::Gene { row.swap_order(); } diff --git a/lib/rust/cr_lib/src/stages/check_barcodes_compatibility.rs b/lib/rust/cr_lib/src/stages/check_barcodes_compatibility.rs index efd713e..6abc61c 100644 --- a/lib/rust/cr_lib/src/stages/check_barcodes_compatibility.rs +++ b/lib/rust/cr_lib/src/stages/check_barcodes_compatibility.rs @@ -1,8 +1,6 @@ //! # CHECK_BARCODES_COMPATIBILITY //! -//! This stage has two responsibilities: -//! 1. Check that barcodes from different libraries are compatible -//! 2. Infer whether libraries need barcode translation. +//! This stage checks that barcodes from different libraries are compatible. //! //! ## What is the meaning of compatibility? //! @@ -13,13 +11,6 @@ //! processed through a different gem well. This stage checks that the fastqs from different //! libraries are compatible. //! -//! ## What is barcode translation? -//! We use barcode to refer to a unique microfluidic partition or a GEM. In the 3' v3 assay, the gel -//! bead contains capture sequences that enable capture and priming of feature barcoding targets in -//! addition to the poly(dT) primer. The poly(dT) primer is attached to the Truseq handle and the -//! capture sequences are attached to the Nextera handle. See the image below from the 3' v3 user -//! guide: -//! //! 3' v3 gel bead //! //! The barcode associated with the Truseq handle (often called the Truseq barcode or the GEX barcode @@ -31,9 +22,10 @@ //! //! However, there are also applications where the Antibody library is captured by polyA //! (TotalSeq A, for example). Hence **for 3' v3** if we have GEX + FB, in some cases the barcodes -//! in the FB library need to be translated whereas in other cases they need not be. +//! in the FB library need to be translated whereas in other cases they need not be. Chemistry +//! detection takes care of determining the correct whitelist for each library. //! -//! ## How do we check for compatibility & infer translation? +//! ## How do we check for compatibility? //! //! If all the libraries came from the same set of cells, we expect to see a similar distribution of //! the number of reads associated with each barcode. Conversely, if they came from different set of @@ -41,38 +33,38 @@ //! the number of common cell associated barcodes that you get by chance between two gem wells is //! very small for the cell loads we operate in). We compute the similarity using: //! 1. Sample upto 1 million reads for each library and create a histogram of the number of reads -//! associated with each valid barcode. +//! associated with each valid barcode. //! 2. Compute a modified [cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) of -//! the histogram of each library with the histogram of the gene expression library. Before applying -//! the similarity measure, we first cap each count to a threshold value to reduces the impact of -//! very high count outliers. +//! the histogram of each library with the histogram of the gene expression library. Before applying +//! the similarity measure, we first cap each count to a threshold value to reduces the impact of +//! very high count outliers. //! - If translation is available (`3' v3`), we compute similarity using the translated barcode. -//! If the similarity is improved, we flag the library for translation. +//! If the similarity is improved, we flag the library for translation. //! 3. The libraries are compatible if their modified cosine similarity is at least `0.1` (empirical -//! threshold). +//! threshold). //! //! ## NOTES //! - No compatibility check is performed if we have only a single library. With the current -//! whitelist setup, we can't know if a 3' v3 Antibody only sample will need to be translated or -//! not. In order to do this correctly, we need to define a canonical whitelist instead of a mixed -//! one containing both Truseq and Nextera barcodes. We made a deliberate choice to enable -//! translation by default for 3' v3 antibody only samples. This is not the "correct" thing to do -//! TotalSeqA. A consequence of this is that the cellranger output for TotalSeqA Antibody only 3' v3 -//! will **not be barcode compatible** with a GEX only run from the same gem well. +//! whitelist setup, we can't know if a 3' v3 Antibody only sample will need to be translated or +//! not. In order to do this correctly, we need to define a canonical whitelist instead of a mixed +//! one containing both Truseq and Nextera barcodes. We made a deliberate choice to enable +//! translation by default for 3' v3 antibody only samples. This is not the "correct" thing to do +//! TotalSeqA. A consequence of this is that the cellranger output for TotalSeqA Antibody only 3' v3 +//! will **not be barcode compatible** with a GEX only run from the same gem well. //! - There needs to be a GEX library if there are >1 library types. -use anyhow::{ensure, Result}; +use anyhow::{anyhow, ensure, Result}; use barcode::{BarcodeConstruct, BcSegSeq, Whitelist}; -use cr_types::chemistry::{ChemistryDefs, ChemistryName}; +use cr_types::chemistry::ChemistryDefs; use cr_types::sample_def::SampleDef; use cr_types::LibraryType; use fastq_set::filenames::FindFastqs; use fastq_set::read_pair::{ReadPart, RpRange}; use fastq_set::read_pair_iter::ReadPairIter; -use itertools::Itertools; +use itertools::{process_results, Itertools}; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; -use metric::{set, Metric, SimpleHistogram, TxHashMap, TxHashSet}; +use metric::{Metric, SimpleHistogram, TxHashMap, TxHashSet}; use parameters_toml::min_barcode_similarity; use serde::{Deserialize, Serialize}; @@ -86,11 +78,8 @@ pub struct CheckBarcodesCompatibilityStageInputs { pub check_library_compatibility: bool, } -#[derive(Clone, Serialize, Deserialize, MartianStruct, PartialEq, Eq)] -#[cfg_attr(test, derive(Debug))] -pub struct CheckBarcodesCompatibilityStageOutputs { - pub libraries_to_translate: TxHashSet, -} +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct, PartialEq, Eq)] +pub struct CheckBarcodesCompatibilityStageOutputs {} // This is our stage struct pub struct CheckBarcodesCompatibility; @@ -100,23 +89,23 @@ pub(crate) fn sample_valid_barcodes( barcode_range: RpRange, wl: &Whitelist, ) -> Result> { - let mut histogram = SimpleHistogram::default(); - let mut num_reads = 0; - for fastq in sample_def.get_fastq_def()?.find_fastqs()? { - for read_pair in ReadPairIter::from_fastq_files(&fastq)? { - if let Some(seq) = read_pair?.get_range(barcode_range, ReadPart::Seq) { - // NOTE: This is robust to a single N cycle - if let Some(bc_in_wl) = wl.match_to_whitelist(BcSegSeq::from_bytes(seq)) { - histogram.observe_owned(bc_in_wl); - } - num_reads += 1; - } - if num_reads >= MAX_READS_BARCODE_COMPATIBILITY { - return Ok(histogram); - } - } - } - Ok(histogram) + let barcode_iter = sample_def + .get_fastq_def()? + .find_fastqs()? + .into_iter() + .map(|fastq| ReadPairIter::from_fastq_files(&fastq)) + .flatten_ok() + .map(|x| x?) + .filter_map_ok(|read| { + read.get_range(barcode_range, ReadPart::Seq) + .map(BcSegSeq::from_bytes) + }) + .take(MAX_READS_BARCODE_COMPATIBILITY) + .filter_map_ok(|seq| wl.match_to_whitelist(seq, true)); + + Ok(process_results(barcode_iter, |iter| { + SimpleHistogram::from_iter_owned(iter) + })?) } /// Calculate the robust cosine similarity of two barcode lists. @@ -170,30 +159,13 @@ impl MartianMain for CheckBarcodesCompatibility { .values() .any(|x| matches!(x.barcode_whitelist(), BarcodeConstruct::Segmented(_))) { - return Ok(CheckBarcodesCompatibilityStageOutputs { - libraries_to_translate: TxHashSet::default(), - }); + return Ok(CheckBarcodesCompatibilityStageOutputs {}); } // ----------------------------------------------------------------------------------------- // Trivial case when we don't have more than 1 library type if unique_lib_types.len() < 2 { - let chemistry_def = args.chemistry_defs.values().exactly_one().unwrap(); - // We are making a choice to "translate" 3' v3 antibody only libraries by default. This - // is not be the correct thing to do if the input is TotalSeqA, but we do it anyway, - // because we do not have a notion of a "canonical" whitelist and we can only get one of - // TotalSeqA or TotalSeqB correct until we fix that. - let libraries_to_translate = if (chemistry_def.name == ChemistryName::ThreePrimeV3 - || chemistry_def.name == ChemistryName::ThreePrimeV3LT) - && unique_lib_types.contains(&LibraryType::Antibody) - { - set![LibraryType::Antibody] - } else { - set![] - }; - return Ok(CheckBarcodesCompatibilityStageOutputs { - libraries_to_translate, - }); + return Ok(CheckBarcodesCompatibilityStageOutputs {}); } // ----------------------------------------------------------------------------------------- @@ -201,22 +173,16 @@ impl MartianMain for CheckBarcodesCompatibility { // possibly be relaxed in the future ensure!(unique_lib_types.contains(&LibraryType::Gex), MISSING_GEX); - // Assert that all the chemistries have a matching gel bead whitelist. - let gb_whitelist_spec = args - .chemistry_defs - .values() - .map(|chem| chem.barcode_whitelist().gel_bead()) - .unique() - .exactly_one() - .unwrap(); - // ----------------------------------------------------------------------------------------- // Compute gel bead barcode histogram per library type - - let whitelist = gb_whitelist_spec.as_source(false)?.as_whitelist()?; let mut per_lib_bc_histogram = TxHashMap::default(); for sdef in &args.sample_def { let chem = &args.chemistry_defs[&sdef.library_type.unwrap()]; + let whitelist = chem + .barcode_whitelist() + .gel_bead() + .as_source()? + .as_whitelist()?; let this_hist = sample_valid_barcodes(sdef, chem.barcode_range().gel_bead(), &whitelist)?; per_lib_bc_histogram @@ -228,25 +194,11 @@ impl MartianMain for CheckBarcodesCompatibility { let gex_hist = per_lib_bc_histogram.remove(&LibraryType::Gex).unwrap(); // This is guaranteed to succeed due to the check above // ----------------------------------------------------------------------------------------- - // Check similarity with the GEX library and infer if we need translation. - let translation_map = match gb_whitelist_spec.as_source(true) { - Ok(source) => Some(source.as_translation()?), - Err(_) => None, - }; - let mut libraries_to_translate = set![]; + // Check similarity with the GEX library. let min_barcode_similarity = *min_barcode_similarity()?; for (lib_type, this_hist) in per_lib_bc_histogram { - let mut similarity = robust_cosine_similarity(&gex_hist, &this_hist); - println!("Without translation: {lib_type} - {similarity:?}"); - if let Some(ref translate) = translation_map { - let trans_similarity = - robust_cosine_similarity(&gex_hist, &this_hist.map_key(|key| translate[&key])); - println!("With translation : {lib_type} - {trans_similarity:?}"); - if trans_similarity > similarity { - libraries_to_translate.insert(lib_type); - similarity = trans_similarity; - } - } + let similarity = robust_cosine_similarity(&gex_hist, &this_hist); + println!("Similarity to GEX: {lib_type} - {similarity:?}"); if args.check_library_compatibility { ensure!( similarity >= min_barcode_similarity, @@ -255,17 +207,16 @@ impl MartianMain for CheckBarcodesCompatibility { } } - Ok(CheckBarcodesCompatibilityStageOutputs { - libraries_to_translate, - }) + Ok(CheckBarcodesCompatibilityStageOutputs {}) } } const MISSING_GEX: &str = "Gene expression data is required if there are multiple library types."; -fn incompatible_message(lib_0_type: LibraryType, lib_1_type: LibraryType) -> String { - format!( - "Barcodes from the [{lib_0_type}] library and the [{lib_1_type}] library have insufficient overlap. \ +fn incompatible_message(lib_0_type: LibraryType, lib_1_type: LibraryType) -> anyhow::Error { + anyhow!( + "Barcodes from the [{lib_0_type}] library and the [{lib_1_type}] library have \ + insufficient overlap. \ This usually indicates the libraries originated from different cells or samples. \ This error can usually be fixed by providing correct FASTQ files from the same \ sample. If you are certain the input libraries are matched, you can bypass \ @@ -301,59 +252,32 @@ mod barcode_compatibility_tests { #[test] fn test_single_lib_type() { let args = inputs( - ChemistryName::ThreePrimeV3, + ChemistryName::ThreePrimeV3PolyA, vec![SampleDef { library_type: Some(LibraryType::Gex), ..Default::default() }], ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![]); - } - - #[test] - fn test_ab_only_3pv3() { - // By default we will translate the Antibody library in 3' v3. This is not the correct - // thing to do for TotalSeqA, but we prefer TotalSeqB. - let args = inputs( - ChemistryName::ThreePrimeV3, - vec![SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: - "../dui_tests/test_resources/cellranger-count/pbmc_1k_protein_v3_antibody" - .into(), - sample_names: Some(vec!["pbmc_1k_protein_v3_antibody".into()]), - lanes: Some(vec![4]), - library_type: Some(LibraryType::Antibody), - ..Default::default() - }], - ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![LibraryType::Antibody]); - } - - #[test] - fn test_5p_ab_only() { - let args = inputs( - ChemistryName::FivePrimeR2, - vec![SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: "../dui_tests/test_resources/cellranger-count/vdj_v1_hs_pbmc2_antibody" - .into(), - sample_names: Some(vec!["vdj_v1_hs_pbmc2_antibody".into()]), - library_type: Some(LibraryType::Antibody), - ..Default::default() - }], - ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![]); + CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); } #[test] fn test_ab_and_gex_3pv3() { - let args = inputs( - ChemistryName::ThreePrimeV3, - vec![ + let chems: ChemistryDefs = [ + ( + LibraryType::Gex, + ChemistryDef::named(ChemistryName::ThreePrimeV3PolyA), + ), + ( + LibraryType::Antibody, + ChemistryDef::named(ChemistryName::ThreePrimeV3CS1), + ), + ] + .into_iter() + .collect(); + let args = CheckBarcodesCompatibilityStageInputs { + chemistry_defs: chems, + sample_def: vec![ SampleDef { fastq_mode: FastqMode::ILMN_BCL2FASTQ, read_path: @@ -374,16 +298,28 @@ mod barcode_compatibility_tests { ..Default::default() }, ], - ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![LibraryType::Antibody]); + check_library_compatibility: true, + }; + CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); } #[test] fn test_crispr_and_gex_3pv3() { - let args = inputs( - ChemistryName::ThreePrimeV3, - vec![ + let chems: ChemistryDefs = [ + ( + LibraryType::Gex, + ChemistryDef::named(ChemistryName::ThreePrimeV3PolyA), + ), + ( + LibraryType::Crispr, + ChemistryDef::named(ChemistryName::ThreePrimeV3CS1), + ), + ] + .into_iter() + .collect(); + let args = CheckBarcodesCompatibilityStageInputs { + chemistry_defs: chems, + sample_def: vec![ SampleDef { fastq_mode: FastqMode::ILMN_BCL2FASTQ, read_path: @@ -402,18 +338,30 @@ mod barcode_compatibility_tests { ..Default::default() }, ], - ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![LibraryType::Crispr]); + check_library_compatibility: true, + }; + CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); } #[test] fn test_incompatible() { // Antibody from pbmc_1k_protein_v3 // GEX from CR-300-01 - let args = inputs( - ChemistryName::ThreePrimeV3, - vec![ + let chems: ChemistryDefs = [ + ( + LibraryType::Gex, + ChemistryDef::named(ChemistryName::ThreePrimeV3PolyA), + ), + ( + LibraryType::Antibody, + ChemistryDef::named(ChemistryName::ThreePrimeV3CS1), + ), + ] + .into_iter() + .collect(); + let args = CheckBarcodesCompatibilityStageInputs { + chemistry_defs: chems, + sample_def: vec![ SampleDef { fastq_mode: FastqMode::ILMN_BCL2FASTQ, read_path: @@ -433,9 +381,10 @@ mod barcode_compatibility_tests { ..Default::default() }, ], - ); + check_library_compatibility: true, + }; assert_eq!( - incompatible_message(LibraryType::Gex, LibraryType::Antibody), + incompatible_message(LibraryType::Gex, LibraryType::Antibody).to_string(), CheckBarcodesCompatibility .test_run_tmpdir(args) .unwrap_err() @@ -444,10 +393,10 @@ mod barcode_compatibility_tests { } #[test] - fn test_incompatible_override() -> Result<()> { + fn test_incompatible_override() { // Same as test_incompatible but ensure it works with override let mut args = inputs( - ChemistryName::ThreePrimeV3, + ChemistryName::ThreePrimeV3PolyA, vec![ SampleDef { fastq_mode: FastqMode::ILMN_BCL2FASTQ, @@ -471,13 +420,12 @@ mod barcode_compatibility_tests { ); args.check_library_compatibility = false; CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - Ok(()) } #[test] fn test_missing_gex() { let args = inputs( - ChemistryName::ThreePrimeV3, + ChemistryName::ThreePrimeV3PolyA, vec![ SampleDef { library_type: Some(LibraryType::Antibody), @@ -490,8 +438,8 @@ mod barcode_compatibility_tests { ], ); assert_eq!( - MISSING_GEX.to_string(), - CheckBarcodesCompatibility + MISSING_GEX, + &CheckBarcodesCompatibility .test_run_tmpdir(args) .unwrap_err() .to_string(), @@ -508,19 +456,19 @@ mod barcode_compatibility_tests { c2.observe_by_owned(BcSegSeq::from_bytes(b"AA"), 5); c2.observe_by_owned(BcSegSeq::from_bytes(b"AG"), 10); - assert!((robust_cosine_similarity(&c1, &c2) - 0.5f64).abs() < 10f64 * std::f64::EPSILON); + assert!((robust_cosine_similarity(&c1, &c2) - 0.5f64).abs() < 10f64 * f64::EPSILON); let mut c3 = SimpleHistogram::default(); c3.observe_by_owned(BcSegSeq::from_bytes(b"AC"), 5); c3.observe_by_owned(BcSegSeq::from_bytes(b"AG"), 10); - assert!((robust_cosine_similarity(&c1, &c3) - 0.5f64).abs() < 10f64 * std::f64::EPSILON); + assert!((robust_cosine_similarity(&c1, &c3) - 0.5f64).abs() < 10f64 * f64::EPSILON); } #[test] fn test_3pv3_total_seq_a() { let args = inputs( - ChemistryName::ThreePrimeV3, + ChemistryName::ThreePrimeV3PolyA, vec![ SampleDef { fastq_mode: FastqMode::BCL_PROCESSOR, @@ -538,8 +486,7 @@ mod barcode_compatibility_tests { }, ], ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![]); + CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); } #[test] @@ -563,8 +510,7 @@ mod barcode_compatibility_tests { }, ], ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![]); + CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); } #[test] @@ -591,16 +537,27 @@ mod barcode_compatibility_tests { }, ], ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![]); + CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); } #[test] fn test_cycle_failure() { // In this test, the first base of R1 is N in the antibody fastq - let args = inputs( - ChemistryName::ThreePrimeV3, - vec![ + let chems: ChemistryDefs = [ + ( + LibraryType::Gex, + ChemistryDef::named(ChemistryName::ThreePrimeV3PolyA), + ), + ( + LibraryType::Antibody, + ChemistryDef::named(ChemistryName::ThreePrimeV3CS1), + ), + ] + .into_iter() + .collect(); + let args = CheckBarcodesCompatibilityStageInputs { + chemistry_defs: chems, + sample_def: vec![ SampleDef { fastq_mode: FastqMode::BCL_PROCESSOR, library_type: Some(LibraryType::Antibody), @@ -617,8 +574,8 @@ mod barcode_compatibility_tests { ..Default::default() }, ], - ); - let outs = CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); - assert_eq!(outs.libraries_to_translate, set![LibraryType::Antibody]); + check_library_compatibility: true, + }; + CheckBarcodesCompatibility.test_run_tmpdir(args).unwrap(); } } diff --git a/lib/rust/cr_lib/src/stages/check_barcodes_compatibility_vdj.rs b/lib/rust/cr_lib/src/stages/check_barcodes_compatibility_vdj.rs index 39058b6..7f07af1 100644 --- a/lib/rust/cr_lib/src/stages/check_barcodes_compatibility_vdj.rs +++ b/lib/rust/cr_lib/src/stages/check_barcodes_compatibility_vdj.rs @@ -1,7 +1,7 @@ //! Martian stage CHECK_BARCODES_COMPATIBILITY_VDJ use super::check_barcodes_compatibility::sample_valid_barcodes; -use anyhow::{bail, ensure, Result}; +use anyhow::{ensure, Result}; use barcode::{BcSegSeq, Whitelist}; use cr_types::chemistry::{ChemistryDef, ChemistryDefs, ChemistryName}; use cr_types::sample_def::SampleDef; @@ -38,16 +38,17 @@ pub struct CheckBarcodesCompatibilityVdj; /// Sort barcodes by read count and take the barcodes containing the top CELL_CALLING_THRESH percent /// of reads as cells fn approx_call_cells(c: &SimpleHistogram) -> TxHashSet { - let thresh = c.raw_counts().map(|i| *(i) as f64).sum::() * CELL_CALLING_THRESH; - let mut cells = TxHashSet::default(); - let mut acc = 0; - for (bc, count) in c.distribution().iter().sorted_by_key(|(_, v)| Reverse(*v)) { - if (acc as f64) < thresh { - cells.insert(*bc); - } - acc += count.count(); - } - cells + let reads_threshold = (CELL_CALLING_THRESH * c.raw_counts().sum::() as f64).ceil() as u64; + let mut total_reads = 0; + c.distribution() + .iter() + .sorted_by_key(|(&barcode, &reads)| (Reverse(reads), barcode)) + .filter_map(|(&barcode, reads)| { + let is_cell = total_reads < reads_threshold; + total_reads += reads.count() as u64; + is_cell.then_some(barcode) + }) + .collect() } #[make_mro] @@ -66,12 +67,13 @@ impl MartianMain for CheckBarcodesCompatibilityVdj { let allowed_gex_chem = [ ChemistryName::FivePrimePE, ChemistryName::FivePrimePEV3, + ChemistryName::FivePrimePEOCMV3, ChemistryName::FivePrimeR1, ChemistryName::FivePrimeR2, ChemistryName::FivePrimeHT, - ChemistryName::FivePrimeR2OH, + ChemistryName::FivePrimeR2OCM, ChemistryName::FivePrimeR2V3, - ChemistryName::FivePrimeR2OHV3, + ChemistryName::FivePrimeR2OCMV3, ChemistryName::Custom, ]; @@ -96,7 +98,7 @@ impl MartianMain for CheckBarcodesCompatibilityVdj { args.vdj_chemistry_def.barcode_whitelist() ); - let wl = Whitelist::construct(gex_chemistry_def.barcode_whitelist(), false)?.gel_bead(); + let wl = Whitelist::construct(gex_chemistry_def.barcode_whitelist())?.gel_bead(); let mut gex_bc_hist = SimpleHistogram::default(); let mut vdj_bc_hist = SimpleHistogram::default(); @@ -122,9 +124,11 @@ impl MartianMain for CheckBarcodesCompatibilityVdj { let similarity: f64 = (gex_cells.intersection(&vdj_cells).count() as f64) / (vdj_cells.len() as f64); - if args.check_library_compatibility && similarity < MIN_SIMILARITY { - bail!( - "Barcodes from the [{}] library and the [VDJ] library have insufficient overlap. \ + if args.check_library_compatibility { + ensure!( + similarity >= MIN_SIMILARITY, + "Barcodes from the [{}] library and the [VDJ] library have \ + insufficient overlap. \ This usually indicates the libraries originated from different cells or samples. \ This error can usually be fixed by providing correct FASTQ files from the same \ sample. If you are certain the input libraries are matched, you can bypass \ @@ -146,6 +150,7 @@ impl MartianMain for CheckBarcodesCompatibilityVdj { mod barcode_compatibility_tests { use super::*; use cr_types::sample_def::FastqMode; + use insta::assert_debug_snapshot; fn gex_chem_map(name: ChemistryName) -> ChemistryDefs { [(LibraryType::Gex, ChemistryDef::named(name))] @@ -195,7 +200,7 @@ mod barcode_compatibility_tests { library_type: Some(LibraryType::VdjAuto), ..Default::default() }], - count_chemistry_defs: gex_chem_map(ChemistryName::ThreePrimeV3), + count_chemistry_defs: gex_chem_map(ChemistryName::ThreePrimeV3PolyA), gex_sample_def: vec![SampleDef { library_type: Some(LibraryType::Gex), ..Default::default() @@ -263,7 +268,7 @@ mod barcode_compatibility_tests { check_library_compatibility: true, }; let outs = CheckBarcodesCompatibilityVdj.test_run_tmpdir(args); - insta::assert_debug_snapshot!(outs.unwrap()); + assert_debug_snapshot!(outs.unwrap()); let args = CheckBarcodesCompatibilityVdjStageInputs { vdj_chemistry_def: ChemistryDef::named(ChemistryName::VdjPE), @@ -294,7 +299,7 @@ mod barcode_compatibility_tests { check_library_compatibility: true, }; let outs = CheckBarcodesCompatibilityVdj.test_run_tmpdir(args); - insta::assert_debug_snapshot!(outs.unwrap()); + assert_debug_snapshot!(outs.unwrap()); let args = CheckBarcodesCompatibilityVdjStageInputs { vdj_chemistry_def: ChemistryDef::named(ChemistryName::VdjPE), @@ -325,7 +330,7 @@ mod barcode_compatibility_tests { check_library_compatibility: true, }; let outs = CheckBarcodesCompatibilityVdj.test_run_tmpdir(args); - insta::assert_debug_snapshot!(outs.unwrap()); + assert_debug_snapshot!(outs.unwrap()); let args = CheckBarcodesCompatibilityVdjStageInputs { vdj_chemistry_def: ChemistryDef::named(ChemistryName::VdjPE), @@ -356,7 +361,7 @@ mod barcode_compatibility_tests { check_library_compatibility: true, }; let outs = CheckBarcodesCompatibilityVdj.test_run_tmpdir(args); - insta::assert_debug_snapshot!(outs.unwrap()); + assert_debug_snapshot!(outs.unwrap()); } #[test] diff --git a/lib/rust/cr_lib/src/stages/collate_metrics.rs b/lib/rust/cr_lib/src/stages/collate_metrics.rs index 5130460..c64f527 100644 --- a/lib/rust/cr_lib/src/stages/collate_metrics.rs +++ b/lib/rust/cr_lib/src/stages/collate_metrics.rs @@ -7,6 +7,9 @@ use crate::AggregateBarcode; use anyhow::Result; use barcode::Barcode; use cr_types::filtered_barcodes::{read_filtered_barcodes_set, FilteredBarcodesCsv}; +use cr_types::probe_set::ProbeSetReferenceMetadata; +use cr_types::reference::get_reference_genome_names; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::reference::reference_info::ReferenceInfo; use cr_types::{ GenomeName, LibraryType, MetricsFile, SampleAssignment, SampleBarcodes, SampleBarcodesFile, @@ -19,6 +22,7 @@ use martian_filetypes::tabular_file::CsvFile; use martian_filetypes::FileTypeRead; use metric::{JsonReport, JsonReporter, TxHashMap, TxHashSet}; use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value}; use shardio::ShardReader; use std::collections::HashMap; use std::fs::File; @@ -53,7 +57,8 @@ impl From<&AggregateBarcode> for AggregateBarcodesMetrics { #[derive(Clone, Deserialize, MartianStruct)] pub struct CollateMetricsStageInputs { pub per_barcode_metrics: Vec, - pub reference_path: PathBuf, + pub reference_path: Option, + pub target_set: Option, pub feature_reference: FeatureReferenceFormat, pub filtered_barcodes: Option, pub aggregate_barcodes: Option>, @@ -285,7 +290,19 @@ impl MartianStage for CollateMetrics { .into_barcodes(&chunk_args.sample) .map(TxHashSet::from_iter); - let ref_info = ReferenceInfo::from_reference_path(&args.reference_path)?; + let ref_info = args + .reference_path + .as_deref() + .map(ReferenceInfo::from_reference_path) + .transpose()?; + + let probe_set_metadata = args + .target_set + .as_ref() + .map(ProbeSetReferenceMetadata::load_from) + .transpose()?; + + let genomes = get_reference_genome_names(ref_info.as_ref(), probe_set_metadata.as_ref()); let has_targeted_gex = args.feature_reference.read()?.target_set.is_some(); @@ -301,7 +318,7 @@ impl MartianStage for CollateMetrics { iter, barcodes_for_sample.as_ref(), filtered_barcodes.as_ref(), - &ref_info.genomes, + &genomes, &mut csv_writer, ) })??; @@ -320,7 +337,7 @@ impl MartianStage for CollateMetrics { .map(|(library_type, metrics)| { ( library_type, - metrics.make_report(library_type, &ref_info.genomes, has_targeted_gex), + metrics.make_report(library_type, &genomes, has_targeted_gex), ) }) .collect(); @@ -338,9 +355,23 @@ impl MartianStage for CollateMetrics { JsonReporter::default() }; + let ref_info_report = if let Some(ref_info) = ref_info { + ref_info.into_json_report() + } else if let Some(probe_set_metadata) = probe_set_metadata { + [ + ("reference_genomes", probe_set_metadata.reference_genome()), + ("reference_version", probe_set_metadata.reference_version()), + ] + .into_iter() + .map(|(k, v)| (k.to_string(), Value::from(v))) + .collect() + } else { + Map::default() + }; + let metrics: TxHashMap<_, _> = chain!( per_lib_type_reports.to_json_reporter(), - ref_info.into_json_report(), + ref_info_report, aggregate_barcode_metrics, ) .collect(); diff --git a/lib/rust/cr_lib/src/stages/collate_probe_metrics.rs b/lib/rust/cr_lib/src/stages/collate_probe_metrics.rs index b8d2209..379f7bb 100644 --- a/lib/rust/cr_lib/src/stages/collate_probe_metrics.rs +++ b/lib/rust/cr_lib/src/stages/collate_probe_metrics.rs @@ -9,6 +9,7 @@ use crate::gdna_utils::{ use crate::probe_barcode_matrix::{write_probe_bc_matrix, ProbeCounts}; use anyhow::Result; use cr_types::filtered_barcodes::{read_filtered_barcodes_set, FilteredBarcodesCsv}; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::{BarcodeIndexFormat, CountShardFile, H5File}; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; @@ -22,8 +23,8 @@ use std::path::PathBuf; #[derive(Deserialize, MartianStruct)] pub struct CollateProbeMetricsStageInputs { pub probe_barcode_counts: Vec, - pub reference_path: PathBuf, - pub probe_set: CsvFile<()>, + pub reference_path: Option, + pub probe_set: TargetSetFile, pub filtered_barcodes: FilteredBarcodesCsv, pub probe_set_name: String, pub barcode_index_path: BarcodeIndexFormat, @@ -53,7 +54,7 @@ impl MartianMain for CollateProbeMetrics { &args.probe_barcode_counts, &filtered_barcodes, &args.probe_set, - &args.reference_path, + args.reference_path.as_deref(), )?; // Compute gDNA corrected metrics and write them out out to JSON. @@ -85,7 +86,7 @@ impl MartianMain for CollateProbeMetrics { let raw_probe_bc_matrix: H5File = rover.make_path("raw_probe_bc_matrix"); write_probe_bc_matrix( &args.probe_set, - &args.reference_path, + args.reference_path.as_deref(), &args.probe_barcode_counts, &raw_probe_bc_matrix, &barcode_index, diff --git a/lib/rust/cr_lib/src/stages/compute_antigen_vdj_metrics.rs b/lib/rust/cr_lib/src/stages/compute_antigen_vdj_metrics.rs index 30ccb94..c95efa4 100644 --- a/lib/rust/cr_lib/src/stages/compute_antigen_vdj_metrics.rs +++ b/lib/rust/cr_lib/src/stages/compute_antigen_vdj_metrics.rs @@ -122,15 +122,20 @@ mod tests { fn test_run_compute_antigen_vdj_stage() -> Result<()> { let tmp_dir = tempfile::tempdir()?; - let barcodes = vec![ - "AAACCTGAGAAACCAT-1".to_string(), - "AAACCTGAGAAACCGC-1".to_string(), - "AAACCTGAGAAACCTA-1".to_string(), - "AAACCTGAGAAACGAG-1".to_string(), - "AAACCTGAGAAACGCC-1".to_string(), - "AAACCTGAGAAAGTGG-1".to_string(), + let barcodes = [ + "AAACCTGAGAAACCAT-1", + "AAACCTGAGAAACCGC-1", + "AAACCTGAGAAACCTA-1", + "AAACCTGAGAAACGAG-1", + "AAACCTGAGAAACGCC-1", + "AAACCTGAGAAAGTGG-1", ]; - let vdj_cells: Vec<_> = barcodes.iter().take(3).cloned().collect(); + let vdj_cells: Vec<_> = barcodes + .iter() + .take(3) + .copied() + .map(str::to_string) + .collect(); let vdj_cell_barcodes = JsonFile::new(&tmp_dir, "vdj_cell_barcodes"); vdj_cell_barcodes.write(&vdj_cells)?; @@ -139,7 +144,7 @@ mod tests { ShardWriter::new(&metrics_shard, 100, 100, 100)?; let mut sender = metrics_writer.get_sender(); - for (i, bc) in barcodes.iter().enumerate() { + for (i, bc) in barcodes.into_iter().enumerate() { let barcode: Barcode = bc.parse()?; for (j, library_type) in [LibraryType::Gex, LibraryType::Antigen] .into_iter() diff --git a/lib/rust/cr_lib/src/stages/copy_chemistry_spec.rs b/lib/rust/cr_lib/src/stages/copy_chemistry_spec.rs index c230b39..e7be4cf 100644 --- a/lib/rust/cr_lib/src/stages/copy_chemistry_spec.rs +++ b/lib/rust/cr_lib/src/stages/copy_chemistry_spec.rs @@ -2,18 +2,22 @@ //! This is a shim stage to adapt older pipelines that only accept a single //! chemistry spec from the user into the spec-per-library-type required by //! DETECT_CHEMISTRY. +//! +//! This stage can also handle expanding a ChemistrySet into the individual +//! chemistries required for each library. use anyhow::Result; use cr_types::chemistry::{AutoOrRefinedChemistry, ChemistrySpecs}; use cr_types::sample_def::SampleDef; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; +use multi::config::ChemistryParam; use serde::{Deserialize, Serialize}; #[derive(Clone, Deserialize, MartianStruct)] pub struct CopyChemistrySpecStageInputs { pub sample_defs: Vec, - pub chemistry_spec: AutoOrRefinedChemistry, + pub chemistry_spec: ChemistryParam, } #[derive(Clone, Serialize, Deserialize, MartianStruct)] @@ -33,8 +37,17 @@ impl MartianMain for CopyChemistrySpec { chemistry_specs: args .sample_defs .iter() - .map(|sample| (sample.library_type.unwrap_or_default(), args.chemistry_spec)) - .collect(), + .map(|sample| { + let library_type = sample.library_type.unwrap_or_default(); + let chem = match args.chemistry_spec { + ChemistryParam::AutoOrRefined(chem) => chem, + ChemistryParam::Set(set) => AutoOrRefinedChemistry::Refined( + set.chemistry_for_library_type(library_type)?, + ), + }; + Ok((library_type, chem)) + }) + .collect::>()?, }) } } diff --git a/lib/rust/cr_lib/src/stages/demux_probe_bc_matrix.rs b/lib/rust/cr_lib/src/stages/demux_probe_bc_matrix.rs index ac19b3b..3a5992f 100644 --- a/lib/rust/cr_lib/src/stages/demux_probe_bc_matrix.rs +++ b/lib/rust/cr_lib/src/stages/demux_probe_bc_matrix.rs @@ -3,6 +3,7 @@ use crate::gdna_utils::get_filtered_per_probe_metrics; use crate::probe_barcode_matrix::{read_bc_json, write_probe_bc_matrix, ProbeCounts}; use barcode::Barcode; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::{BarcodeIndex, CountShardFile, H5File}; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; @@ -19,8 +20,8 @@ use std::path::PathBuf; #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct DemuxProbeBcMatrixStageInputs { pub probe_barcode_counts: Vec, - pub reference_path: PathBuf, - pub probe_set: CsvFile<()>, + pub reference_path: Option, + pub probe_set: TargetSetFile, pub probe_set_name: String, pub sample_barcodes: JsonFile>>, pub sample_cell_barcodes: JsonFile>>, @@ -95,7 +96,7 @@ impl MartianStage for DemuxProbeBcMatrix { &args.probe_barcode_counts, &sample_cell_bcs, &args.probe_set, - &args.reference_path, + args.reference_path.as_deref(), )?; // Write out sample per probe metrics @@ -115,7 +116,7 @@ impl MartianStage for DemuxProbeBcMatrix { let cell_bc_indicator_vec = bc_index.into_indicator_vec(&sample_cell_bcs); write_probe_bc_matrix( &args.probe_set, - &args.reference_path, + args.reference_path.as_deref(), &args.probe_barcode_counts, &sample_raw_probe_bc_matrix, &bc_index, diff --git a/lib/rust/cr_lib/src/stages/detect_chemistry.rs b/lib/rust/cr_lib/src/stages/detect_chemistry.rs index f5be744..ddfdc58 100644 --- a/lib/rust/cr_lib/src/stages/detect_chemistry.rs +++ b/lib/rust/cr_lib/src/stages/detect_chemistry.rs @@ -166,7 +166,8 @@ fn select_chemistries( Err(err) => { // No single chemistry was compatible with all units. - // Attempt to detect chemistry per library type for RTL experiments. + // Attempt to detect chemistry per library type for RTL, + // SC3Pv3, and SC3Pv4. let Some(DetectChemistryErrors::ConflictingChemistries { per_unit_chems, .. }) = err.downcast_ref::() @@ -178,7 +179,15 @@ fn select_chemistries( .iter() .flatten() .all(|chem| chem.is_rtl().unwrap_or(false)); - ensure!(is_rtl, err); + let is_3p_v3 = per_unit_chems + .iter() + .flatten() + .all(ChemistryName::is_sc_3p_v3); + let is_3p_v4 = per_unit_chems + .iter() + .flatten() + .all(ChemistryName::is_sc_3p_v4); + ensure!(is_rtl || is_3p_v3 || is_3p_v4, err); detect_chemistry_per_library_type(mode, &metadata, multi_config_csv, units)? } @@ -420,7 +429,7 @@ fn detect_chemistry( let chosen_chemistry_def = if wl_matching_chemistries.len() == 1 { let &chem = wl_matching_chemistries.iter().exactly_one().unwrap(); - if chem == SFRP { + if chem.is_sfrp() { // Bail out if a mixture of probe barcodes is observed for singleplex FRP chemistry validate_no_probe_bc_mixture_in_sfrp( units, @@ -435,7 +444,10 @@ fn detect_chemistry( multi_config_csv, is_overhang_multiplexed, )?) - } else if wl_matching_chemistries == set![ThreePrimeV3, ThreePrimeV3HT, ThreePrimeV3LT] { + } else if wl_matching_chemistries + == set![ThreePrimeV3PolyA, ThreePrimeV3HTPolyA, ThreePrimeV3LT] + || wl_matching_chemistries == set![ThreePrimeV3CS1, ThreePrimeV3HTCS1, ThreePrimeV3LT] + { Some(validate_chemistry( ThreePrimeV3LT, metadata.allowed_chems, @@ -443,17 +455,33 @@ fn detect_chemistry( multi_config_csv, is_overhang_multiplexed, )?) - } else if wl_matching_chemistries == set![ThreePrimeV3, ThreePrimeV3HT] { + } else if wl_matching_chemistries == set![ThreePrimeV3PolyA, ThreePrimeV3HTPolyA] { + Some(validate_chemistry( + ThreePrimeV3PolyA, + metadata.allowed_chems, + metadata.sample_defs, + multi_config_csv, + is_overhang_multiplexed, + )?) + } else if wl_matching_chemistries == set![ThreePrimeV3CS1, ThreePrimeV3HTCS1] { Some(validate_chemistry( - ThreePrimeV3, + ThreePrimeV3CS1, metadata.allowed_chems, metadata.sample_defs, multi_config_csv, is_overhang_multiplexed, )?) - } else if wl_matching_chemistries == set![ThreePrimeV4] { + } else if wl_matching_chemistries == set![ThreePrimeV4PolyA] { Some(validate_chemistry( - ThreePrimeV4, + ThreePrimeV4PolyA, + metadata.allowed_chems, + metadata.sample_defs, + multi_config_csv, + is_overhang_multiplexed, + )?) + } else if wl_matching_chemistries == set![ThreePrimeV4CS1] { + Some(validate_chemistry( + ThreePrimeV4CS1, metadata.allowed_chems, metadata.sample_defs, multi_config_csv, @@ -610,12 +638,15 @@ fn validate_chemistry( the {chemistry} chemistry in your analysis configuration." ); } - if chemistry == ChemistryName::ThreePrimeV4 - && sample_defs - .iter() - .any(|sdef| sdef.library_type == Some(LibraryType::Crispr)) - { - bail!("The chemistry SC3Pv4 (Single Cell 3'v4) is not supported with CRISPR Guide Capture libraries.") + + if let Some(config) = multi_config_csv { + if config.libraries.has_gene_expression() && chemistry.is_rtl() == Some(false) { + let gex = config.gene_expression.as_ref(); + ensure!( + gex.is_some_and(|gex| gex.reference_path.is_some()), + "A reference transcriptome is required to analyze a Gene Expression library." + ); + } } validate_multiplexing(chemistry, sample_defs)?; @@ -671,33 +702,30 @@ fn validate_rtl(multi_config_csv: Option<&MultiConfigCsv>, chemistry: ChemistryN }; ensure!( !samples.has_probe_barcode_ids(), - "A non-Fixed RNA Profiling chemistry {chemistry} was detected, and the [samples] \ + "A non-Flex chemistry {chemistry} was detected, and the [samples] \ section has a probe_barcode_ids column. The probe_barcode_ids column may only be \ - specified with Fixed RNA Profiling chemistries.", + specified with Flex chemistries.", ); return Ok(()); } if let Some(gex) = &config.gene_expression { if config.libraries.has_gene_expression() { - ensure!( - gex.probe_set.is_some(), - "Fixed RNA Profiling chemistries require a probe-set." - ); + ensure!(gex.has_probe_set(), "Flex chemistries require a probe-set."); } ensure!( gex.include_introns == multiconst::DEFAULT_INCLUDE_INTRONS, "The [gene-expression] section specifies the parameter include-introns, \ - which is not valid for Fixed RNA Profiling chemistries." + which is not valid for Flex chemistries." ); } - if chemistry == SFRP { + if chemistry.is_sfrp() { ensure!( config.samples.is_none(), - "We detected singleplex Fixed RNA Profiling chemistry from the data. \ + "We detected singleplex Flex chemistry from the data. \ Sample definitions are unsupported for singleplex inputs. \ - To process this data as multiplex Fixed RNA Profiling you will need to specify `MFRP` \ + To process this data as multiplex Flex you will need to specify `MFRP` \ as the chemistry in the config.csv." ); } @@ -766,7 +794,7 @@ fn handle_probe_barcode_translation( let target_probe_bc_whitelist = outputs.chemistry_defs[&LibraryType::Gex] .barcode_whitelist() .probe() - .as_source(true)?; + .as_source()?; for (&library_type, chemistry_def) in &mut outputs.chemistry_defs { chemistry_def.translate_probe_barcode_whitelist_with_id_map( &pairing, @@ -785,6 +813,7 @@ fn handle_probe_barcode_translation( mod tests { use super::*; use cr_types::chemistry::{known_chemistry_defs, ChemistryDefsExt}; + use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::sample_def::FastqMode; use cr_types::LibraryType; use dui_tests::stage_test::StageFailTest; @@ -796,9 +825,9 @@ mod tests { #[test] fn test_validate_rtl() { - use ChemistryName::{MFRP_Ab, ThreePrimeV3, MFRP_RNA, SFRP}; + use ChemistryName::{MFRP_Ab, ThreePrimeV3PolyA, MFRP_RNA, SFRP}; - assert!(validate_rtl(None, ThreePrimeV3).is_ok()); + assert!(validate_rtl(None, ThreePrimeV3PolyA).is_ok()); let gex_library = Library::BclProcessor { fastq_path: PathBuf::default(), @@ -825,7 +854,7 @@ mod tests { let gex_without_probe_set = MultiConfigCsv { libraries: LibrariesCsv(vec![gex_library]), gene_expression: Some(GeneExpressionParams { - probe_set: None, + probe_set: vec![], include_introns: multiconst::DEFAULT_INCLUDE_INTRONS, ..GeneExpressionParams::default() }), @@ -833,11 +862,11 @@ mod tests { }; assert!(validate_rtl(Some(&gex_without_probe_set), MFRP_RNA).is_err()); assert!(validate_rtl(Some(&gex_without_probe_set), SFRP).is_err()); - assert!(validate_rtl(Some(&gex_without_probe_set), ThreePrimeV3).is_ok()); + assert!(validate_rtl(Some(&gex_without_probe_set), ThreePrimeV3PolyA).is_ok()); let gex_with_probe_set = MultiConfigCsv { gene_expression: Some(GeneExpressionParams { - probe_set: Some(PathBuf::new()), + probe_set: vec![TargetSetFile::from("probe_set")], include_introns: multiconst::DEFAULT_INCLUDE_INTRONS, ..GeneExpressionParams::default() }), @@ -845,12 +874,12 @@ mod tests { }; assert!(validate_rtl(Some(&gex_with_probe_set), MFRP_RNA).is_ok()); assert!(validate_rtl(Some(&gex_with_probe_set), SFRP).is_ok()); - assert!(validate_rtl(Some(&gex_with_probe_set), ThreePrimeV3).is_ok()); // to aggr with RTL + assert!(validate_rtl(Some(&gex_with_probe_set), ThreePrimeV3PolyA).is_ok()); // to aggr with RTL let antibody_only = MultiConfigCsv { libraries: LibrariesCsv(vec![antibody_library]), gene_expression: Some(GeneExpressionParams { - probe_set: None, + probe_set: vec![], include_introns: multiconst::DEFAULT_INCLUDE_INTRONS, ..GeneExpressionParams::default() }), @@ -862,11 +891,11 @@ mod tests { assert!(validate_rtl(Some(&antibody_only), MFRP_RNA).is_ok()); assert!(validate_rtl(Some(&antibody_only), MFRP_Ab).is_ok()); assert!(validate_rtl(Some(&antibody_only), SFRP).is_ok()); - assert!(validate_rtl(Some(&antibody_only), ThreePrimeV3).is_ok()); + assert!(validate_rtl(Some(&antibody_only), ThreePrimeV3CS1).is_ok()); let include_introns_false = MultiConfigCsv { gene_expression: Some(GeneExpressionParams { - probe_set: Some(PathBuf::new()), + probe_set: vec![TargetSetFile::from("probe_set")], include_introns: false, ..GeneExpressionParams::default() }), @@ -874,7 +903,7 @@ mod tests { }; assert!(validate_rtl(Some(&include_introns_false), MFRP_RNA).is_err()); assert!(validate_rtl(Some(&include_introns_false), SFRP).is_err()); - assert!(validate_rtl(Some(&include_introns_false), ThreePrimeV3).is_ok()); // to aggr with RTL + assert!(validate_rtl(Some(&include_introns_false), ThreePrimeV3CS1).is_ok()); // to aggr with RTL let samples = MultiConfigCsv { samples: Some(SamplesCsv(vec![SampleRow::from_probe_barcode_id("BC001")])), @@ -882,7 +911,7 @@ mod tests { }; assert!(validate_rtl(Some(&samples), MFRP_RNA).is_ok()); assert!(validate_rtl(Some(&samples), SFRP).is_err()); - assert!(validate_rtl(Some(&samples), ThreePrimeV3).is_err()); + assert!(validate_rtl(Some(&samples), ThreePrimeV3CS1).is_err()); } macro_rules! err_snapshot { @@ -1015,6 +1044,15 @@ mod tests { )); } + #[test] + fn test_duplicate_fastqs_recursive() { + err_snapshot!(test_invalid_bcl2fastq_input( + "../cr_lib/test/fastq/duplicate_fastqs_recursive", + None, + vec!["test_sample"], + )); + } + #[test] fn test_duplicate_r1_r2() { err_snapshot!(test_invalid_bcl2fastq_input( @@ -1046,7 +1084,7 @@ mod tests { fn test_name_spec_not_in_allowed() { let args = DetectChemistryStageInputs { chemistry_specs: specs_input_gex(ChemistryName::VdjPE), - allowed_chems: Some(vec![ChemistryName::ThreePrimeV3.into()]), + allowed_chems: Some(vec![ChemistryName::ThreePrimeV3PolyA.into()]), ..Default::default() }; err_snapshot!(args); @@ -1054,7 +1092,7 @@ mod tests { #[test] fn test_custom_chemistry_spec() { - let mut def: ChemistryDef = ChemistryDef::named(ChemistryName::ThreePrimeV3); + let mut def: ChemistryDef = ChemistryDef::named(ChemistryName::ThreePrimeV3PolyA); def.name = ChemistryName::Custom; def.rna.offset = 13; let args = DetectChemistryStageInputs { @@ -1075,7 +1113,7 @@ mod tests { #[test] fn test_mix_of_custom_and_manual_chemistry_spec() { - let mut def: ChemistryDef = ChemistryDef::named(ChemistryName::ThreePrimeV3); + let mut def: ChemistryDef = ChemistryDef::named(ChemistryName::ThreePrimeV3CS1); def.name = ChemistryName::Custom; def.rna.offset = 13; let args = DetectChemistryStageInputs { @@ -1187,13 +1225,13 @@ mod tests { sample_names: Some(vec!["CR-300-01".into()]), ..Default::default() }], - chemistry_specs: specs_input_gex(ChemistryName::ThreePrimeV3), + chemistry_specs: specs_input_gex(ChemistryName::ThreePrimeV3PolyA), ..Default::default() }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + ChemistryName::ThreePrimeV3PolyA ); assert!(!outs.is_antibody_only); } @@ -1214,7 +1252,7 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + ChemistryName::ThreePrimeV3PolyA ); assert!(!outs.is_antibody_only); } @@ -1229,20 +1267,20 @@ mod tests { sample_names: Some(vec!["1107522".into()]), ..Default::default() }], - chemistry_specs: specs_input_gex(ChemistryName::ThreePrimeV3HT), + chemistry_specs: specs_input_gex(ChemistryName::ThreePrimeV3HTPolyA), ..Default::default() }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3HT + ChemistryName::ThreePrimeV3HTPolyA ); assert!(!outs.is_antibody_only); } #[test] fn test_auto_chemistry_spec_ht() { - // should detect ThreePrimeV3 when HT fastqs are run + // should detect ThreePrimeV3PolyA when HT fastqs are run let args = DetectChemistryStageInputs { sample_def: vec![SampleDef { fastq_mode: FastqMode::ILMN_BCL2FASTQ, @@ -1256,7 +1294,7 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + ChemistryName::ThreePrimeV3PolyA ); assert!(!outs.is_antibody_only); } @@ -1308,7 +1346,7 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + ChemistryName::ThreePrimeV3PolyA ); assert!(!outs.is_antibody_only); } @@ -1368,7 +1406,7 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + ChemistryName::ThreePrimeV3CS1 ); assert!(outs.is_antibody_only); } @@ -1393,7 +1431,7 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + ChemistryName::ThreePrimeV3CS1 ); assert!(outs.is_antibody_only); } @@ -1452,8 +1490,14 @@ mod tests { }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( - outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + outs.chemistry_defs + .values() + .map(|def| def.name) + .collect::>(), + set![ + ChemistryName::ThreePrimeV3PolyA, + ChemistryName::ThreePrimeV3CS1 + ] ); assert!(!outs.is_antibody_only); } @@ -1488,8 +1532,14 @@ mod tests { }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( - outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + outs.chemistry_defs + .values() + .map(|def| def.name) + .collect::>(), + set![ + ChemistryName::ThreePrimeV3PolyA, + ChemistryName::ThreePrimeV3CS1 + ] ); assert!(!outs.is_antibody_only); } @@ -1557,8 +1607,14 @@ mod tests { }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( - outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + outs.chemistry_defs + .values() + .map(|def| def.name) + .collect::>(), + set![ + ChemistryName::ThreePrimeV3PolyA, + ChemistryName::ThreePrimeV3CS1 + ] ); assert!(!outs.is_antibody_only); } @@ -1779,7 +1835,7 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3 + ChemistryName::ThreePrimeV3PolyA ); assert!(!outs.is_antibody_only); } @@ -1834,7 +1890,6 @@ mod tests { .into(), sample_names: Some(vec!["test_sample".into()]), library_type: Some(LibraryType::Gex), - target_set: Some("../dui_tests/test_resources/cellranger-count/RTL_single_sample_probe_bcs_mixture/probe_set.csv".into()), ..Default::default() }], chemistry_specs: specs_input_gex(ChemistryName::SFRP), @@ -1890,7 +1945,7 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV3OH + ChemistryName::ThreePrimeV3PolyAOCM ); } @@ -2096,7 +2151,6 @@ mod tests { fastq_mode: FastqMode::ILMN_BCL2FASTQ, read_path: testdata_path("fastqs/cellranger/multi/1247954_1270332_frp_gex_and_ab_fastqs"), sample_names: Some(vec!["1247954_GEX".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), lanes: Some(vec![4]), library_type: Some(LibraryType::Gex), ..Default::default() @@ -2123,19 +2177,20 @@ mod tests { #[test] fn test_gex_only_sfrp() { let args = DetectChemistryStageInputs { - sample_def: vec![SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: testdata_path("fastqs/cellranger/multi/1245033_sfrp_fastqs"), - sample_names: Some(vec!["CTACTGAATT".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), - lanes: Some(vec![4]), - library_type: Some(LibraryType::Gex), + sample_def: vec![SampleDef { + fastq_mode: FastqMode::ILMN_BCL2FASTQ, + read_path: testdata_path("fastqs/cellranger/multi/1245033_sfrp_fastqs"), + sample_names: Some(vec!["CTACTGAATT".into()]), + lanes: Some(vec![4]), + library_type: Some(LibraryType::Gex), + ..Default::default() + }], + multi_config: Some( + "../dui_tests/test_resources/cellranger-multi/1245033_sfrp.csv".into(), + ), + chemistry_specs: specs_input_gex(AutoChemistryName::Count), ..Default::default() - }], - multi_config: Some("../dui_tests/test_resources/cellranger-multi/1245033_sfrp.csv".into()), - chemistry_specs: specs_input_gex(AutoChemistryName::Count), - ..Default::default() - }; + }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!(outs.chemistry_defs.primary().name, ChemistryName::SFRP); } @@ -2143,38 +2198,40 @@ mod tests { #[test] fn test_gex_only_mfrp() { let args = DetectChemistryStageInputs { - sample_def: vec![SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: testdata_path("fastqs/cellranger/multi/1216790_1245489_mfrp_fastqs"), - sample_names: Some(vec!["AATTTCGGGT".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), - lanes: Some(vec![4]), - library_type: Some(LibraryType::Gex), + sample_def: vec![SampleDef { + fastq_mode: FastqMode::ILMN_BCL2FASTQ, + read_path: testdata_path("fastqs/cellranger/multi/1216790_1245489_mfrp_fastqs"), + sample_names: Some(vec!["AATTTCGGGT".into()]), + lanes: Some(vec![4]), + library_type: Some(LibraryType::Gex), + ..Default::default() + }], + multi_config: Some( + "../dui_tests/test_resources/cellranger-multi/1216790_1245489.csv".into(), + ), + chemistry_specs: specs_input_gex(AutoChemistryName::Count), ..Default::default() - }], - multi_config: Some("../dui_tests/test_resources/cellranger-multi/1216790_1245489.csv".into()), - chemistry_specs: specs_input_gex(AutoChemistryName::Count), - ..Default::default() - }; + }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!(outs.chemistry_defs.primary().name, ChemistryName::MFRP_RNA); } #[test] fn test_mfrp_r1() { - let args = DetectChemistryStageInputs{ - sample_def: vec![SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: testdata_path("fastqs/cellranger/multi/mfrp_r1_50_90"), - sample_names: Some(vec!["tiny_gex".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), - lanes: Some(vec![1]), - library_type: Some(LibraryType::Gex), + let args = DetectChemistryStageInputs { + sample_def: vec![SampleDef { + fastq_mode: FastqMode::ILMN_BCL2FASTQ, + read_path: testdata_path("fastqs/cellranger/multi/mfrp_r1_50_90"), + sample_names: Some(vec!["tiny_gex".into()]), + lanes: Some(vec![1]), + library_type: Some(LibraryType::Gex), + ..Default::default() + }], + multi_config: Some( + "../dui_tests/test_resources/cellranger-multi/1320608_mfrp_r1_50_90.csv".into(), + ), + chemistry_specs: specs_input_gex(AutoChemistryName::Count), ..Default::default() - }], - multi_config: Some("../dui_tests/test_resources/cellranger-multi/1320608_mfrp_r1_50_90.csv".into()), - chemistry_specs: specs_input_gex(AutoChemistryName::Count), - ..Default::default() }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( @@ -2185,19 +2242,20 @@ mod tests { #[test] fn test_ab_only_mfrp() { - let args = DetectChemistryStageInputs{ - sample_def: vec![SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: testdata_path("fastqs/cellranger/multi/1461767_mfrp_gex_ab/ab"), - sample_names: Some(vec!["tiny_ab".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), - lanes: Some(vec![1]), - library_type: Some(LibraryType::Gex), + let args = DetectChemistryStageInputs { + sample_def: vec![SampleDef { + fastq_mode: FastqMode::ILMN_BCL2FASTQ, + read_path: testdata_path("fastqs/cellranger/multi/1461767_mfrp_gex_ab/ab"), + sample_names: Some(vec!["tiny_ab".into()]), + lanes: Some(vec![1]), + library_type: Some(LibraryType::Gex), + ..Default::default() + }], + multi_config: Some( + "../dui_tests/test_resources/cellranger-multi/1461767_mfrp_ab_only.csv".into(), + ), + chemistry_specs: specs_input_gex(AutoChemistryName::Count), ..Default::default() - }], - multi_config: Some("../dui_tests/test_resources/cellranger-multi/1461767_mfrp_ab_only.csv".into()), - chemistry_specs: specs_input_gex(AutoChemistryName::Count), - ..Default::default() }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!(outs.chemistry_defs.primary().name, ChemistryName::MFRP_Ab); @@ -2205,19 +2263,21 @@ mod tests { #[test] fn test_ab_only_mfrp_r1() { - let args = DetectChemistryStageInputs{ - sample_def: vec![SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: testdata_path("fastqs/cellranger/multi/1464930_mfrp_r1_gex_ab/ab"), - sample_names: Some(vec!["tiny_ab".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), - lanes: Some(vec![1]), - library_type: Some(LibraryType::Gex), + let args = DetectChemistryStageInputs { + sample_def: vec![SampleDef { + fastq_mode: FastqMode::ILMN_BCL2FASTQ, + read_path: testdata_path("fastqs/cellranger/multi/1464930_mfrp_r1_gex_ab/ab"), + sample_names: Some(vec!["tiny_ab".into()]), + lanes: Some(vec![1]), + library_type: Some(LibraryType::Gex), + ..Default::default() + }], + multi_config: Some( + "../dui_tests/test_resources/cellranger-multi/1464930_mfrp_r1_ab_only.csv" + .into(), + ), + chemistry_specs: specs_input_gex(AutoChemistryName::Count), ..Default::default() - }], - multi_config: Some("../dui_tests/test_resources/cellranger-multi/1464930_mfrp_r1_ab_only.csv".into()), - chemistry_specs: specs_input_gex(AutoChemistryName::Count), - ..Default::default() }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( @@ -2235,7 +2295,6 @@ mod tests { read_path: testdata_path("fastqs/cellranger/multi/1548572/tiny_ab"), r1_length: Some(28), sample_names: Some(vec!["tiny_ab".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), lanes: Some(vec![1]), library_type: Some(LibraryType::Antibody), ..Default::default() @@ -2244,7 +2303,6 @@ mod tests { fastq_mode: FastqMode::ILMN_BCL2FASTQ, read_path: testdata_path("fastqs/cellranger/multi/1548572/tiny_gex"), sample_names: Some(vec!["tiny_gex".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), lanes: Some(vec![1]), library_type: Some(LibraryType::Gex), ..Default::default() @@ -2265,19 +2323,22 @@ mod tests { #[test] fn test_ab_only_sfrp() { - let args = DetectChemistryStageInputs{ - sample_def: vec![SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: testdata_path("fastqs/cellranger/multi/1247954_1270332_frp_ab_fastqs/ab"), - sample_names: Some(vec!["ab".into()]), - target_set: Some(refdata_path("targeted_panels/human_wta_RTL.Fletcher_v7.0.all_manufacturing.mismatch_base_pairing_revision.csv")), - lanes: Some(vec![1]), - library_type: Some(LibraryType::Gex), + let args = DetectChemistryStageInputs { + sample_def: vec![SampleDef { + fastq_mode: FastqMode::ILMN_BCL2FASTQ, + read_path: testdata_path( + "fastqs/cellranger/multi/1247954_1270332_frp_ab_fastqs/ab", + ), + sample_names: Some(vec!["ab".into()]), + lanes: Some(vec![1]), + library_type: Some(LibraryType::Gex), + ..Default::default() + }], + multi_config: Some( + "../dui_tests/test_resources/cellranger-multi/1247954_sfrp_ab_only.csv".into(), + ), + chemistry_specs: specs_input_gex(AutoChemistryName::Count), ..Default::default() - }], - multi_config: Some("../dui_tests/test_resources/cellranger-multi/1247954_sfrp_ab_only.csv".into()), - chemistry_specs: specs_input_gex(AutoChemistryName::Count), - ..Default::default() }; let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!(outs.chemistry_defs.primary().name, ChemistryName::SFRP); @@ -2406,7 +2467,7 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::FivePrimeR2OHV3 + ChemistryName::FivePrimeR2OCMV3 ); } @@ -2427,36 +2488,8 @@ mod tests { let outs = DetectChemistry.test_run_tmpdir(args).unwrap(); assert_eq!( outs.chemistry_defs.primary().name, - ChemistryName::ThreePrimeV4 + ChemistryName::ThreePrimeV4PolyA ); } - - #[test] - fn test_crispr_and_gex_3pv4_fails() { - let args = DetectChemistryStageInputs { - sample_def: vec![ - SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: testdata_path("fastqs/cellranger/multi/detectchem_unittest_tiny_gex_crispr_3pv4/crispr"), - sample_names: Some(vec!["crispr".into()]), - library_type: Some(LibraryType::Crispr), - ..Default::default() - }, - SampleDef { - fastq_mode: FastqMode::ILMN_BCL2FASTQ, - read_path: testdata_path("fastqs/cellranger/multi/detectchem_unittest_tiny_gex_crispr_3pv4/gex"), - sample_names: Some(vec!["gex".into()]), - library_type: Some(LibraryType::Gex), - ..Default::default() - }, - ], - chemistry_specs: specs_input_gex(AutoChemistryName::Count), - feature_reference: Some( - "../dui_tests/test_resources/reference/feature/RAB1A_NT_Aug2020.csv".into(), - ), - ..Default::default() - }; - err_snapshot!(args) - } } } diff --git a/lib/rust/cr_lib/src/stages/detect_vdj_receptor.rs b/lib/rust/cr_lib/src/stages/detect_vdj_receptor.rs index 2e564e1..3563670 100644 --- a/lib/rust/cr_lib/src/stages/detect_vdj_receptor.rs +++ b/lib/rust/cr_lib/src/stages/detect_vdj_receptor.rs @@ -1,7 +1,7 @@ //! Martian stage DETECT_VDJ_RECEPTOR use crate::detect_chemistry::chemistry_filter::detect_chemistry_units; -use anyhow::{bail, Result}; +use anyhow::{anyhow, bail, Context, Result}; use cr_types::reference::feature_reference::{BeamMode, FeatureConfig, FeatureReferenceFile}; use cr_types::sample_def::SampleDef; use cr_types::LibraryType; @@ -220,18 +220,13 @@ impl MartianMain for DetectVdjReceptor { break; } } - match stats.compatible_receptor() { - Some(receptor) => per_unit_receptors.push(receptor), - None => { - bail!( - "V(D)J Chain detection failed for {}.\n\n{}\n{}\n{}\n", - unit, - stats, - ClassificationStats::help_text(), - resolution_text, - ); - } - } + per_unit_receptors.push(stats.compatible_receptor().with_context(|| { + anyhow!( + "V(D)J Chain detection failed for {unit}.\n\n{stats}\n{}\n\ + {resolution_text}\n", + ClassificationStats::help_text(), + ) + })?); println!("{stats}"); } @@ -475,6 +470,7 @@ mod tests { has_mhc_allele_column: true,}), beam_mode: None, functional_map: None, + hashtag_ids: None, }), }, ); diff --git a/lib/rust/cr_lib/src/stages/expect_single_barcode_whitelist.rs b/lib/rust/cr_lib/src/stages/expect_single_barcode_whitelist.rs new file mode 100644 index 0000000..d257958 --- /dev/null +++ b/lib/rust/cr_lib/src/stages/expect_single_barcode_whitelist.rs @@ -0,0 +1,39 @@ +//! Martian stage EXPECT_SINGLE_BARCODE_WHITELIST. + +use anyhow::{ensure, Result}; +use martian::prelude::*; +use martian_derive::{make_mro, MartianStruct}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Serialize, Deserialize, MartianStruct)] +pub struct Inputs { + pub barcode_whitelists: Vec, +} + +#[derive(Clone, Serialize, Deserialize, MartianStruct, PartialEq)] +pub struct Outputs { + pub barcode_whitelist: Option, +} + +pub struct ExpectSingleBarcodeWhitelist; + +#[make_mro] +impl MartianMain for ExpectSingleBarcodeWhitelist { + type StageInputs = Inputs; + type StageOutputs = Outputs; + fn main( + &self, + mut args: Self::StageInputs, + _rover: MartianRover, + ) -> Result { + ensure!( + args.barcode_whitelists.len() < 2, + "Expected at most one barcode whitelist but found {}:\n{}", + args.barcode_whitelists.len(), + args.barcode_whitelists.join("\n") + ); + Ok(Outputs { + barcode_whitelist: args.barcode_whitelists.pop(), + }) + } +} diff --git a/lib/rust/cr_lib/src/stages/generate_cas_websummary.rs b/lib/rust/cr_lib/src/stages/generate_cas_websummary.rs new file mode 100644 index 0000000..7a59f1f --- /dev/null +++ b/lib/rust/cr_lib/src/stages/generate_cas_websummary.rs @@ -0,0 +1,249 @@ +//! +//! Dump vega plots into cell annotation websummary +//! stage GENERATE_CAS_WEBSUMMARY +//! +use crate::cell_annotation_ws_parameters::{ + generate_cas_bc_mismatch_alert, generate_cas_de_warn_alert, generate_cas_failure_alert, + generate_cell_type_barcharts_from_json, generate_cell_type_diffexp_from_json, + generate_cell_type_metrics, generate_cell_type_umap_plot_from_json, + generate_cell_type_violin_plot_from_json, CellAnnotationMetrics, +}; +use crate::HtmlFile; +use anyhow::{Ok, Result}; +use cr_types::constants::{COMMAND_LINE_ENV_DEFAULT_VALUE, COMMAND_LINE_ENV_VARIABLE_NAME}; +use martian::prelude::*; +use martian_derive::{make_mro, MartianStruct}; +use martian_filetypes::json_file::JsonFile; +use martian_filetypes::{FileTypeRead, FileTypeWrite}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::env; +use tenx_websummary::components::{ + Card, CommandLine, DifferentialExpressionTable, InlineHelp, TableMetric, Title, VegaLitePlot, + WithTitle, WsNavBar, +}; +use tenx_websummary::{HtmlTemplate, SinglePageHtml}; +use websummary_build::build_files; + +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +struct MetadataStruct { + tree_version_used: Option, + display_map_version_used: Option, + fraction_non_informative_annotations: Option, + is_beta_model: Option, + developer: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] +pub struct GenerateCasWebsummaryStageInputs { + sample_id: Option, + sample_desc: Option, + cas_frac_returned_bcs: Option, + metadata: Option>, + cell_annotation_model: Option, + cell_type_bar_chart: Option>, + spatial_cell_types_chart: Option>, + cell_type_interactive_bar_chart: Option>, + cell_types_box_plot: Option>, + cell_types_umap_plot: Option>, + diffexp: Option>, + cas_success: Option, + disable_differential_expression: Option, + alert_string: Option, + disable_cas_ws: Option, + pipestance_type: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] +pub struct GenerateCasWebsummaryStageOutputs { + summary: Option, + cell_annotation_metrics: Option>, + cell_annotation_cloupe_name: Option, +} + +#[derive(Serialize, HtmlTemplate)] +pub struct WebSummaryContent { + disclaimer_banner: Option, + metrics_table: Card>, + cell_type_interactive_bar_chart: Option>>, + cell_types_box_plot: Option>>, + cell_types_umap_plot: Option>>, + diffexp_table: Option>>, + cell_type_bar_chart: Option>, + spatial_cell_types_chart: Option>, + command_line_card: Option>, +} + +pub const NO_ANNOTATE_WS_PIPESTANCE_TYPES: [&str; 1] = ["SC_MULTI_CORE_SAMPLE"]; + +impl WebSummaryContent { + fn from_stage_inputs( + args: &GenerateCasWebsummaryStageInputs, + cell_annotation_metrics: CellAnnotationMetrics, + cmdline: &str, + ) -> Result { + Ok(WebSummaryContent { + disclaimer_banner: cell_annotation_metrics.generate_disclaiming_banner(), + metrics_table: Card::full_width(generate_cell_type_metrics(cell_annotation_metrics)?), + cell_type_interactive_bar_chart: args + .cell_type_interactive_bar_chart + .as_ref() + .map(|x| Ok(Card::full_width(generate_cell_type_barcharts_from_json(x)?))) + .transpose()?, + cell_types_box_plot: args + .cell_types_box_plot + .as_ref() + .map(|x| { + Ok(Card::full_width(generate_cell_type_violin_plot_from_json( + x, + )?)) + }) + .transpose()?, + cell_types_umap_plot: args + .cell_types_umap_plot + .as_ref() + .map(|x| Ok(Card::full_width(generate_cell_type_umap_plot_from_json(x)?))) + .transpose()?, + diffexp_table: args + .diffexp + .as_ref() + .map(|x| Ok(Card::full_width(generate_cell_type_diffexp_from_json(x)?))) + .transpose()?, + cell_type_bar_chart: args + .cell_type_bar_chart + .as_ref() + .map(|x| { + Ok(WithTitle { + title: Title::new( + "cell annotation cell types and clusters discovered by unbiased clustering" + .to_string(), + ), + inner: VegaLitePlot { + spec: x.read()?, + actions: None, + renderer: None, + }, + }) + }) + .transpose()?, + spatial_cell_types_chart: args + .spatial_cell_types_chart + .as_ref() + .map(|x| { + Ok(WithTitle { + title: Title::new("Spatial distribution of annotated spots".to_string()), + inner: VegaLitePlot { + spec: x.read()?, + actions: None, + renderer: None, + }, + }) + }) + .transpose()?, + command_line_card: Some(Card::full_width(CommandLine::new(cmdline)?)), + }) + } +} + +pub struct GenerateCasWebsummary; + +#[make_mro] +impl MartianMain for GenerateCasWebsummary { + type StageInputs = GenerateCasWebsummaryStageInputs; + type StageOutputs = GenerateCasWebsummaryStageOutputs; + fn main( + &self, + args: Self::StageInputs, + rover: MartianRover, + ) -> Result { + if args.disable_cas_ws.unwrap_or(false) { + return Ok(GenerateCasWebsummaryStageOutputs { + summary: None, + cell_annotation_metrics: None, + cell_annotation_cloupe_name: None, + }); + } + + let metadata_metrics = args + .metadata + .as_ref() + .map(martian_filetypes::FileTypeRead::read) + .transpose()? + .unwrap_or_default(); + + let cell_annotation_metrics = CellAnnotationMetrics { + cell_annotation_beta_model: metadata_metrics.is_beta_model != Some(false), + cell_annotation_model_developer: metadata_metrics + .developer + .clone() + .unwrap_or_else(|| "Unknown".to_string()), + cell_annotation_model: args + .cell_annotation_model + .clone() + .unwrap_or_else(|| "NOT FOUND".to_string()), + cell_annotation_tree_version_used: metadata_metrics + .tree_version_used + .clone() + .unwrap_or_else(|| "NOT FOUND".to_string()), + cell_annotation_display_map_version_used: metadata_metrics + .display_map_version_used + .unwrap_or_else(|| "NOT FOUND".to_string()), + cell_annotation_frac_returned_bcs: args.cas_frac_returned_bcs, + cell_annotation_success: args.cas_success, + cell_annotation_differential_expression: args.disable_differential_expression, + pipeline_version: rover.pipelines_version(), + }; + + let cell_annotation_cloupe_name = Some(cell_annotation_metrics.get_cloupe_track_name()); + + let cmdline = env::var(COMMAND_LINE_ENV_VARIABLE_NAME) + .unwrap_or_else(|_| COMMAND_LINE_ENV_DEFAULT_VALUE.to_string()); + + let json: JsonFile = rover.make_path("cell_annotation_metrics"); + json.write(&cell_annotation_metrics)?; + + let web_summary_content = + WebSummaryContent::from_stage_inputs(&args, cell_annotation_metrics, &cmdline)?; + + let nav_bar = WsNavBar { + pipeline: "Cell Annotation".to_string(), + id: args.sample_id.unwrap_or_default(), + description: args.sample_desc.unwrap_or_default(), + }; + let summary_html: HtmlFile = rover.make_path("minimal_websummary"); + let initial_alerts = match (args.cas_success, args.disable_differential_expression) { + (Some(false), _) => Some(vec![generate_cas_failure_alert()]), + (Some(true), Some(true)) => Some(vec![generate_cas_de_warn_alert()]), + _ => None, + }; + + let final_alerts = match (initial_alerts, args.alert_string) { + (Some(alert_vec), None) => Some(alert_vec), + (Some(mut alert_vec), Some(alert_str)) => { + alert_vec.push(generate_cas_bc_mismatch_alert(alert_str)); + Some(alert_vec) + } + (None, Some(alert_str)) => Some(vec![generate_cas_bc_mismatch_alert(alert_str)]), + _ => None, + }; + + let pipestance_type = args.pipestance_type.unwrap_or_default(); + + let summary_output = if !(NO_ANNOTATE_WS_PIPESTANCE_TYPES + .iter() + .any(|&ps_type| pipestance_type.contains(ps_type))) + { + let html = SinglePageHtml::new(nav_bar, web_summary_content, final_alerts); + html.generate_html_file_with_build_files(&summary_html, build_files()?)?; + Some(summary_html) + } else { + None + }; + + Ok(GenerateCasWebsummaryStageOutputs { + summary: summary_output, + cell_annotation_metrics: Some(json), + cell_annotation_cloupe_name, + }) + } +} diff --git a/lib/rust/cr_lib/src/stages/get_gdna_metrics.rs b/lib/rust/cr_lib/src/stages/get_gdna_metrics.rs index 6069e40..ec90dab 100644 --- a/lib/rust/cr_lib/src/stages/get_gdna_metrics.rs +++ b/lib/rust/cr_lib/src/stages/get_gdna_metrics.rs @@ -2,14 +2,13 @@ use crate::gdna_utils::compute_gdna_metrics; use anyhow::Result; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::H5File; use martian::{MartianMain, MartianRover}; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::json_file::JsonFile; -use martian_filetypes::tabular_file::CsvFile; use martian_filetypes::FileTypeWrite; use serde::{Deserialize, Serialize}; -use std::path::PathBuf; #[derive(Serialize)] pub struct GdnaMetric { @@ -29,8 +28,7 @@ pub struct GdnaPlottingSummary { #[derive(Clone, Deserialize, MartianStruct)] pub struct GetGdnaMetricsStageInputs { pub molecule_info: H5File, - pub reference_path: PathBuf, - pub probe_set: CsvFile<()>, + pub probe_set: TargetSetFile, } #[derive(Serialize, Deserialize, MartianStruct)] @@ -48,8 +46,7 @@ impl MartianMain for GetGdnaMetrics { type StageOutputs = GetGdnaMetricsStageOutputs; fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { - let gdna_metrics = - compute_gdna_metrics(&args.molecule_info, &args.probe_set, &args.reference_path); + let gdna_metrics = compute_gdna_metrics(&args.molecule_info, &args.probe_set)?; let summary: JsonFile<_> = rover.make_path("summary"); summary.write(&GdnaMetric { diff --git a/lib/rust/cr_lib/src/stages/make_correction_map.rs b/lib/rust/cr_lib/src/stages/make_correction_map.rs index d4b9b06..b9a13e4 100644 --- a/lib/rust/cr_lib/src/stages/make_correction_map.rs +++ b/lib/rust/cr_lib/src/stages/make_correction_map.rs @@ -111,7 +111,7 @@ impl MartianStage for MakeCorrectionMap { let correction_map_builders = chemistry_def.barcode_construct().map_result(|bc| { bc.whitelist() - .as_source(false) + .as_source() .and_then(|src| src.as_whitelist().map(|wl| CorrectionMapBuilder::new(&wl))) })?; diff --git a/lib/rust/cr_lib/src/stages/make_shard.rs b/lib/rust/cr_lib/src/stages/make_shard.rs index 11cbaa5..1e444a4 100644 --- a/lib/rust/cr_lib/src/stages/make_shard.rs +++ b/lib/rust/cr_lib/src/stages/make_shard.rs @@ -1,7 +1,7 @@ //! Martian stage MAKE_SHARD use crate::barcode_correction_metrics::{BarcodeCorrectionMetrics, BarcodeCorrectionMetricsFormat}; -use crate::barcode_sort::BarcodeSortWorkflow; +use crate::barcode_sort::execute_barcode_sort_with_visitor; use crate::make_shard_metrics::{MakeShardHistograms, MakeShardMetrics, MakeShardVisitor}; use crate::types::{FeatureReferenceFormat, ReadPrefixCountFile, ReadShardFile, UmiCountFile}; use crate::SequencingMetricsFormat; @@ -10,14 +10,13 @@ use barcode::Whitelist; use cr_types::chemistry::{ChemistryDefs, ChemistryDefsExt}; use cr_types::reference::feature_reference::{ FeatureConfig, FeatureReference, FeatureReferenceFile, FeatureType, TargetGeneIndicesFile, - TargetSetFile, }; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::rna_read::RnaChunk; use cr_types::types::{ BcCountFormat, BcSegmentCountFormat, FeatureBarcodeType, GemWell, LibraryType, }; use cr_types::{FeatureCountFormat, MetricsFile}; -use cr_websummary::multi::tables::SequencingMetricsTable; use fastq_set::read_pair::WhichRead; use itertools::{zip_eq, Itertools}; use martian::prelude::*; @@ -30,6 +29,10 @@ use parameters_toml::umi_min_read_length; use serde::{Deserialize, Serialize}; use std::path::PathBuf; +// Report up to 50 unknown feature barcode sequences which occupies at least 0.1% library reads +const MAX_UNKNOWN_FBC_TO_REPORT: usize = 50; +const MIN_FRAC_READS_UNKNOWN_FBC: f64 = 0.001; + martian_filetype!(MakeShardMetricsFile, "msm"); martian_filetype!(MakeShardHistogramsFile, "msh"); @@ -49,7 +52,6 @@ pub struct MakeShardStageInputs { pub target_features: Option, pub target_set: Option, pub target_set_name: Option, - pub libraries_to_translate: TxHashSet, pub feature_config: Option, } @@ -93,7 +95,7 @@ pub struct MakeShardStageOutputs { /// Read the FASTQ files and extract the barcode and UMI sequences. pub struct MakeShard; -#[make_mro(volatile = strict)] +#[make_mro(mem_gb = 2, volatile = strict)] impl MartianStage for MakeShard { type StageInputs = MakeShardStageInputs; type StageOutputs = MakeShardStageOutputs; @@ -133,24 +135,24 @@ impl MartianStage for MakeShard { None }; - let feature_reference = args - .reference_path - .as_ref() - .map(|reference_path| -> Result<_> { - let fref_file: FeatureReferenceFormat = rover.make_path("feature_reference"); - let fref = FeatureReference::from_paths( - reference_path, - args.feature_reference_path.as_ref(), - use_feature_types, - args.target_set_name.as_deref(), - args.target_set.as_ref(), - args.target_features.as_ref(), - args.feature_config.as_ref(), - )?; - fref_file.write(&fref)?; - Ok(fref_file) - }) - .transpose()?; + let feature_reference = if args.reference_path.is_some() + || args.target_set.is_some() + || args.feature_reference_path.is_some() + { + let feature_reference: FeatureReferenceFormat = rover.make_path("feature_reference"); + feature_reference.write(&FeatureReference::from_paths( + args.reference_path.as_deref(), + args.feature_reference_path.as_ref(), + use_feature_types, + args.target_set_name.as_deref(), + args.target_set.as_ref(), + args.target_features.as_ref(), + args.feature_config.as_ref(), + )?)?; + Some(feature_reference) + } else { + None + }; Ok((0..args.read_chunks.len()) .map(|chunk_id| { @@ -159,7 +161,7 @@ impl MartianStage for MakeShard { chunk_id, feature_reference: feature_reference.clone(), }, - Resource::with_mem_gb(4).threads(2), + Resource::with_mem_gb(4).threads(4), ) }) .collect::>() @@ -215,17 +217,6 @@ impl MartianStage for MakeShard { let chunk_summary: BinaryFormat<_, _> = rover.make_path("chunk_summary"); let chunk_hist: BinaryFormat<_, _> = rover.make_path("chunk_hist"); - let mut bc_sort: BarcodeSortWorkflow = BarcodeSortWorkflow::new( - rna_chunk.clone(), - valid_shard.as_ref(), - invalid_shard.as_ref(), - Whitelist::construct( - rna_chunk.chemistry.barcode_whitelist(), - args.libraries_to_translate - .contains(&rna_chunk.library_type()), - )?, - )?; - let initial_read_pairs = args.initial_read_pairs.map(|i| { let frac = i as f64 / args.read_chunks.len() as f64; let lwr = (frac * id as f64).round() as usize; @@ -233,7 +224,14 @@ impl MartianStage for MakeShard { upr - lwr }); - bc_sort.execute_workflow_with_visitor(initial_read_pairs, &mut visitor)?; + let metrics = execute_barcode_sort_with_visitor( + rna_chunk.clone(), + valid_shard.to_path_buf(), + invalid_shard.to_path_buf(), + Whitelist::construct(rna_chunk.chemistry.barcode_whitelist())?, + initial_read_pairs, + &mut visitor, + )?; feature_counts.write(&visitor.feature_counts)?; chunk_summary.write(visitor.metrics())?; chunk_hist.write(visitor.histograms())?; @@ -242,10 +240,8 @@ impl MartianStage for MakeShard { // - MAKE_SHARD counts the reads with a valid barcode, that is, all segments are valid. // - BARCODE_CORRECTION counts the reads with an invalid barcode, that is, any segment is invalid. // Counting which individual segments are valid/invalid here in MAKE_SHARD would double count the reads with any invalid segment. - let num_valid_barcodes = bc_sort.num_valid_items(); - let num_valid_barcode_segments = bc_sort - .num_valid_segments() - .map(|_x| num_valid_barcodes.into()); + let num_valid_barcodes = metrics.valid_items; + let num_valid_barcode_segments = metrics.valid_items_in.map(|_x| num_valid_barcodes.into()); let bc_correct_summary: BarcodeCorrectionMetricsFormat = rover.make_path("bc_correct_summary"); bc_correct_summary.write(&BarcodeCorrectionMetrics::with_valid( @@ -254,7 +250,7 @@ impl MartianStage for MakeShard { num_valid_barcode_segments, ))?; - let total_read_pairs = bc_sort.num_valid_items() + bc_sort.num_invalid_items(); + let total_read_pairs = metrics.valid_items + metrics.invalid_items; ensure!( total_read_pairs > 0, @@ -303,6 +299,7 @@ impl MartianStage for MakeShard { let mut per_lib_per_fastq_id_metrics: TxHashMap<_, TxHashMap<_, MakeShardMetrics>> = TxHashMap::default(); let mut per_lib_hist = TxHashMap::default(); + for (read_chunk, chunk_out) in zip_eq(&args.read_chunks, &chunk_outs) { let library_type = read_chunk.library_type(); let barcode_construct = read_chunk.chemistry.barcode_construct().map(|_| ()); @@ -322,18 +319,43 @@ impl MartianStage for MakeShard { .merge(hist); } + let top_unknown_fbc_seqs: Vec<(_, SimpleHistogram)> = per_lib_hist + .iter() + .map(|(&k, v)| { + ( + k, + v.unknown_feature_bcs + .top_n(MAX_UNKNOWN_FBC_TO_REPORT) + .clone(), + ) + }) + .collect(); + let mut per_lib_seq_metrics = TxHashMap::default(); let mut per_lib_metrics = TxHashMap::default(); - for (library_type, per_fastq_id_metrics) in per_lib_per_fastq_id_metrics { + for (library_id, (library_type, per_fastq_id_metrics)) in + (0_u16..).zip(per_lib_per_fastq_id_metrics.into_iter()) + { let mut lib_metrics = MakeShardMetrics::default(); let mut seq_metrics_rows = Vec::new(); for (fastq_id, metrics) in per_fastq_id_metrics { - seq_metrics_rows - .push(metrics.sequencing_metrics_row(fastq_id.cloned().unwrap_or_default())); + seq_metrics_rows.push( + metrics.sequencing_metrics_for_fastq(fastq_id.cloned().unwrap_or_default()), + ); lib_metrics.merge(metrics); + if let Some((_, feature_bc_hist)) = top_unknown_fbc_seqs + .iter() + .find(|(lib_type, _)| *lib_type == library_type) + { + lib_metrics.report_unknown_fbc( + library_id, + feature_bc_hist.clone(), + MIN_FRAC_READS_UNKNOWN_FBC, + ); + } } per_lib_metrics.insert(library_type, lib_metrics); - per_lib_seq_metrics.insert(library_type, SequencingMetricsTable(seq_metrics_rows)); + per_lib_seq_metrics.insert(library_type, seq_metrics_rows); } let sequencing_metrics_file: SequencingMetricsFormat = @@ -403,13 +425,13 @@ impl MartianStage for MakeShard { max = r1_max_length, tbl = per_lib_hist .keys() - .map(|key| match *key { + .map(|&key| match key { LibraryType::Gex => multiconst::GENE_EXPRESSION, LibraryType::Vdj(_) => multiconst::VDJ, LibraryType::FeatureBarcodes(_) => multiconst::FEATURE, LibraryType::Atac => unreachable!(), }) - .join("], ["), + .format("], ["), ); } @@ -431,7 +453,8 @@ impl MartianStage for MakeShard { let summary = JsonReporter::from(("cellranger_version", rover.pipelines_version())) + per_lib_reporter - + args.chemistry_defs.primary().to_json_reporter(); + + args.chemistry_defs.primary().to_json_reporter() + + JsonReporter::from(("chemistry_defs", args.chemistry_defs.to_value())); let feature_reference = chunk_defs.first().and_then(|x| x.feature_reference.clone()); diff --git a/lib/rust/cr_lib/src/stages/mod.rs b/lib/rust/cr_lib/src/stages/mod.rs index 31c1743..1074f96 100644 --- a/lib/rust/cr_lib/src/stages/mod.rs +++ b/lib/rust/cr_lib/src/stages/mod.rs @@ -15,7 +15,9 @@ pub mod demux_probe_bc_matrix; pub mod detect_chemistry; pub mod detect_chemistry_test; pub mod detect_vdj_receptor; +pub mod expect_single_barcode_whitelist; pub mod extract_single_chemistry; +pub mod generate_cas_websummary; pub mod get_chemistry_def; pub mod get_gdna_metrics; pub mod logic_not; diff --git a/lib/rust/cr_lib/src/stages/multi_preflight.rs b/lib/rust/cr_lib/src/stages/multi_preflight.rs index 6e38347..8c5defc 100644 --- a/lib/rust/cr_lib/src/stages/multi_preflight.rs +++ b/lib/rust/cr_lib/src/stages/multi_preflight.rs @@ -7,10 +7,10 @@ use crate::preflight::{ }; use anyhow::{bail, ensure, Result}; use cr_types::chemistry::ChemistryName; -use cr_types::reference::feature_reference::FeatureType; +use cr_types::probe_set::merge_probe_set_csvs; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::reference::reference_info::ReferenceInfo; use cr_types::types::FileOrBytes; -use cr_types::FeatureBarcodeType; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use multi::config::preflight::{ @@ -40,7 +40,7 @@ impl MartianMain for MultiPreflight { type StageInputs = MultiPreflightInputs; type StageOutputs = MultiPreflightOutputs; - fn main(&self, args: Self::StageInputs, _rover: MartianRover) -> Result { + fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { let hostname = hostname(); check_resource_limits()?; // make a new chunk per sample_def to do chemistry detection @@ -55,7 +55,12 @@ impl MartianMain for MultiPreflight { FileOrBytes { bytes: None, file: Some(ref file), - } => MultiConfigCsvFile::from(file).read(), + } => { + if file.extension().and_then(|ext| ext.to_str()) != Some("csv") { + bail!("multi config file must have .csv extention") + } + MultiConfigCsvFile::from(file).read() + } FileOrBytes { bytes: None, file: None, @@ -65,6 +70,7 @@ impl MartianMain for MultiPreflight { file: Some(_), } => bail!("exactly one of either config file or config bytes must be provided"), }?; + let gene_expression = cfg.gene_expression.as_ref(); let (transcriptome, target_genes) = if let Some(gex) = gene_expression { ensure!( @@ -74,41 +80,68 @@ impl MartianMain for MultiPreflight { multiconst::GENE_EXPRESSION, ); - let transcriptome = check_gex_reference( - &SectionCtx { - section: "gene-expression", - field: "reference", - }, - &gex.reference_path, - &hostname, - )?; - let ref_info = ReferenceInfo::from_reference_path(&gex.reference_path)?; - ref_info.validate()?; - let genomes = ref_info.genomes; - let target_genes = if let (Some(probe_set), Some(targeting_method)) = - (gex.probe_set(), gex.targeting_method()) - { - Some(check_target_panel( - &transcriptome, - genomes, - probe_set, - targeting_method, - args.is_pd, - )?) - } else { - None + let transcriptome = gex + .reference_path + .as_deref() + .map(|ref_path| { + check_gex_reference( + &SectionCtx { + section: "gene-expression", + field: "reference", + }, + ref_path, + &hostname, + ) + }) + .transpose()?; + + let ref_info = gex + .reference_path + .as_deref() + .map(ReferenceInfo::from_reference_path) + .transpose()?; + if let Some(ref_info) = &ref_info { + ref_info.validate()?; + } + + let probe_set_csv = match gex.probe_set() { + [] => None, + [probe_set] => Some(probe_set.clone()), + probe_sets => { + let probe_set_csv: TargetSetFile = rover.make_path("combined_probe_set"); + merge_probe_set_csvs(probe_sets, probe_set_csv.buf_writer()?)?; + Some(probe_set_csv) + } }; - (Some(transcriptome), target_genes) + + let target_genes = probe_set_csv + .as_ref() + .map(|probe_set_csv| { + check_target_panel( + transcriptome.as_ref(), + ref_info.as_ref(), + probe_set_csv, + gex.targeting_method().unwrap(), + ) + }) + .transpose()?; + (transcriptome, target_genes) } else { (None, None) }; - let max_multiplexing_tags = *max_multiplexing_tags()?; + if cfg.libraries.has_gene_expression() && !cfg.is_rtl() { + ensure!( + transcriptome.is_some(), + "A reference transcriptome or probe set is required to analyze a Gene Expression library." + ); + } + + let max_multiplexing_tags = *max_multiplexing_tags()?; let (feature_reference, _tenx_cmos) = build_feature_reference_with_cmos(&cfg, args.is_pd, &hostname, max_multiplexing_tags)?; - if let (Some(transcriptome), Some(feature_reference)) = - (transcriptome.as_ref(), feature_reference.as_ref()) + if let (Some(transcriptome), Some(feature_reference)) = (&transcriptome, &feature_reference) { check_crispr_target_genes(transcriptome, feature_reference, target_genes.as_ref())?; } @@ -152,20 +185,6 @@ impl MartianMain for MultiPreflight { bail!("The chemistry SC3Pv3LT (Single Cell 3'v3 LT) is no longer supported. To analyze this data, use Cell Ranger 7.2 or earlier."); } - // Check for CRISPR guide capture libraries and v4 of 3pGEX, which are incompatible. - if let Some(feature_reference) = feature_reference.as_ref() { - for feat in &feature_reference.feature_defs { - if feat.feature_type == FeatureType::Barcode(FeatureBarcodeType::Crispr) - && cfg.chemistry_specs()?.values().any(|chem| { - chem.refined() == Some(ChemistryName::ThreePrimeV4) - || chem.refined() == Some(ChemistryName::ThreePrimeV4OH) - }) - { - bail!("The chemistry SC3Pv4 (Single Cell 3'v4) is not supported with CRISPR Guide Capture libraries.") - } - } - } - Ok(MultiPreflightOutputs {}) } } @@ -174,6 +193,7 @@ impl MartianMain for MultiPreflight { mod tests { use super::*; use glob::glob; + use insta::{assert_debug_snapshot, assert_snapshot}; use itertools::Itertools; use multi::config::preflight::check_feature_reference; use std::path::Path; @@ -199,17 +219,7 @@ mod tests { #[test] fn test_gex_missing_gex_section() { let outs = test_run_stage("test/multi/invalid_csvs/gex_missing_gex_section.csv"); - insta::assert_display_snapshot!(outs.unwrap_err()); - } - - #[test] - fn test_3pgexv4_crispr_incompatible() { - if !refdata_available() { - return; - } - - let outs = test_run_stage("test/multi/3pgexv4_crispr_incompatible.csv"); - insta::assert_debug_snapshot!(&outs); + assert_snapshot!(outs.unwrap_err()); } #[test] @@ -218,7 +228,7 @@ mod tests { return; } let outs = test_run_stage("test/multi/gex_multi_dup1.csv"); - insta::assert_debug_snapshot!(&outs); + assert_debug_snapshot!(&outs); } #[test] @@ -227,7 +237,7 @@ mod tests { return; } let outs = test_run_stage("test/multi/gex_multi_dup2.csv"); - insta::assert_display_snapshot!(&outs.unwrap_err()); + assert_snapshot!(&outs.unwrap_err()); } #[test] @@ -247,7 +257,7 @@ mod tests { ) }) .collect(); - insta::assert_debug_snapshot!(outs); + assert_debug_snapshot!(outs); Ok(()) } @@ -257,7 +267,7 @@ mod tests { return; } let outs = test_run_stage("test/multi/gex_multi_no_feature.csv"); - insta::assert_debug_snapshot!(&outs); + assert_debug_snapshot!(&outs); } #[test] @@ -266,7 +276,7 @@ mod tests { return; } let outs = test_run_stage("test/multi/gex_multi_only.csv"); - insta::assert_display_snapshot!(&outs.unwrap_err()); + assert_snapshot!(&outs.unwrap_err()); } #[test] @@ -275,7 +285,7 @@ mod tests { return; } let outs = test_run_stage("test/multi/gex_multi_unsupp.csv"); - insta::assert_display_snapshot!(&outs.unwrap_err()); + assert_snapshot!(&outs.unwrap_err()); } #[test] @@ -284,7 +294,7 @@ mod tests { return; } let outs = test_run_stage("test/multi/beamab_vdj_gex_invalid_antigen_spec1.csv"); - insta::assert_display_snapshot!(&outs.unwrap_err()); + assert_snapshot!(&outs.unwrap_err()); } #[test] @@ -293,43 +303,43 @@ mod tests { return; } let outs = test_run_stage("test/multi/beamt_vdj_gex_invalid_antigen_spec1.csv"); - insta::assert_display_snapshot!(&outs.unwrap_err()); + assert_snapshot!(&outs.unwrap_err()); } #[test] fn test_invalid_beamab_with_allele() { let outs = test_run_stage("test/multi/beamab_vdj_gex_with_allele.csv"); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] fn test_invalid_beamab_config_w_allele_featureref_no_allele() { let outs = test_run_stage("test/multi/beamab_config_w_allele_featureref_no_allele.csv"); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] fn beamab_config_no_allele_featureref_w_allele() { let outs = test_run_stage("test/multi/beamab_config_no_allele_featureref_w_allele.csv"); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] fn beamt_config_no_allele_featureref_w_allele() { let outs = test_run_stage("test/multi/beamt_config_no_allele_featureref_w_allele.csv"); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] fn beamt_config_no_allele_featureref_no_allele() { let outs = test_run_stage("test/multi/beamt_config_no_allele_featureref_no_allele.csv"); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] fn beamt_config_incompatible_allele() { let outs = test_run_stage("test/multi/beamt_config_incompatible_allele.csv"); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] @@ -338,7 +348,7 @@ mod tests { return; } let outs = test_run_stage("test/multi/beamab_vdj_gex_invalid_functional_map.csv"); - insta::assert_display_snapshot!(&outs.unwrap_err()); + assert_snapshot!(&outs.unwrap_err()); } #[test] @@ -348,7 +358,7 @@ mod tests { } assert!(test_run_stage_is_pd("test/multi/mfrp_ab_multi.csv", true).is_ok()); let outs = test_run_stage("test/multi/mfrp_ab_multi.csv"); - insta::assert_debug_snapshot!(&outs); + assert_debug_snapshot!(&outs); } #[test] @@ -358,7 +368,7 @@ mod tests { } let outs = test_run_stage("test/multi/invalid_csvs/mfrp_ab_multi_invalid_probe_barcode.csv"); - insta::assert_debug_snapshot!(&outs); + assert_debug_snapshot!(&outs); } #[test] @@ -368,7 +378,7 @@ mod tests { } let outs = test_run_stage("test/multi/invalid_csvs/mfrp_ab_multi_unknown_probe_barcode.csv"); - insta::assert_debug_snapshot!(&outs); + assert_debug_snapshot!(&outs); } #[test] @@ -380,7 +390,7 @@ mod tests { test_run_stage_is_pd("test/multi/mfrp_ab_multi_without_ab_library.csv", true).is_ok() ); let outs = test_run_stage("test/multi/mfrp_ab_multi_without_ab_library.csv"); - insta::assert_debug_snapshot!(&outs); + assert_debug_snapshot!(&outs); } #[test] @@ -390,6 +400,16 @@ mod tests { } let outs = test_run_stage("test/multi/invalid_csvs/invalid_overhang_ids.csv"); - insta::assert_debug_snapshot!(&outs.unwrap_err().to_string()); + assert_debug_snapshot!(&outs.unwrap_err().to_string()); + } + + #[test] + fn test_invalid_hashtag_ids() { + if !refdata_available() { + return; + } + + let outs = test_run_stage("test/multi/invalid_csvs/invalid_hashtag_ids.csv"); + assert_debug_snapshot!(&outs.unwrap_err().to_string()); } } diff --git a/lib/rust/cr_lib/src/stages/multi_setup_chunks.rs b/lib/rust/cr_lib/src/stages/multi_setup_chunks.rs index ca8e1dc..1c88911 100644 --- a/lib/rust/cr_lib/src/stages/multi_setup_chunks.rs +++ b/lib/rust/cr_lib/src/stages/multi_setup_chunks.rs @@ -23,12 +23,11 @@ pub struct MultiSetupChunksStageInputs { #[derive(Clone, Serialize, Deserialize, MartianStruct, PartialEq)] pub struct MultiSetupChunksStageOutputs { pub chunks: Vec, - /// Gel Bead barcode whitelist or the spot barcode in Visium - pub barcode_whitelist: Option, + /// Gel Bead barcode whitelist(s) or the spot barcode in Visium + pub barcode_whitelists: Vec, pub visium_hd_slide_name: Option, } -// This is our stage struct pub struct MultiSetupChunks; #[make_mro] @@ -94,7 +93,7 @@ impl MartianMain for MultiSetupChunks { }) .collect(); - let barcode_whitelist = args + let barcode_whitelists = args .chemistry_defs .values() .filter_map(|x| { @@ -102,10 +101,9 @@ impl MartianMain for MultiSetupChunks { .option_gel_bead() .and_then(WhitelistSpec::whitelist_name) }) - .dedup() - .at_most_one() - .unwrap() - .map(String::from); + .unique() + .map(String::from) + .collect(); let visium_hd_slide_name = args .chemistry_defs @@ -119,31 +117,8 @@ impl MartianMain for MultiSetupChunks { Ok(MultiSetupChunksStageOutputs { chunks, - barcode_whitelist, + barcode_whitelists, visium_hd_slide_name, }) } } - -#[cfg(test)] -#[cfg(feature = "slow_tests")] -mod tests { - use super::*; - use insta::assert_ron_snapshot; - use martian_filetypes::json_file::JsonFile; - use martian_filetypes::FileTypeRead; - use std::collections::BTreeMap; - - #[test] - fn test_setup_chunks_outs() -> Result<()> { - let data: BTreeMap = - JsonFile::from("test/setup_chunks_sample_defs.json").read()?; - let total_items = data.len(); - for (i, (sample, args)) in data.into_iter().enumerate() { - println!("({}/{}) Sample: {}", i, total_items, sample); - let outs = MultiSetupChunks.test_run_tmpdir(args)?; - assert_ron_snapshot!(sample, outs); - } - Ok(()) - } -} diff --git a/lib/rust/cr_lib/src/stages/parse_multi_config.rs b/lib/rust/cr_lib/src/stages/parse_multi_config.rs index 39c776a..83ecf07 100644 --- a/lib/rust/cr_lib/src/stages/parse_multi_config.rs +++ b/lib/rust/cr_lib/src/stages/parse_multi_config.rs @@ -2,10 +2,13 @@ use crate::preflight::hostname; use anyhow::{anyhow, bail, Result}; +use cr_types::cell_annotation::CellAnnotationModel; use cr_types::chemistry::{ AutoChemistryName, AutoOrRefinedChemistry, ChemistryDef, ChemistrySpecs, IndexScheme, }; +use cr_types::probe_set::{merge_probe_set_csvs, ProbeSetReferenceMetadata}; use cr_types::reference::feature_reference::{FeatureConfig, FeatureReferenceFile}; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::sample_def::SampleDef; use cr_types::types::FileOrBytes; use cr_types::{AlignerParam, LibraryType, TargetingMethod, VdjChainType}; @@ -40,6 +43,8 @@ pub struct MultiParams { barcode_whitelist: Option, #[serde(default)] special_genomic_regions: Option>, + #[serde(default)] + cell_calling_mode: Option, } #[derive(Clone, Deserialize, MartianStruct)] @@ -120,10 +125,12 @@ pub type GeneticDemuxParams = JValue; #[cfg_attr(test, derive(Debug))] pub struct CountInputs { pub sample_def: Vec, + pub target_set: Option, + pub target_set_name: Option, pub chemistry_specs: ChemistrySpecs, pub custom_chemistry_def: Option, - pub reference_path: PathBuf, - pub gene_index: JsonFile<()>, + pub reference_path: Option, + pub gene_index: Option>, #[mro_type = "map[]"] pub primers: Vec, pub cell_calling_config: CellCalling, @@ -153,7 +160,10 @@ pub struct CountInputs { pub min_assignment_confidence: Option, pub min_crispr_umi_threshold: Option, pub annotations: Option>>, - pub cas_model: Option, + pub cell_annotation_model: Option, + pub skip_cell_annotation: bool, + pub tenx_cloud_token_path: Option, + pub enable_tsne: bool, } /// General VdjInputs which are not chain specific @@ -206,6 +216,10 @@ pub struct BasicPipelineConfig { /// boolean to disable stages that are only needed when count libraries are /// present in the multi pipeline pub disable_multi_count: bool, + /// boolean to disable stages that are only needed when probes are present + pub disable_rtl: bool, + /// boolean to disable annotate stages + pub disable_annotate: bool, } #[derive(Clone, Serialize, Deserialize, MartianStruct)] @@ -221,6 +235,8 @@ pub struct ParseMultiConfigStageOutputs { #[mro_retain] pub feature_ref: Option, #[mro_retain] + pub target_set: Option, + #[mro_retain] pub cell_barcodes: Option>, #[mro_retain] pub sample_barcodes: Option>, @@ -279,6 +295,7 @@ impl MartianMain for ParseMultiConfig { index_scheme, barcode_whitelist, special_genomic_regions, + cell_calling_mode, } = args.params.unwrap_or_default(); let ( @@ -301,7 +318,7 @@ impl MartianMain for ParseMultiConfig { .iter() .try_fold(Vec::new(), |mut acc, x| -> Result<_> { if x.is_gex() || x.library_type().is_fb() { - acc.push(x.to_sample_def(&cfg)?); + acc.push(x.to_sample_def()?); } Ok(acc) })?; @@ -327,21 +344,17 @@ impl MartianMain for ParseMultiConfig { sample.r2_length = feature.and_then(|f| f.r2_length); } } - // write the gene_index json if we need to - let gene_index: JsonFile<()> = rover.make_path("gene_index"); - transcriptome::python_gene_index::write_gene_index( - &gex.reference_path, - gene_index.as_ref(), - )?; - /* TODO: when we divvy up CountInputs into a vec by gem-well, - // thread in gem-wells params for force_cells, etc - let force_cells = cfg - .gem_wells - .as_ref() - .map(|gw| gw.0.get(&GemWell(1)).map(|p| p.force_cells)) - .flatten() - .flatten(); - */ + + let gene_index = if let Some(reference_path) = &gex.reference_path { + let gene_index: JsonFile<()> = rover.make_path("gene_index"); + transcriptome::python_gene_index::write_gene_index( + reference_path, + &gene_index, + )?; + Some(gene_index) + } else { + None + }; let ( cell_barcodes, @@ -417,7 +430,7 @@ impl MartianMain for ParseMultiConfig { .map(multi::config::SamplesCsv::get_max_mito_percent), }, cell_barcodes: cell_barcodes.clone(), - override_mode: None, + override_mode: cell_calling_mode, override_library_types: None, disable_ab_aggregate_detection: feature .is_some_and(|feat| !feat.filter_aggregates), @@ -463,17 +476,46 @@ impl MartianMain for ParseMultiConfig { ) }); + let chemistry_specs = cfg.chemistry_specs()?; + let has_gex_library = chemistry_specs + .iter() + .any(|(lib_type, _)| lib_type.is_gex()); + + let (target_set, target_set_name) = + match (cfg.gene_expression.as_ref(), has_gex_library) { + (Some(gex_params), true) => match gex_params.probe_set() { + [] => (None, None), + [probe_set] => ( + Some(probe_set.clone()), + Some( + ProbeSetReferenceMetadata::load_from(probe_set)? + .panel_name() + .to_string(), + ), + ), + probe_sets => { + let target_set: TargetSetFile = + rover.make_path("combined_probe_set"); + let name = + merge_probe_set_csvs(probe_sets, target_set.buf_writer()?)?; + (Some(target_set), Some(name)) + } + }, + _ => (None, None), + }; + let count_input = Some(CountInputs { // Filter the VDJ libraries out of this collection since VDJ // chemistry is handled separately. - chemistry_specs: cfg - .chemistry_specs()? + chemistry_specs: chemistry_specs .into_iter() .filter(|(lib_type, _)| !lib_type.is_vdj()) .collect(), + target_set, + target_set_name, sample_def, custom_chemistry_def, - reference_path: PathBuf::from(&gex.reference_path), + reference_path: gex.reference_path.clone(), gene_index, primers: primers.clone(), cell_calling_config, @@ -506,7 +548,15 @@ impl MartianMain for ParseMultiConfig { min_assignment_confidence: gex.min_assignment_confidence, min_crispr_umi_threshold: cfg.feature.as_ref().map(|x| x.min_crispr_umi), annotations: None, - cas_model: gex.cas_model.clone(), + skip_cell_annotation: gex.skip_cell_annotation + || (gex.cell_annotation_model.is_none() && !args.is_pd), + cell_annotation_model: gex + .cell_annotation_model + .as_ref() + .and_then(CellAnnotationModel::to_pipeline_inputs), + // this will return a default token path if not supplied + tenx_cloud_token_path: gex.get_tenx_cloud_token_path(), + enable_tsne: true, }); ( @@ -529,7 +579,7 @@ impl MartianMain for ParseMultiConfig { per_lib_vdj_sample_def .entry((lib.physical_library_id(), lib.library_type())) .or_insert_with(Vec::new) - .push(lib.to_sample_def(&cfg)?); + .push(lib.to_sample_def()?); } } if per_lib_vdj_sample_def.len() > 3 { @@ -590,8 +640,7 @@ impl MartianMain for ParseMultiConfig { let vdj_gen_inputs = VdjGenInputs { reference_path: cfg .gene_expression - .as_ref() - .map(|gex| PathBuf::from(&gex.reference_path)), + .and_then(|gex| gex.reference_path.clone()), vdj_reference_path: Some(vdj.reference_path.clone()), min_contig_length: vdj.min_contig_length, filter_flags: VdjFilterFlags { @@ -609,6 +658,12 @@ impl MartianMain for ParseMultiConfig { disable_vdj: vdj_inputs.is_empty(), disable_multi: false, disable_multi_count: count_input.is_none(), + disable_rtl: count_input + .as_ref() + .map_or(true, |c| c.target_set.is_none()), + disable_annotate: count_input + .as_ref() + .map_or(true, |c| c.skip_cell_annotation), }; let common_input = CommonInputs { @@ -625,6 +680,7 @@ impl MartianMain for ParseMultiConfig { cfg.antigen_specificity.as_ref(), cfg.functional_map.as_ref(), cfg.libraries.beam_mode(), + cfg.samples.as_ref(), ); // Create feature reference object to make sure features are continous @@ -638,6 +694,7 @@ impl MartianMain for ParseMultiConfig { Ok(ParseMultiConfigStageOutputs { common_input, + target_set: count_input.as_ref().and_then(|c| c.target_set.clone()), count_input, vdj_inputs, vdj_gen_inputs, @@ -657,6 +714,7 @@ impl MartianMain for ParseMultiConfig { #[cfg(test)] mod tests { use super::*; + use insta::{assert_snapshot, assert_yaml_snapshot}; use multi::config::ProbeBarcodeIterationMode; use std::path::Path; @@ -717,7 +775,7 @@ mod tests { let test_csv = &format!("test/multi/{sample_id}.csv"); insta_settings(test_csv).bind(|| { let outs = test_run_stage(test_csv, sample_id).unwrap(); - insta::assert_yaml_snapshot!(sample_id, &outs); + assert_yaml_snapshot!(sample_id, &outs); }); } @@ -782,7 +840,7 @@ mod tests { "test/multi/invalid_csvs/vdj_micro_gd_no_primer.csv", "vdj_micro_gd_noprimer", ); - insta::assert_display_snapshot!(&outs.unwrap_err()); + assert_snapshot!(&outs.unwrap_err()); } #[test] @@ -816,13 +874,13 @@ mod tests { "test/multi/invalid_csvs/fb_only_missing_gex_section.csv", "fb", ); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] fn test_gex_missing_gex_section() { let outs = test_run_stage("test/multi/invalid_csvs/gex_missing_gex_section.csv", "gex"); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] @@ -846,7 +904,7 @@ mod tests { "test/multi/non_continous_feature_ref.csv", "non_continous_feature_ref", ); - insta::assert_display_snapshot!(outs.unwrap_err()); + assert_snapshot!(outs.unwrap_err()); } #[test] diff --git a/lib/rust/cr_lib/src/stages/rust_bridge.rs b/lib/rust/cr_lib/src/stages/rust_bridge.rs index 2b38b27..1eb5a7c 100644 --- a/lib/rust/cr_lib/src/stages/rust_bridge.rs +++ b/lib/rust/cr_lib/src/stages/rust_bridge.rs @@ -62,13 +62,13 @@ pub struct RustBridgeStageOutputs { pub gem_groups: Vec, pub barcodes: Vec>, pub raw_barcode_counts_json: JsonFile<()>, - pub corrected_barcode_counts_json: JsonFile>, + pub corrected_barcode_counts_json: JsonFile>, pub summary: MetricsFile, pub n50_n50_rpu: u32, pub processed_read_pairs: u64, } -fn iter_range_grouped<'a, T: 'a, S: 'a>( +fn iter_range_grouped<'a, T, S>( reader: &'a ShardReader, range: &Range<>::Key>, ) -> Result< @@ -80,9 +80,9 @@ fn iter_range_grouped<'a, T: 'a, S: 'a>( anyhow::Error, > where - T: DeserializeOwned, + T: 'a + DeserializeOwned, >::Key: Clone + Ord + DeserializeOwned, - S: SortKey, + S: 'a + SortKey, { Ok(reader.iter_range(range)?.group_by(|read| { read.as_ref() diff --git a/lib/rust/cr_lib/src/stages/set_targeted_umi_filter.rs b/lib/rust/cr_lib/src/stages/set_targeted_umi_filter.rs index a319e8e..264fe4b 100644 --- a/lib/rust/cr_lib/src/stages/set_targeted_umi_filter.rs +++ b/lib/rust/cr_lib/src/stages/set_targeted_umi_filter.rs @@ -14,7 +14,7 @@ use serde::{Deserialize, Serialize}; use shardio::ShardReader; const QUANTILE: f64 = 0.9; -const NUM_ORDMAG: f64 = 2.0; +const NUM_ORDMAG: i32 = 2; /// Set the parameter `umi_read_count_threshold` based on a random sample of barcodes. /// Receive UMI counts from a set of barcodes and construct a histogram of the @@ -73,7 +73,7 @@ impl MartianMain for SetTargetedUmiFilter { // Compute RPU threshold using quantile + order of magnitude adjustment let threshold = match rpu_histogram.quantiles([QUANTILE]) { Some(quantiles) => { - let threshold_float = quantiles[0] / (10_f64).powf(NUM_ORDMAG); + let threshold_float = quantiles[0] / (10_f64).powi(NUM_ORDMAG); threshold_float.ceil() as u64 } // No counts diff --git a/lib/rust/cr_lib/src/stages/setup_vdj_analysis.rs b/lib/rust/cr_lib/src/stages/setup_vdj_analysis.rs index 08fa0ec..bfec96b 100644 --- a/lib/rust/cr_lib/src/stages/setup_vdj_analysis.rs +++ b/lib/rust/cr_lib/src/stages/setup_vdj_analysis.rs @@ -5,7 +5,7 @@ use crate::GexMatrices; use anyhow::Result; use cr_h5::count_matrix::CountMatrixFile; use cr_types::reference::feature_reference::BeamMode; -use cr_types::CellMultiplexingType; +use cr_types::{BarcodeMultiplexingType, ReadLevel}; use itertools::Itertools; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; @@ -38,6 +38,8 @@ pub struct SetupVdjAnalysisStageOutputs { pub disable_cell_calling: bool, pub disable_clonotyping: bool, pub disable_beam: bool, + pub disable_asm_metrics: bool, + pub multiplexing_method: Option, pub beam_mode: Option, pub filtered_matrix_h5: Option, pub raw_matrix_h5: Option, @@ -46,6 +48,7 @@ pub struct SetupVdjAnalysisStageOutputs { pub struct SetupVdjAnalysis; +#[derive(Eq, PartialEq)] pub enum VdjAnalysisType { /// Cellranger vdj LibraryLevelCount, @@ -107,7 +110,7 @@ impl MartianMain for SetupVdjAnalysis { fingerprint .read()? .into_iter() - .map(|f| f.cell_multiplexing_type()) + .map(|f| f.barcode_multiplexing_type()) .dedup() .exactly_one() .unwrap() @@ -115,6 +118,12 @@ impl MartianMain for SetupVdjAnalysis { None }; + let disable_asm_metrics = analysis_type == VdjAnalysisType::SampleLevelMulti + && matches!( + multiplexing_type, + Some(BarcodeMultiplexingType::CellLevel(_)) + ); + let sample_level_files = if let Some(sample) = args.demux_sample_info.and_then(|info| info.gex_matrices) { // Hardlink to play nice with Martian @@ -132,12 +141,20 @@ impl MartianMain for SetupVdjAnalysis { (VdjAnalysisType::LibraryLevelMulti, _) => args.lib_level_gex.hardlink(&rover)?, // Hardlink to play nice with Martian // cellranger multi VDJ+GEX sample-level analysis (VdjAnalysisType::SampleLevelMulti, None) => sample_level_files, - // cellranger multi OH multiplexed sample-level analysis - (VdjAnalysisType::SampleLevelMulti, Some(CellMultiplexingType::OH)) => { + // cellranger multi CMO and Hashtag multiplexed sample-level analysis + (VdjAnalysisType::SampleLevelMulti, Some(BarcodeMultiplexingType::CellLevel(_))) => { sample_level_files } - (VdjAnalysisType::SampleLevelMulti, Some(CellMultiplexingType::CMO)) => unreachable!(), - (VdjAnalysisType::SampleLevelMulti, Some(CellMultiplexingType::RTL)) => unreachable!(), + ( + VdjAnalysisType::SampleLevelMulti, + Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::OH)), + ) => sample_level_files, + ( + VdjAnalysisType::SampleLevelMulti, + Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)), + ) => { + unreachable!() + } }; let receptor = match (args.receptor, args.vdj_config.denovo) { @@ -165,6 +182,8 @@ impl MartianMain for SetupVdjAnalysis { filtered_matrix_h5: gex_matrices.filtered_matrix_h5, raw_matrix_h5: gex_matrices.raw_matrix_h5, filtered_barcodes: gex_matrices.filtered_barcodes, + disable_asm_metrics, + multiplexing_method: multiplexing_type, }) } } diff --git a/lib/rust/cr_lib/src/stages/setup_vdj_demux.rs b/lib/rust/cr_lib/src/stages/setup_vdj_demux.rs index 3db645b..61f74e0 100644 --- a/lib/rust/cr_lib/src/stages/setup_vdj_demux.rs +++ b/lib/rust/cr_lib/src/stages/setup_vdj_demux.rs @@ -2,7 +2,7 @@ use crate::{GexMatrices, SampleMatrices}; use anyhow::{Context, Result}; -use cr_types::{CrMultiGraph, FingerprintFile}; +use cr_types::{BarcodeMultiplexingType, CrMultiGraph, FingerprintFile}; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::json_file::JsonFile; @@ -19,7 +19,6 @@ pub struct SetupVDJDemuxStageInputs { #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct VdjDemuxSampleInfo { pub sample_id: String, - pub sample_number: usize, pub gex_matrices: Option, pub fingerprint: Option, } @@ -30,6 +29,7 @@ pub struct SetupVDJDemuxStageOutputs { pub is_not_multi: bool, pub has_antigen: bool, pub per_sample_info: Option>, + pub multiplexing_method: Option, } pub struct SetupVDJDemux; @@ -47,6 +47,7 @@ impl MartianMain for SetupVDJDemux { is_not_multi: true, has_antigen: false, per_sample_info: None, + multiplexing_method: None, }); } }; @@ -55,9 +56,9 @@ impl MartianMain for SetupVDJDemux { cr_types::FeatureBarcodeType::Antigen, )); let mut per_sample_info = HashMap::new(); - for (sample_number, sample) in multi_graph.samples.into_iter().enumerate() { + for sample in &multi_graph.samples { let fingerprint = sample - .cell_multiplexing_type() + .barcode_multiplexing_type() .map(|_| { rover .make_path::(format!("{}_fingerprint", sample.sample_id)) @@ -67,19 +68,20 @@ impl MartianMain for SetupVDJDemux { per_sample_info.insert( sample.sample_id.clone(), VdjDemuxSampleInfo { - sample_id: sample.sample_id, - sample_number, + sample_id: sample.sample_id.clone(), gex_matrices: None, fingerprint, }, ); } + let read_level_multiplexing = multi_graph.is_read_level_multiplexed(); + if let Some(multi_matrices) = args.multi_matrices { for sample_matrices in multi_matrices { let sample_id = sample_matrices.sample.to_string(); per_sample_info.get_mut(&sample_id).unwrap().gex_matrices = Some( - GexMatrices::from(sample_matrices) + GexMatrices::from_sample_matrices(sample_matrices, read_level_multiplexing) .hardlink(&rover) // Hardlink to play nice with Martian .context("Error hard linking SampleMatrices")?, ); @@ -91,6 +93,7 @@ impl MartianMain for SetupVDJDemux { is_not_multi: false, has_antigen, per_sample_info: Some(per_sample_info), + multiplexing_method: multi_graph.barcode_multiplexing_type(), }) } } diff --git a/lib/rust/cr_lib/src/stages/write_barcode_index.rs b/lib/rust/cr_lib/src/stages/write_barcode_index.rs index d0f13e3..a9d1668 100644 --- a/lib/rust/cr_lib/src/stages/write_barcode_index.rs +++ b/lib/rust/cr_lib/src/stages/write_barcode_index.rs @@ -1,19 +1,22 @@ //! Martian stage WRITE_BARCODE_INDEX //! Assign a distinct integer to each barcode sequence. +use crate::utils::estimate_mem::{barcode_mem_gib, get_total_barcodes_detected}; use anyhow::Result; use cr_types::barcode_index::BarcodeIndex; use cr_types::types::{BarcodeIndexFormat, BcCountFormat}; +use cr_types::MetricsFile; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::json_file::JsonFile; -use martian_filetypes::FileTypeWrite; +use martian_filetypes::{FileTypeRead, FileTypeWrite}; use serde::{Deserialize, Serialize}; #[derive(Clone, Deserialize, MartianStruct)] pub struct WriteBarcodeIndexStageInputs { pub barcode_counts: BcCountFormat, pub barcodes_under_tissue: Option>>, + pub barcode_correction_summary: MetricsFile, } #[derive(Clone, Serialize, Deserialize, MartianStruct)] @@ -23,16 +26,49 @@ pub struct WriteBarcodeIndexStageOutputs { pub struct WriteBarcodeIndex; -#[make_mro(mem_gb = 6, volatile = strict)] -impl MartianMain for WriteBarcodeIndex { +#[make_mro(volatile = strict)] +impl MartianStage for WriteBarcodeIndex { type StageInputs = WriteBarcodeIndexStageInputs; type StageOutputs = WriteBarcodeIndexStageOutputs; - fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { - let barcode_index: BarcodeIndexFormat = rover.make_path("barcode_index"); - barcode_index.write(&BarcodeIndex::new( - &args.barcode_counts, - args.barcodes_under_tissue.as_ref(), - )?)?; - Ok(WriteBarcodeIndexStageOutputs { barcode_index }) + type ChunkInputs = MartianVoid; + type ChunkOutputs = MartianVoid; + + fn split( + &self, + args: Self::StageInputs, + _rover: MartianRover, + ) -> Result> { + // Multi uses more memory for sample_barcodes and other data. + let barcodes_count = get_total_barcodes_detected(&args.barcode_correction_summary.read()?); + // bytes_per_barcode and offset_gib are empirically determined. + let mem_gib = barcode_mem_gib(barcodes_count, 220, 2); + println!("barcode_count={barcodes_count},mem_gib={mem_gib}"); + Ok(StageDef::with_join_resource(Resource::with_mem_gb(mem_gib))) + } + + fn main( + &self, + _args: Self::StageInputs, + _chunk_args: MartianVoid, + _rover: MartianRover, + ) -> Result { + unreachable!() + } + + fn join( + &self, + args: Self::StageInputs, + _chunk_defs: Vec, + _chunk_outs: Vec, + rover: MartianRover, + ) -> Result { + { + let barcode_index: BarcodeIndexFormat = rover.make_path("barcode_index"); + barcode_index.write(&BarcodeIndex::new( + &args.barcode_counts, + args.barcodes_under_tissue.as_ref(), + )?)?; + Ok(WriteBarcodeIndexStageOutputs { barcode_index }) + } } } diff --git a/lib/rust/cr_lib/src/stages/write_barcode_summary.rs b/lib/rust/cr_lib/src/stages/write_barcode_summary.rs index 4e0c443..e19295d 100644 --- a/lib/rust/cr_lib/src/stages/write_barcode_summary.rs +++ b/lib/rust/cr_lib/src/stages/write_barcode_summary.rs @@ -6,14 +6,15 @@ use crate::align_metrics::{ MULTI_GENOME, }; use crate::types::FeatureReferenceFormat; +use crate::utils::estimate_mem::{barcode_mem_gib, get_total_barcodes_detected}; use crate::BarcodeMetricsShardFile; use anyhow::{bail, Result}; use cr_h5::count_matrix::write_barcodes_column; use cr_types::barcode_index::BarcodeIndex; use cr_types::reference::feature_reference::{FeatureReference, FeatureType}; -use cr_types::{BarcodeIndexFormat, GenomeName, H5File, LibraryType}; +use cr_types::{BarcodeIndexFormat, GenomeName, H5File, LibraryType, MetricsFile}; use itertools::zip_eq; -use martian::prelude::{MartianMain, MartianRover}; +use martian::{MartianRover, MartianStage, MartianVoid, Resource, StageDef}; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::FileTypeRead; use metric::join_metric_name; @@ -30,6 +31,7 @@ pub struct WriteBarcodeSummaryStageInputs { pub per_barcode_metrics: Vec, pub feature_reference: FeatureReferenceFormat, pub barcode_index: BarcodeIndexFormat, + pub barcode_correction_summary: MetricsFile, } /// The Martian stage outputs. @@ -51,6 +53,8 @@ struct BarcodeCounts { half_mapped_counts: Vec, // Split-mapped probe reads (MAPQ = 3) split_mapped_counts: Vec, + // Gap not within max error probe reads (MAPQ = 5) + gap_mapped_not_within_max_error_counts: Vec, } impl BarcodeCounts { @@ -61,6 +65,7 @@ impl BarcodeCounts { half_mapped_counts: vec![0; num_barcodes], split_mapped_counts: vec![0; num_barcodes], umi_counts: vec![0; num_barcodes], + gap_mapped_not_within_max_error_counts: vec![0; num_barcodes], } } } @@ -141,7 +146,7 @@ impl BarcodeSummaryData { let metrics_reader = UnsortedShardReader::::open_set( per_barcode_metrics, - )?; + ); fn update_counts( genome_barcode_counts: &mut HashMap<(FeatureType, GenomeName), BarcodeCounts>, @@ -192,6 +197,12 @@ impl BarcodeSummaryData { &mut entry.split_mapped_counts[index], genome_mapping_metrics.split_mapped.count(), ); + checked_add( + &mut entry.gap_mapped_not_within_max_error_counts[index], + genome_mapping_metrics + .gap_mapped_not_within_max_error + .count(), + ); } } FeatureType::Gene @@ -285,6 +296,7 @@ fn write_barcode_summary_h5( umi_counts, half_mapped_counts, split_mapped_counts, + gap_mapped_not_within_max_error_counts, } = genome_barcode_counts .iter() .filter(|((t, _), _)| *t == FeatureType::Gene) @@ -313,6 +325,10 @@ fn write_barcode_summary_h5( "_multi_transcriptome_half_mapped_barcoded_reads", half_mapped_counts, ), + ( + "_multi_transcriptome_gap_not_within_max_error_mapped_barcoded_reads", + gap_mapped_not_within_max_error_counts, + ), ] { if !data.is_empty() { file.new_dataset::() @@ -351,27 +367,49 @@ fn write_barcode_summary_h5( Ok(()) } -#[make_mro(mem_gb = 7, volatile = strict)] -impl MartianMain for WriteBarcodeSummary { +#[make_mro(volatile = strict)] +impl MartianStage for WriteBarcodeSummary { type StageInputs = WriteBarcodeSummaryStageInputs; type StageOutputs = WriteBarcodeSummaryStageOutputs; + type ChunkInputs = MartianVoid; + type ChunkOutputs = MartianVoid; + + fn split( + &self, + args: Self::StageInputs, + _rover: MartianRover, + ) -> Result> { + // Multi uses more memory for sample_barcodes and other data. + let barcodes_count = get_total_barcodes_detected(&args.barcode_correction_summary.read()?); + // bytes_per_barcode and offset_gib are empirically determined. + let mem_gib = barcode_mem_gib(barcodes_count, 220, 2); + println!("barcode_count={barcodes_count},mem_gib={mem_gib}"); + Ok(StageDef::with_join_resource(Resource::with_mem_gb(mem_gib))) + } - /// Run the Martian stage WRITE_BARCODE_SUMMARY. fn main( &self, - WriteBarcodeSummaryStageInputs { - per_barcode_metrics, - feature_reference, - barcode_index, - }: Self::StageInputs, + _args: Self::StageInputs, + _chunk_args: MartianVoid, + _rover: MartianRover, + ) -> Result { + unreachable!() + } + + /// Run the Martian stage WRITE_BARCODE_SUMMARY. + fn join( + &self, + args: Self::StageInputs, + _chunk_defs: Vec, + _chunk_outs: Vec, rover: MartianRover, ) -> Result { let barcode_summary: H5File = rover.make_path("barcode_summary"); - let barcode_index = barcode_index.read()?; + let barcode_index = args.barcode_index.read()?; write_barcode_summary_h5( &barcode_summary, - &per_barcode_metrics, - &feature_reference.read()?, + &args.per_barcode_metrics, + &args.feature_reference.read()?, &barcode_index, )?; Ok(Self::StageOutputs { barcode_summary }) diff --git a/lib/rust/cr_lib/src/stages/write_gene_index.rs b/lib/rust/cr_lib/src/stages/write_gene_index.rs index 64b8e45..e95fcb9 100644 --- a/lib/rust/cr_lib/src/stages/write_gene_index.rs +++ b/lib/rust/cr_lib/src/stages/write_gene_index.rs @@ -11,12 +11,12 @@ pub struct WriteGeneIndex; #[derive(Deserialize, Clone, MartianStruct)] pub struct StageInputs { - pub(crate) reference_path: PathBuf, + pub(crate) reference_path: Option, } #[derive(Serialize, Deserialize, Clone, MartianStruct)] pub struct StageOutputs { - pub(crate) gene_index: JsonFile<()>, + pub(crate) gene_index: Option>, } #[make_mro(mem_gb = 6, volatile = strict)] @@ -25,8 +25,14 @@ impl MartianMain for WriteGeneIndex { type StageOutputs = StageOutputs; fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { + let Some(reference_path) = &args.reference_path else { + return Ok(StageOutputs { gene_index: None }); + }; + let gene_index: JsonFile<()> = rover.make_path("gene_index"); - transcriptome::python_gene_index::write_gene_index(&args.reference_path, &gene_index)?; - Ok(StageOutputs { gene_index }) + transcriptome::python_gene_index::write_gene_index(reference_path, &gene_index)?; + Ok(StageOutputs { + gene_index: Some(gene_index), + }) } } diff --git a/lib/rust/cr_lib/src/stages/write_h5_matrix.rs b/lib/rust/cr_lib/src/stages/write_h5_matrix.rs index 08fa154..d778f64 100644 --- a/lib/rust/cr_lib/src/stages/write_h5_matrix.rs +++ b/lib/rust/cr_lib/src/stages/write_h5_matrix.rs @@ -1,11 +1,12 @@ //! Martian stage WRITE_H5_MATRIX. use crate::types::FeatureReferenceFormat; +use crate::utils::estimate_mem::{barcode_mem_gib, get_total_barcodes_detected}; use anyhow::Result; use cr_h5::count_matrix::write_matrix_h5; use cr_types::chemistry::{ChemistryDefs, ChemistryDefsExt}; -use cr_types::{BarcodeIndexFormat, CountShardFile, GemWell, H5File}; -use martian::{MartianMain, MartianRover}; +use cr_types::{BarcodeIndexFormat, CountShardFile, GemWell, H5File, MetricsFile}; +use martian::{MartianRover, MartianStage, MartianVoid, Resource, StageDef}; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::FileTypeRead; use serde::{Deserialize, Serialize}; @@ -14,26 +15,56 @@ use serde::{Deserialize, Serialize}; pub struct WriteH5Matrix; #[derive(Deserialize, Clone, MartianStruct)] -pub struct StageInputs { +pub struct WriteH5MatrixStageInputs { pub gem_well: GemWell, pub counts: Vec, pub feature_reference: FeatureReferenceFormat, pub chemistry_defs: ChemistryDefs, pub sample_id: String, pub barcode_index: BarcodeIndexFormat, + pub barcode_correction_summary: MetricsFile, } #[derive(Serialize, Deserialize, Clone, MartianStruct)] -pub struct StageOutputs { +pub struct WriteH5MatrixStageOutputs { pub matrix: H5File, } +#[make_mro(volatile = strict)] +impl MartianStage for WriteH5Matrix { + type StageInputs = WriteH5MatrixStageInputs; + type StageOutputs = WriteH5MatrixStageOutputs; + type ChunkInputs = MartianVoid; + type ChunkOutputs = MartianVoid; -#[make_mro(mem_gb = 7, volatile = strict)] -impl MartianMain for WriteH5Matrix { - type StageInputs = StageInputs; - type StageOutputs = StageOutputs; + fn split( + &self, + args: Self::StageInputs, + _rover: MartianRover, + ) -> Result> { + // Multi uses more memory for sample_barcodes and other data. + let barcodes_count = get_total_barcodes_detected(&args.barcode_correction_summary.read()?); + // bytes_per_barcode and offset_gib are empirically determined. + let mem_gib = barcode_mem_gib(barcodes_count, 220, 2); + println!("barcode_count={barcodes_count},mem_gib={mem_gib}"); + Ok(StageDef::with_join_resource(Resource::with_mem_gb(mem_gib))) + } + + fn main( + &self, + _args: Self::StageInputs, + _chunk_args: MartianVoid, + _rover: MartianRover, + ) -> Result { + unreachable!() + } - fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { + fn join( + &self, + args: Self::StageInputs, + _chunk_defs: Vec, + _chunk_outs: Vec, + rover: MartianRover, + ) -> Result { let raw_feature_bc_matrix = rover.make_path("raw_feature_bc_matrix"); write_matrix_h5( &raw_feature_bc_matrix, @@ -45,7 +76,7 @@ impl MartianMain for WriteH5Matrix { &args.barcode_index.read()?, &rover.pipelines_version(), )?; - Ok(StageOutputs { + Ok(Self::StageOutputs { matrix: raw_feature_bc_matrix, }) } diff --git a/lib/rust/cr_lib/src/stages/write_matrix_market.rs b/lib/rust/cr_lib/src/stages/write_matrix_market.rs index 7b8c3b3..38593ca 100644 --- a/lib/rust/cr_lib/src/stages/write_matrix_market.rs +++ b/lib/rust/cr_lib/src/stages/write_matrix_market.rs @@ -2,13 +2,14 @@ use crate::env; use crate::types::FeatureReferenceFormat; +use crate::utils::estimate_mem::{barcode_mem_gib, get_total_barcodes_detected}; use anyhow::Result; use barcode::Barcode; use cr_types::barcode_index::BarcodeIndex; use cr_types::reference::feature_reference::{FeatureReference, FeatureType}; use cr_types::types::{BarcodeIndexFormat, FeatureBarcodeCount}; -use cr_types::{BarcodeThenFeatureOrder, CountShardFile}; -use martian::{MartianFileType, MartianMain, MartianRover}; +use cr_types::{BarcodeThenFeatureOrder, CountShardFile, MetricsFile}; +use martian::{MartianFileType, MartianRover, MartianStage, MartianVoid, Resource, StageDef}; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::gzip_file::Gzip; use martian_filetypes::tabular_file::TsvFileNoHeader; @@ -126,23 +127,53 @@ impl MtxWriter { pub struct WriteMatrixMarket; #[derive(Deserialize, Clone, MartianStruct)] -pub struct StageInputs { +pub struct WriteMatrixMarketStageInputs { pub counts: Vec, pub feature_reference: FeatureReferenceFormat, pub barcode_index: BarcodeIndexFormat, + pub barcode_correction_summary: MetricsFile, } #[derive(Serialize, Deserialize, Clone, MartianStruct)] -pub struct StageOutputs { +pub struct WriteMatrixMarketStageOutputs { pub feature_bc_matrix: PathBuf, } -#[make_mro(mem_gb = 7, volatile = strict)] -impl MartianMain for WriteMatrixMarket { - type StageInputs = StageInputs; - type StageOutputs = StageOutputs; +#[make_mro(volatile = strict)] +impl MartianStage for WriteMatrixMarket { + type StageInputs = WriteMatrixMarketStageInputs; + type StageOutputs = WriteMatrixMarketStageOutputs; + type ChunkInputs = MartianVoid; + type ChunkOutputs = MartianVoid; - fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { + fn split( + &self, + args: Self::StageInputs, + _rover: MartianRover, + ) -> Result> { + let barcodes_count = get_total_barcodes_detected(&args.barcode_correction_summary.read()?); + // bytes_per_barcode and offset_gib are empirically determined. + let mem_gib = barcode_mem_gib(barcodes_count, 220, 2); + println!("barcode_count={barcodes_count},mem_gib={mem_gib}"); + Ok(StageDef::with_join_resource(Resource::with_mem_gb(mem_gib))) + } + + fn main( + &self, + _args: Self::StageInputs, + _chunk_args: MartianVoid, + _rover: MartianRover, + ) -> Result { + unreachable!() + } + + fn join( + &self, + args: Self::StageInputs, + _chunk_defs: Vec, + _chunk_outs: Vec, + rover: MartianRover, + ) -> Result { let barcode_index = args.barcode_index.read()?; let feature_bc_matrix: PathBuf = rover.make_path("raw_feature_bc_matrix"); let mtx_writer = MtxWriter::new(&feature_bc_matrix)?; @@ -152,6 +183,6 @@ impl MartianMain for WriteMatrixMarket { &barcode_index, &rover.pipelines_version(), )?; - Ok(StageOutputs { feature_bc_matrix }) + Ok(Self::StageOutputs { feature_bc_matrix }) } } diff --git a/lib/rust/cr_lib/src/stages/write_molecule_info.rs b/lib/rust/cr_lib/src/stages/write_molecule_info.rs index 65d90d8..2714323 100644 --- a/lib/rust/cr_lib/src/stages/write_molecule_info.rs +++ b/lib/rust/cr_lib/src/stages/write_molecule_info.rs @@ -4,6 +4,7 @@ use crate::probe_barcode_matrix::ProbeCounts; use crate::stages::collate_metrics::SampleMetrics; use crate::stages::parse_multi_config::CellCallingParam; use crate::types::FeatureReferenceFormat; +use crate::utils::estimate_mem::{barcode_mem_gib, get_total_barcodes_detected}; use crate::BcUmiInfoShardFile; use anyhow::Result; use barcode::{Barcode, BarcodeContent}; @@ -11,8 +12,9 @@ use cr_h5::molecule_info::MoleculeInfoWriter; use cr_types::barcode_index::BarcodeIndex; use cr_types::chemistry::{ChemistryDefs, ChemistryDefsExt}; use cr_types::filtered_barcodes::{FilteredBarcodesCsv, FilteredBarcodesCsvRow}; -use cr_types::probe_set::Probe; +use cr_types::probe_set::{Probe, ProbeSetReferenceMetadata}; use cr_types::reference::feature_reference::FeatureReference; +use cr_types::reference::get_reference_genome_names; use cr_types::reference::reference_info::ReferenceInfo; use cr_types::rna_read::{LibraryInfo, RnaChunk}; use cr_types::target_panel_summary::{TargetPanelSummary, TargetPanelSummaryFormat}; @@ -31,7 +33,6 @@ use metric::{join_metric_name, CountMetric, JsonReport, PercentMetric, TxHashMap use serde::{Deserialize, Serialize}; use serde_json::{json, Map, Value}; use shardio::ShardReader; -use std::cmp::max; use std::collections::HashMap; use std::path::PathBuf; use strum_macros::IntoStaticStr; @@ -53,7 +54,7 @@ pub struct WriteMoleculeInfoStageInputs { pub chemistry_defs: ChemistryDefs, pub gem_well: GemWell, pub counts_bc_order: Vec, - pub reference_path: PathBuf, + pub reference_path: Option, pub read_chunks: Vec, pub feature_reference: FeatureReferenceFormat, pub filtered_barcodes: FilteredBarcodesCsv, @@ -116,17 +117,6 @@ fn calculate_frac_usable_confidently_mapped_reads_on_target(metrics: &Value) -> }) } -/// Return the number of valid barcodes from a metrics JSON. -/// An antibody-only analysis has no metric barcodes_detected, -/// so return the maximum of barcodes_detected and ANTIBODY_barcodes_detected. -fn get_valid_barcodes(metrics: &HashMap) -> u64 { - let gex_barcodes_detected = metrics.get("barcodes_detected").and_then(Value::as_u64); - let antibody_barcodes_detected = metrics - .get("ANTIBODY_barcodes_detected") - .and_then(Value::as_u64); - max(gex_barcodes_detected, antibody_barcodes_detected).unwrap() -} - #[make_mro(volatile = strict)] impl MartianStage for WriteMoleculeInfo { type StageInputs = WriteMoleculeInfoStageInputs; @@ -141,17 +131,20 @@ impl MartianStage for WriteMoleculeInfo { ) -> Result> { // Multi uses more memory for sample_barcodes and other data. let sample_barcodes_mem_gib = if args.sample_barcodes.is_some() { - // For MULTI_WRITE_PER_SAMPLE_MOLECULE_INFO. - /// Loading sample_barcodes.json uses this many bytes per valid barcode. - const MEM_BYTES_PER_VALID_BARCODE: u64 = 384; - let mem_bytes = MEM_BYTES_PER_VALID_BARCODE - * get_valid_barcodes(&args.matrix_computer_summary.read()?); - 1 + mem_bytes / 1024 / 1024 / 1024 + // For MULTI_WRITE_PER_SAMPLE_MOLECULE_INFO, loading sample_barcodes.json uses this many bytes per valid barcode. + let barcodes_count = get_total_barcodes_detected(&args.matrix_computer_summary.read()?); + let sample_barcodes_mem_gib = barcode_mem_gib(barcodes_count, 384, 1); + println!( + "barcode_count={barcodes_count},sample_barcodes_mem_gib={sample_barcodes_mem_gib}" + ); + + sample_barcodes_mem_gib } else { // For WRITE_MOLECULE_INFO. 0 }; - let mem_gib = 8 + isize::try_from(sample_barcodes_mem_gib).unwrap(); + let mem_gib = 12 + sample_barcodes_mem_gib; + println!("mem_gib={mem_gib}"); Ok(StageDef::with_join_resource(Resource::with_mem_gb(mem_gib))) } @@ -207,7 +200,18 @@ impl MartianStage for WriteMoleculeInfo { TxHashMap::default() }; - let ref_info = ReferenceInfo::from_reference_path(&args.reference_path)?; + let ref_info = args + .reference_path + .as_deref() + .map(ReferenceInfo::from_reference_path) + .transpose()?; + let genomes = get_reference_genome_names( + ref_info.as_ref(), + target_panel_summary + .map(|x| ProbeSetReferenceMetadata::load_from(&x.target_panel_path)) + .transpose()? + .as_ref(), + ); let library_filtered_genome_barcodes = args.filtered_barcodes.read()?; let library_filtered_barcodes: TxHashSet<&Barcode> = library_filtered_genome_barcodes @@ -271,7 +275,6 @@ impl MartianStage for WriteMoleculeInfo { }; // pass_filter table of molecule_info - let genomes: Vec<_> = ref_info.genomes.iter().sorted().cloned().collect(); let barcode_info_pass_filter = build_barcode_info( &library_filtered_genome_barcodes, &library_info, @@ -329,7 +332,7 @@ impl MartianStage for WriteMoleculeInfo { per_sample_metrics_json, &visitor.metrics, molecule_info_type, - &ref_info, + ref_info.as_ref(), target_panel_summary, )?; writer.write_metrics(&serde_json::to_string(&metrics)?)?; @@ -505,7 +508,7 @@ fn get_molecule_info_metrics( sample_metrics_json: &MetricsFile, metrics: &MoleculeInfoMetrics, molecule_info_type: MoleculeInfoType, - ref_info: &ReferenceInfo, + ref_info: Option<&ReferenceInfo>, target_panel_summary: Option<&TargetPanelSummary>, ) -> Result { let gem_well_summary_map: JMap = args.matrix_computer_summary.read()?; @@ -515,12 +518,17 @@ fn get_molecule_info_metrics( .unwrap() .parse()?; - let mut final_metrics: JMap = ref_info - .clone() - .into_json_report() - .into_iter() - .filter(|(k, _)| REFERENCE_METRICS.contains(&k.as_str())) - .collect(); + let mut final_metrics = JMap::default(); + + if let Some(ref_info) = ref_info { + final_metrics.extend( + ref_info + .clone() + .into_json_report() + .into_iter() + .filter(|(k, _)| REFERENCE_METRICS.contains(&k.as_str())), + ); + }; final_metrics.insert( "cellranger_version".to_string(), diff --git a/lib/rust/cr_lib/src/stages/write_multi_web_summary_json.rs b/lib/rust/cr_lib/src/stages/write_multi_web_summary_json.rs index 6e1defb..fabb4f7 100644 --- a/lib/rust/cr_lib/src/stages/write_multi_web_summary_json.rs +++ b/lib/rust/cr_lib/src/stages/write_multi_web_summary_json.rs @@ -1,28 +1,34 @@ //! Martian stage WRITE_MULTI_WEB_SUMMARY_JSON //! Write a JSON file with the metrics and plots data for the websummary. +use super::parse_multi_config::VdjGenInputs; +use crate::cell_annotation_ws_parameters::{ + generate_cell_type_barchart_from_value, generate_cell_type_diffexp_from_value, + generate_cell_type_parameter_table, generate_cell_type_umap_plot_from_value, + generate_cell_type_violin_plot_from_value, CellAnnotationMetrics, +}; use crate::itertools::Itertools; use crate::stages::build_per_sample_vdj_ws_contents::{VdjWsContents, VdjWsContentsFormat}; use crate::stages::compute_antigen_vdj_metrics::{AntigenVdjMetrics, AntigenVdjMetricsFormat}; use crate::stages::detect_chemistry::DetectedProbeBarcodePairingFile; use crate::stages::parse_multi_config::{CommonInputs, CountInputs}; -use crate::{SequencingMetricsFormat, SvgFile}; +use crate::{PerLibrarySequencingMetrics, SequencingMetricsFormat, SvgFile}; use anyhow::{bail, Result}; -use barcode::whitelist::{categorize_multiplexing_barcode_id, MultiplexingBarcodeType}; +use barcode::whitelist::{categorize_rtl_multiplexing_barcode_id, RTLMultiplexingBarcodeType}; use cr_types::chemistry::{ChemistryDefs, ChemistryDefsExt, ChemistryName}; use cr_types::reference::feature_reference::{FeatureConfig, SpecificityControls}; -use cr_types::reference::reference_info::MULTI_GENOME_SEPARATOR; +use cr_types::reference::reference_info::{ReferenceInfo, MULTI_GENOME_SEPARATOR}; use cr_types::{ - AlignerParam, CellMultiplexingType, CrMultiGraph, Fingerprint, LibraryType, Sample, - SampleAssignment, TargetingMethod, + AlignerParam, BarcodeMultiplexingType, CellLevel, CrMultiGraph, Fingerprint, LibraryType, + ReadLevel, Sample, SampleAssignment, TargetingMethod, }; use cr_websummary::alert::AlertContext; use cr_websummary::multi::antigen::{clonotype_specificity_heatmap, AntigenSpecificityRow}; use cr_websummary::multi::plots::{ - format_barcode_rank_plot, format_histogram, format_jibes_biplots, format_tags_on_tsne_plot, - format_umi_on_tsne_plot, library_median_genes_plot_from_metrics, + format_barcode_rank_plot, format_histogram, format_jibes_biplots, format_tags_on_umap_plot, + format_umi_on_umap_plot, library_median_genes_plot_from_metrics, library_sequencing_saturation_plot_from_metrics, sample_median_genes_plot_from_metrics, - targeted_enrichment_plot, PlotType, + PlotType, }; use cr_websummary::multi::svg::SvgGraph; use cr_websummary::multi::tables::{ @@ -30,35 +36,36 @@ use cr_websummary::multi::tables::{ AntibodyPhysicalLibraryMetricsRow, AntibodyPhysicalLibraryMetricsTable, AntibodySampleHeroMetricsRow, AntibodySampleHeroMetricsTable, AntibodySampleMappingMetricsTable, AntigenPhysicalLibraryMetricsTable, - AntigenSampleHeroMetricsRow, AntigenSampleHeroMetricsTable, CrisprLibraryMappingMetricsRow, + AntigenSampleHeroMetricsRow, AntigenSampleHeroMetricsTable, CmoMultiplexingQualityRow, + CmoMultiplexingQualityTable, CmoPerTagMetricsTable, CrisprLibraryMappingMetricsRow, CrisprLibraryMappingMetricsTable, CrisprPhysicalLibraryMetricsRow, CrisprPhysicalLibraryMetricsTable, CrisprSampleHeroMetricsRow, CrisprSampleHeroMetricsTable, CrisprSampleMappingMetricsTable, CustomFeaturePhysicalLibraryMetricsRow, - CustomFeaturePhysicalLibraryMetricsTable, CustomFeatureSampleHeroMetricsRow, - CustomFeatureSampleHeroMetricsTable, GdnaMetricsTable, GexLibraryMappingMetricsRow, - GexLibraryMappingMetricsTable, GexLibraryTargetedEnrichmentAlertsRow, - GexLibraryTargetedEnrichmentAlertsTable, GexLibraryTargetedEnrichmentMetricsRow, - GexLibraryTargetedEnrichmentMetricsTable, GexPhysicalLibraryMetricsRow, - GexPhysicalLibraryMetricsTable, GexSampleCellMetricsRow, GexSampleCellMetricsTable, - GexSampleHeroMetricsRow, GexSampleHeroMetricsTable, GexSampleMappingMetricsRow, - GexSampleMappingMetricsTable, LibraryCellMetricsRow, LibraryCellMetricsTable, - MultiplexingCmoMetricsRow, MultiplexingCmoMetricsTable, MultiplexingLibraryCellMetricsRow, - MultiplexingLibraryCellMetricsTable, MultiplexingPhysicalLibraryMetricsRow, - MultiplexingPhysicalLibraryMetricsTable, MultiplexingSampleAssignmentsRow, - MultiplexingSampleAssignmentsTable, RtlLibraryMappingMetricsRow, RtlLibraryMappingMetricsTable, - RtlProbeBarcodeMetricsRow, RtlProbeBarcodeMetricsTable, RtlSampleCellMetricsRow, - RtlSampleCellMetricsTable, RtlSampleMappingMetricsRow, RtlSampleMappingMetricsTable, + CustomFeaturePhysicalLibraryMetricsTable, CustomFeatureSampleHeroMetricsTable, + GdnaMetricsTable, GexLibraryMappingMetricsRow, GexLibraryMappingMetricsTable, + GexPhysicalLibraryMetricsRow, GexPhysicalLibraryMetricsTable, GexSampleCellMetricsRow, + GexSampleCellMetricsTable, GexSampleHeroMetricsRow, GexSampleHeroMetricsTable, + GexSampleMappingMetricsTable, HashtagMultiplexingQualityRow, HashtagMultiplexingQualityTable, + HashtagPerTagMetricsTable, LibraryCellMetricsRow, LibraryCellMetricsTable, + MultiplexingPhysicalLibraryMetricsRow, MultiplexingPhysicalLibraryMetricsTable, + OcmPerOverhangMetricsRow, OcmPerOverhangMetricsTable, RtlLibraryMappingMetricsRow, + RtlLibraryMappingMetricsTable, RtlProbeBarcodeMetricsRow, RtlProbeBarcodeMetricsTable, + RtlSampleCellMetricsRow, RtlSampleCellMetricsTable, RtlSampleMappingMetricsTable, SequencingMetricsTable, }; use cr_websummary::multi::websummary::{ - AntibodyOrAntigen, CountParametersTable, ExperimentalDesign, GexOrRtl, - GexOrRtlLibraryMappingMetricsTable, GexOrRtlSampleMappingMetricsTable, JsonMetricSummary, + AntibodyOrAntigen, CmoOrHashtag, CmoOrHashtagMultiplexingQualityTable, + CmoOrHashtagPerTagMetricsTable, CountParametersTable, ExperimentalDesign, GexOrRtl, + GexOrRtlLibraryMappingMetricsTable, GexOrRtlSampleMappingMetricsTable, LibraryAntibodyOrAntigenWebSummary, LibraryCmoWebSummary, LibraryCrisprWebSummary, - LibraryCustomFeatureWebSummary, LibraryGexWebSummary, LibraryHeaderInfo, LibraryWebSummary, - MismatchedProbeBarcodePairings, MultiDiagnostics, MultiSharedResource, MultiWebSummary, - MultiWebSummaryData, SampleAntibodyWebSummary, SampleAntigenWebSummary, SampleCellMetricsTable, + LibraryCustomFeatureWebSummary, LibraryGexWebSummary, LibraryHashtagWebSummary, + LibraryHeaderInfo, LibraryWebSummary, MismatchedProbeBarcodePairings, MultiDiagnostics, + MultiSharedResource, MultiWebSummary, MultiWebSummaryLibraryData, MultiWebSummarySampleData, + MultiplexingTagMetricsRow, MultiplexingTagMetricsRows, SampleAntibodyWebSummary, + SampleAntigenWebSummary, SampleCellAnnotationWebSummary, SampleCellMetricsTable, SampleCrisprWebSummary, SampleCustomFeatureWebSummary, SampleDiagnostics, SampleGexWebSummary, - SampleHeaderInfo, SampleWebSummary, ToJsonSummary, UMI_PER_PROBE_BARCODE_BACKGROUND_THRESHOLD, + SampleHeaderInfo, SampleWebSummary, ToJsonSummary, CELL_ANNOTATION_ADVERTISEMENT_STRING, + UMI_PER_PROBE_BARCODE_BACKGROUND_THRESHOLD, }; use cr_websummary::{ CountAndPercent, FloatAsInt, Percent, PlotlyChart, RawChartWithHelp, Tab, WsSample, @@ -68,7 +75,7 @@ use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::json_file::JsonFile; use martian_filetypes::tabular_file::CsvFile; -use martian_filetypes::{FileTypeRead, FileTypeWrite}; +use martian_filetypes::FileTypeRead; use metric::{join_metric_name, PercentMetric, TxHashMap, TxHashSet}; use multi::config::{ MultiConfigCsv, MultiConfigCsvFile, ProbeBarcodeIterationMode, PROBE_BARCODE_ID_GROUPING, @@ -77,11 +84,11 @@ use ordered_float::NotNan; use serde::{Deserialize, Serialize}; use serde_json::value::Value; use serde_json::{self, Number}; -use std::cmp::Ordering; -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use std::hash::Hash; use std::iter::FromIterator; use std::string::ToString; +use tenx_websummary::components::DifferentialExpressionTable; pub const GEM_BARCODE_OVERLAP_ALERT_THRESHOLD: f64 = 0.6; @@ -106,8 +113,9 @@ pub struct StageInputs { pub multi_graph_svg: SvgFile, pub common_inputs: CommonInputs, pub count_inputs: Option, + pub vdj_gen_inputs: Option, pub tag_contaminant_info: Option>, - pub sample_tsne_plots: TxHashMap>>, + pub sample_projection_plots: TxHashMap>>, pub sample_barcode_rank_plots: TxHashMap>>>, pub sample_treemap_plots: Option< @@ -119,8 +127,7 @@ pub struct StageInputs { pub sample_antibody_histograms: Option>>>, pub antigen_histograms: Option>, - pub targeted_per_feature_metrics: Option>, - pub cmo_tsne_plot: Option>, + pub cmo_projection_plot: Option>, pub vdj_t_contents: Option>, pub vdj_t_gd_contents: Option>, pub vdj_b_contents: Option>, @@ -128,6 +135,14 @@ pub struct StageInputs { pub antigen_vdj_metrics: Option>>, pub antigen_specificity: Option>>>, + pub cell_annotation_barcharts: Option>>>, + pub cell_annotation_box_plots: Option>>>, + pub cell_annotation_umap_plots: Option>>>, + pub cell_annotation_diffexp_tables: + Option>>>, + pub cell_annotation_metrics_jsons: + Option>>>, + pub cell_annotation_viable_but_not_requested: Option>>, pub feature_config: Option, /// chemistry_defs is None for a VDJ-only analysis. pub chemistry_defs: Option, @@ -138,10 +153,8 @@ pub struct StageInputs { #[derive(Clone, Serialize, Deserialize, MartianStruct)] pub struct StageOutputs { #[mro_retain] - pub web_summary_json: TxHashMap>, + pub web_summary_json: TxHashMap>, pub metrics_summary_csv: TxHashMap>, - #[mro_retain] - pub metrics_summary_json: TxHashMap>>, } struct LibWsBuilder { @@ -151,19 +164,18 @@ struct LibWsBuilder { chemistry_defs: Option, lib_metrics: TxHashMap, barcode_rank_plots: TxHashMap, - sequencing_metrics: TxHashMap, + sequencing_metrics: PerLibrarySequencingMetrics, count_inputs: Option, jibes_biplot_histogram: Option, antibody_histograms: Option, antigen_histograms: Option, - cmo_tsne_plot: Option, + cmo_projection_plot: Option, target_set_name: Option, vdj_t_contents: Option, vdj_t_gd_contents: Option, vdj_b_contents: Option, - targeted_per_feature_metrics: Option>, /// True if any form of multiplexing is used in this analysis. - is_multiplexed: bool, + multiplexing_method: Option, specificity_controls: Option, dropped_tags: Vec, probe_barcodes_high_gem_overlap: Vec, @@ -192,11 +204,6 @@ impl LibWsBuilder { self.count_inputs.as_ref().and_then(|x| x.targeting_method) } - /// Return true if the targeting method is hybridization capture. - fn is_hybrid_capture(&self) -> bool { - self.targeting_method() == Some(TargetingMethod::HybridCapture) - } - /// Return true if the targeting method is RTL. fn is_rtl(&self) -> bool { self.targeting_method() == Some(TargetingMethod::TemplatedLigation) @@ -204,12 +211,22 @@ impl LibWsBuilder { /// Return true if multiplexed using CMO. fn is_cmo_multiplexed(&self) -> bool { - self.is_multiplexed && !self.is_rtl() + self.multiplexing_method == Some(BarcodeMultiplexingType::CellLevel(CellLevel::CMO)) + } + + /// Return true if multiplexed using Hashtag. + fn is_hashtag_multiplexed(&self) -> bool { + self.multiplexing_method == Some(BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag)) + } + + /// Return true if multiplexed using OH + fn is_oh_multiplexed(&self) -> bool { + self.multiplexing_method == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::OH)) } /// Return true if multiplexed using RTL . fn is_rtl_multiplexed(&self) -> bool { - self.is_multiplexed && self.is_rtl() + self.multiplexing_method == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)) } /// Return true if antigen specificity controls are specified. @@ -263,7 +280,6 @@ impl LibWsBuilder { .map(|content| Tab::new(content.to_library_ws(), context)), ..Default::default() }; - for lib in &self.multi_graph.libraries { match lib.library_type { LibraryType::Gex => { @@ -279,6 +295,12 @@ impl LibWsBuilder { self.build_antibody_or_antigen_ws(&lib.physical_library_id, true)?, context, )); + if self.is_hashtag_multiplexed() { + let mut hashtag_tab: LibraryHashtagWebSummary = self.build_hashtag_ws()?; + // bubble up shared resources, currently just cmo counts + lib_ws.resources.extend(hashtag_tab.resources.drain()); + lib_ws.hashtag_tab = Some(Tab::new(hashtag_tab, context)); + } } LibraryType::Antigen => { assert!(lib_ws.antigen_tab.is_none()); @@ -346,7 +368,7 @@ impl LibWsBuilder { }; let get_if_cmo_multiplexed = |key: &str| -> Result> { - if self.is_cmo_multiplexed() { + if self.is_cmo_multiplexed() || self.is_hashtag_multiplexed() { self.lib_fraction_cell_partitions(key) } else { Ok(None) @@ -402,15 +424,26 @@ impl LibWsBuilder { let (unspecified_probe_barcodes_detected, specified_probe_barcodes_missing) = self.identify_unexpected_or_missing_probe_barcodes(library_type); + let transcriptome = if let Some(reference_genomes) = + get_metric_string(&self.lib_metrics, "reference_genomes")? + { + format!( + "{}-{}", + reference_genomes, + get_metric_string(&self.lib_metrics, "reference_version")?.unwrap() + ) + } else { + String::new() + }; + Ok(CountParametersTable { chemistry: self.chemistry_description_with_manual(library_type), introns_included: count_inputs.include_introns, - reference_path: count_inputs.reference_path.display().to_string(), - transcriptome: format!( - "{}-{}", - get_metric_string(&self.lib_metrics, "reference_genomes")?.unwrap(), - get_metric_string(&self.lib_metrics, "reference_version")?.unwrap() - ), + reference_path: count_inputs + .reference_path + .as_deref() + .map(|x| x.display().to_string()), + transcriptome, feature_ref_path: self.get_feature_ref(), cmo_set_path: self.get_cmo_set(), target_set_name: self.target_set_name.clone(), @@ -453,76 +486,102 @@ impl LibWsBuilder { &self, physical_library_id: &str, ) -> Result { - let metrics = &self.lib_metrics; if self.aligner() == AlignerParam::Hurtle { Ok(GexOrRtl::Rtl(RtlLibraryMappingMetricsTable(vec![ RtlLibraryMappingMetricsRow { physical_library_id: Some(physical_library_id.to_string()), - reads_in_library: get_metric_usize(metrics, "total_read_pairs")?, - reads_half_mapped_to_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_half_mapped_reads_frac", - )?, - reads_split_mapped_to_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_split_mapped_reads_frac", - )?, - reads_mapped_to_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_mapped_reads_frac", - )?, - reads_confidently_mapped_to_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_conf_mapped_reads_frac", - )?, - reads_confidently_mapped_to_filtered_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_targeted_conf_mapped_reads_frac", - )?, + ..RtlLibraryMappingMetricsRow::from_metrics(&self.lib_metrics)? }, ]))) } else { Ok(GexOrRtl::Gex(GexLibraryMappingMetricsTable(vec![ GexLibraryMappingMetricsRow { physical_library_id: Some(physical_library_id.to_string()), - reads_in_library: get_metric_usize(metrics, "total_read_pairs")?, - mapped_to_genome: get_metric_percent( - metrics, - "multi_genome_mapped_reads_frac", - )?, - confidently_mapped_to_genome: get_metric_percent( - metrics, - "multi_genome_conf_mapped_reads_frac", - )?, - confidently_mapped_to_transcriptome: get_metric_percent( - metrics, - "multi_transcriptome_conf_mapped_reads_frac", - )?, - confidently_mapped_to_targeted_transcriptome: get_metric_percent( - metrics, - "multi_transcriptome_targeted_conf_mapped_reads_frac", - )?, - confidently_mapped_to_intronic_regions: get_metric_percent( - metrics, - "multi_intronic_conf_mapped_reads_frac", - )?, - confidently_mapped_to_exonic_regions: get_metric_percent( - metrics, - "multi_exonic_conf_mapped_reads_frac", - )?, - confidently_mapped_to_intergenic_regions: get_metric_percent( - metrics, - "multi_intergenic_conf_mapped_reads_frac", - )?, - confidently_mapped_antisense: get_metric_percent( - metrics, - "multi_antisense_reads_frac", - )?, + ..GexLibraryMappingMetricsRow::from_metrics(&self.lib_metrics)? }, ]))) } } + fn build_ocm_per_overhang_metrics_table( + &self, + library_type: LibraryType, + ) -> Option { + if !self.is_oh_multiplexed() { + return None; + } + + let ocm_barcode_id_to_sample_id = self.multi_graph.get_tag_name_to_sample_id_map().unwrap(); + + let umi_per_ocm_barcode: Vec<(&str, i64)> = if let Some(umi_per_ocm_barcode) = self + .lib_metrics + .get(&join_metric_name(library_type, "umi_per_overhang")) + { + umi_per_ocm_barcode + .as_object() + .unwrap() + .iter() + .map(|(id, n)| (id.as_str(), n.as_i64().unwrap())) + .sorted() + .collect() + } else { + Vec::default() + }; + + let umi_sum: i64 = umi_per_ocm_barcode.iter().map(|(_id, n)| n).sum(); + + let filtered_barcodes_per_ocm_barcode: TxHashMap<&str, i64> = self.lib_metrics + ["filtered_barcodes_per_overhang"] + .as_object() + .unwrap() + .iter() + .map(|(id, n)| (id.as_str(), n.as_i64().unwrap())) + .collect(); + + let filtered_barcodes_sum: i64 = filtered_barcodes_per_ocm_barcode + .iter() + .map(|(_id, &n)| n) + .sum(); + + let rows: Vec = umi_per_ocm_barcode + .into_iter() + .map(|(ocm_barcode_id, umi_count)| { + let sample_id = ocm_barcode_id_to_sample_id + .get(ocm_barcode_id) + .map(|(sample_id, _)| *sample_id); + let umi_per_ocm_barcode = + CountAndPercent(PercentMetric::from_parts(umi_count, umi_sum)); + let cells = *filtered_barcodes_per_ocm_barcode + .get(ocm_barcode_id) + .unwrap_or(&0); + + let cells_per_ocm_barcode = if sample_id.is_some() { + Some(CountAndPercent(PercentMetric::from_parts( + cells, + filtered_barcodes_sum, + ))) + } else { + assert_eq!(cells, 0); + None + }; + match sample_id { + Some(sample_id) => OcmPerOverhangMetricsRow { + ocm_barcode_id: Some(ocm_barcode_id.to_string()), + sample_id: Some(sample_id.to_string()), + umi_per_ocm_barcode: Some(umi_per_ocm_barcode), + cells_per_ocm_barcode, + }, + None => OcmPerOverhangMetricsRow { + ocm_barcode_id: Some(ocm_barcode_id.to_string()), + sample_id: None, + umi_per_ocm_barcode: Some(umi_per_ocm_barcode), + cells_per_ocm_barcode, + }, + } + }) + .collect(); + Some(OcmPerOverhangMetricsTable(rows)) + } /// Return the probe barcode metrics table for the specified library type. fn build_rtl_probe_barcode_metrics_table( &self, @@ -532,36 +591,8 @@ impl LibWsBuilder { return None; } - let probe_barcode_id_to_sample_id_and_mapped_probe_barcode_ids: TxHashMap<_, _> = self - .multi_graph - .samples - .iter() - .flat_map(|sample| { - sample - .fingerprints - .iter() - .map(|fingerprint| match fingerprint { - Fingerprint::Tagged { - tag_name, - cell_multiplexing_type: CellMultiplexingType::RTL, - translated_tag_names, - .. - } => ( - tag_name.as_str(), - (sample.sample_id.as_str(), translated_tag_names.as_slice()), - ), - Fingerprint::Tagged { - cell_multiplexing_type: CellMultiplexingType::CMO, - .. - } => unreachable!(), - Fingerprint::Tagged { - cell_multiplexing_type: CellMultiplexingType::OH, - .. - } => unreachable!(), - Fingerprint::Untagged { .. } => unreachable!(), - }) - }) - .collect(); + let probe_barcode_id_to_sample_id_and_mapped_probe_barcode_ids = + self.multi_graph.get_tag_name_to_sample_id_map().unwrap(); let umi_per_probe_barcode: Vec<(&str, i64)> = if let Some(umi_per_probe_barcode) = self .lib_metrics @@ -719,124 +750,6 @@ impl LibWsBuilder { Some(GdnaMetricsTable::from_metrics(&self.lib_metrics)?.into()) }; - let log_rpu_threshold = get_metric_f64(&self.lib_metrics, "log_rpu_threshold")?; - - let targeted_table = if self.is_hybrid_capture() { - let umi_filtering_active = - get_metric_f64(&self.lib_metrics, "filtered_target_umi_count_threshold")? - .unwrap_or(0.0) - > 1.0; - - let filtered_target_umi_count_threshold = if umi_filtering_active { - get_metric_f64(&self.lib_metrics, "filtered_target_umi_count_threshold")? - } else { - None - }; - - let filtered_target_umi_reads_frac = if umi_filtering_active { - get_metric_percent(&self.lib_metrics, "filtered_target_umi_reads_frac")? - } else { - None - }; - - Some( - GexLibraryTargetedEnrichmentMetricsTable(vec![ - GexLibraryTargetedEnrichmentMetricsRow { - targeting_status: Some("Targeted".to_string()), - multi_frac_conf_transcriptomic_reads: get_metric_percent( - &self.lib_metrics, - "multi_frac_conf_transcriptomic_reads_on_target", - )?, - num_genes: get_metric_usize(&self.lib_metrics, "num_genes_on_target")?, - num_genes_quantifiable: get_metric_usize( - &self.lib_metrics, - "num_genes_quantifiable_on_target", - )?, - num_rpu_enriched_genes: get_metric_usize( - &self.lib_metrics, - "num_rpu_enriched_genes_on_target", - )?, - mean_reads_per_umi_per_gene_cells: get_metric_f64( - &self.lib_metrics, - "mean_reads_per_umi_per_gene_cells_on_target", - )?, - filtered_target_umi_count_threshold, - filtered_target_umi_reads_frac, - }, - GexLibraryTargetedEnrichmentMetricsRow { - targeting_status: Some("Non-Targeted".to_string()), - multi_frac_conf_transcriptomic_reads: get_metric_percent( - &self.lib_metrics, - "multi_frac_conf_transcriptomic_reads_off_target", - )?, - num_genes: get_metric_usize(&self.lib_metrics, "num_genes_off_target")?, - num_genes_quantifiable: get_metric_usize( - &self.lib_metrics, - "num_genes_quantifiable_off_target", - )?, - num_rpu_enriched_genes: get_metric_usize( - &self.lib_metrics, - "num_rpu_enriched_genes_off_target", - )?, - mean_reads_per_umi_per_gene_cells: get_metric_f64( - &self.lib_metrics, - "mean_reads_per_umi_per_gene_cells_off_target", - )?, - filtered_target_umi_count_threshold: None, - filtered_target_umi_reads_frac: None, - }, - ]) - .into(), - ) - } else { - None - }; - - let targeted_alerts = if self.is_hybrid_capture() { - Some( - GexLibraryTargetedEnrichmentAlertsTable(vec![ - GexLibraryTargetedEnrichmentAlertsRow { - frac_on_target_genes_enriched: get_metric_percent( - &self.lib_metrics, - "frac_on_target_genes_enriched", - )?, - frac_off_target_genes_enriched: get_metric_percent( - &self.lib_metrics, - "frac_off_target_genes_enriched", - )?, - }, - ]) - .into(), - ) - } else { - None - }; - - let targeted_plot = if self.is_hybrid_capture() { - targeted_enrichment_plot( - self.targeted_per_feature_metrics.as_deref(), - log_rpu_threshold, - )? - } else { - None - }; - - let targeted_sequencing_saturation = if self.is_hybrid_capture() { - get_metric_percent( - &self.lib_metrics, - "multi_cdna_pcr_dupe_reads_frac_on_target", - )? - } else { - None - }; - - let mean_targeted_reads_per_cell_associated_partition = if self.is_hybrid_capture() { - get_metric_f64(&self.lib_metrics, "total_targeted_reads_per_filtered_bc")? - .map(FloatAsInt) - } else { - None - }; - let (valid_gem_barcodes, valid_probe_barcodes) = if self.is_rtl_multiplexed() { ( get_metric_percent(&self.lib_metrics, "good_bc_in_gel_bead_frac")?, @@ -855,48 +768,26 @@ impl LibWsBuilder { mean_reads_per_cell_associated_partition, )?]) .into(), - sequencing_metrics_table: self - .sequencing_metrics - .get(&LibraryType::Gex) - .expect("Sequencing metrics for Gene Expression not found.") - .clone() - .into(), + sequencing_metrics_table: self.get_sequencing_metrics_table(LibraryType::Gex).into(), mapping_metrics_table: self.get_mapping_metrics_table(physical_library_id)?.into(), physical_library_metrics_table: GexPhysicalLibraryMetricsTable(vec![ GexPhysicalLibraryMetricsRow { physical_library_id: Some(physical_library_id.to_string()), - number_of_reads: get_metric_usize( - &self.lib_metrics, - "total_read_pairs", // DOUBLE CHECK THIS METRIC - )?, - valid_barcodes: get_metric_percent(&self.lib_metrics, "good_bc_frac")?, valid_gem_barcodes, valid_probe_barcodes, - valid_umis: get_metric_percent(&self.lib_metrics, "good_umi_frac")?, - sequencing_saturation: get_metric_percent( - &self.lib_metrics, - "multi_cdna_pcr_dupe_reads_frac", // DOUBLE CHECK THIS METRIC exactly the same thing as sequencing saturation? - )?, - targeted_sequencing_saturation, - reads_in_cell_associated_partitions: get_metric_percent( - &self.lib_metrics, - "multi_filtered_bcs_conf_mapped_barcoded_reads_cum_frac", - )?, - mean_reads_per_cell_associated_partition, - mean_targeted_reads_per_cell_associated_partition, + ..GexPhysicalLibraryMetricsRow::from_metrics(&self.lib_metrics)? }, ]) .into(), rtl_probe_barcode_metrics_table: self .build_rtl_probe_barcode_metrics_table(LibraryType::Gex) .map(Into::into), + ocm_per_overhang_metrics_table: self + .build_ocm_per_overhang_metrics_table(LibraryType::Gex) + .map(Into::into), gdna_table, - targeted_table, - targeted_plot, - targeted_alerts, sequencing_saturation_plot: library_sequencing_saturation_plot_from_metrics( &self.lib_metrics, - self.is_hybrid_capture(), ), median_genes_per_cell_plot: library_median_genes_plot_from_metrics( &self.lib_metrics, @@ -924,7 +815,7 @@ impl LibWsBuilder { self.barcode_rank_plots .get(&library_type) .unwrap_or_else(|| panic!("{} barcode rank plot was missing.", &library_type)), - if is_antibody { "AB" } else { "AG" }, + if is_antibody { "Antibody" } else { "Antigen" }, ); let mean_reads_per_cell_associated_partition = get_metric_f64( @@ -955,8 +846,11 @@ impl LibWsBuilder { None }; - // Only show the antibody histogram at the library level for CMO. - let feature_histogram = match (is_antibody, self.is_cmo_multiplexed()) { + // Only show the antibody histogram at the library level for CMO and HASHTAG. + let feature_histogram = match ( + is_antibody, + (self.is_cmo_multiplexed() || self.is_hashtag_multiplexed()), + ) { (true, true) => self.antibody_histograms.clone(), (true, false) => None, (false, _) => self.antigen_histograms.clone(), @@ -971,12 +865,7 @@ impl LibWsBuilder { Ok(LibraryAntibodyOrAntigenWebSummary { parameters_table: self.count_param_table(library_type)?, cell_metrics_table: LibraryCellMetricsTable(vec![library_cell_metrics_row]).into(), - sequencing_metrics_table: self - .sequencing_metrics - .get(&library_type) - .expect("Sequencing metrics for Antibody or Antigen Capture not found.") - .clone() - .into(), + sequencing_metrics_table: self.get_sequencing_metrics_table(library_type).into(), mapping_metrics_table: mapping_metrics_table.map(Into::into), physical_library_metrics_table: physical_library_metrics_table.into(), rtl_probe_barcode_metrics_table: self @@ -999,10 +888,7 @@ impl LibWsBuilder { )?]) .into(), sequencing_metrics_table: self - .sequencing_metrics - .get(&LibraryType::Crispr) - .expect("Sequencing metrics for CRISPR not found.") - .clone() + .get_sequencing_metrics_table(LibraryType::Crispr) .into(), mapping_metrics_table: CrisprLibraryMappingMetricsTable(vec![ CrisprLibraryMappingMetricsRow { @@ -1042,41 +928,12 @@ impl LibWsBuilder { )?]) .into(), sequencing_metrics_table: self - .sequencing_metrics - .get(&LibraryType::Custom) - .expect("Sequencing metrics for Custom Feature not found.") - .clone() + .get_sequencing_metrics_table(LibraryType::Custom) .into(), physical_library_metrics_table: CustomFeaturePhysicalLibraryMetricsTable(vec![ CustomFeaturePhysicalLibraryMetricsRow { physical_library_id: Some(physical_library_id.to_string()), - number_of_reads: get_metric_usize( - &self.lib_metrics, - "Custom_total_read_pairs", - )?, - valid_barcodes: get_metric_percent(&self.lib_metrics, "Custom_good_bc_frac")?, - valid_umis: get_metric_percent(&self.lib_metrics, "Custom_good_umi_frac")?, - sequencing_saturation: get_metric_percent( - &self.lib_metrics, - "Custom_multi_cdna_pcr_dupe_reads_frac", - )?, - reads_in_cell_associated_partitions: get_metric_percent( - &self.lib_metrics, - "Custom_feature_reads_in_cells", - )?, - mean_reads_per_cell_associated_partition, - fraction_feature_reads: get_metric_percent( - &self.lib_metrics, - "Custom_recognized_feature_bc_frac", - )?, - fraction_feature_reads_usable: get_metric_percent( - &self.lib_metrics, - "Custom_frac_feature_reads_usable", - )?, - fraction_unknown_feature: get_metric_percent( - &self.lib_metrics, - "Custom_unrecognized_feature_bc_frac", // DOUBLE CHECK THIS METRIC - )?, + ..CustomFeaturePhysicalLibraryMetricsRow::from_metrics(&self.lib_metrics)? }, ]) .into(), @@ -1099,7 +956,7 @@ impl LibWsBuilder { let jibes_biplot_histogram: JibesBiplotHistogramData = serde_json::from_value(jibes_biplot)?; ( - Some(format_jibes_biplots(&jibes_biplot_histogram.biplot)), + Some(format_jibes_biplots(&jibes_biplot_histogram.biplot, "CMO")), Some(format_histogram(&jibes_biplot_histogram.histogram, "CMO")), jibes_biplot_histogram.resources.clone(), ) @@ -1109,120 +966,18 @@ impl LibWsBuilder { Ok(LibraryCmoWebSummary { parameters_table: self.count_param_table(LibraryType::Cellplex)?, - multiplexing_metrics_table: MultiplexingLibraryCellMetricsTable(vec![ - MultiplexingLibraryCellMetricsRow { - cell_associated_partitions: get_metric_usize( - &self.lib_metrics, - "multi_filtered_bcs", - )?, - samples_assigned_at_least_one_singlet: get_metric_usize( - &self.lib_metrics, - "samples_with_any_singlets", - )?, - singlets_assigned_to_sample: self - .lib_fraction_cell_partitions("total_singlets")?, - singlet_capture_ratio: get_metric_f64( - &self.lib_metrics, - "MULTIPLEXING_sc_rec_efficiency_jibes", - )?, - cell_associated_partitions_identified_as_multiplet: self - .lib_fraction_cell_partitions( - "cell_associated_partitions_identified_as_multiplets", - )?, - median_cmo_umis_per_singlet: get_metric_round_float_to_int( - &self.lib_metrics, - "MULTIPLEXING_median_cmo_umis_per_singlet", - )?, - }, - ]) - .into(), - sample_assignments_table: MultiplexingSampleAssignmentsTable(vec![ - MultiplexingSampleAssignmentsRow { - physical_library_id: Some(physical_library_id.to_string()), - cell_associated_partitions: get_metric_usize( - &self.lib_metrics, - "multi_filtered_bcs", - )?, - mean_reads_per_cell: get_metric_f64( - &self.lib_metrics, - "MULTIPLEXING_multi_total_raw_reads_per_filtered_bc", - )? - .map(FloatAsInt), - samples_assigned_at_least_one_singlet: get_metric_usize( - &self.lib_metrics, - "samples_with_any_singlets", - )?, - singlets_assigned_to_a_sample: self - .lib_fraction_cell_partitions("total_singlets")?, - cell_associated_partitions_identified_as_multiplets: self - .lib_fraction_cell_partitions( - "cell_associated_partitions_identified_as_multiplets", - )?, - cell_associated_partitions_not_assigned_any_cmos: self - .lib_fraction_cell_partitions( - "cell_associated_partitions_not_assigned_any_samples", - )?, - median_cmo_umis_per_cell_associated_partition: get_metric_round_float_to_int( - &self.lib_metrics, - "MULTIPLEXING_multi_filtered_bcs_median_counts", - )?, - }, - ]) - .into(), + multiplexing_quality_table: self.build_multiplexing_quality_table()?.into(), sequencing_metrics_table: self - .sequencing_metrics - .get(&LibraryType::Cellplex) - .expect("Sequencing metrics for Multiplexing not found.") - .clone() + .get_sequencing_metrics_table(LibraryType::Cellplex) .into(), physical_library_metrics_table: MultiplexingPhysicalLibraryMetricsTable(vec![ MultiplexingPhysicalLibraryMetricsRow { physical_library_id: Some(physical_library_id.to_string()), - number_of_reads: get_metric_usize( - &self.lib_metrics, - "MULTIPLEXING_total_read_pairs", // DOUBLE CHECK THIS METRIC - )?, - valid_barcodes: get_metric_percent( - &self.lib_metrics, - "MULTIPLEXING_good_bc_frac", - )?, - valid_umis: get_metric_percent( - &self.lib_metrics, - "MULTIPLEXING_good_umi_frac", - )?, - sequencing_saturation: get_metric_percent( - &self.lib_metrics, - "MULTIPLEXING_multi_cdna_pcr_dupe_reads_frac", - )?, - reads_in_cell_associated_partitions: get_metric_percent( - &self.lib_metrics, - "MULTIPLEXING_feature_reads_in_cells", - )?, - mean_reads_per_cell_associated_partition: get_metric_f64( - &self.lib_metrics, - "MULTIPLEXING_multi_total_raw_reads_per_filtered_bc", - )? - .map(FloatAsInt), - fraction_cmo_reads: get_metric_percent( - &self.lib_metrics, - "MULTIPLEXING_recognized_feature_bc_frac", - )?, - fraction_cmo_reads_usable: get_metric_percent( - &self.lib_metrics, - "MULTIPLEXING_frac_feature_reads_usable", - )?, - fraction_unknown_cmo: get_metric_percent( - &self.lib_metrics, - "MULTIPLEXING_unrecognized_feature_bc_frac", // DOUBLE CHECK THIS METRIC - )?, - fraction_reads_from_multiplets: get_metric_percent( - &self.lib_metrics, - "MULTIPLEXING_frac_reads_from_multiplets", - )?, + ..MultiplexingPhysicalLibraryMetricsRow::from_metrics(&self.lib_metrics)? }, ]) .into(), - cmo_metrics_table: self.build_per_cmo_metrics_table()?.into(), + cmo_metrics_table: self.build_per_tag_metrics_table()?.into(), barcode_rank_plot: format_barcode_rank_plot( self.barcode_rank_plots .get(&LibraryType::Cellplex) @@ -1231,26 +986,133 @@ impl LibWsBuilder { ), jibes_biplot, jibes_histogram, - cmo_umi_tsne_plot: self.cmo_tsne_plot.as_ref().map(|x| { - format_umi_on_tsne_plot( - &x.cmo_umi_tsne_plot, + cmo_umi_projection_plot: self.cmo_projection_plot.as_ref().map(|x| { + format_umi_on_umap_plot( + &x.cmo_umi_projection_plot, "Multiplexing Capture", - "t-SNE Projection of Cells Colored by UMI Counts", + "UMAP Projection of Cells Colored by UMI Counts", ) }), - cmo_tags_tsne_plot: self - .cmo_tsne_plot + cmo_tags_projection_plot: self.cmo_projection_plot.as_ref().map(|x| { + format_tags_on_umap_plot(&x.cmo_tags_projection_plot, "Multiplexing Capture") + }), + resources, + }) + } + + fn build_hashtag_ws(&self) -> Result { + let (jibes_biplot, jibes_histogram, resources): ( + Option, + Option, + TxHashMap, + ) = match self.jibes_biplot_histogram.clone() { + Some(jibes_biplot) => { + let jibes_biplot_histogram: JibesBiplotHistogramData = + serde_json::from_value(jibes_biplot)?; + ( + Some(format_jibes_biplots( + &jibes_biplot_histogram.biplot, + "Hashtag", + )), + Some(format_histogram( + &jibes_biplot_histogram.histogram, + "Hashtag", + )), + jibes_biplot_histogram.resources.clone(), + ) + } + None => (None, None, TxHashMap::default()), + }; + Ok(LibraryHashtagWebSummary { + parameters_table: self.count_param_table(LibraryType::Antibody)?, + multiplexing_quality_table: self.build_multiplexing_quality_table()?.into(), + hashtag_metrics_table: self.build_per_tag_metrics_table()?.into(), + jibes_biplot, + jibes_histogram, + hashtag_umi_projection_plot: self.cmo_projection_plot.as_ref().map(|x| { + format_umi_on_umap_plot( + &x.cmo_umi_projection_plot, + "Antibody Capture", + "UMAP Projection of Cells Colored by Hashtag UMI Counts", + ) + }), + hashtag_tags_projection_plot: self + .cmo_projection_plot .as_ref() - .map(|x| format_tags_on_tsne_plot(&x.cmo_tags_tsne_plot)), + .map(|x| format_tags_on_umap_plot(&x.cmo_tags_projection_plot, "Antibody Capture")), resources, }) } - fn build_per_cmo_metrics_table(&self) -> Result { + fn build_multiplexing_quality_table(&self) -> Result { + let singlets_assigned_to_a_sample = self.lib_fraction_cell_partitions("total_singlets")?; + let cell_associated_partitions_identified_as_multiplets = self + .lib_fraction_cell_partitions("cell_associated_partitions_identified_as_multiplets")?; + let cell_associated_partitions_not_assigned_any_tags = self + .lib_fraction_cell_partitions("cell_associated_partitions_not_assigned_any_samples")?; + if self.is_cmo_multiplexed() { + Ok(CmoOrHashtag::Cmo(CmoMultiplexingQualityTable(vec![ + CmoMultiplexingQualityRow { + singlets_assigned_to_a_sample, + cell_associated_partitions_identified_as_multiplets, + cell_associated_partitions_not_assigned_any_tags, + ..CmoMultiplexingQualityRow::from_metrics(&self.lib_metrics)? + }, + ]))) + } else { + Ok(CmoOrHashtag::Hashtag(HashtagMultiplexingQualityTable( + vec![HashtagMultiplexingQualityRow { + singlets_assigned_to_a_sample, + cell_associated_partitions_identified_as_multiplets, + cell_associated_partitions_not_assigned_any_tags, + ..HashtagMultiplexingQualityRow::from_metrics(&self.lib_metrics)? + }], + ))) + } + } + + fn build_multiplexing_tag_metrics_row( + &self, + tag_name: &String, + sample_id: &String, + ) -> Result { + let singlets_metric_name = format!("tag_{tag_name}_number_of_singlets"); + let tag_reads_in_cell_associated_partitions_metric_name = + format!("tag_{tag_name}_frac_reads_in_cells"); + let snr_metric_name = format!("snr_{tag_name}_jibes"); + let total_singlets = get_metric_usize(&self.lib_metrics, "total_singlets")?.unwrap() as i64; + let singlets_assigned_to_tag = if total_singlets == 0 { + None + } else { + get_metric_usize(&self.lib_metrics, &singlets_metric_name)?.map( + |singlets_assigned_to_tag_count| { + CountAndPercent(PercentMetric::from_parts( + singlets_assigned_to_tag_count as i64, + total_singlets, + )) + }, + ) + }; + let tag_reads_in_cell_associated_partitions = get_metric_percent( + &self.lib_metrics, + &tag_reads_in_cell_associated_partitions_metric_name, + )?; + let tag_signal_to_background_ratio = get_metric_f64(&self.lib_metrics, &snr_metric_name)?; + + Ok(MultiplexingTagMetricsRow { + gem_well_tag: Some(tag_name.to_string()), + sample_id: Some(sample_id.to_string()), + tag_reads_in_cell_associated_partitions, + singlets_assigned_to_tag, + tag_signal_to_background_ratio, + }) + } + + fn build_per_tag_metrics_table(&self) -> Result { let mut gem_wells = TxHashSet::default(); - let mut rows = Vec::new(); + let mut rows = MultiplexingTagMetricsRows::default(); for sample in &self.multi_graph.samples { - rows.reserve(sample.fingerprints.len()); + rows.0.reserve(sample.fingerprints.len()); for fingerprint in &sample.fingerprints { match fingerprint { Fingerprint::Tagged { @@ -1263,75 +1125,56 @@ impl LibWsBuilder { "Multiple gem well data passed into per-tag metrics table generation, which is not yet supported." ); } - let singlets_metric_name = format!("tag_{tag_name}_number_of_singlets"); - let reads_in_cell_associated_partitions_metric_name = - format!("tag_{tag_name}_frac_reads_in_cells"); - let snr_metric_name = format!("snr_{tag_name}_jibes"); - let total_singlets = - get_metric_usize(&self.lib_metrics, "total_singlets")?.unwrap() as i64; - - let singlets_assigned_to_cmo = - get_metric_usize(&self.lib_metrics, &singlets_metric_name)?.map( - |singlets_assigned_to_cmo_count| { - Percent::Metric(PercentMetric::from_parts( - singlets_assigned_to_cmo_count as i64, - total_singlets, - )) - }, - ); - let reads_in_cell_associated_partitions = get_metric_percent( - &self.lib_metrics, - &reads_in_cell_associated_partitions_metric_name, - )?; - - let cmo_signal_to_background_ratio = - get_metric_f64(&self.lib_metrics, &snr_metric_name)?; - rows.push(MultiplexingCmoMetricsRow { - gem_well_cmo: Some(tag_name.to_string()), - reads_in_cell_associated_partitions, - singlets_assigned_to_cmo, - cmo_signal_to_background_ratio, - }); + let row = + self.build_multiplexing_tag_metrics_row(tag_name, &sample.sample_id)?; + rows.0.push(row); } Fingerprint::Untagged { .. } => { - bail!("Unable to build CMO metrics table involving untagged fingerprint."); + bail!("Unable to build Tag metrics table involving untagged fingerprint."); } } } } - sort_cmo_rows(&mut rows); - Ok(MultiplexingCmoMetricsTable(rows)) + rows.sort_tag_rows(); + if self.is_cmo_multiplexed() { + Ok(CmoOrHashtag::Cmo(CmoPerTagMetricsTable::from(rows))) + } else { + Ok(CmoOrHashtag::Hashtag(HashtagPerTagMetricsTable::from(rows))) + } } -} -// Helper function to sort rows by their CMO name -fn sort_cmo_rows(rows: &mut [MultiplexingCmoMetricsRow]) { - rows.sort_by(|a, b| match (&a.gem_well_cmo, &b.gem_well_cmo) { - (Some(ref _x), None) => Ordering::Greater, - (None, Some(ref _y)) => Ordering::Less, - (Some(ref x), Some(ref y)) => x.cmp(y), - (None, None) => Ordering::Equal, - }); + /// Build SequencingMetricsTable for a particular library type. + fn get_sequencing_metrics_table(&self, library_type: LibraryType) -> SequencingMetricsTable { + SequencingMetricsTable( + self.sequencing_metrics + .get(&library_type) + .unwrap_or_else(|| panic!("sequencing metrics for {library_type} not found.")) + .iter() + .cloned() + .map(Into::into) + .collect(), + ) + } } -// describes the various TSNE plots a single sample may have. +// describes the various UMAP plots a single sample may have. #[derive(Serialize, Deserialize, Clone, Default)] -pub struct SampleTsnePlots { - // full TSNE/clustering/diffexp plots for gene expression run +pub struct SampleUmapPlots { + // full UMAP/clustering/diffexp plots for gene expression run gex_diffexp_clustering_plots: Value, - // full TSNE/clustering/diffexp plots for antibody-only case only + // full UMAP/clustering/diffexp plots for antibody-only case only antibody_diffexp_clustering_plots: Value, - // the normal colored-umi TSNEs that feature barcode libraries get otherwise - crispr_umi_on_tsne: Value, - antibody_umi_on_tsne: Value, - custom_umi_on_tsne: Value, + // the normal colored-umi UMAPs that feature barcode libraries get otherwise + crispr_umi_on_umap: Value, + antibody_umi_on_umap: Value, + custom_umi_on_umap: Value, } -// describes the various TSNE plots a multiplexing experiment may have. +// describes the various UMAP plots a multiplexing experiment may have. #[derive(Serialize, Deserialize, Clone, Default)] -pub struct MultiplexingTsnePlots { - cmo_umi_tsne_plot: Value, - cmo_tags_tsne_plot: Value, +pub struct MultiplexingUmapPlots { + cmo_umi_projection_plot: Value, + cmo_tags_projection_plot: Value, } struct MultiWsBuilder { @@ -1340,41 +1183,49 @@ struct MultiWsBuilder { sample_barcode_rank_plots: TxHashMap>, sample_treemap_plots: Option>>, - sample_tsne_plots: TxHashMap, + sample_projection_plots: TxHashMap, sample_antibody_histograms: Option>, svg_str: String, csv_str: String, + is_barnyard: bool, diagnostics: MultiDiagnostics, pipeline_version: String, context: AlertContext, - multiplexing_method: Option, + multiplexing_method: Option, targeting_method: Option, antigen_vdj_metrics: Option>, clonotype_clustermap: Option>, vdj_t_contents: Option>, vdj_t_gd_contents: Option>, vdj_b_contents: Option>, + cell_annotation_barcharts: Option>, + cell_annotation_box_plots: Option>, + cell_annotation_umap_plots: Option>, + cell_annotation_diffexp_tables: + Option>, + cell_annotation_metrics: Option>, + cell_annotation_viable_but_not_requested: Option>>, } impl MultiWsBuilder { - /// Return true if the targeting method is hybridization capture. - fn is_hybrid_capture(&self) -> bool { - self.targeting_method == Some(TargetingMethod::HybridCapture) - } - /// Return true if multiplexed using CMO. fn is_cmo_multiplexed(&self) -> bool { - self.multiplexing_method == Some(CellMultiplexingType::CMO) + self.multiplexing_method == Some(BarcodeMultiplexingType::CellLevel(CellLevel::CMO)) + } + + /// Return true if multiplexed using Hashtag. + fn is_hashtag_multiplexed(&self) -> bool { + self.multiplexing_method == Some(BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag)) } /// Return true if multiplexed using RTL . fn is_rtl_multiplexed(&self) -> bool { - self.multiplexing_method == Some(CellMultiplexingType::RTL) + self.multiplexing_method == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)) } /// Return true if multiplexed using OH. fn is_overhang_multiplexed(&self) -> bool { - self.multiplexing_method == Some(CellMultiplexingType::OH) + self.multiplexing_method == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::OH)) } /// Return the multi experimental design graph. @@ -1465,7 +1316,8 @@ impl MultiWsBuilder { ["ANTIBODY_total_read_pairs"] .as_u64() .unwrap(); - if sample.cell_multiplexing_type() == Some(CellMultiplexingType::RTL) + if sample.barcode_multiplexing_type() + == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)) && antibody_reads == 0 && !sample_is_associated_with_flex_library_type( sample, @@ -1505,24 +1357,70 @@ impl MultiWsBuilder { LibraryType::Atac => unreachable!(), } } + + let put_in_cell_annotation_tab = [ + self.cell_annotation_barcharts + .as_ref() + .map(|x| x.contains_key(&sample_assignment)) + .unwrap_or_default(), + self.cell_annotation_box_plots + .as_ref() + .map(|x| x.contains_key(&sample_assignment)) + .unwrap_or_default(), + self.cell_annotation_umap_plots + .as_ref() + .map(|x| x.contains_key(&sample_assignment)) + .unwrap_or_default(), + self.cell_annotation_diffexp_tables + .as_ref() + .map(|x| x.contains_key(&sample_assignment)) + .unwrap_or_default(), + self.cell_annotation_metrics + .as_ref() + .map(|x| x.contains_key(&sample_assignment)) + .unwrap_or_default(), + ] + .iter() + .any(|x| *x); + if put_in_cell_annotation_tab { + sample_ws.cell_annotation_tab = Some(Tab::new( + self.build_cell_annotation_ws(&sample_assignment)?, + &self.context, + )); + } + result.insert( sample_assignment, MultiWebSummary { sample: WsSample::multi(sample.sample_id.clone(), sample.description.clone()), - data: MultiWebSummaryData { - library_websummary: library_websummary.clone(), - sample_websummary: sample_ws, - experimental_design: ExperimentalDesign { - svg: SvgGraph::new( - self.svg_str.clone(), - format!("sample_{}", i + 1), - self.multiplexing_method, - ), - csv: self.csv_str.clone(), - }, + library: MultiWebSummaryLibraryData { + metrics: library_websummary.to_json_summary(&self.context), + types: multi_graph + .libraries + .iter() + .map(|lib| lib.library_type) + .unique() + .sorted() + .collect(), + data: library_websummary.clone(), + }, + per_sample: vec![MultiWebSummarySampleData { + metrics: sample_ws.to_json_summary(&self.context), + data: sample_ws, + }], + experimental_design: ExperimentalDesign { + svg: SvgGraph::new( + self.svg_str.clone(), + format!("sample_{}", i + 1), + self.multiplexing_method, + ), + csv: self.csv_str.clone(), + multiplexing_method: self.multiplexing_method, + is_rtl: self.lib_ws_builder.is_rtl(), + is_barnyard: self.is_barnyard, }, diagnostics: self.diagnostics.clone(), - sample_diagnostics, + sample_diagnostics: vec![sample_diagnostics], resources: resources.clone(), }, ); @@ -1581,75 +1479,13 @@ impl MultiWsBuilder { metrics: &TxHashMap, ) -> Result { if self.lib_ws_builder.aligner() == AlignerParam::Hurtle { - Ok(GexOrRtl::Rtl(RtlSampleMappingMetricsTable(vec![ - RtlSampleMappingMetricsRow { - reads_from_cells_assigned_to_sample: get_metric_usize( - metrics, - "total_read_pairs_in_filtered_barcodes", - )?, - reads_half_mapped_to_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_half_mapped_reads_frac_in_filtered_barcodes", - )?, - reads_split_mapped_to_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_split_mapped_reads_frac_in_filtered_barcodes", - )?, - reads_mapped_to_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_mapped_reads_frac_in_filtered_barcodes", - )?, - reads_confidently_mapped_to_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_conf_mapped_reads_frac_in_filtered_barcodes", - )?, - reads_confidently_mapped_to_filtered_probe_set: get_metric_percent( - metrics, - "multi_transcriptome_targeted_conf_mapped_reads_frac_in_filtered_barcodes", - )?, - }, - ]))) + Ok(GexOrRtl::Rtl(RtlSampleMappingMetricsTable::from_metrics( + metrics, + )?)) } else { - Ok(GexOrRtl::Gex(GexSampleMappingMetricsTable(vec![ - GexSampleMappingMetricsRow { - reads_from_cells_assigned_to_sample: get_metric_usize( - metrics, - "total_read_pairs_in_filtered_barcodes", - )?, - mapped_to_genome: get_metric_percent( - metrics, - "multi_genome_mapped_reads_frac_in_filtered_barcodes", - )?, - confidently_mapped_to_genome: get_metric_percent( - metrics, - "multi_genome_conf_mapped_reads_frac_in_filtered_barcodes", - )?, - confidently_mapped_to_transcriptome: get_metric_percent( - metrics, - "multi_transcriptome_conf_mapped_reads_frac_in_filtered_barcodes", - )?, - confidently_mapped_to_targeted_transcriptome: get_metric_percent( - metrics, - "multi_transcriptome_targeted_conf_mapped_reads_frac_in_filtered_barcodes", - )?, - confidently_mapped_to_intronic_regions: get_metric_percent( - metrics, - "multi_intronic_conf_mapped_reads_frac_in_filtered_barcodes", - )?, - confidently_mapped_to_exonic_regions: get_metric_percent( - metrics, - "multi_exonic_conf_mapped_reads_frac_in_filtered_barcodes", - )?, - confidently_mapped_to_intergenic_regions: get_metric_percent( - metrics, - "multi_intergenic_conf_mapped_reads_frac_in_filtered_barcodes", - )?, - confidently_mapped_antisense: get_metric_percent( - metrics, - "multi_antisense_reads_frac_in_filtered_barcodes", - )?, - }, - ]))) + Ok(GexOrRtl::Gex(GexSampleMappingMetricsTable::from_metrics( + metrics, + )?)) } } @@ -1664,78 +1500,78 @@ impl MultiWsBuilder { .get(sample_assignment) .expect("Sample metrics file not found."); - let [median_genes_per_cell_on_target, num_genes_detected_on_target, median_umis_per_cell_on_target] = - if self.is_hybrid_capture() && genomes.len() == 1 { - [ - "median_genes_per_cell_on_target", - "num_genes_detected_on_target", - "median_umis_per_cell_on_target", - ] - .map(|key| get_metric_round_float_to_int(metrics, key).unwrap()) - } else { - [None, None, None] - }; + let disclaimer_banner = if self + .cell_annotation_viable_but_not_requested + .as_ref() + .and_then(|x| x.get(sample_assignment).copied()) + .flatten() + .unwrap_or(false) + { + Some(CELL_ANNOTATION_ADVERTISEMENT_STRING.to_string()) + } else { + None + }; let mut cell_hero_metrics_rows = Vec::with_capacity(genomes.len()); for genome in &genomes { - let mean_reads_per_cell = if genomes.len() == 1 { - get_metric_round_float_to_int(metrics, "filtered_reads_per_filtered_bc")? - } else { - // Reads must be mapped to be assigned to a particular genome for barnyard. - get_metric_round_float_to_int( + let mean_reads_per_cell = match (self.targeting_method, genomes.len()) { + (_, 0..2) => { + // Non-barynard metrics are not prefixed by genome. + get_metric_round_float_to_int(metrics, "filtered_reads_per_filtered_bc")? + } + (Some(TargetingMethod::TemplatedLigation), 2..) => { + // In targeted Barnyard, Hurtle annotates all mapped reads to the _and_ genome. + // Therefore, the mean reads per cell by genome metrics are incorrect (zero). + // Once that is updated to annotate reads per genome, this case can be removed. + None + } + (_, 2..) => get_metric_round_float_to_int( + // Barnyard metrics are prefixed by genome. metrics, &format!("{genome}_filtered_bcs_conf_mapped_barcoded_reads_per_filtered_bc"), - )? - }; - - let median_reads_per_cell_on_target = if self.is_hybrid_capture() && genomes.len() == 1 - { - get_metric_round_float_to_int( - metrics, - &format!("{genome}_median_reads_per_singlet_ontarget"), - )? - } else { - None + )?, }; let [median_genes_per_singlet, total_genes_detected, median_umi_per_singlet] = match self.targeting_method { Some(TargetingMethod::TemplatedLigation) => { // Use the filtered probe set metrics. + // Targeted metrics are prefixed by genome only if there are >=2 genomes. + let targeted_prefix = (genomes.len() >= 2).then_some(genome.as_str()); [ "median_genes_per_cell_on_target", "num_genes_detected_on_target", "median_umis_per_cell_on_target", ] - .map(|key| get_metric_round_float_to_int(metrics, key).unwrap()) - } - Some(TargetingMethod::HybridCapture) if genomes.len() == 1 => { - // Hide these metrics for targeting with hybridization-capture. - [None, None, None] - } - _ => { - // Non-targeted metrics. - [ - "filtered_bcs_median_unique_genes_detected", - "filtered_bcs_total_unique_genes_detected", - "filtered_bcs_median_counts", - ] .map(|key| { - get_metric_round_float_to_int(metrics, &format!("{genome}_{key}")) - .unwrap() + get_metric_round_float_to_int( + metrics, + &join_metric_name(targeted_prefix, key), + ) + .unwrap() }) } + // Non-targeted metrics are always prefixed by genome, even if there is only one genome. + _ => [ + "filtered_bcs_median_unique_genes_detected", + "filtered_bcs_total_unique_genes_detected", + "filtered_bcs_median_counts", + ] + .map(|key| { + get_metric_round_float_to_int(metrics, &format!("{genome}_{key}")).unwrap() + }), }; - let confidently_mapped_reads_in_cells = if self.is_cmo_multiplexed() { - // CMO multiplexing does not demultiplex reads outside of cells. - None - } else { - get_metric_percent( - metrics, - &format!("{genome}_filtered_bcs_conf_mapped_barcoded_reads_cum_frac"), - )? - }; + let confidently_mapped_reads_in_cells = + if self.is_cmo_multiplexed() || self.is_hashtag_multiplexed() { + // CMO and HASHTAG multiplexing does not demultiplex reads outside of cells. + None + } else { + get_metric_percent( + metrics, + &format!("{genome}_filtered_bcs_conf_mapped_barcoded_reads_cum_frac"), + )? + }; cell_hero_metrics_rows.push(GexSampleHeroMetricsRow { genome: if genomes.len() > 1 { @@ -1748,13 +1584,9 @@ impl MultiWsBuilder { &format!("{genome}_singlets_assigned_to_this_sample"), )?, mean_reads_per_cell, - median_reads_per_cell_on_target, median_genes_per_singlet, total_genes_detected: total_genes_detected.map(|x| x.0 as usize), median_umi_per_singlet, - median_genes_per_cell_on_target, - num_genes_detected_on_target: num_genes_detected_on_target.map(|x| x.0 as usize), - median_umis_per_cell_on_target, confidently_mapped_reads_in_cells, }); } @@ -1806,12 +1638,13 @@ impl MultiWsBuilder { None }, clustering_and_diffexp_plots: self - .sample_tsne_plots + .sample_projection_plots .get(sample_assignment) .cloned() .unwrap_or_default() .gex_diffexp_clustering_plots, barcode_rank_plot, + disclaimer: disclaimer_banner, }) } @@ -1823,22 +1656,22 @@ impl MultiWsBuilder { let metrics = &self.per_sample_metrics[sample_assignment]; let mut hero_metrics = AntibodySampleHeroMetricsRow::from_metrics(metrics)?; - if self.is_cmo_multiplexed() { + if self.is_cmo_multiplexed() || self.is_hashtag_multiplexed() { hero_metrics.reads_in_cells = None; }; - let tsne_plots = self - .sample_tsne_plots + let projection_plots = self + .sample_projection_plots .get(sample_assignment) .cloned() .unwrap_or_default(); - // if this is antibody_only case, we don't show the single umi-on-TSNE plot. - let umi_on_tsne_plot = match tsne_plots.antibody_diffexp_clustering_plots { - Value::Null => Some(format_umi_on_tsne_plot( - &tsne_plots.antibody_umi_on_tsne, + // if this is antibody_only case, we don't show the single umi-on-UMAP plot. + let umi_on_projection_plot = match projection_plots.antibody_diffexp_clustering_plots { + Value::Null => Some(format_umi_on_umap_plot( + &projection_plots.antibody_umi_on_umap, "Antibody Capture", - "t-SNE Projection", + "UMAP Projection", )), _ => None, }; @@ -1855,7 +1688,7 @@ impl MultiWsBuilder { let barcode_rank_plot = if self.is_rtl_multiplexed() { Some(format_barcode_rank_plot( &self.sample_barcode_rank_plots[sample_assignment][&LibraryType::Antibody], - "AB", + "Antibody", )) } else { None @@ -1876,8 +1709,8 @@ impl MultiWsBuilder { }, mapping_metrics_table: AntibodySampleMappingMetricsTable::from_metrics(metrics)?.into(), antibody_treemap, - clustering_and_diffexp_plots: Some(tsne_plots.antibody_diffexp_clustering_plots), - tsne_plot: umi_on_tsne_plot, + clustering_and_diffexp_plots: Some(projection_plots.antibody_diffexp_clustering_plots), + projection_plot: umi_on_projection_plot, barcode_rank_plot, feature_histogram: self .sample_antibody_histograms @@ -1897,15 +1730,7 @@ impl MultiWsBuilder { let mut hero_metrics_row = vec![AntigenSampleHeroMetricsRow { feature_type: Some(LibraryType::Gex.to_string()), - total_singlets: get_metric_usize(metrics, "ANTIGEN_multi_filtered_bcs")?, - median_umis_per_singlet: get_metric_round_float_to_int( - metrics, - "ANTIGEN_multi_filtered_bcs_median_counts", - )?, - antigen_reads_usable_per_cell: get_metric_round_float_to_int( - metrics, - "ANTIGEN_multi_usable_reads_per_filtered_bc", - )?, + ..AntigenSampleHeroMetricsRow::from_metrics(metrics)? }]; if let Some(antigen_vdj_metrics) = self.antigen_vdj_metrics.as_ref() { @@ -1965,7 +1790,7 @@ impl MultiWsBuilder { let metrics = &self.per_sample_metrics[sample_assignment]; let mut hero_metrics = CrisprSampleHeroMetricsRow::from_metrics(metrics)?; - if self.is_cmo_multiplexed() { + if self.is_cmo_multiplexed() || self.is_hashtag_multiplexed() { hero_metrics.reads_in_cells = None; }; @@ -1981,13 +1806,16 @@ impl MultiWsBuilder { None }, mapping_metrics_table: CrisprSampleMappingMetricsTable::from_metrics(metrics)?.into(), - tsne_plot: self.sample_tsne_plots.get(sample_assignment).map(|x| { - format_umi_on_tsne_plot( - &x.crispr_umi_on_tsne, - "CRISPR Guide Capture", - "t-SNE Projection", - ) - }), + projection_plot: self + .sample_projection_plots + .get(sample_assignment) + .map(|x| { + format_umi_on_umap_plot( + &x.crispr_umi_on_umap, + "CRISPR Guide Capture", + "UMAP Projection", + ) + }), barcode_rank_plot: None, }) } @@ -2004,20 +1832,7 @@ impl MultiWsBuilder { Ok(SampleCustomFeatureWebSummary { parameters_table: self.lib_ws_builder.count_param_table(LibraryType::Custom)?, - hero_metrics: CustomFeatureSampleHeroMetricsTable(vec![ - CustomFeatureSampleHeroMetricsRow { - total_singlets: get_metric_usize(metrics, "Custom_multi_filtered_bcs")?, - median_umis_per_singlet: get_metric_round_float_to_int( - metrics, - "Custom_multi_filtered_bcs_median_counts", - )?, - feature_reads_usable_per_cell: get_metric_round_float_to_int( - metrics, - "Custom_multi_usable_reads_per_filtered_bc", - )?, - }, - ]) - .into(), + hero_metrics: CustomFeatureSampleHeroMetricsTable::from_metrics(metrics)?.into(), cell_metrics_table: if self.multiplexing_method.is_some() { Some( self.sample_cell_metrics_table(metrics, physical_library_id)? @@ -2026,19 +1841,71 @@ impl MultiWsBuilder { } else { None }, - tsne_plot: Some(format_umi_on_tsne_plot( + projection_plot: Some(format_umi_on_umap_plot( &self - .sample_tsne_plots + .sample_projection_plots .get(sample_assignment) .cloned() .unwrap_or_default() - .custom_umi_on_tsne, + .custom_umi_on_umap, "Custom Feature", - "t-SNE Projection", + "UMAP Projection", )), barcode_rank_plot: None, }) } + + fn build_cell_annotation_ws( + &self, + sample_assignment: &SampleAssignment, + ) -> Result { + let cell_annotation_barchart = self + .cell_annotation_barcharts + .as_ref() + .and_then(|c| c.get(sample_assignment).cloned()); + let cell_annotation_violin_plot = self + .cell_annotation_box_plots + .as_ref() + .and_then(|c| c.get(sample_assignment).cloned()); + let cell_annotation_umap_plot = self + .cell_annotation_umap_plots + .as_ref() + .and_then(|c| c.get(sample_assignment).cloned()); + let cell_annotation_diffexp_table = self + .cell_annotation_diffexp_tables + .as_ref() + .and_then(|c| c.get(sample_assignment).cloned()); + let cell_annotation_metric_struct = self + .cell_annotation_metrics + .as_ref() + .and_then(|c| c.get(sample_assignment).cloned()); + Ok(SampleCellAnnotationWebSummary { + cas_success: cell_annotation_metric_struct + .as_ref() + .and_then(|x| x.cell_annotation_success), + cell_annotation_disable_differential_expression: cell_annotation_metric_struct + .as_ref() + .and_then(|x| x.cell_annotation_differential_expression), + disclaimer: cell_annotation_metric_struct + .as_ref() + .and_then(CellAnnotationMetrics::generate_disclaimer_html_fragment), + parameters_table: cell_annotation_metric_struct + .map(generate_cell_type_parameter_table) + .transpose()?, + cell_annotation_cell_types_chart: cell_annotation_barchart + .map(generate_cell_type_barchart_from_value) + .transpose()?, + cell_annotation_violin_plot_chart: cell_annotation_violin_plot + .map(generate_cell_type_violin_plot_from_value) + .transpose()?, + cell_annotation_umap_plot_chart: cell_annotation_umap_plot + .map(generate_cell_type_umap_plot_from_value) + .transpose()?, + cell_annotation_diffexp_table: cell_annotation_diffexp_table + .map(generate_cell_type_diffexp_from_value) + .transpose()?, + }) + } } fn get_metric(metrics: &TxHashMap, key: &str) -> Result> { @@ -2136,20 +2003,23 @@ fn identify_dropped_tags( /// Return true if this sample is associated with the provided FLEX-compatible library type. /// Return false if not multiplexed, or if the multiplexing type is not RTL. fn sample_is_associated_with_flex_library_type(sample: &Sample, library_type: LibraryType) -> bool { - if sample.cell_multiplexing_type() != Some(CellMultiplexingType::RTL) { + if sample.barcode_multiplexing_type() + != Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)) + { return false; } let expected_multi_bc_type = match library_type { - LibraryType::Gex => MultiplexingBarcodeType::RTL, - LibraryType::Antibody => MultiplexingBarcodeType::Antibody, - LibraryType::Crispr => MultiplexingBarcodeType::Crispr, + LibraryType::Gex => RTLMultiplexingBarcodeType::Gene, + LibraryType::Antibody => RTLMultiplexingBarcodeType::Antibody, + LibraryType::Crispr => RTLMultiplexingBarcodeType::Crispr, _ => { return false; } }; - sample - .tag_names() - .any(|tag| categorize_multiplexing_barcode_id(tag) == expected_multi_bc_type) + sample.tag_names().any(|tag| { + categorize_rtl_multiplexing_barcode_id(tag).expect("Cannot determine multiplexing type!") + == expected_multi_bc_type + }) } #[make_mro(volatile = strict, mem_gb = 5)] @@ -2221,7 +2091,7 @@ impl MartianMain for WriteMultiWebSummaryJson { jibes_biplot_histogram: args.jibes_biplot_histogram.map(|j| j.read()).transpose()?, antibody_histograms: args.antibody_histograms.map(|j| j.read()).transpose()?, antigen_histograms: args.antigen_histograms.map(|j| j.read()).transpose()?, - cmo_tsne_plot: args.cmo_tsne_plot.map(|j| j.read()).transpose()?, + cmo_projection_plot: args.cmo_projection_plot.map(|j| j.read()).transpose()?, vdj_t_contents: args .vdj_t_contents .clone() @@ -2253,14 +2123,14 @@ impl MartianMain for WriteMultiWebSummaryJson { }) .transpose()?, target_set_name: args.target_set_name, - targeted_per_feature_metrics: args.targeted_per_feature_metrics.clone(), - is_multiplexed: multi_graph.is_multiplexed(), + multiplexing_method: multi_graph.barcode_multiplexing_type(), specificity_controls: args .feature_config .unwrap_or(FeatureConfig { beam_mode: None, specificity_controls: None, functional_map: None, + hashtag_ids: None, }) .specificity_controls, dropped_tags, @@ -2275,6 +2145,12 @@ impl MartianMain for WriteMultiWebSummaryJson { // POPULATE DIAGNOSTIC DATA //****************************************************************************************** let get_metric = |metric| lib_ws_builder.lib_metrics.get(metric).cloned(); + let unknown_feature_bcs: HashMap = lib_ws_builder + .lib_metrics + .iter() + .filter(|(key, _)| key.contains("unknown_feature_bcs")) + .map(|(key, value)| (key.clone(), value.clone())) + .collect(); let diagnostics = MultiDiagnostics { corrected_bc_frac: get_metric("corrected_bc_frac"), @@ -2297,6 +2173,7 @@ impl MartianMain for WriteMultiWebSummaryJson { high_occupancy_probe_barcode_count_threshold: get_metric( "rtl_multiplexing_high_occupancy_probe_barcode_count_threshold", ), + unknown_feature_barcode_seqs: unknown_feature_bcs, }; //****************************************************************************************** @@ -2319,13 +2196,12 @@ impl MartianMain for WriteMultiWebSummaryJson { .chemistry_defs .map_or(true, |x| x.endedness() == Some(WhichEnd::FivePrime)); - let is_hybrid_capture = lib_ws_builder.is_hybrid_capture(); let is_rtl = lib_ws_builder.is_rtl(); let multi_ws_builder = MultiWsBuilder { lib_ws_builder, per_sample_metrics: read_optional_file_map(&args.per_sample_metrics)?, - sample_tsne_plots: read_optional_file_map(&args.sample_tsne_plots)?, + sample_projection_plots: read_optional_file_map(&args.sample_projection_plots)?, sample_barcode_rank_plots: read_optional_file_map(&args.sample_barcode_rank_plots)?, sample_treemap_plots: args .sample_treemap_plots @@ -2342,33 +2218,31 @@ impl MartianMain for WriteMultiWebSummaryJson { csv_str: std::fs::read_to_string(&args.multi_config)? .replace("\r\n", "\n") .replace('\r', "\n"), + is_barnyard: is_barnyard(args.count_inputs.as_ref())?, diagnostics, pipeline_version: rover.pipelines_version(), context: AlertContext { - is_hybrid_capture, is_rtl, - is_lt_chemistry: chemistries.contains(&ChemistryName::ThreePrimeV3LT), is_arc_chemistry: chemistries.contains(&ChemistryName::ArcV1), + library_types: multi_graph.library_types().collect(), is_fiveprime, - is_multiplexing: args.count_inputs.as_ref().is_some_and(|inputs| { + is_cmo_multiplexed: args.count_inputs.as_ref().is_some_and(|inputs| { inputs .sample_def .iter() .any(|sdef| sdef.library_type == Some(LibraryType::Cellplex)) }), - is_antigen: args.count_inputs.as_ref().is_some_and(|inputs| { - inputs - .sample_def - .iter() - .any(|sdef| sdef.library_type == Some(LibraryType::Antigen)) - }), + multiplexing_method: multi_graph.barcode_multiplexing_type(), + is_hashtag_multiplexed: multi_graph + .barcode_multiplexing_type() + .is_some_and(|mm| mm == BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag)), include_introns: args .count_inputs .as_ref() .is_some_and(|inputs| inputs.include_introns), no_preflight: args.no_preflight, }, - multiplexing_method: multi_graph.cell_multiplexing_type(), + multiplexing_method: multi_graph.barcode_multiplexing_type(), targeting_method: args .count_inputs .as_ref() @@ -2407,36 +2281,51 @@ impl MartianMain for WriteMultiWebSummaryJson { .as_ref() .map(read_files_into_map) .transpose()?, + cell_annotation_barcharts: args + .cell_annotation_barcharts + .as_ref() + .map(read_optional_file_map) + .transpose()?, + cell_annotation_box_plots: args + .cell_annotation_box_plots + .as_ref() + .map(read_optional_file_map) + .transpose()?, + cell_annotation_umap_plots: args + .cell_annotation_umap_plots + .as_ref() + .map(read_optional_file_map) + .transpose()?, + cell_annotation_diffexp_tables: args + .cell_annotation_diffexp_tables + .as_ref() + .map(read_optional_file_map) + .transpose()?, + cell_annotation_metrics: args + .cell_annotation_metrics_jsons + .as_ref() + .map(read_optional_file_map) + .transpose()?, + cell_annotation_viable_but_not_requested: args.cell_annotation_viable_but_not_requested, }; - let per_sample_ws = multi_ws_builder.build()?; - let mut sample_to_json_summary = TxHashMap::default(); - - for (sample, sample_ws) in per_sample_ws { + for (sample, sample_ws) in multi_ws_builder.build()? { // Write the web summary data to JSON // put the path to the JSON into sample_to_web_summary, with key being sample ID - let json_file: JsonFile<()> = + let json_file: JsonFile = rover.make_path(format!("{}_web_summary_data.json", sample.clone())); serde_json::to_writer_pretty(json_file.buf_writer()?, &sample_ws)?; sample_to_web_summary.insert(sample.clone(), json_file); - sample_to_json_summary.insert( - sample.clone(), - rover - .make_path::>(format!("{}_metric_summary_json", &sample)) - .with_content(&sample_ws.to_json_summary())?, - ); - let csv_file: CsvFile<()> = rover.make_path(format!("{}_metric_summary_csv", &sample)); - sample_ws.to_csv(&csv_file)?; + sample_ws.to_csv(&csv_file, 0)?; sample_to_metrics_csv.insert(sample.clone(), csv_file); } Ok(StageOutputs { web_summary_json: sample_to_web_summary, metrics_summary_csv: sample_to_metrics_csv, - metrics_summary_json: sample_to_json_summary, }) } } @@ -2481,7 +2370,8 @@ fn get_mismatched_probe_barcode_pairings( .into_iter() .filter(|(_, source_bc)| { // CRISPR not yet supported in pairing detection - categorize_multiplexing_barcode_id(source_bc) != MultiplexingBarcodeType::Crispr + categorize_rtl_multiplexing_barcode_id(source_bc).unwrap() + != RTLMultiplexingBarcodeType::Crispr }) .map(|(target_bc, source_bc)| format!("{target_bc}{PROBE_BARCODE_ID_GROUPING}{source_bc}")) .collect(); @@ -2491,7 +2381,8 @@ fn get_mismatched_probe_barcode_pairings( .into_iter() .filter(|(source_bc, _)| { // CRISPR not yet supported in pairing detection - categorize_multiplexing_barcode_id(source_bc) != MultiplexingBarcodeType::Crispr + categorize_rtl_multiplexing_barcode_id(source_bc).unwrap() + != RTLMultiplexingBarcodeType::Crispr }) .map(|(source_bc, target_bc)| format!("{target_bc}{PROBE_BARCODE_ID_GROUPING}{source_bc}")) .collect(); @@ -2500,16 +2391,26 @@ fn get_mismatched_probe_barcode_pairings( { return Ok(None); } - Ok(Some(MismatchedProbeBarcodePairings { - configured_not_detected: configured_probe_barcode_pairing - .difference(&detected_probe_barcode_pairing) - .cloned() - .collect(), - detected_not_configured: detected_probe_barcode_pairing - .difference(&configured_probe_barcode_pairing) - .cloned() - .collect(), - })) + Ok(Some(MismatchedProbeBarcodePairings::new( + &configured_probe_barcode_pairing, + &detected_probe_barcode_pairing, + ))) +} + +/// Determine if this is a barnyard analysis. +fn is_barnyard(count_inputs: Option<&CountInputs>) -> Result { + let Some(CountInputs { + reference_path: Some(reference_path), + .. + }) = count_inputs + else { + return Ok(false); + }; + + Ok(ReferenceInfo::from_reference_path(reference_path)? + .genomes + .len() + >= 2) } #[cfg(test)] @@ -2518,28 +2419,37 @@ mod tests { #[test] fn test_sorted_cmos() { - let mut rows = vec![ - MultiplexingCmoMetricsRow { - gem_well_cmo: Some("CMO_2_5".to_string()), - reads_in_cell_associated_partitions: Some(Percent::Float(0.822)), - singlets_assigned_to_cmo: Some(Percent::Float(0.822)), - cmo_signal_to_background_ratio: Some(3.0), + let mut rows = MultiplexingTagMetricsRows(vec![ + MultiplexingTagMetricsRow { + gem_well_tag: Some("CMO_2_5".to_string()), + sample_id: Some("sample_1".to_string()), + tag_reads_in_cell_associated_partitions: Some(Percent::Float(0.822)), + singlets_assigned_to_tag: Some(CountAndPercent(PercentMetric::from_parts( + 822, 1000, + ))), + tag_signal_to_background_ratio: Some(3.0), }, - MultiplexingCmoMetricsRow { - gem_well_cmo: Some("CMO_2_3".to_string()), - reads_in_cell_associated_partitions: Some(Percent::Float(0.822)), - singlets_assigned_to_cmo: Some(Percent::Float(0.822)), - cmo_signal_to_background_ratio: Some(3.0), + MultiplexingTagMetricsRow { + gem_well_tag: Some("CMO_2_3".to_string()), + sample_id: Some("sample_2".to_string()), + tag_reads_in_cell_associated_partitions: Some(Percent::Float(0.822)), + singlets_assigned_to_tag: Some(CountAndPercent(PercentMetric::from_parts( + 822, 1000, + ))), + tag_signal_to_background_ratio: Some(3.0), }, - MultiplexingCmoMetricsRow { - gem_well_cmo: Some("CMO_2_4".to_string()), - reads_in_cell_associated_partitions: Some(Percent::Float(0.822)), - singlets_assigned_to_cmo: Some(Percent::Float(0.822)), - cmo_signal_to_background_ratio: Some(2.0), + MultiplexingTagMetricsRow { + gem_well_tag: Some("CMO_2_4".to_string()), + sample_id: Some("sample_2".to_string()), + tag_reads_in_cell_associated_partitions: Some(Percent::Float(0.822)), + singlets_assigned_to_tag: Some(CountAndPercent(PercentMetric::from_parts( + 822, 1000, + ))), + tag_signal_to_background_ratio: Some(2.0), }, - ]; - sort_cmo_rows(&mut rows); - let names: Vec> = rows.into_iter().map(|x| x.gem_well_cmo).collect(); + ]); + rows.sort_tag_rows(); + let names: Vec> = rows.0.into_iter().map(|x| x.gem_well_tag).collect(); assert_eq!( names, vec![ diff --git a/lib/rust/cr_lib/src/stages/write_pos_bam.rs b/lib/rust/cr_lib/src/stages/write_pos_bam.rs index 26f2826..24feef4 100644 --- a/lib/rust/cr_lib/src/stages/write_pos_bam.rs +++ b/lib/rust/cr_lib/src/stages/write_pos_bam.rs @@ -108,7 +108,7 @@ pub struct WritePosBam; #[derive(Deserialize, Clone, MartianStruct)] pub struct StageInputs { - pub bam_header: PathBuf, + pub bam_header: Option, pub alignments: Vec, pub read_chunks: Vec, pub target_set_name: Option, @@ -155,7 +155,7 @@ fn attach_read_group_tags<'a>( // ID: {read_group}, SM: {sample_id}, LB: {library_id}.{gem_group}, PU: {read_group} record.push_tag(b"ID", read_group); record.push_tag(b"SM", parts[0]); - record.push_tag(b"LB", &format!("{}.{}", parts[1], parts[2])); + record.push_tag(b"LB", format!("{}.{}", parts[1], parts[2])); record.push_tag(b"PU", read_group); record.push_tag(b"PL", "ILLUMINA"); header.push_record(&record); @@ -282,7 +282,7 @@ impl MartianStage for WritePosBam { // Read in the header text & initialize the BAM file with it. let header = make_header( - Some(&args.bam_header), + args.bam_header.as_deref(), &args.read_chunks, args.target_set_name.as_deref(), chunk_args.write_header, @@ -342,7 +342,7 @@ impl MartianStage for WritePosBam { ) -> Result { //Determine the time of BAM index needed let header: Header = make_header( - Some(&args.bam_header), + args.bam_header.as_deref(), &args.read_chunks, args.target_set_name.as_deref(), false, @@ -439,7 +439,7 @@ mod tests { fn test_fail_bam_comparison() { let chunk = get_test_chunk(); let args = StageInputs { - bam_header: PathBuf::from("test/multi/write_bam_multi/test1/bam_header"), + bam_header: Some(PathBuf::from("test/multi/write_bam_multi/test1/bam_header")), alignments: vec![AlignShardFile::from( "test/multi/write_bam_multi/test1/pos_sorted.asf", )], @@ -470,7 +470,7 @@ mod tests { fn test_single_sample() { let chunk = get_test_chunk(); let args = StageInputs { - bam_header: PathBuf::from("test/multi/write_bam_multi/test1/bam_header"), + bam_header: Some(PathBuf::from("test/multi/write_bam_multi/test1/bam_header")), alignments: vec![AlignShardFile::from( "test/multi/write_bam_multi/test1/pos_sorted.asf", )], @@ -503,7 +503,7 @@ mod tests { let chunk = get_test_chunk(); let args = StageInputs { - bam_header: PathBuf::from("test/multi/write_bam_multi/test1/bam_header"), + bam_header: Some(PathBuf::from("test/multi/write_bam_multi/test1/bam_header")), alignments: vec![AlignShardFile::from( "test/multi/write_bam_multi/test1/pos_sorted.asf", )], diff --git a/lib/rust/cr_lib/src/types.rs b/lib/rust/cr_lib/src/types.rs index 1cba72c..1fb3d7f 100644 --- a/lib/rust/cr_lib/src/types.rs +++ b/lib/rust/cr_lib/src/types.rs @@ -6,13 +6,13 @@ use cr_h5::count_matrix::CountMatrixFile; use cr_types::reference::feature_reference::FeatureReference; use cr_types::rna_read::RnaRead; use cr_types::{LibraryType, SampleAssignment}; -use cr_websummary::multi::tables::SequencingMetricsTable; +use cr_websummary::multi::tables::SequencingMetricsRow; use martian::MartianRover; use martian_derive::{martian_filetype, MartianStruct, MartianType}; use martian_filetypes::bin_file::BinaryFormat; use martian_filetypes::json_file::JsonFormat; use martian_filetypes::tabular_file::CsvFile; -use metric::TxHashMap; +use metric::{PercentMetric, TxHashMap}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use tx_annotation::read::ReadAnnotations; @@ -78,16 +78,46 @@ impl GexMatrices { } } -impl From for GexMatrices { - fn from(value: SampleMatrices) -> Self { +impl GexMatrices { + pub fn from_sample_matrices(value: SampleMatrices, read_level_multiplexing: bool) -> Self { GexMatrices { filtered_matrix_h5: Some(value.filtered_matrix_h5), - raw_matrix_h5: Some(value.raw_matrix_h5), + raw_matrix_h5: read_level_multiplexing.then_some(value.raw_matrix_h5), filtered_barcodes: Some(value.filtered_barcodes), } } } +/// Sequencing metrics for a specific FASTQ ID. +#[derive(Clone, Serialize, Deserialize)] +pub struct SequencingMetrics { + pub fastq_id: String, + pub number_of_reads: usize, + pub unprocessed_reads: usize, + pub q30_barcode: PercentMetric, + pub q30_gem_barcode: Option, + pub q30_probe_barcode: Option, + pub q30_umi: PercentMetric, + pub q30_read1: PercentMetric, + pub q30_read2: Option, +} + +impl From for SequencingMetricsRow { + fn from(value: SequencingMetrics) -> Self { + SequencingMetricsRow { + fastq_id: Some(value.fastq_id), + number_of_reads: Some(value.number_of_reads), + unprocessed_reads: Some(value.unprocessed_reads), + q30_barcode: Some(value.q30_barcode.into()), + q30_gem_barcode: value.q30_gem_barcode.map(Into::into), + q30_probe_barcode: value.q30_probe_barcode.map(Into::into), + q30_umi: Some(value.q30_umi.into()), + q30_read1: Some(value.q30_read1.into()), + q30_read2: value.q30_read2.map(Into::into), + } + } +} + // Shardio file containing BcUmiInfo records, sorted by barcode martian_filetype!(BcUmiInfoShardFile, "bui"); @@ -117,8 +147,9 @@ martian_filetype!(BcListFile, "bcl"); martian_filetype!(_FeatureReferenceFile, "frf"); pub type FeatureReferenceFormat = BinaryFormat<_FeatureReferenceFile, FeatureReference>; +pub type PerLibrarySequencingMetrics = TxHashMap>; + martian_filetype!(_SequencingMetricsFile, "smf"); -pub type SequencingMetricsFormat = - JsonFormat<_SequencingMetricsFile, TxHashMap>; +pub type SequencingMetricsFormat = JsonFormat<_SequencingMetricsFile, PerLibrarySequencingMetrics>; martian_filetype!(SvgFile, "svg"); diff --git a/lib/rust/cr_lib/src/utils.rs b/lib/rust/cr_lib/src/utils.rs index a03e344..07186e2 100644 --- a/lib/rust/cr_lib/src/utils.rs +++ b/lib/rust/cr_lib/src/utils.rs @@ -37,3 +37,30 @@ pub fn hard_link_martianfile>( hard_link_file(&p, &new_link)?; Ok(new_link) } + +pub mod estimate_mem { + use serde_json::Value; + use std::collections::HashMap; + + /// Return the total number of valid barcodes from a metrics JSON. + /// This is computed by the BARCODE_CORRECTION stage as the size of the union + /// set of the barcodes of all library types including barcodes_under_tissue.* + pub fn get_total_barcodes_detected(metrics: &HashMap) -> isize { + metrics + .get("total_barcodes_detected") + .and_then(Value::as_u64) + .unwrap() as isize + } + + /// Return the memory requirement for a data structure given barcode_count, + /// bytes_per_barcode, and offset. + pub fn barcode_mem_gib( + barcodes_count: isize, + bytes_per_barcode: isize, + offset_gib: isize, + ) -> isize { + let mem_bytes = bytes_per_barcode * barcodes_count; + + offset_gib + mem_bytes / 1024 / 1024 / 1024 + } +} diff --git a/lib/rust/cr_types/Cargo.toml b/lib/rust/cr_types/Cargo.toml index 5a36bd8..cba476e 100644 --- a/lib/rust/cr_types/Cargo.toml +++ b/lib/rust/cr_types/Cargo.toml @@ -1,14 +1,7 @@ [dependencies] -bio = '1' -csv = '1' -fxhash = '0.2' -lazy_static = '1' -proc-macro2 = '1' -quote = '1' serde_bytes = '0.11' -serde_with = '2' +serde_with = '3' sha1 = '0.10' -thiserror = '1' [dependencies.anyhow] workspace = true @@ -19,15 +12,27 @@ workspace = true [dependencies.barcode] path = '../barcode' +[dependencies.bio] +workspace = true + +[dependencies.csv] +workspace = true + [dependencies.derive_more] workspace = true [dependencies.fastq_set] workspace = true +[dependencies.fxhash] +workspace = true + [dependencies.itertools] workspace = true +[dependencies.lazy_static] +workspace = true + [dependencies.martian] workspace = true @@ -40,10 +45,14 @@ workspace = true [dependencies.metric] path = '../metric' +[dependencies.proc-macro2] +workspace = true + +[dependencies.quote] +workspace = true + [dependencies.regex] -default-features = false -features = ['std', 'perf'] -version = '1' +workspace = true [dependencies.serde] workspace = true @@ -63,6 +72,9 @@ workspace = true [dependencies.strum_macros] workspace = true +[dependencies.thiserror] +workspace = true + [dependencies.transcriptome] path = '../transcriptome' diff --git a/lib/rust/cr_types/src/barcode_index.rs b/lib/rust/cr_types/src/barcode_index.rs index 8e8e9f2..e6191bb 100644 --- a/lib/rust/cr_types/src/barcode_index.rs +++ b/lib/rust/cr_types/src/barcode_index.rs @@ -24,15 +24,16 @@ impl BarcodeIndex { let barcodes = bc_count_file .read()? .into_values() - .flat_map(|h| h.into_iter().map(|(barcode, _)| barcode)); - Ok(if let Some(json_file) = barcodes_under_tissue { - let additional_barcodes = json_file.read()?; - barcodes - .chain(additional_barcodes.into_iter().map(|x| x.parse().unwrap())) - .collect() - } else { - barcodes.collect() - }) + .flat_map(|h| h.into_iter().map(|(barcode, _)| barcode)) + .chain( + barcodes_under_tissue + .map(martian_filetypes::FileTypeRead::read) + .transpose()? + .unwrap_or_default() + .into_iter() + .map(|x| x.parse().unwrap()), + ); + Ok(barcodes.collect()) } } diff --git a/lib/rust/cr_types/src/cell_annotation.rs b/lib/rust/cr_types/src/cell_annotation.rs new file mode 100644 index 0000000..5d85c25 --- /dev/null +++ b/lib/rust/cr_types/src/cell_annotation.rs @@ -0,0 +1,35 @@ +use anyhow::{Error, Result}; +use serde::Serialize; +use std::str::FromStr; + +#[derive(Clone, Debug, Serialize)] +pub enum CellAnnotationModel { + Auto, + Custom(String), +} + +impl CellAnnotationModel { + /// Converts cell annotation model to ppln inputs + /// CellAnnotationModel::Custom("my model".to_string()) + /// gets mapped to Some("my model".to_string()) + /// CellAnnotationModel::Auto gets mapped to None + pub fn to_pipeline_inputs(&self) -> Option { + if let Self::Custom(model_name) = self { + Some(model_name.clone()) + } else { + None + } + } +} + +impl FromStr for CellAnnotationModel { + type Err = Error; + + fn from_str(s: &str) -> Result { + if s.to_lowercase().trim() == "auto" { + Ok(CellAnnotationModel::Auto) + } else { + Ok(CellAnnotationModel::Custom(s.to_string())) + } + } +} diff --git a/lib/rust/cr_types/src/chemistry/chemistry_defs.rs b/lib/rust/cr_types/src/chemistry/chemistry_defs.rs index 8fc9256..a4f9476 100644 --- a/lib/rust/cr_types/src/chemistry/chemistry_defs.rs +++ b/lib/rust/cr_types/src/chemistry/chemistry_defs.rs @@ -55,7 +55,7 @@ pub fn normalize_chemistry_def(mut def: ChemistryDef) -> Option { // I think this is advantageous because it specifies what you ignore // instead of what you include and is thus resilient to adding fields. def.name = known_def.name; - def.description = known_def.description.clone(); + def.description.clone_from(&known_def.description); def == **known_def }) .exactly_one() diff --git a/lib/rust/cr_types/src/chemistry/mod.rs b/lib/rust/cr_types/src/chemistry/mod.rs index 6919561..c072111 100644 --- a/lib/rust/cr_types/src/chemistry/mod.rs +++ b/lib/rust/cr_types/src/chemistry/mod.rs @@ -60,15 +60,18 @@ pub enum AutoChemistryName { Vdj, } -const THREE_PRIME_AUTO_CHEMS: [ChemistryName; 7] = [ +const THREE_PRIME_AUTO_CHEMS: [ChemistryName; 10] = [ ChemistryName::ThreePrimeV1, ChemistryName::ThreePrimeV2, - ChemistryName::ThreePrimeV3, + ChemistryName::ThreePrimeV3PolyA, + ChemistryName::ThreePrimeV3CS1, // LT is no longer supported, but we retain it here so that we can issue // an accurate error message in DETECT_CHEMISTRY if we detect an LT kit. ChemistryName::ThreePrimeV3LT, - ChemistryName::ThreePrimeV3HT, - ChemistryName::ThreePrimeV4, + ChemistryName::ThreePrimeV3HTPolyA, + ChemistryName::ThreePrimeV3HTCS1, + ChemistryName::ThreePrimeV4PolyA, + ChemistryName::ThreePrimeV4CS1, // ARC is not supported by count, but is included to improve debugging // of reagent mix-ups. ChemistryName::ArcV1, @@ -87,7 +90,7 @@ const VDJ_AUTO_CHEMS: [ChemistryName; 6] = [ ChemistryName::VdjPEV3, ChemistryName::VdjR2V3, ChemistryName::VdjR2FRP, - ChemistryName::ThreePrimeV3, + ChemistryName::ThreePrimeV3PolyA, ]; impl AutoChemistryName { @@ -237,25 +240,33 @@ pub enum ChemistryName { #[serde(rename = "SCVDJ-v3")] #[strum(serialize = "SCVDJ-v3")] VdjPEV3, + #[serde(rename = "SCVDJ-v3-OCM")] + #[strum(serialize = "SCVDJ-v3-OCM")] + VdjPEOCMV3, #[serde(rename = "SCVDJ-Splint-R2-FRP")] #[strum(serialize = "SCVDJ-Splint-R2-FRP")] VdjR2FRP, #[serde(rename = "SCVDJ-R2-v3")] #[strum(serialize = "SCVDJ-R2-v3")] VdjR2V3, + #[serde(rename = "SCVDJ-R2-OCM-v3")] + #[strum(serialize = "SCVDJ-R2-OCM-v3")] + VdjR2OCMV3, #[serde(rename = "SCVDJ-R1")] #[strum(serialize = "SCVDJ-R1")] VdjR1, // Deprecated now, does not have a V2 version + // N.B. OCM was only added for these for internal purposes and + // so only ever added for R2, not R1-only or paired-end. #[serde(rename = "SC5P-R1")] #[strum(serialize = "SC5P-R1")] FivePrimeR1, #[serde(rename = "SC5P-R2")] #[strum(serialize = "SC5P-R2")] FivePrimeR2, - #[serde(rename = "SC5P-R2-OH")] - #[strum(serialize = "SC5P-R2-OH")] - FivePrimeR2OH, + #[serde(rename = "SC5P-R2-OCM")] + #[strum(serialize = "SC5P-R2-OCM")] + FivePrimeR2OCM, #[serde(rename = "SC5PHT")] #[strum(serialize = "SC5PHT")] FivePrimeHT, @@ -266,15 +277,21 @@ pub enum ChemistryName { #[serde(rename = "SC5P-R1-v3")] #[strum(serialize = "SC5P-R1-v3")] FivePrimeR1V3, + #[serde(rename = "SC5P-R1-OCM-v3")] + #[strum(serialize = "SC5P-R1-OCM-v3")] + FivePrimeR1OCMV3, #[serde(rename = "SC5P-R2-v3")] #[strum(serialize = "SC5P-R2-v3")] FivePrimeR2V3, - #[serde(rename = "SC5P-R2-OH-v3")] - #[strum(serialize = "SC5P-R2-OH-v3")] - FivePrimeR2OHV3, + #[serde(rename = "SC5P-R2-OCM-v3")] + #[strum(serialize = "SC5P-R2-OCM-v3")] + FivePrimeR2OCMV3, #[serde(rename = "SC5P-PE-v3")] #[strum(serialize = "SC5P-PE-v3")] FivePrimePEV3, + #[serde(rename = "SC5P-PE-OCM-v3")] + #[strum(serialize = "SC5P-PE-OCM-v3")] + FivePrimePEOCMV3, #[serde(rename = "SC3Pv1")] #[strum(serialize = "SC3Pv1")] @@ -282,24 +299,45 @@ pub enum ChemistryName { #[serde(rename = "SC3Pv2")] #[strum(serialize = "SC3Pv2")] ThreePrimeV2, - #[serde(rename = "SC3Pv3")] - #[strum(serialize = "SC3Pv3")] - ThreePrimeV3, - #[serde(rename = "SC3Pv3-OH")] - #[strum(serialize = "SC3Pv3-OH")] - ThreePrimeV3OH, + + #[serde(rename = "SC3Pv3-polyA")] + #[strum(serialize = "SC3Pv3-polyA")] + ThreePrimeV3PolyA, + #[serde(rename = "SC3Pv3-CS1")] + #[strum(serialize = "SC3Pv3-CS1")] + ThreePrimeV3CS1, + + #[serde(rename = "SC3Pv3-polyA-OCM")] + #[strum(serialize = "SC3Pv3-polyA-OCM")] + ThreePrimeV3PolyAOCM, + #[serde(rename = "SC3Pv3-CS1-OCM")] + #[strum(serialize = "SC3Pv3-CS1-OCM")] + ThreePrimeV3CS1OCM, + #[serde(rename = "SC3Pv3LT")] #[strum(serialize = "SC3Pv3LT")] ThreePrimeV3LT, // deprecated, to be removed - #[serde(rename = "SC3Pv3HT")] - #[strum(serialize = "SC3Pv3HT")] - ThreePrimeV3HT, - #[serde(rename = "SC3Pv4")] - #[strum(serialize = "SC3Pv4")] - ThreePrimeV4, - #[serde(rename = "SC3Pv4-OH")] - #[strum(serialize = "SC3Pv4-OH")] - ThreePrimeV4OH, + + #[serde(rename = "SC3Pv3HT-polyA")] + #[strum(serialize = "SC3Pv3HT-polyA")] + ThreePrimeV3HTPolyA, + #[serde(rename = "SC3Pv3HT-CS1")] + #[strum(serialize = "SC3Pv3HT-CS1")] + ThreePrimeV3HTCS1, + + #[serde(rename = "SC3Pv4-polyA")] + #[strum(serialize = "SC3Pv4-polyA")] + ThreePrimeV4PolyA, + #[serde(rename = "SC3Pv4-CS1")] + #[strum(serialize = "SC3Pv4-CS1")] + ThreePrimeV4CS1, + + #[serde(rename = "SC3Pv4-polyA-OCM")] + #[strum(serialize = "SC3Pv4-polyA-OCM")] + ThreePrimeV4PolyAOCM, + #[serde(rename = "SC3Pv4-CS1-OCM")] + #[strum(serialize = "SC3Pv4-CS1-OCM")] + ThreePrimeV4CS1OCM, #[serde(rename = "SPATIAL3Pv1")] #[strum(serialize = "SPATIAL3Pv1")] @@ -328,6 +366,14 @@ pub enum ChemistryName { #[serde(rename = "ATAC-v1")] #[strum(serialize = "ATAC-v1")] AtacV1, + + #[serde(rename = "SFRP-no-trim-R2")] + #[strum(serialize = "SFRP-no-trim-R2")] + SfrpNoTrimR2, + + #[serde(rename = "MFRP-R1-no-trim-R2")] + #[strum(serialize = "MFRP-R1-no-trim-R2")] + MfrpR1NoTrimR2, } impl ChemistryName { @@ -346,6 +392,7 @@ impl ChemistryName { // FRP chemistries are RTL. SFRP + | SfrpNoTrimR2 | MFRP_RNA | MFRP_Ab | MFRP_47 @@ -354,15 +401,20 @@ impl ChemistryName { | MFRP_Ab_R1 | MFRP_R1_48_uncollapsed | MFRP_Ab_R2pos50 - | MFRP_CRISPR => Some(true), + | MFRP_CRISPR + | MfrpR1NoTrimR2 => Some(true), // All other chemistries are not RTL. // These are explicitly listed for future exhaustiveness checks. FeatureBarcodingOnly | VdjPE | VdjR2 | VdjPEV3 | VdjR2FRP | VdjR2V3 | VdjR1 - | FivePrimeR1 | FivePrimeR2 | FivePrimeR2OH | FivePrimeHT | FivePrimePE - | FivePrimeR1V3 | FivePrimeR2V3 | FivePrimeR2OHV3 | FivePrimePEV3 | ThreePrimeV1 - | ThreePrimeV2 | ThreePrimeV3 | ThreePrimeV3OH | ThreePrimeV3LT | ThreePrimeV3HT - | ThreePrimeV4 | ThreePrimeV4OH | ArcV1 | AtacV1 => Some(false), + | VdjPEOCMV3 | VdjR2OCMV3 | FivePrimeR1 | FivePrimeR2 | FivePrimeR2OCM + | FivePrimeHT | FivePrimePE | FivePrimeR1V3 | FivePrimeR1OCMV3 | FivePrimeR2V3 + | FivePrimeR2OCMV3 | FivePrimePEV3 | FivePrimePEOCMV3 | ThreePrimeV1 | ThreePrimeV2 + | ThreePrimeV3PolyA | ThreePrimeV3CS1 | ThreePrimeV3PolyAOCM | ThreePrimeV3CS1OCM + | ThreePrimeV3LT | ThreePrimeV3HTPolyA | ThreePrimeV3HTCS1 | ThreePrimeV4PolyA + | ThreePrimeV4CS1 | ThreePrimeV4PolyAOCM | ThreePrimeV4CS1OCM | ArcV1 | AtacV1 => { + Some(false) + } } } @@ -371,6 +423,67 @@ impl ChemistryName { self.is_rtl().unwrap_or(false) && self != &ChemistryName::SFRP } + /// Return true if a this is an SFRP chemistry. + pub fn is_sfrp(&self) -> bool { + #[allow(clippy::enum_glob_use)] + use ChemistryName::*; + match self { + SFRP | SfrpNoTrimR2 => true, + MFRP_RNA + | MFRP_Ab + | MFRP_47 + | MFRP_uncollapsed + | MFRP_RNA_R1 + | MFRP_Ab_R1 + | MFRP_R1_48_uncollapsed + | MFRP_Ab_R2pos50 + | MFRP_CRISPR + | MfrpR1NoTrimR2 + | Custom + | FeatureBarcodingOnly + | VdjPE + | VdjR2 + | VdjPEV3 + | VdjR2FRP + | VdjR2V3 + | VdjR1 + | VdjPEOCMV3 + | VdjR2OCMV3 + | FivePrimeR1 + | FivePrimeR2 + | FivePrimeR2OCM + | FivePrimeHT + | FivePrimePE + | FivePrimeR1V3 + | FivePrimeR1OCMV3 + | FivePrimeR2V3 + | FivePrimeR2OCMV3 + | FivePrimePEV3 + | FivePrimePEOCMV3 + | ThreePrimeV1 + | ThreePrimeV2 + | ThreePrimeV3PolyA + | ThreePrimeV3CS1 + | ThreePrimeV3PolyAOCM + | ThreePrimeV3CS1OCM + | ThreePrimeV3LT + | ThreePrimeV3HTPolyA + | ThreePrimeV3HTCS1 + | ThreePrimeV4PolyA + | ThreePrimeV4CS1 + | ThreePrimeV4PolyAOCM + | ThreePrimeV4CS1OCM + | SpatialThreePrimeV1 + | SpatialThreePrimeV2 + | SpatialThreePrimeV3 + | SpatialThreePrimeV4 + | SpatialThreePrimeV5 + | SpatialHdV1 + | ArcV1 + | AtacV1 => false, + } + } + /// Return true if this is an MFRP chemistry. pub fn is_mfrp(&self) -> bool { #[allow(clippy::enum_glob_use)] @@ -384,31 +497,222 @@ impl ChemistryName { | MFRP_Ab_R1 | MFRP_R1_48_uncollapsed | MFRP_Ab_R2pos50 - | MFRP_CRISPR => true, + | MFRP_CRISPR + | MfrpR1NoTrimR2 => true, Custom | SFRP | FeatureBarcodingOnly | VdjPE | VdjR2 | VdjPEV3 | VdjR2FRP | VdjR2V3 - | VdjR1 | FivePrimeR1 | FivePrimeR2 | FivePrimeR2OH | FivePrimeHT | FivePrimePE - | FivePrimeR1V3 | FivePrimeR2V3 | FivePrimeR2OHV3 | FivePrimePEV3 | ThreePrimeV1 - | ThreePrimeV2 | ThreePrimeV3 | ThreePrimeV3OH | ThreePrimeV3LT | ThreePrimeV3HT - | ThreePrimeV4 | ThreePrimeV4OH | SpatialThreePrimeV1 | SpatialThreePrimeV2 - | SpatialThreePrimeV3 | SpatialThreePrimeV4 | SpatialThreePrimeV5 | SpatialHdV1 - | ArcV1 | AtacV1 => false, + | VdjR1 | VdjPEOCMV3 | VdjR2OCMV3 | FivePrimeR1 | FivePrimeR2 | FivePrimeR2OCM + | FivePrimeHT | FivePrimePE | FivePrimeR1V3 | FivePrimeR1OCMV3 | FivePrimeR2V3 + | FivePrimeR2OCMV3 | FivePrimePEV3 | FivePrimePEOCMV3 | ThreePrimeV1 | ThreePrimeV2 + | ThreePrimeV3PolyA | ThreePrimeV3CS1 | ThreePrimeV3PolyAOCM | ThreePrimeV3CS1OCM + | ThreePrimeV3LT | ThreePrimeV3HTPolyA | ThreePrimeV3HTCS1 | ThreePrimeV4PolyA + | ThreePrimeV4CS1 | ThreePrimeV4PolyAOCM | ThreePrimeV4CS1OCM | SpatialThreePrimeV1 + | SpatialThreePrimeV2 | SpatialThreePrimeV3 | SpatialThreePrimeV4 + | SpatialThreePrimeV5 | SpatialHdV1 | ArcV1 | AtacV1 | SfrpNoTrimR2 => false, + } + } + + /// Return true if this is a single-cell 3' v3 chemistry. + pub fn is_sc_3p_v3(&self) -> bool { + #[allow(clippy::enum_glob_use)] + use ChemistryName::*; + match self { + ThreePrimeV3PolyA | ThreePrimeV3CS1 | ThreePrimeV3PolyAOCM | ThreePrimeV3CS1OCM + | ThreePrimeV3LT | ThreePrimeV3HTPolyA | ThreePrimeV3HTCS1 => true, + Custom + | SFRP + | SfrpNoTrimR2 + | MFRP_RNA + | MFRP_Ab + | MFRP_47 + | MFRP_uncollapsed + | MFRP_RNA_R1 + | MFRP_Ab_R1 + | MFRP_R1_48_uncollapsed + | MFRP_Ab_R2pos50 + | MFRP_CRISPR + | MfrpR1NoTrimR2 + | FeatureBarcodingOnly + | VdjPE + | VdjR2 + | VdjPEV3 + | VdjR2FRP + | VdjR2V3 + | VdjR1 + | VdjPEOCMV3 + | VdjR2OCMV3 + | FivePrimeR1 + | FivePrimeR2 + | FivePrimeR2OCM + | FivePrimeHT + | FivePrimePE + | FivePrimeR1V3 + | FivePrimeR1OCMV3 + | FivePrimeR2V3 + | FivePrimeR2OCMV3 + | FivePrimePEV3 + | FivePrimePEOCMV3 + | ThreePrimeV1 + | ThreePrimeV2 + | ThreePrimeV4PolyA + | ThreePrimeV4CS1 + | ThreePrimeV4PolyAOCM + | ThreePrimeV4CS1OCM + | SpatialThreePrimeV1 + | SpatialThreePrimeV2 + | SpatialThreePrimeV3 + | SpatialThreePrimeV4 + | SpatialThreePrimeV5 + | SpatialHdV1 + | ArcV1 + | AtacV1 => false, + } + } + + /// Return true if this is a single-cell 3' v4 (GEM-X) chemistry. + pub fn is_sc_3p_v4(&self) -> bool { + #[allow(clippy::enum_glob_use)] + use ChemistryName::*; + match self { + ThreePrimeV4PolyA | ThreePrimeV4CS1 | ThreePrimeV4PolyAOCM | ThreePrimeV4CS1OCM => true, + Custom + | SFRP + | SfrpNoTrimR2 + | MFRP_RNA + | MFRP_Ab + | MFRP_47 + | MFRP_uncollapsed + | MFRP_RNA_R1 + | MFRP_Ab_R1 + | MFRP_R1_48_uncollapsed + | MFRP_Ab_R2pos50 + | MFRP_CRISPR + | MfrpR1NoTrimR2 + | FeatureBarcodingOnly + | VdjPE + | VdjR2 + | VdjPEV3 + | VdjR2FRP + | VdjR2V3 + | VdjR1 + | VdjPEOCMV3 + | VdjR2OCMV3 + | FivePrimeR1 + | FivePrimeR2 + | FivePrimeR2OCM + | FivePrimeHT + | FivePrimePE + | FivePrimeR1V3 + | FivePrimeR1OCMV3 + | FivePrimeR2V3 + | FivePrimeR2OCMV3 + | FivePrimePEV3 + | FivePrimePEOCMV3 + | ThreePrimeV1 + | ThreePrimeV2 + | ThreePrimeV3PolyA + | ThreePrimeV3CS1 + | ThreePrimeV3PolyAOCM + | ThreePrimeV3CS1OCM + | ThreePrimeV3LT + | ThreePrimeV3HTPolyA + | ThreePrimeV3HTCS1 + | SpatialThreePrimeV1 + | SpatialThreePrimeV2 + | SpatialThreePrimeV3 + | SpatialThreePrimeV4 + | SpatialThreePrimeV5 + | SpatialHdV1 + | ArcV1 + | AtacV1 => false, + } + } + + /// Return true if this is a single-cell 5' v3 (GEM-X) chemistry. + pub fn is_sc_5p_v3(&self) -> bool { + #[allow(clippy::enum_glob_use)] + use ChemistryName::*; + match self { + FivePrimeR1V3 | FivePrimeR1OCMV3 | FivePrimeR2V3 | FivePrimeR2OCMV3 | FivePrimePEV3 + | FivePrimePEOCMV3 => true, + Custom + | SFRP + | SfrpNoTrimR2 + | MFRP_RNA + | MFRP_Ab + | MFRP_47 + | MFRP_uncollapsed + | MFRP_RNA_R1 + | MFRP_Ab_R1 + | MFRP_R1_48_uncollapsed + | MFRP_Ab_R2pos50 + | MFRP_CRISPR + | MfrpR1NoTrimR2 + | FeatureBarcodingOnly + | VdjPE + | VdjR2 + | VdjPEV3 + | VdjR2FRP + | VdjR2V3 + | VdjR1 + | VdjPEOCMV3 + | VdjR2OCMV3 + | FivePrimeR1 + | FivePrimeR2 + | FivePrimeR2OCM + | FivePrimeHT + | FivePrimePE + | ThreePrimeV1 + | ThreePrimeV2 + | ThreePrimeV3PolyA + | ThreePrimeV3CS1 + | ThreePrimeV3PolyAOCM + | ThreePrimeV3CS1OCM + | ThreePrimeV3LT + | ThreePrimeV3HTPolyA + | ThreePrimeV3HTCS1 + | ThreePrimeV4PolyA + | ThreePrimeV4CS1 + | ThreePrimeV4PolyAOCM + | ThreePrimeV4CS1OCM + | SpatialThreePrimeV1 + | SpatialThreePrimeV2 + | SpatialThreePrimeV3 + | SpatialThreePrimeV4 + | SpatialThreePrimeV5 + | SpatialHdV1 + | ArcV1 + | AtacV1 => false, } } /// Return true if this chemistry is compatible with the provided library type. - /// NOTE: this method is currently only used for Flex, and the full implementation - /// would be verbose. This can be expanded in the future if other products + /// NOTE: this method is currently only used for Flex, SC3Pv3, and SC3Pv4. + /// The full implementation would be verbose. + /// + /// This can be expanded in the future if other products /// need to answer this question. pub fn compatible_with_library_type(&self, library_type: LibraryType) -> bool { - assert!(self.is_mfrp() || *self == SFRP); + assert!(self.is_mfrp() || self.is_sfrp() || self.is_sc_3p_v3() || self.is_sc_3p_v4()); #[allow(clippy::enum_glob_use)] use ChemistryName::*; match library_type { LibraryType::Gex => matches!( self, - SFRP | MFRP_RNA | MFRP_47 | MFRP_uncollapsed | MFRP_RNA_R1 | MFRP_R1_48_uncollapsed + SFRP | SfrpNoTrimR2 + | MFRP_RNA + | MFRP_47 + | MFRP_uncollapsed + | MFRP_RNA_R1 + | MFRP_R1_48_uncollapsed + | MfrpR1NoTrimR2 + | ThreePrimeV3PolyA + | ThreePrimeV3PolyAOCM + | ThreePrimeV3HTPolyA + | ThreePrimeV4PolyA + | ThreePrimeV4PolyAOCM + | ThreePrimeV3LT ), - LibraryType::Antibody => matches!( + LibraryType::Antibody | LibraryType::Custom => matches!( self, SFRP | MFRP_Ab | MFRP_47 @@ -416,12 +720,43 @@ impl ChemistryName { | MFRP_Ab_R1 | MFRP_R1_48_uncollapsed | MFRP_Ab_R2pos50 + | ThreePrimeV3PolyA + | ThreePrimeV3CS1 + | ThreePrimeV3PolyAOCM + | ThreePrimeV3CS1OCM + | ThreePrimeV3HTPolyA + | ThreePrimeV3HTCS1 + | ThreePrimeV4PolyA + | ThreePrimeV4PolyAOCM + | ThreePrimeV4CS1 + | ThreePrimeV4CS1OCM + | ThreePrimeV3LT ), LibraryType::Crispr => matches!( self, - SFRP | MFRP_47 | MFRP_uncollapsed | MFRP_R1_48_uncollapsed | MFRP_CRISPR + SFRP | MFRP_47 + | MFRP_uncollapsed + | MFRP_R1_48_uncollapsed + | MFRP_CRISPR + | ThreePrimeV3PolyA + | ThreePrimeV3CS1 + | ThreePrimeV3PolyAOCM + | ThreePrimeV3CS1OCM + | ThreePrimeV3HTPolyA + | ThreePrimeV3HTCS1 + | ThreePrimeV3LT ), - _ => panic!("the library type {library_type} is not supported by Flex"), + LibraryType::Cellplex => matches!( + self, + ThreePrimeV3CS1 + | ThreePrimeV3CS1OCM + | ThreePrimeV3HTCS1 + | ThreePrimeV4CS1 + | ThreePrimeV4CS1OCM + ), + _ => { + panic!("The library type {library_type} is not supported by the chemistry {self}.") + } } } @@ -472,10 +807,16 @@ impl ChemistryName { #[allow(clippy::enum_glob_use)] use ChemistryName::*; match self { - ThreePrimeV3 => Ok(ThreePrimeV3OH), - ThreePrimeV4 => Ok(ThreePrimeV4OH), - FivePrimeR2 => Ok(FivePrimeR2OH), - FivePrimeR2V3 => Ok(FivePrimeR2OHV3), + ThreePrimeV3PolyA => Ok(ThreePrimeV3PolyAOCM), + ThreePrimeV3CS1 => Ok(ThreePrimeV3CS1OCM), + ThreePrimeV4PolyA => Ok(ThreePrimeV4PolyAOCM), + ThreePrimeV4CS1 => Ok(ThreePrimeV4CS1OCM), + FivePrimeR1V3 => Ok(FivePrimeR1OCMV3), + FivePrimeR2 => Ok(FivePrimeR2OCM), + FivePrimeR2V3 => Ok(FivePrimeR2OCMV3), + FivePrimePEV3 => Ok(FivePrimePEOCMV3), + VdjPEV3 => Ok(VdjPEOCMV3), + VdjR2V3 => Ok(VdjR2OCMV3), _ => bail!("Overhang chemistry undefined for {self}"), } @@ -487,7 +828,15 @@ impl ChemistryName { use ChemistryName::*; matches!( self, - VdjPE | VdjR1 | VdjR2 | VdjPEV3 | VdjR2V3 | VdjR2FRP | ThreePrimeV3 + VdjPE + | VdjR1 + | VdjR2 + | VdjPEV3 + | VdjR2V3 + | VdjR2FRP + | ThreePrimeV3PolyA + | VdjPEOCMV3 + | VdjR2OCMV3 ) } } @@ -599,11 +948,13 @@ impl ChemistryName { match self { // standard 'modern' chemistries - ThreePrimeV2 | ThreePrimeV3 | ThreePrimeV3OH | ThreePrimeV3LT | ThreePrimeV3HT - | ThreePrimeV4 | ThreePrimeV4OH | SpatialThreePrimeV1 | SpatialThreePrimeV2 - | SpatialThreePrimeV3 | SpatialThreePrimeV4 | SpatialThreePrimeV5 | FivePrimeR2 - | FivePrimeR2OH | FivePrimeHT | FivePrimeR2V3 | FivePrimeR2OHV3 - | FeatureBarcodingOnly | SFRP | ArcV1 => &[ + ThreePrimeV2 | ThreePrimeV3PolyA | ThreePrimeV3CS1 | ThreePrimeV3PolyAOCM + | ThreePrimeV3CS1OCM | ThreePrimeV3LT | ThreePrimeV3HTPolyA | ThreePrimeV3HTCS1 + | ThreePrimeV4PolyA | ThreePrimeV4CS1 | ThreePrimeV4PolyAOCM | ThreePrimeV4CS1OCM + | SpatialThreePrimeV1 | SpatialThreePrimeV2 | SpatialThreePrimeV3 + | SpatialThreePrimeV4 | SpatialThreePrimeV5 | FivePrimeR2 | FivePrimeR2OCM + | FivePrimeHT | FivePrimeR2V3 | FivePrimeR2OCMV3 | FeatureBarcodingOnly | SFRP + | SfrpNoTrimR2 | ArcV1 => &[ "10x_bam_to_fastq:R1(CR:CY,UR:UY)", "10x_bam_to_fastq:R2(SEQ:QUAL)", ], @@ -617,7 +968,8 @@ impl ChemistryName { | MFRP_Ab_R1 | MFRP_R1_48_uncollapsed | MFRP_Ab_R2pos50 - | MFRP_CRISPR => &[ + | MFRP_CRISPR + | MfrpR1NoTrimR2 => &[ "10x_bam_to_fastq:R1(GR:GY,UR:UY,1R:1Y)", "10x_bam_to_fastq:R2(SEQ:QUAL,2R:2Y)", ], @@ -631,16 +983,16 @@ impl ChemistryName { // VDJ chemistry should not be coming through here - may need changing if // we decide to make bamtofastq compatible BAMs from VDJ in the future. - VdjR1 | VdjR2 | VdjPE | VdjR2V3 | VdjPEV3 | VdjR2FRP => { + VdjR1 | VdjR2 | VdjPE | VdjR2V3 | VdjPEV3 | VdjR2FRP | VdjPEOCMV3 | VdjR2OCMV3 => { panic!("VDJ don't yet make a normal BAM file") } // this chemistry supported for customers & bamtofastq doesn't work, so don't emit any // bamtofastq headers - FivePrimeR1 | FivePrimeR1V3 => &[], + FivePrimeR1 | FivePrimeR1V3 | FivePrimeR1OCMV3 => &[], // 5' PE chem - FivePrimePE | FivePrimePEV3 => &[ + FivePrimePE | FivePrimePEV3 | FivePrimePEOCMV3 => &[ "10x_bam_to_fastq:R1(CR:CY,UR:UY,SEQ:QUAL)", "10x_bam_to_fastq:R2(SEQ:QUAL)", ], @@ -727,7 +1079,7 @@ pub(crate) enum BarcodeKind { LeftProbe, RightProbe, SpotSegment, - // To enable OH multiplexing + // To enable OCM multiplexing Overhang, } @@ -781,7 +1133,7 @@ impl BarcodeReadComponent { translate_to: &WhitelistSource, path: PathBuf, ) -> Result<()> { - let source = self.whitelist.as_source(true)?; + let source = self.whitelist.as_source()?; let mut file = BufWriter::new(File::create(&path)?); for row in source.create_translation_from_id_map(id_map, translate_to)? { writeln!(file, "{}\t{}\t{}", row.0, row.1, row.2)?; @@ -795,7 +1147,7 @@ impl BarcodeReadComponent { /// For a translated whitelist build a sequence to id map pub fn build_seq_to_id_map(&self) -> Result> { - self.whitelist().as_source(true)?.as_translation_seq_to_id() + self.whitelist().as_source()?.as_translation_seq_to_id() } } @@ -891,64 +1243,64 @@ impl AsMartianPrimaryType for BarcodeExtraction { /// The corresponding chemistry definition would be: /// /// - Barcode is present in the first 16 bases of Read 1. -/// This translates to a `read_type` "R1", `read_offset` 0 -/// and `read_length` 16. Valid options for `read_type` are -/// "R1", "R2", "I1", "I2" -/// ``` text -/// { -/// "barcode_read_length": 16, -/// "barcode_read_offset": 0, -/// "barcode_read_type": "R1", -/// "barcode_whitelist": "737K-august-2016", -/// ``` +/// This translates to a `read_type` "R1", `read_offset` 0 +/// and `read_length` 16. Valid options for `read_type` are +/// "R1", "R2", "I1", "I2" +/// ``` text +/// { +/// "barcode_read_length": 16, +/// "barcode_read_offset": 0, +/// "barcode_read_type": "R1", +/// "barcode_whitelist": "737K-august-2016", +/// ``` /// - Description and name for the chemistry -/// ``` text -/// "description": "Single Cell V(D)J", -/// "name": "SCVDJ", -/// ``` +/// ``` text +/// "description": "Single Cell V(D)J", +/// "name": "SCVDJ", +/// ``` /// - Specify the `endedness` of the product. This would be `three_prime` for Single Cell -/// 3' Gene expression and `five_prime` for VDJ and 5' Gene expression -/// ``` text -/// "endedness": "five_prime", -/// ``` +/// 3' Gene expression and `five_prime` for VDJ and 5' Gene expression +/// ``` text +/// "endedness": "five_prime", +/// ``` /// - Every RNA product will have cDNA sequences in -/// one or both of read1 and read2. Hence an `rna_read` -/// definition is necessary for each chemistry. `rna_read2` -/// is optional. For V(D)J, `rna_read` would be the bases in read1 -/// beyond the spacer sequence and `rna_read2` would be all the -/// bases in read2. It is not necessary that `rna_read` correspond to -/// read1. For example, in Single Cell 5' R2-only mode, `rna_read` -/// would be all of read2 and `rna_read2` would be empty. -/// ``` text -/// "rna": { -/// "length": null, -/// "offset": 41, -/// "read_type": "R1", -/// } -/// ``` +/// one or both of read1 and read2. Hence an `rna_read` +/// definition is necessary for each chemistry. `rna_read2` +/// is optional. For V(D)J, `rna_read` would be the bases in read1 +/// beyond the spacer sequence and `rna_read2` would be all the +/// bases in read2. It is not necessary that `rna_read` correspond to +/// read1. For example, in Single Cell 5' R2-only mode, `rna_read` +/// would be all of read2 and `rna_read2` would be empty. +/// ``` text +/// "rna": { +/// "length": null, +/// "offset": 41, +/// "read_type": "R1", +/// } +/// ``` /// - Optionally specify `rna_read2` -/// ``` text -/// "rna2": { -/// "length": null, -/// "offset": 0, -/// "read_type": "R2", -/// } -/// ``` +/// ``` text +/// "rna2": { +/// "length": null, +/// "offset": 0, +/// "read_type": "R2", +/// } +/// ``` /// - Strandedness is `+` when the rna_read and the transcript are -/// expected to be in the same orientation and `-` otherwise. -/// ``` text -/// "strandedness": "+", -/// ``` +/// expected to be in the same orientation and `-` otherwise. +/// ``` text +/// "strandedness": "+", +/// ``` /// - UMI is present in the bases 16-25 of read1 -/// ``` text -/// "umi": { -/// "length": 10, -/// "min_length": null, -/// "offset": 16, -/// "read_type": "R1" -/// } -/// } -/// ``` +/// ``` text +/// "umi": { +/// "length": 10, +/// "min_length": null, +/// "offset": 16, +/// "read_type": "R1" +/// } +/// } +/// ``` #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug, MartianStruct)] #[serde(deny_unknown_fields)] pub struct ChemistryDef { @@ -1110,6 +1462,9 @@ pub trait ChemistryDefsExt { /// Return the endedness of this chemistry. fn endedness(&self) -> Option; + + /// Convert `self` to a `Value`. + fn to_value(&self) -> Value; } impl ChemistryDefsExt for ChemistryDefs { @@ -1170,6 +1525,11 @@ impl ChemistryDefsExt for ChemistryDefs { .at_most_one() .unwrap() } + + /// Convert `self` to a `Value`. + fn to_value(&self) -> Value { + serde_json::to_value(self).unwrap() + } } #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug, MartianType)] @@ -1211,6 +1571,16 @@ impl IndexScheme { let strandedness = self.read_defs.strand; let endedness = self.read_defs.endedness; + // FIXME: CELLRANGER-8653 this is not a good long-term solution. + // Better would be to allow searching for a whitelist in either the + // regular or translation locations, and determine which is which based + // on that. This would require ensuring that whitelists in each location + // do not have naming collisions. + let translation = matches!( + barcode_whitelist, + "3M-3pgex-may-2023_NXT" | "3M-february-2018_NXT" + ); + let gel_bead_barcode = BarcodeReadComponent { read_type: self.read_defs.barcode_read_type, kind: BarcodeKind::GelBead, @@ -1218,6 +1588,7 @@ impl IndexScheme { length: self.read_defs.barcode_read_length, whitelist: WhitelistSpec::TxtFile { name: barcode_whitelist.into(), + translation, }, }; @@ -1232,6 +1603,7 @@ impl IndexScheme { length: self.read_defs.right_probe_barcode_read_length.unwrap(), whitelist: WhitelistSpec::TxtFile { name: right_probe_barcode_whitelist, + translation: true, }, }) } else { @@ -1284,6 +1656,7 @@ impl IndexScheme { #[cfg(test)] mod tests { use super::*; + use insta::assert_json_snapshot; use strum::IntoEnumIterator; #[test] @@ -1385,7 +1758,8 @@ mod tests { assert_eq!( barcode.whitelist, WhitelistSpec::TxtFile { - name: "737k-whitelist".into() + name: "737k-whitelist".into(), + translation: false, } ); } @@ -1396,7 +1770,8 @@ mod tests { assert_eq!( barcode.whitelist, WhitelistSpec::TxtFile { - name: "probe-barcodes-whitelist".into() + name: "probe-barcodes-whitelist".into(), + translation: true, } ); } @@ -1440,8 +1815,8 @@ mod tests { Auto(AutoChemistryName::ThreePrime) ); assert_eq!( - serde_json::from_str::(r#""SC3Pv3""#).unwrap(), - Refined(ChemistryName::ThreePrimeV3) + serde_json::from_str::(r#""SC3Pv3-polyA""#).unwrap(), + Refined(ChemistryName::ThreePrimeV3PolyA) ); } @@ -1473,7 +1848,7 @@ mod tests { fn test_min_read_length() { use ChemistryName::{ FivePrimeHT, FivePrimePE, FivePrimeR1, FivePrimeR2, ThreePrimeV1, ThreePrimeV2, - ThreePrimeV3, ThreePrimeV3HT, ThreePrimeV3LT, VdjPE, VdjR2, + ThreePrimeV3HTPolyA, ThreePrimeV3LT, ThreePrimeV3PolyA, VdjPE, VdjR2, }; use WhichRead::{I1, R1, R2}; assert_eq!(ChemistryDef::named(ThreePrimeV1).min_read_length(I1), 14); @@ -1483,14 +1858,26 @@ mod tests { assert_eq!(ChemistryDef::named(ThreePrimeV2).min_read_length(R1), 26); assert_eq!(ChemistryDef::named(ThreePrimeV2).min_read_length(R2), 25); - assert_eq!(ChemistryDef::named(ThreePrimeV3).min_read_length(R1), 26); - assert_eq!(ChemistryDef::named(ThreePrimeV3).min_read_length(R2), 25); + assert_eq!( + ChemistryDef::named(ThreePrimeV3PolyA).min_read_length(R1), + 26 + ); + assert_eq!( + ChemistryDef::named(ThreePrimeV3PolyA).min_read_length(R2), + 25 + ); assert_eq!(ChemistryDef::named(ThreePrimeV3LT).min_read_length(R1), 26); assert_eq!(ChemistryDef::named(ThreePrimeV3LT).min_read_length(R2), 25); - assert_eq!(ChemistryDef::named(ThreePrimeV3HT).min_read_length(R1), 26); - assert_eq!(ChemistryDef::named(ThreePrimeV3HT).min_read_length(R2), 25); + assert_eq!( + ChemistryDef::named(ThreePrimeV3HTPolyA).min_read_length(R1), + 26 + ); + assert_eq!( + ChemistryDef::named(ThreePrimeV3HTPolyA).min_read_length(R2), + 25 + ); assert_eq!(ChemistryDef::named(FivePrimeR1).min_read_length(R1), 66); assert_eq!(ChemistryDef::named(FivePrimeR1).min_read_length(R2), 0); @@ -1513,8 +1900,8 @@ mod tests { #[test] fn test_chem_json_report() { - insta::assert_json_snapshot!( - ChemistryDef::named(ChemistryName::ThreePrimeV3).to_json_reporter() + assert_json_snapshot!( + ChemistryDef::named(ChemistryName::ThreePrimeV3PolyA).to_json_reporter() ); } @@ -1527,6 +1914,7 @@ mod tests { length: 16, whitelist: WhitelistSpec::TxtFile { name: "737K-august-2016".to_string(), + translation: false, }, }]; assert_eq!( @@ -1545,6 +1933,7 @@ mod tests { length: 16, whitelist: WhitelistSpec::TxtFile { name: "737K-august-2016".to_string(), + translation: false, }, }, BarcodeReadComponent { @@ -1554,6 +1943,7 @@ mod tests { length: 8, whitelist: WhitelistSpec::TxtFile { name: "turtle-scheme1a-right".to_string(), + translation: true, }, }, ]; @@ -1574,6 +1964,7 @@ mod tests { length: 16, whitelist: WhitelistSpec::TxtFile { name: "737K-august-2016".to_string(), + translation: false, }, }, BarcodeReadComponent { @@ -1583,6 +1974,7 @@ mod tests { length: 8, whitelist: WhitelistSpec::TxtFile { name: "turtle-scheme1a-left".to_string(), + translation: true, }, }, BarcodeReadComponent { @@ -1592,6 +1984,7 @@ mod tests { length: 8, whitelist: WhitelistSpec::TxtFile { name: "turtle-scheme1a-right".to_string(), + translation: true, }, }, ]; @@ -1608,6 +2001,7 @@ mod tests { length: 7, whitelist: WhitelistSpec::TxtFile { name: "omni-part1.txt".to_string(), + translation: false, }, }, BarcodeReadComponent { @@ -1617,6 +2011,7 @@ mod tests { length: 7, whitelist: WhitelistSpec::TxtFile { name: "omni-part2.txt".to_string(), + translation: false, }, }, BarcodeReadComponent { @@ -1626,6 +2021,7 @@ mod tests { length: 7, whitelist: WhitelistSpec::TxtFile { name: "omni-part3.txt".to_string(), + translation: false, }, }, BarcodeReadComponent { @@ -1635,6 +2031,7 @@ mod tests { length: 7, whitelist: WhitelistSpec::TxtFile { name: "omni-part4.txt".to_string(), + translation: false, }, }, ]; @@ -1678,6 +2075,7 @@ mod tests { length: 16, whitelist: WhitelistSpec::TxtFile { name: "737K-august-2016".to_string(), + translation: false, }, }, BarcodeReadComponent { @@ -1687,6 +2085,7 @@ mod tests { length: 16, whitelist: WhitelistSpec::TxtFile { name: "737K-august-2016".to_string(), + translation: false, }, }, ]; @@ -1704,6 +2103,7 @@ mod tests { length: 16, whitelist: WhitelistSpec::TxtFile { name: "turtle-scheme1-right".to_string(), + translation: true, }, }, BarcodeReadComponent { @@ -1713,6 +2113,7 @@ mod tests { length: 16, whitelist: WhitelistSpec::TxtFile { name: "turtle-scheme1-right".to_string(), + translation: true, }, }, ]; @@ -1724,12 +2125,41 @@ mod tests { assert_eq!( serde_json::from_str::( r#"{ - "name": "3M-february-2018" + "name": "3M-february-2018_TRU" + }"#, + ) + .unwrap(), + WhitelistSpec::TxtFile { + name: "3M-february-2018_TRU".into(), + translation: false, + } + ); + + assert_eq!( + serde_json::from_str::( + r#"{ + "name": "3M-february-2018_TRU", + "translation": false + }"#, + ) + .unwrap(), + WhitelistSpec::TxtFile { + name: "3M-february-2018_TRU".into(), + translation: false, + } + ); + + assert_eq!( + serde_json::from_str::( + r#"{ + "name": "3M-february-2018_TRU", + "translation": true }"#, ) .unwrap(), WhitelistSpec::TxtFile { - name: "3M-february-2018".into(), + name: "3M-february-2018_TRU".into(), + translation: true, } ); diff --git a/lib/rust/cr_types/src/clonotype.rs b/lib/rust/cr_types/src/clonotype.rs index 8f46071..e1a2911 100644 --- a/lib/rust/cr_types/src/clonotype.rs +++ b/lib/rust/cr_types/src/clonotype.rs @@ -1,43 +1,51 @@ -pub const CLONOTYPE_PREFIX: &str = "clonotype"; -pub const SAMPLE_PREFIX: &str = "sample"; -pub const CONSENSUS_PREFIX: &str = "consensus"; -pub const CONCAT_REF: &str = "concat_ref"; +use anyhow::{Context, Result}; -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct ClonotypeId { +const CLONOTYPE_PREFIX: &str = "clonotype"; +const CONSENSUS_PREFIX: &str = "consensus"; +const CONCAT_REF: &str = "concat_ref"; + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct ClonotypeId<'a> { pub id: usize, - pub sample_number: Option, + pub sample_id: Option<&'a str>, +} + +impl<'a> ClonotypeId<'a> { + /// Parse the provided string as a ClonotypeId. + pub fn parse(s: &'a str) -> Result { + Ok( + if let Some((sample_id, clonotype_num)) = s.rsplit_once('_') { + ClonotypeId { + id: parse_clonotype_number(clonotype_num)?, + sample_id: Some(sample_id), + } + } else { + ClonotypeId { + id: parse_clonotype_number(s)?, + sample_id: None, + } + }, + ) + } } -impl std::fmt::Display for ClonotypeId { +impl<'a> std::fmt::Display for ClonotypeId<'a> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(sample_number) = self.sample_number { - write!(f, "{SAMPLE_PREFIX}{sample_number}_")?; + if let Some(sample_id) = self.sample_id { + write!(f, "{sample_id}_")?; } write!(f, "{CLONOTYPE_PREFIX}{}", self.id) } } -impl std::str::FromStr for ClonotypeId { - type Err = anyhow::Error; - - fn from_str(s: &str) -> Result { - let (left, right) = if s.starts_with(CLONOTYPE_PREFIX) { - (None, s) - } else if s.starts_with(SAMPLE_PREFIX) { - let (left, right) = s.split_once('_').unwrap(); - (Some(left), right) - } else { - anyhow::bail!("Invalid clonotype id: {}", s); - }; - Ok(ClonotypeId { - id: right[CLONOTYPE_PREFIX.len()..].parse()?, - sample_number: left.map(|s| s[SAMPLE_PREFIX.len()..].parse()).transpose()?, - }) - } +/// Parse the number from a string that looks like clonotype123. +fn parse_clonotype_number(s: &str) -> Result { + s[CLONOTYPE_PREFIX.len()..] + .parse() + .with_context(|| format!("invalid clonotype number: \"{s}\"")) } -impl ClonotypeId { +impl<'a> ClonotypeId<'a> { pub fn consensus_name(&self, consensus_index: usize) -> String { format!("{self}_{CONSENSUS_PREFIX}_{consensus_index}") } @@ -54,14 +62,14 @@ mod tests { fn test_clonotype_id() { let clonotype_id = ClonotypeId { id: 1, - sample_number: None, + sample_id: None, }; assert_eq!(clonotype_id.to_string(), "clonotype1"); assert_eq!( - "clonotype1".parse::().unwrap(), + ClonotypeId::parse("clonotype1").unwrap(), ClonotypeId { id: 1, - sample_number: None + sample_id: None } ); assert_eq!(clonotype_id.consensus_name(2), "clonotype1_consensus_2"); @@ -72,37 +80,37 @@ mod tests { fn test_clonotype_id_with_sample() { let clonotype_id = ClonotypeId { id: 1, - sample_number: Some(3), + sample_id: Some("test_sample"), }; - assert_eq!(clonotype_id.to_string(), "sample3_clonotype1"); + assert_eq!(clonotype_id.to_string(), "test_sample_clonotype1"); assert_eq!( - "sample2_clonotype1".parse::().unwrap(), + ClonotypeId::parse("test_sample_clonotype1").unwrap(), ClonotypeId { id: 1, - sample_number: Some(2) + sample_id: Some("test_sample") } ); assert_eq!( clonotype_id.consensus_name(2), - "sample3_clonotype1_consensus_2" + "test_sample_clonotype1_consensus_2" ); assert_eq!( clonotype_id.concat_ref_name(3), - "sample3_clonotype1_concat_ref_3" + "test_sample_clonotype1_concat_ref_3" ); } proptest::proptest! { #[test] fn test_clonotype_id_roundtrip(id in 0..1_000_000usize) { - let clonotype_id = ClonotypeId { id, sample_number: None }; - assert_eq!(clonotype_id.to_string().parse::().unwrap(), clonotype_id); + let clonotype_id = ClonotypeId { id, sample_id: None }; + assert_eq!(ClonotypeId::parse(&clonotype_id.to_string()).unwrap(), clonotype_id); } #[test] - fn test_clonotype_id_roundtrip_with_sample(id in 0..1_000_000usize, sample_number in 0..1_000_000usize) { - let clonotype_id = ClonotypeId { id, sample_number: Some(sample_number) }; - assert_eq!(clonotype_id.to_string().parse::().unwrap(), clonotype_id); + fn test_clonotype_id_roundtrip_with_sample(id in 0..1_000_000usize) { + let clonotype_id = ClonotypeId { id, sample_id: Some("test_sample") }; + assert_eq!(ClonotypeId::parse(&clonotype_id.to_string()).unwrap(), clonotype_id); } } } diff --git a/lib/rust/cr_types/src/constants.rs b/lib/rust/cr_types/src/constants.rs index 5d4040e..329405f 100644 --- a/lib/rust/cr_types/src/constants.rs +++ b/lib/rust/cr_types/src/constants.rs @@ -3,3 +3,9 @@ pub const ILLUMINA_QUAL_OFFSET: u8 = 33; /// Default minimum CRISPR UMI threshold. pub const DEFAULT_MIN_CRISPR_UMI_THRESHOLD: usize = 3; + +/// Name of the environment variable command line inputs are stashed in +pub const COMMAND_LINE_ENV_VARIABLE_NAME: &str = "CMDLINE"; + +/// Default value for non command line runs +pub const COMMAND_LINE_ENV_DEFAULT_VALUE: &str = "NA"; diff --git a/lib/rust/cr_types/src/lib.rs b/lib/rust/cr_types/src/lib.rs index 19ac53c..01b8305 100644 --- a/lib/rust/cr_types/src/lib.rs +++ b/lib/rust/cr_types/src/lib.rs @@ -54,6 +54,7 @@ pub mod aggr; pub mod barcode_index; pub use barcode_index::*; mod bit_encode; +pub mod cell_annotation; pub mod chemistry; pub mod clonotype; pub mod constants; @@ -71,6 +72,7 @@ pub mod spill_vec; pub mod utils; pub use metrics_file::*; pub mod filtered_barcodes; +pub mod mempool; pub mod websummary; #[derive(Debug)] diff --git a/lib/rust/cr_types/src/mempool.rs b/lib/rust/cr_types/src/mempool.rs new file mode 100644 index 0000000..968dbbc --- /dev/null +++ b/lib/rust/cr_types/src/mempool.rs @@ -0,0 +1,60 @@ +//! A thread-safe, fixed-size pool of T. +//! This type can be used to provide reusable allocations that can be passed +//! between threads, such as in-memory buffers. +//! +//! The pool will never allocate more than the specified number of members, +//! and requesting a member from the pool will block until one is available. + +use std::ops::{Deref, DerefMut}; +use std::sync::mpsc::{sync_channel, Receiver, SyncSender}; + +pub struct MemPool { + recv: Receiver, + load: SyncSender, +} + +impl MemPool { + /// Initialize a new pool of size count. + /// Calls init repeatedly to produce the items. + pub fn new T>(count: usize, mut init: F) -> Self { + let (load, recv) = sync_channel(count); + for _ in 0..count { + load.send(init()).unwrap(); + } + Self { recv, load } + } + + /// Fetch a member from the pool, blocking until one is available. + pub fn fetch(&self) -> PoolMember { + PoolMember { + val: Some(self.recv.recv().unwrap()), + return_to_pool: self.load.clone(), + } + } +} + +/// A value of type T that will be returned to the source memory pool when dropped. +pub struct PoolMember { + val: Option, + return_to_pool: SyncSender, +} + +impl Drop for PoolMember { + fn drop(&mut self) { + // This can only fail if the entire pool itself has been dropped. + let _ = self.return_to_pool.send(self.val.take().unwrap()); + } +} + +impl Deref for PoolMember { + type Target = T; + fn deref(&self) -> &Self::Target { + self.val.as_ref().unwrap() + } +} + +impl DerefMut for PoolMember { + fn deref_mut(&mut self) -> &mut Self::Target { + self.val.as_mut().unwrap() + } +} diff --git a/lib/rust/cr_types/src/probe_set.rs b/lib/rust/cr_types/src/probe_set.rs index 13f0dc4..286e7ad 100644 --- a/lib/rust/cr_types/src/probe_set.rs +++ b/lib/rust/cr_types/src/probe_set.rs @@ -1,7 +1,11 @@ +use crate::reference::probe_set_reference::TargetSetFile; use crate::rna_read::HIGH_CONF_MAPQ; use crate::types::GenomeName; -use anyhow::{anyhow, Context, Result}; -use itertools::{chain, Itertools}; +use anyhow::{anyhow, bail, ensure, Context, Result}; +use bio::alignment::distance::simd::{bounded_levenshtein, levenshtein}; +use bio::alignment::pairwise::{Aligner, Scoring}; +use bio::alignment::{Alignment, AlignmentOperation}; +use itertools::{chain, zip_eq, Itertools}; use lazy_static::lazy_static; use metric::TxHashMap; use serde::{Deserialize, Serialize}; @@ -9,12 +13,14 @@ use std::cmp::{min, Ord, Ordering, PartialOrd}; use std::collections::HashMap; use std::fs::File; use std::hash::{Hash, Hasher}; -use std::io::{BufRead, BufReader}; +use std::io::{BufRead, BufReader, Write}; use std::iter::zip; use std::ops::Deref; use std::path::Path; +use std::str::FromStr; use std::{fmt, iter}; -use transcriptome::{Gene, Transcriptome}; +use strum_macros::{AsRefStr, Display, EnumString}; +use transcriptome::Gene; /// One read half maps to a probe and the other half does not. pub const MAPQ_HALF_MAPPED: u8 = 1; @@ -22,6 +28,17 @@ pub const MAPQ_HALF_MAPPED: u8 = 1; /// Each read half maps to a different probe. pub const MAPQ_SPLIT_MAPPED: u8 = 3; +/// Both LHS and RHS map, but the gap sequence is not within the max error of expected gap +pub const MAPQ_GAP_MAPPED_NOT_WITHIN_MAX_ERR: u8 = 5; + +/// Maximum rate of error in the gap sequence. The value is chosen +/// based on the expectations that the errors in gap should be really small. +/// Will revisit this once we have more data. +pub const MAX_GAP_ERROR_RATE: f64 = 0.25; +/// Minmum number of basepairs difference allowed for gap to still be aligned +/// to the expected gap and alignment metrics to be reported. +pub const MIN_ALLOWED_GAP_ERROR: u32 = 2; + /// Return the intersection of two sorted iterators. fn intersect_sorted_lists(xs: I, ys: I) -> impl Iterator where @@ -107,6 +124,27 @@ impl fmt::Display for ProbeRegion { } } +// do we even need the probe type?? discard it before merge if it ends up unnecessary +#[derive( + Clone, + Debug, + PartialEq, + Eq, + Deserialize, + Serialize, + Copy, + EnumString, + AsRefStr, + Default, + Display, +)] +pub enum ProbeType { + #[default] + RTL, + PairedGapAlign, + UnpairedGapAlign, +} + /// A probe index and its gene. #[derive(Clone, Debug, Eq, Deserialize, Serialize)] pub struct Probe { @@ -121,13 +159,24 @@ pub struct Probe { /// The region of the probe pub region: Option, + + // The type of the probe + pub probe_type: ProbeType, + + // reference sequence (chromosome) name where probe is expected to map + pub ref_sequence_name: String, + + // reference sequence (chromosome) position where probe is expected to map + pub ref_sequence_pos: Option, + + // CIGAR string describing expected alignment + pub cigar_string: String, } impl Probe { - /// Return true if this probe ID is excluded based on its probe ID or if included - /// is false. + /// Return whether this probe ID is excluded based on its probe ID or `included` is false. pub fn is_excluded_probe(&self) -> bool { - is_deprecated_probe(&self.probe_id) || !self.included + !self.included || is_deprecated_probe(&self.probe_id) } } @@ -167,12 +216,52 @@ impl fmt::Display for Probe { } /// A pair of left and right half-probe sequences. -struct ProbeSequence { +pub struct ProbeSequence { /// LHS half-probe sequence. - lhs: Vec, + pub lhs: Vec, /// RHS half-probe sequence. - rhs: Vec, + pub rhs: Vec, + + /// Expected sequence of the optional gap. + gap: Vec, +} + +impl FromStr for ProbeSequence { + type Err = anyhow::Error; + + fn from_str(probe_seq_str: &str) -> Result { + let probe_seq = probe_seq_str.as_bytes(); + Ok(match probe_seq.iter().filter(|&&x| x == b'-').count() { + 0 => { + // Skip the middle base if the sequence has odd length. + let lhs_end = probe_seq.len() / 2; + let rhs_start = (probe_seq.len() + 1) / 2; + ProbeSequence { + lhs: probe_seq[..lhs_end].to_vec(), + rhs: probe_seq[rhs_start..].to_vec(), + gap: Vec::new(), + } + } + 1 => { + let (lhs, rhs) = probe_seq.split(|&x| x == b'-').collect_tuple().unwrap(); + ProbeSequence { + lhs: lhs.to_vec(), + rhs: rhs.to_vec(), + gap: Vec::new(), + } + } + 2 => { + let (lhs, gap, rhs) = probe_seq.split(|&x| x == b'-').collect_tuple().unwrap(); + ProbeSequence { + lhs: lhs.to_vec(), + rhs: rhs.to_vec(), + gap: gap.to_vec(), + } + } + 3.. => bail!("Too many hyphens in probe sequence: {probe_seq_str}"), + }) + } } /// A map of probe IDs to probe sequences. @@ -196,7 +285,7 @@ impl Deref for ProbeSetReferenceMetadata { impl ProbeSetReferenceMetadata { /// Read probe set reference metadata from a file. - pub fn load_from(path: &Path) -> Result { + pub fn load_from(path: &TargetSetFile) -> Result { Ok(Self(read_csv_comment_metadata(path)?)) } @@ -204,6 +293,51 @@ impl ProbeSetReferenceMetadata { pub fn is_probe_set_metadata(&self) -> bool { self.0.contains_key("probe_set_file_format") } + + fn probe_set_file_format(&self) -> &str { + &self["probe_set_file_format"] + } + + pub fn reference_genome(&self) -> &str { + &self["reference_genome"] + } + + pub fn reference_version(&self) -> &str { + &self["reference_version"] + } + + pub fn panel_name(&self) -> &str { + &self["panel_name"] + } + + fn set_panel_name(&mut self, panel_name: &str) { + self.0 + .insert("panel_name".to_string(), panel_name.to_string()); + } + + fn check_merge_compatibility(&self, other: &Self) -> Result<()> { + ensure!( + self.probe_set_file_format() == other.probe_set_file_format(), + "Probe set merging error: file formats do not match." + ); + ensure!( + self.reference_genome() == other.reference_genome(), + "Probe set merging error: reference genomes do not match." + ); + ensure!( + self.reference_version() == other.reference_version(), + "Probe set merging error: reference versions do not match." + ); + + Ok(()) + } + + fn write_to(&self, mut writer: W) -> Result<()> { + for (key, value) in self.0.iter().sorted_by(|(a, _), (b, _)| a.cmp(b)) { + writeln!(writer, "#{key}={value}")?; + } + Ok(()) + } } /// A probe set reference. @@ -225,9 +359,13 @@ pub struct ProbeSetReference { /// The reference genome name. pub genome: GenomeName, - /// The length of a probe sequence. - /// All probe sequences must have the same length. - probe_seq_len: usize, + /// The length of a probe's left-hand side half. + /// All LHS probe half sequences must have the same length. + lhs_length: usize, + + /// The length of a probe's right-hand side half. + /// All RHS probe half sequences must have the same length. + rhs_length: usize, /// The map of probes to probe sequences. probe_to_seq: ProbeToSeqMap, @@ -240,8 +378,19 @@ pub struct ProbeSetReference { /// The map of right probe sequences to probes. rhs_seq_to_probe: SeqToProbeMap, + + /// True if this probe set contains one or more gap aligned probes. + pub has_gap_probes: bool, + + /// True if the probe set contains one or more unpaired gap probes. + pub has_unpaired_gap_probes: bool, + + /// True if the probe set does not have any paired gap probes + pub has_no_paired_gap_probes: bool, } +pub const LHS_START: usize = 0; + impl ProbeSetReference { /// Align a half read to the probe set reference, allowing up to one mismatch. /// Return no match if there is more than one possible match. @@ -252,7 +401,7 @@ impl ProbeSetReference { ) -> Option<(&'a [Probe], i32)> { const BASES: [u8; 4] = [b'A', b'C', b'G', b'T']; - if seq.len() < self.probe_seq_len / 2 { + if seq.len() < min(self.lhs_length, self.rhs_length) { // Half read sequence is shorter than half probe sequence. return None; } @@ -289,31 +438,82 @@ impl ProbeSetReference { /// Align a read to the probe set reference. pub fn align_probe_read(&self, seq: &[u8]) -> MappedProbe { - if seq.len() < self.probe_seq_len / 2 { + if seq.len() < min(self.lhs_length, self.rhs_length) { // Read sequence is shorter than half the probe sequence. return MappedProbe::new(None, None, &self.genome); } - // Skip the middle base if the sequence has odd length. - let lhs_end = self.probe_seq_len / 2; - let rhs_start = (self.probe_seq_len + 1) / 2; - let rhs_end = min(seq.len(), self.probe_seq_len); - let lhs_seq = &seq[..lhs_end]; - let rhs_seq = &seq[rhs_start..rhs_end]; + // intial alignment of the lhs probe half + let lhs_seq = &seq[LHS_START..self.lhs_length]; let (lhs_probes, lhs_score) = self .align_half_read(&self.lhs_seq_to_probe, lhs_seq) .unwrap_or((&[], 0)); - let (rhs_probes, rhs_score) = self - .align_half_read(&self.rhs_seq_to_probe, rhs_seq) - .unwrap_or((&[], 0)); - match (lhs_probes, rhs_probes) { + // initial alignment of rhs probe half + let (rhs_probes, rhs_score, rhs_start) = { + // return first encountered kmer with RHS (if any) + let mut read_kmers = get_rhs_read_kmers( + self.has_gap_probes, + self.lhs_length, + lhs_probes, + self.rhs_length, + seq, + ); + read_kmers.find_map(|(read_pos, rhs_seq)| { + self.align_half_read(&self.rhs_seq_to_probe, rhs_seq) + .map(|(probes, score)| (probes, score, read_pos)) + }) + } + .unwrap_or((&[], 0, self.lhs_length)); + + let mut mapped_probe = match (lhs_probes, rhs_probes) { ([], []) => MappedProbe::new(None, None, &self.genome), - ([..], []) => self.rescue_rhs(lhs_probes, lhs_score, rhs_seq), - ([], [..]) => self.rescue_lhs(lhs_seq, rhs_probes, rhs_score), + ([..], []) => { + // return first encountered kmer with RHS (if any) + let mut read_kmers = get_rhs_read_kmers( + self.has_gap_probes, + self.lhs_length, + lhs_probes, + self.rhs_length, + seq, + ); + read_kmers + .find_map(|(read_pos, rhs_seq)| { + let res = + self.rescue_rhs(LHS_START, lhs_probes, lhs_score, read_pos, rhs_seq); + if res.rhs.is_some() { + Some(res) + } else { + None + } + }) + .unwrap_or_else(|| { + MappedProbe::new( + Some(MappedProbeHalf::new( + lhs_probes[0].clone(), + lhs_score, + LHS_START, + LHS_START + self.lhs_length, + )), + None, + &self.genome, + ) + }) + } + ([], [..]) => self.rescue_lhs(LHS_START, lhs_seq, rhs_start, rhs_probes, rhs_score), ([lhs], [rhs]) => MappedProbe::new( - Some(MappedProbeHalf::new(lhs.clone(), lhs_seq.len() as i32)), - Some(MappedProbeHalf::new(rhs.clone(), rhs_seq.len() as i32)), + Some(MappedProbeHalf::new( + lhs.clone(), + self.lhs_length as i32, + LHS_START, + LHS_START + self.lhs_length, + )), + Some(MappedProbeHalf::new( + rhs.clone(), + self.rhs_length as i32, + rhs_start, + rhs_start + self.rhs_length, + )), &self.genome, ), ([..], [..]) => { @@ -322,25 +522,52 @@ impl ProbeSetReference { // in which case use the lexicographically minimal probe ID. if let Some(probe) = intersect_sorted_lists(lhs_probes, rhs_probes).next() { MappedProbe::new( - Some(MappedProbeHalf::new(probe.clone(), lhs_seq.len() as i32)), - Some(MappedProbeHalf::new(probe.clone(), rhs_seq.len() as i32)), + Some(MappedProbeHalf::new( + probe.clone(), + self.lhs_length as i32, + LHS_START, + LHS_START + self.lhs_length, + )), + Some(MappedProbeHalf::new( + probe.clone(), + self.rhs_length as i32, + rhs_start, + rhs_start + self.rhs_length, + )), &self.genome, ) } else { MappedProbe::new( Some(MappedProbeHalf::new( lhs_probes[0].clone(), - lhs_seq.len() as i32, + self.lhs_length as i32, + LHS_START, + LHS_START + self.lhs_length, )), Some(MappedProbeHalf::new( rhs_probes[0].clone(), - rhs_seq.len() as i32, + self.rhs_length as i32, + rhs_start, + rhs_start + self.rhs_length, )), &self.genome, ) } } + }; + if mapped_probe.is_paired_gap_align() { + let probe = mapped_probe.lhs_probe().unwrap(); + let expected_gap_seq = &self.probe_to_seq[probe].gap; + assert!(!expected_gap_seq.is_empty()); + + let gap_seq = mapped_probe.gap_info().unwrap().gap_seq(seq); + + mapped_probe.gap = Some(MappedGap { + gap_seq: std::str::from_utf8(gap_seq).unwrap().to_string(), + expected_gap_seq: std::str::from_utf8(expected_gap_seq).unwrap().to_string(), + }); } + mapped_probe } /// Rescue an unaligned half read. Return the mapping and alignment score. @@ -352,6 +579,7 @@ impl ProbeSetReference { mapped_probe: &Probe, mapped_score: i32, probe_seq: &[u8], + read_pos: usize, read_seq: &[u8], ) -> Option { assert!(read_seq.len() <= probe_seq.len()); @@ -365,17 +593,26 @@ impl ProbeSetReference { // The score of the half-probe alignment must be positive, and the sum // of both half-probe score must be at least transcriptome_min_score. if score > 0 && mapped_score + score >= self.transcriptome_min_score as i32 { - Some(MappedProbeHalf::new(mapped_probe.clone(), score)) + Some(MappedProbeHalf::new( + mapped_probe.clone(), + score, + read_pos, + read_pos + probe_seq.len(), + )) } else { None } } /// Rescue an unaligned half-probe sequence. + #[allow(clippy::too_many_arguments)] fn rescue_unaligned_half( &self, mapped_probes: &[Probe], mapped_score: i32, + mapped_probe_pos: usize, + mapped_probe_length: usize, + read_pos: usize, read_seq: &[u8], rescue_which_half: impl Fn(&ProbeSequence) -> &[u8], ) -> (MappedProbeHalf, Option) { @@ -384,30 +621,75 @@ impl ProbeSetReference { .rev() // Return the first probe with max score. .filter_map(|probe| { let probe_seq = rescue_which_half(&self.probe_to_seq[probe]); - self.align_unaligned_half(probe, mapped_score, probe_seq, read_seq) + if !probe_seq.is_empty() { + self.align_unaligned_half(probe, mapped_score, probe_seq, read_pos, read_seq) + } else { + None + } }) .max_by_key(|x| x.score); if let Some(ref x) = best { - (MappedProbeHalf::new(x.probe.clone(), mapped_score), best) + ( + MappedProbeHalf::new( + x.probe.clone(), + mapped_score, + mapped_probe_pos, + mapped_probe_pos + mapped_probe_length, + ), + best, + ) } else { ( - MappedProbeHalf::new(mapped_probes[0].clone(), mapped_score), + MappedProbeHalf::new( + mapped_probes[0].clone(), + mapped_score, + mapped_probe_pos, + mapped_probe_pos + mapped_probe_length, + ), None, ) } } /// Rescue an unaligned LHS sequence. - fn rescue_lhs(&self, lhs_read_seq: &[u8], rhs_probes: &[Probe], rhs_score: i32) -> MappedProbe { - let (rhs, opt_lhs) = - self.rescue_unaligned_half(rhs_probes, rhs_score, lhs_read_seq, |x| &x.lhs); + fn rescue_lhs( + &self, + lhs_read_pos: usize, + lhs_read_seq: &[u8], + rhs_read_pos: usize, + rhs_probes: &[Probe], + rhs_score: i32, + ) -> MappedProbe { + let (rhs, opt_lhs) = self.rescue_unaligned_half( + rhs_probes, + rhs_score, + rhs_read_pos, + self.lhs_length, + lhs_read_pos, + lhs_read_seq, + |x| &x.lhs, + ); MappedProbe::new(opt_lhs, Some(rhs), &self.genome) } /// Rescue an unaligned RHS sequence. - fn rescue_rhs(&self, lhs_probes: &[Probe], lhs_score: i32, rhs_read_seq: &[u8]) -> MappedProbe { - let (lhs, opt_rhs) = - self.rescue_unaligned_half(lhs_probes, lhs_score, rhs_read_seq, |x| &x.rhs); + fn rescue_rhs( + &self, + lhs_read_pos: usize, + lhs_probes: &[Probe], + lhs_score: i32, + rhs_read_pos: usize, + rhs_read_seq: &[u8], + ) -> MappedProbe { + let (lhs, opt_rhs) = self.rescue_unaligned_half( + lhs_probes, + lhs_score, + lhs_read_pos, + self.rhs_length, + rhs_read_pos, + rhs_read_seq, + |x| &x.rhs, + ); MappedProbe::new(Some(lhs), opt_rhs, &self.genome) } @@ -415,17 +697,10 @@ impl ProbeSetReference { /// CSV header must include #probe_set_file_format. /// CSV header row must be gene_id,probe_seq,probe_id,included,region. pub fn from_path( - target_set: &Path, - reference_path: &Path, + target_set: &TargetSetFile, + transcriptome_reference_path: Option<&Path>, transcriptome_min_score: usize, ) -> Result { - // Read the transcriptome GTF to map gene IDs to gene names. - let gene_id_to_name: TxHashMap<_, _> = Transcriptome::from_reference_path(reference_path)? - .genes - .into_iter() - .map(|x| (x.id, x.name)) - .collect(); - let metadata = ProbeSetReferenceMetadata::load_from(target_set)?; assert!(metadata.is_probe_set_metadata()); @@ -435,64 +710,52 @@ impl ProbeSetReference { .from_path(target_set) .with_context(|| target_set.display().to_string())?; - // Ensure that the headers are correct. - // bait_seq and bait_id are permitted for backward compatibility. - let header: Vec<_> = reader.headers().unwrap().iter().collect(); - assert_eq!(header[0], "gene_id"); - assert!(header[1] == "probe_seq" || header[1] == "bait_seq"); - assert!(header[2] == "probe_id" || header[2] == "bait_id"); - if let Some(&included_header) = header.get(3) { - assert_eq!(included_header, "included"); - } - // Parse the probe set CSV file. - let mut probe_seq_len = None; - let probe_to_seq: ProbeToSeqMap = reader - .records() - .map(|record| { - let record = record.unwrap(); - let gene_id = record[0].to_string(); - let probe_seq = record[1].as_bytes(); - let probe_id = record[2].to_string(); - let included = record - .get(3) - .map_or(true, |x| x.to_lowercase().parse().unwrap()); - let region = record - .get(4) - .map(str::to_string) - .map(|r| ProbeRegion::new(&r)); - let gene_name = gene_id_to_name.get(&gene_id).unwrap_or(&gene_id).clone(); - let probe = Probe { - probe_id, - gene: Gene { - id: gene_id, - name: gene_name, - }, - included, - region, - }; - - // Ensure that the length of the probe sequences is fixed. - if let Some(probe_seq_len) = probe_seq_len { - assert_eq!(probe_seq.len(), probe_seq_len); + let mut has_gap_probes: bool = false; + let mut has_unpaired_gap_probes: bool = false; + let mut has_no_paired_gap_probes: bool = true; + let mut lhs_length = None; + let mut rhs_length = None; + let probe_to_seq: ProbeToSeqMap = zip_eq( + TargetSetFile::read(target_set, transcriptome_reference_path)?, + reader.records(), + ) + .map(|(probe, records)| { + has_gap_probes |= match probe.probe_type { + ProbeType::UnpairedGapAlign => true, + ProbeType::RTL => false, + ProbeType::PairedGapAlign => true, + }; + has_unpaired_gap_probes |= probe.probe_type == ProbeType::UnpairedGapAlign; + has_no_paired_gap_probes &= probe.probe_type != ProbeType::PairedGapAlign; + + // Ensure that the length of the LHS and RHS sequences is fixed. + let probe_seq = ProbeSequence::from_str(&records?[1])?; + if !probe_seq.lhs.is_empty() { + if let Some(lhs_length) = lhs_length { + assert_eq!(probe_seq.lhs.len(), lhs_length); } else { - probe_seq_len = Some(probe_seq.len()); + lhs_length = Some(probe_seq.lhs.len()); } + } + if !probe_seq.rhs.is_empty() { + if let Some(rhs_length) = rhs_length { + assert_eq!(probe_seq.rhs.len(), rhs_length); + } else { + rhs_length = Some(probe_seq.rhs.len()); + } + } - // Skip the middle base if the sequence has odd length. - let rhs_end = probe_seq.len() / 2; - let lhs_start = (probe_seq.len() + 1) / 2; - ( - probe, - ProbeSequence { - lhs: probe_seq[..rhs_end].to_vec(), - rhs: probe_seq[lhs_start..].to_vec(), - }, - ) - }) - .collect(); - let probe_seq_len = probe_seq_len - .unwrap_or_else(|| panic!("target_set CSV has no records: {}", target_set.display())); + anyhow::Ok((probe, probe_seq)) + }) + .try_collect()?; + + let Some(lhs_length) = lhs_length else { + bail!("probe_set CSV has no LHS records: {}", target_set.display()) + }; + let Some(rhs_length) = rhs_length else { + bail!("probe_set CSV has no RHS records: {}", target_set.display()) + }; // Construct a map of probes to integer indices, sorted by probe ID. let probe_id_to_index: TxHashMap<_, _> = probe_to_seq @@ -503,20 +766,20 @@ impl ProbeSetReference { .collect(); // Construct a map of probe sequences to probes. - let mut lhs_seq_to_probe: SeqToProbeMap = - probe_to_seq - .iter() - .fold(Default::default(), |mut map, (probe, seq)| { - map.entry(seq.lhs.clone()).or_default().push(probe.clone()); - map - }); - let mut rhs_seq_to_probe: SeqToProbeMap = - probe_to_seq - .iter() - .fold(Default::default(), |mut map, (probe, seq)| { - map.entry(seq.rhs.clone()).or_default().push(probe.clone()); - map - }); + let mut lhs_seq_to_probe: SeqToProbeMap = probe_to_seq + .iter() + .filter(|(_, probe_sequence)| !probe_sequence.lhs.is_empty()) + .fold(Default::default(), |mut map, (probe, seq)| { + map.entry(seq.lhs.clone()).or_default().push(probe.clone()); + map + }); + let mut rhs_seq_to_probe: SeqToProbeMap = probe_to_seq + .iter() + .filter(|(_, probe_sequence)| !probe_sequence.rhs.is_empty()) + .fold(Default::default(), |mut map, (probe, seq)| { + map.entry(seq.rhs.clone()).or_default().push(probe.clone()); + map + }); // Sort probes by probe ID. for probes in lhs_seq_to_probe.values_mut() { @@ -531,11 +794,15 @@ impl ProbeSetReference { metadata, transcriptome_min_score, genome, - probe_seq_len, + lhs_length, + rhs_length, probe_to_seq, probe_id_to_index, lhs_seq_to_probe, rhs_seq_to_probe, + has_gap_probes, + has_unpaired_gap_probes, + has_no_paired_gap_probes, }) } @@ -558,6 +825,45 @@ impl ProbeSetReference { pub fn probe_id_to_index(&self, probe_id: &str) -> usize { self.probe_id_to_index[probe_id] } + + pub fn probe_sequence_from_id(&self, probe_id: &str) -> &ProbeSequence { + self.probe_to_seq + .get( + self.sorted_probes() + .get(self.probe_id_to_index(probe_id)) + .unwrap(), + ) + .unwrap() + } +} + +// Helper function returning an iterator over read kmers to try match to the RHS probe halves in the probe set reference +fn get_rhs_read_kmers<'a>( + has_gap_probes: bool, + lhs_length: usize, + lhs_probes: &'a [Probe], + rhs_length: usize, + seq: &'a [u8], +) -> Box + 'a> { + // If there is room for the RHS seq, set up the kmers to screen + if lhs_length <= seq.len() - rhs_length { + if has_gap_probes { + // To do gap alignment scan full read in reverse direction to return the LAST match, i.e. longest gap (maybe change this to return best match later?) + // For rescue_rhs during gap alignment this returns the LAST rhs match in the reads sequence that results in a score >= self.transcriptome_min_score, i.e. longest gap + Box::new( + seq.windows(rhs_length) + .enumerate() + .skip(if lhs_probes.is_empty() { 0 } else { lhs_length }) + .rev(), + ) + } else { + // For non gapped alignment only check pos adjecent to LHS + Box::new(vec![(lhs_length, &seq[lhs_length..(lhs_length + rhs_length)])].into_iter()) + } + } else { + // if the the read is too short, do nothing by returning an empty iterator + Box::new(iter::empty::<(usize, &[u8])>()) + } } /// Read key/value metadata from the beginning of a CSV file. @@ -588,13 +894,172 @@ pub struct MappedProbeHalf { /// The alignment score. pub score: i32, + + /// The alignment start position. + pub start_pos: usize, + + /// The alignment end position. + pub end_pos: usize, } impl MappedProbeHalf { /// Return a new MappedProbeHalf. - pub fn new(probe: Probe, score: i32) -> Self { + pub fn new(probe: Probe, score: i32, start_pos: usize, end_pos: usize) -> Self { assert!(score > 0); - MappedProbeHalf { probe, score } + MappedProbeHalf { + probe, + score, + start_pos, + end_pos, + } + } +} + +const MAPPED_GAP_ALIGNMENT_MATCH_SCORE: i32 = 1; +const MAPPED_GAP_ALIGNMENT_MISMATCH_SCORE: i32 = -1; +const MAPPED_GAP_ALIGNMENT_GAP_OPEN_SCORE: i32 = -1; +const MAPPED_GAP_ALIGNMENT_GAP_EXTEND_SCORE: i32 = -1; +const MAPPED_GAP_ALIGNMENT_CLIP_SCORE: i32 = -3; + +/// The gap part of the probe mapping result +/// Mapped gap is only created for reads that LHS and RHS map to the same probe +#[derive(Deserialize, Serialize, Clone)] +pub struct MappedGap { + /// Gap sequence extracted from the read + pub gap_seq: String, + + /// Expected gap sequence from probe set + pub expected_gap_seq: String, +} + +impl MappedGap { + pub fn get_gap_seq(&self) -> String { + self.gap_seq.clone() + } + + pub fn get_expected_gap_seq(&self) -> String { + self.expected_gap_seq.clone() + } + + pub fn get_alignment(&self) -> Alignment { + // custom scoring to enable clipping in mapped and expected gap sequence + let scoring = Scoring::from_scores( + MAPPED_GAP_ALIGNMENT_GAP_OPEN_SCORE, + MAPPED_GAP_ALIGNMENT_GAP_EXTEND_SCORE, + MAPPED_GAP_ALIGNMENT_MATCH_SCORE, + MAPPED_GAP_ALIGNMENT_MISMATCH_SCORE, + ) + .xclip(MAPPED_GAP_ALIGNMENT_CLIP_SCORE) + .yclip(MAPPED_GAP_ALIGNMENT_CLIP_SCORE); + + let mut aligner = Aligner::with_capacity_and_scoring( + self.gap_seq.len(), + self.expected_gap_seq.len(), + scoring, + ); + aligner.custom(self.gap_seq.as_bytes(), self.expected_gap_seq.as_bytes()) + } + pub fn get_max_gap_error(&self) -> u32 { + std::cmp::max( + MIN_ALLOWED_GAP_ERROR, + (self.expected_gap_seq.len() as f64 * MAX_GAP_ERROR_RATE).ceil() as u32, + ) + } + pub fn gap_within_max_error(&self) -> bool { + return bounded_levenshtein( + self.expected_gap_seq.as_bytes(), + self.gap_seq.as_bytes(), + self.get_max_gap_error(), + ) + .is_some(); + } + pub fn get_gap_levenshtein_distance(&self) -> u32 { + levenshtein(self.expected_gap_seq.as_bytes(), self.gap_seq.as_bytes()) + } +} + +pub struct MappedGapAlignmentInfo { + pub gap_seq: String, + pub expected_gap_seq: String, + pub alignment_operations: Vec, +} + +impl MappedGapAlignmentInfo { + pub fn gap_exactly_matches_expected(&self) -> bool { + self.gap_seq == self.expected_gap_seq + } + + pub fn get_num_matches(&self) -> usize { + self.alignment_operations + .iter() + .filter(|&a| *a == AlignmentOperation::Match) + .count() + } + pub fn get_num_mismatches(&self) -> usize { + self.alignment_operations + .iter() + .filter(|&a| *a == AlignmentOperation::Subst) + .count() + } + + pub fn ends_with_insertion(&self) -> bool { + if self.alignment_operations.is_empty() { + return false; + } + self.alignment_operations.last().map_or(false, |op| { + matches!(op, AlignmentOperation::Xclip(_)) || *op == AlignmentOperation::Ins + }) + } + + pub fn starts_with_insertion(&self) -> bool { + if self.alignment_operations.is_empty() { + return false; + } + self.alignment_operations.first().map_or(false, |op| { + matches!(op, AlignmentOperation::Xclip(_)) || *op == AlignmentOperation::Ins + }) + } + + pub fn ends_with_deletion(&self) -> bool { + if self.alignment_operations.clone().is_empty() { + return false; + } + self.alignment_operations.last().map_or(false, |op| { + matches!(op, AlignmentOperation::Yclip(_)) || *op == AlignmentOperation::Del + }) + } + + pub fn starts_with_deletion(&self) -> bool { + if self.alignment_operations.is_empty() { + return false; + } + self.alignment_operations.first().map_or(false, |op| { + matches!(op, AlignmentOperation::Yclip(_)) || *op == AlignmentOperation::Del + }) + } + + /// Number of insertions in gap compared to expected gap (including soft clips before or after) + pub fn get_num_insertions(&self) -> usize { + self.alignment_operations + .iter() + .map(|op| match op { + AlignmentOperation::Xclip(l) => *l, + AlignmentOperation::Ins => 1, + _ => 0, + }) + .sum() + } + + /// Number of deletions in gap compared to expected gap (including soft clips before or after) + pub fn get_num_deletions(&self) -> usize { + self.alignment_operations + .iter() + .map(|op| match op { + AlignmentOperation::Yclip(l) => *l, + AlignmentOperation::Del => 1, + _ => 0, + }) + .sum() } } @@ -612,6 +1077,11 @@ pub struct MappedProbe { /// The read maps confidently to a probe but multimapped with STAR. is_rescued: bool, + + /// The result of mapping the gap sequence. + /// Only populated when the LHS/RHS sequences are mapped to the same probe + /// and the probe is a gap align probe. + gap: Option, } impl MappedProbe { @@ -627,6 +1097,7 @@ impl MappedProbe { rhs, genome, is_rescued: false, + gap: None, } } @@ -655,6 +1126,11 @@ impl MappedProbe { self.lhs_score() + self.rhs_score() } + /// Return gap + pub fn gap(&self) -> Option { + self.gap.clone() + } + /// Return the reference genome name. pub fn genome(&self) -> Option<&GenomeName> { self.genome.as_ref() @@ -665,9 +1141,20 @@ impl MappedProbe { self.lhs.is_some() || self.rhs.is_some() } + pub fn is_lhs_rhs_mapped_to_same_probe(&self) -> bool { + match (self.lhs_probe(), self.rhs_probe()) { + (Some(lhs), Some(rhs)) => lhs == rhs, + _ => false, + } + } + /// Return whether both left and right sequences mapped to the same probe. pub fn is_conf_mapped(&self) -> bool { - self.is_mapped() && self.lhs_probe() == self.rhs_probe() + self.is_lhs_rhs_mapped_to_same_probe() + && self + .gap + .as_ref() + .map_or(true, MappedGap::gap_within_max_error) } /// Return the confidently mapped gene. @@ -706,6 +1193,10 @@ impl MappedProbe { }, included: true, region: None, + probe_type: ProbeType::default(), + ref_sequence_name: String::new(), + ref_sequence_pos: None, + cigar_string: String::new(), }; } @@ -723,8 +1214,16 @@ impl MappedProbe { /// 0 when neither half maps to a probe. pub fn mapq(&self) -> u8 { match (&self.lhs, &self.rhs) { - (Some(_), Some(_)) if self.is_conf_mapped() => HIGH_CONF_MAPQ, - (Some(_), Some(_)) => MAPQ_SPLIT_MAPPED, + (Some(_), Some(_)) => { + if self.is_conf_mapped() { + HIGH_CONF_MAPQ + } else if self.is_lhs_rhs_mapped_to_same_probe() { + assert!(self.gap.is_some()); + MAPQ_GAP_MAPPED_NOT_WITHIN_MAX_ERR + } else { + MAPQ_SPLIT_MAPPED + } + } (Some(_), None) | (None, Some(_)) => MAPQ_HALF_MAPPED, (None, None) => 0, } @@ -739,12 +1238,115 @@ impl MappedProbe { pub fn set_rescued(&mut self, is_rescued: bool) { self.is_rescued = is_rescued; } + + /// Whether both halves are LHS and RHS of a PairedGapAlign probes + pub fn is_paired_gap_align(&self) -> bool { + match (self.lhs_probe(), self.rhs_probe()) { + (Some(lhs), Some(rhs)) => lhs == rhs && rhs.probe_type == ProbeType::PairedGapAlign, + _ => false, + } + } + + pub fn is_unpaired_gap_align(&self) -> bool { + match (self.lhs_probe(), self.rhs_probe()) { + (Some(lhs), Some(rhs)) => { + lhs.probe_type == ProbeType::UnpairedGapAlign + && rhs.probe_type == ProbeType::UnpairedGapAlign + } + _ => false, + } + } + + pub fn is_gap_align(&self) -> bool { + self.is_unpaired_gap_align() || self.is_paired_gap_align() + } + + /// Return the gap information if available + /// Option tuple of (lhs end position, rhs start position) + /// if probe type gapped and both probes aligned else None + pub fn gap_info(&self) -> Option { + if !self.is_gap_align() { + return None; + } + match (&self.lhs, &self.rhs) { + (Some(lhs), Some(rhs)) => Some(GapInfo { + probe_type: lhs.probe.probe_type, // == rhs.probe.probe_type + lhs_end: lhs.end_pos, + rhs_start: rhs.start_pos, + }), + _ => unreachable!(), // is_gap_align() would return false + } + } +} + +pub struct GapInfo { + pub probe_type: ProbeType, + pub lhs_end: usize, + pub rhs_start: usize, +} + +impl GapInfo { + pub fn gap_seq<'a>(&self, read: &'a [u8]) -> &'a [u8] { + let start = self.lhs_end; + let end = self.rhs_start.max(start); + &read[start..end] + } +} + +fn read_probe_set_headers(csv_file: &TargetSetFile) -> Result> { + Ok(csv::ReaderBuilder::new() + .comment(Some(b'#')) + .from_path(csv_file) + .with_context(|| csv_file.display().to_string())? + .headers() + .unwrap() + .iter() + .map(std::borrow::ToOwned::to_owned) + .collect()) +} + +/// Merge probe set CSVs, and return its combined probe set name. +pub fn merge_probe_set_csvs( + probe_sets: &[TargetSetFile], + mut writer: W, +) -> Result { + assert!(probe_sets.len() >= 2); + let mut metadata = ProbeSetReferenceMetadata::load_from(&probe_sets[0])?; + let headers = read_probe_set_headers(&probe_sets[0])?; + let mut panel_names = vec![metadata.panel_name().to_string()]; + + for probe_set in probe_sets.iter().skip(1) { + let other_metadata = ProbeSetReferenceMetadata::load_from(probe_set)?; + metadata.check_merge_compatibility(&other_metadata)?; + panel_names.push(other_metadata.panel_name().to_string()); + ensure!( + headers == read_probe_set_headers(probe_set)?, + "Probe set headers do not match" + ); + } + let combined_panel_name = panel_names.into_iter().join("|"); + metadata.set_panel_name(&combined_panel_name); + + metadata.write_to(&mut writer)?; + + let mut csv_writer = csv::WriterBuilder::new().from_writer(writer); + csv_writer.write_record(headers.iter())?; + for probe_set in probe_sets { + let mut reader = csv::ReaderBuilder::new() + .comment(Some(b'#')) + .from_path(probe_set) + .with_context(|| probe_set.display().to_string())?; + for record in reader.records() { + let record = record?; + csv_writer.write_record(record.iter())?; + } + } + Ok(combined_panel_name) } #[cfg(test)] mod test { use super::*; - use test_refdata::{refdata_available, refdata_path}; #[test] fn test_intersect_sorted_lists() { @@ -771,11 +1373,11 @@ mod test { #[test] fn test_load_metadata() -> Result<()> { - assert!(!ProbeSetReferenceMetadata::load_from(Path::new( + assert!(!ProbeSetReferenceMetadata::load_from(&TargetSetFile::from( "../cr_lib/test/target_panels/Immunology_targeting_hybrid.csv" ))? .is_probe_set_metadata()); - assert!(ProbeSetReferenceMetadata::load_from(Path::new( + assert!(ProbeSetReferenceMetadata::load_from(&TargetSetFile::from( "../cr_lib/test/target_panels/Immunology_targeting_templated_ligation.csv" ))? .is_probe_set_metadata()); @@ -784,16 +1386,557 @@ mod test { #[test] fn test_from_path() -> Result<()> { - if !refdata_available() { - return Ok(()); - } - let reference = refdata_path("GRCh38-2020-A/"); - ProbeSetReference::from_path( - Path::new("../cr_lib/test/target_panels/Immunology_targeting_templated_ligation.csv"), - &reference, + &TargetSetFile::from( + "../cr_lib/test/target_panels/Immunology_targeting_templated_ligation.csv", + ), + None, + 0, + )?; + Ok(()) + } + + #[test] + fn test_file_format_3() -> Result<()> { + let probe_set = ProbeSetReference::from_path( + &TargetSetFile::from("../cr_lib/test/target_panels/mock_probe_set_file_format_3.csv"), + None, + 0, + )?; + + let probes = probe_set.sorted_probes(); + assert_eq!(probes.len(), 87); + + let first_probe = probes.first().unwrap(); + assert_eq!(first_probe.region, Some(ProbeRegion::Spliced)); + assert_eq!(first_probe.probe_type, ProbeType::RTL); + assert_eq!(first_probe.ref_sequence_name, "not_a_real_ref_2"); + assert_eq!(first_probe.ref_sequence_pos, Some(5)); + assert_eq!(first_probe.cigar_string, "50M"); + let mapped_probe = probe_set.align_probe_read(b"TCATACTCCTGCTTGCTGATCCACATCTGCTGGAAGGTGGACAGCGAGGCGTCAGCGACTACGTACGTACGTAGCTGGGCATGCGATCG"); + assert_eq!(mapped_probe.lhs_probe(), mapped_probe.rhs_probe()); + assert_eq!(&mapped_probe.probes().next().unwrap(), first_probe); + + let last_probe = probes.last().unwrap(); + assert_eq!(last_probe.region, Some(ProbeRegion::Unspliced)); + assert_eq!(last_probe.probe_type, ProbeType::PairedGapAlign); + assert_eq!(last_probe.ref_sequence_name, "not_a_real_ref"); + assert_eq!(last_probe.ref_sequence_pos, Some(77)); + assert_eq!(last_probe.cigar_string, "200M"); + let mapped_probe = probe_set.align_probe_read(b"TGGCCATCGGGCAGCTCGTAGCTCTNNNNNNNTCTCCAGAGAAGAGGAGGATNNNNNAGTCGGTCAGGTCCCGGCCAGCCAGNNNNNNNGCGGCGGTGGCCATCTCCTGCTCGAAGTCCANNNNNAGGATCTTCATGAGGT"); + assert_eq!(mapped_probe.lhs_probe(), mapped_probe.rhs_probe()); + assert_eq!(&mapped_probe.probes().next().unwrap(), last_probe); + assert_eq!(mapped_probe.gap.clone().unwrap().expected_gap_seq, "TCTCCAGAGAAGAGGAGGATGCGGCGGTGGCCATCTCCTGCTCGAAGTCCAGGGCGACGTAGCACAGCTTCTCCTTGATGTCGCGCACGATTTCCCGCTCGGCCGTGGTGGTGAAGCTGTAGCCTCGCTCAGTGAGGATCTTCATGAGGT".to_string()); + assert_eq!( + mapped_probe.gap.clone().unwrap().gap_seq, + "NNNNNNNTCTCCAGAGAAGAGGAGGATNNNNN".to_string() + ); + assert!(!mapped_probe.gap.clone().unwrap().gap_within_max_error()); + Ok(()) + } + + #[test] + fn test_mapped_gap_alignment_info() -> Result<()> { + // Alignment: + // gap: TGGCTTACACTTTCAACTTG + // |||||\|||||\|||||| + // exp: AACTGGCTAACACTCTCAACT + // Alignment Ops: + // [Yclip(3), Match, Match, Match, Match, Match, Subst, Match, Match, + // Match, Match, Match, Subst, Match, Match, Match, Match, Match, Match, Xclip(2)] + // + let expected_gap_seq = "AACTGGCTAACACTCTCAACT".to_string(); + let gap_seq = "TGGCTTACACTTTCAACTGT".to_string(); + let mg = MappedGap { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + }; + println!( + "Alignment: \n{}", + mg.get_alignment() + .pretty(b"TGGCTTACACTTTCAACTGT", b"AACTGGCTAACACTCTCAACT", 80), + ); + println!("Alignment ops: \n{:?}", mg.get_alignment().operations); + + assert_eq!(mg.get_max_gap_error(), 6); + assert!(!mg.gap_within_max_error()); + assert_eq!(mg.get_gap_levenshtein_distance(), 7); + let mgi = MappedGapAlignmentInfo { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + alignment_operations: mg.get_alignment().operations.clone(), + }; + assert_eq!(mgi.get_num_matches(), 16); + assert_eq!(mgi.get_num_mismatches(), 2); + assert_eq!(mgi.get_num_insertions(), 2); + assert_eq!(mgi.get_num_deletions(), 3); + assert!(!mgi.ends_with_deletion()); + assert!(mgi.ends_with_insertion()); + assert!(mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // Alignment: + // gap: CATTTTCTT---CCG + // |||||||||xxx||| + // exp: CATTTTCTTCCACCG + + // Alignment ops: + // [Match, Match, Match, Match, Match, Match, Match, Match, Match, Del, Del, Del, Match, Match, Match] + let expected_gap_seq = "CATTTTCTTCCACCG".to_string(); + let gap_seq = "CATTTTCTTCCG".to_string(); + let mg = MappedGap { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + }; + println!( + "Alignment: \n{}", + mg.get_alignment() + .pretty(b"CATTTTCTTCCG", b"CATTTTCTTCCACCG", 80), + ); + println!("Alignment ops: \n{:?}", mg.get_alignment().operations); + + assert_eq!(mg.get_max_gap_error(), 4); + assert!(mg.gap_within_max_error()); + assert_eq!(mg.get_gap_levenshtein_distance(), 3); + let mgi = MappedGapAlignmentInfo { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + alignment_operations: mg.get_alignment().operations.clone(), + }; + assert_eq!(mgi.get_num_matches(), 12); + assert_eq!(mgi.get_num_mismatches(), 0); + assert_eq!(mgi.get_num_insertions(), 0); + assert_eq!(mgi.get_num_deletions(), 3); + assert!(!mgi.ends_with_deletion()); + assert!(!mgi.ends_with_insertion()); + assert!(!mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // Alignment: + // gap: TAGTTTCCCCTTCA- + // ||||||||\|||||x + // exp: TAGTTTCCACTTCAT + + // Alignment ops: + // [Match, Match, Match, Match, Match, Match, Match, Match, Subst, Match, Match, Match, Match, Match, Del] + let expected_gap_seq = "TAGTTTCCACTTCAT".to_string(); + let gap_seq = "TAGTTTCCCCTTCA".to_string(); + let mg = MappedGap { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + }; + println!( + "Alignment: \n{}", + mg.get_alignment() + .pretty(b"TAGTTTCCCCTTCA", b"TAGTTTCCACTTCAT", 80), + ); + println!("Alignment ops: \n{:?}", mg.get_alignment().operations); + + let mgi = MappedGapAlignmentInfo { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + alignment_operations: mg.get_alignment().operations.clone(), + }; + assert_eq!(mgi.get_num_matches(), 13); + assert_eq!(mgi.get_num_mismatches(), 1); + assert_eq!(mgi.get_num_insertions(), 0); + assert_eq!(mgi.get_num_deletions(), 1); + assert!(mgi.ends_with_deletion()); + assert!(!mgi.ends_with_insertion()); + assert!(!mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // Alignment: + // gap: CTTCCTTC-CTT + // ||||||||x||| + // exp: CTTCCTTCGCTTCTT + + // Alignment ops: + // [Match, Match, Match, Match, Match, Match, Match, Match, Del, Match, + // Match, Match, Yclip(3)] + let expected_gap_seq = "CTTCCTTCGCTTTTT".to_string(); + let gap_seq = "CTTCCTTCCTT".to_string(); + let mg = MappedGap { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + }; + println!( + "Alignment: \n{}", + mg.get_alignment() + .pretty(b"CTTCCTTCCTT", b"CTTCCTTCGCTTTTT", 80), + ); + println!("Alignment ops: \n{:?}", mg.get_alignment().operations); + + let mgi = MappedGapAlignmentInfo { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + alignment_operations: mg.get_alignment().operations.clone(), + }; + assert_eq!(mgi.get_num_matches(), 11); + assert_eq!(mgi.get_num_mismatches(), 0); + assert_eq!(mgi.get_num_insertions(), 0); + assert_eq!(mgi.get_num_deletions(), 4); + assert!(mgi.ends_with_deletion()); + assert!(!mgi.ends_with_insertion()); + assert!(!mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // Alignment: + // gap: ACTGCTCAG---TCA + // |||||||||xxx\|| + // exp: ACTGCTCAGACCACA + + // Alignment ops: + // [Match, Match, Match, Match, Match, Match, Match, Match, Match, Del, + // Del, Del, Subst, Match, Match] + let expected_gap_seq = "ACTGCTCAGACCACA".to_string(); + let gap_seq = "ACTGCTCAGTCA".to_string(); + let mg = MappedGap { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + }; + println!( + "Alignment: \n{}", + mg.get_alignment() + .pretty(b"ACTGCTCAGTCA", b"ACTGCTCAGACCACA", 80), + ); + println!("Alignment ops: \n{:?}", mg.get_alignment().operations); + + let mgi = MappedGapAlignmentInfo { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + alignment_operations: mg.get_alignment().operations.clone(), + }; + assert_eq!(mgi.get_num_matches(), 11); + assert_eq!(mgi.get_num_mismatches(), 1); + assert_eq!(mgi.get_num_insertions(), 0); + assert_eq!(mgi.get_num_deletions(), 3); + assert!(!mgi.ends_with_deletion()); + assert!(!mgi.ends_with_insertion()); + assert!(!mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // Alignment: + // gap: TCATATCTGCCTCAAA + // ||\||\||||\|+||| + // exp: TCTTAGCTGCAT-AAA + + // Alignment ops: + // [Match, Match, Subst, Match, Match, Subst, Match, Match, Match, Match, + // Subst, Match, Ins, Match, Match, Match] + let expected_gap_seq = "TCTTAGCTGCATAAA".to_string(); + let gap_seq = "TCATATCTGCCTCAAA".to_string(); + let mg = MappedGap { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + }; + println!( + "Alignment: \n{}", + mg.get_alignment() + .pretty(b"TCATATCTGCCTCAAA", b"TCTTAGCTGCATAAA", 80), + ); + println!("Alignment ops: \n{:?}", mg.get_alignment().operations); + + let mgi = MappedGapAlignmentInfo { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + alignment_operations: mg.get_alignment().operations.clone(), + }; + assert_eq!(mgi.get_num_matches(), 12); + assert_eq!(mgi.get_num_mismatches(), 3); + assert_eq!(mgi.get_num_insertions(), 1); + assert_eq!(mgi.get_num_deletions(), 0); + assert!(!mgi.ends_with_deletion()); + assert!(!mgi.ends_with_insertion()); + assert!(!mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // Alignment: + // gap: ATTCTCTTGAGACGTT + // \||||||||\|\||+| + // exp: CTTCTCTTGGGCCG-T + + // Alignment ops: + // [Subst, Match, Match, Match, Match, Match, Match, Match, Match, Subst, + // Match, Subst, Match, Match, Ins, Match] + let expected_gap_seq = "CTTCTCTTGGGCCGT".to_string(); + let gap_seq = "ATTCTCTTGAGACGTT".to_string(); + let mg = MappedGap { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + }; + println!( + "Alignment: \n{}", + mg.get_alignment() + .pretty(b"ATTCTCTTGAGACGTT", b"CTTCTCTTGGGCCGT", 80), + ); + println!("Alignment ops: \n{:?}", mg.get_alignment().operations); + + let mgi = MappedGapAlignmentInfo { + gap_seq: gap_seq.clone(), + expected_gap_seq: expected_gap_seq.clone(), + alignment_operations: mg.get_alignment().operations.clone(), + }; + assert_eq!(mgi.get_num_matches(), 12); + assert_eq!(mgi.get_num_mismatches(), 3); + assert_eq!(mgi.get_num_insertions(), 1); + assert_eq!(mgi.get_num_deletions(), 0); + assert!(!mgi.ends_with_deletion()); + assert!(!mgi.ends_with_insertion()); + assert!(!mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // assert!(false); + Ok(()) + } + + #[test] + fn test_gap_alignment() -> Result<()> { + let probe_set = ProbeSetReference::from_path( + &TargetSetFile::from("../cr_lib/test/target_panels/mock_probe_set_file_format_3.csv"), + None, 0, )?; + + let probes = probe_set.sorted_probes(); + assert_eq!(probes.len(), 87); + + let gapfill_probe = probes[85]; + let lhs_seq = "CTTCTCCAGGGAGGAGCTGGAAGCA"; + let rhs_seq = "TCTCTTGCTCGAAGTCCAGGGCGAC"; + let expected_gap_seq = "GCCGTGGCCA"; + assert_eq!(gapfill_probe.region, Some(ProbeRegion::Unspliced)); + assert_eq!(gapfill_probe.probe_type, ProbeType::PairedGapAlign); + assert_eq!(gapfill_probe.ref_sequence_name, "not_a_real_ref"); + assert_eq!(gapfill_probe.ref_sequence_pos, Some(13)); + assert_eq!(gapfill_probe.cigar_string, "60M"); + let gapfill_probe_seq = probe_set.probe_to_seq.get(gapfill_probe).unwrap(); + assert_eq!( + std::str::from_utf8(gapfill_probe_seq.lhs.as_ref()).unwrap(), + lhs_seq + ); + assert_eq!( + std::str::from_utf8(gapfill_probe_seq.rhs.as_ref()).unwrap(), + rhs_seq + ); + assert_eq!( + std::str::from_utf8(gapfill_probe_seq.gap.as_ref()).unwrap(), + expected_gap_seq + ); + + let perfect_read = lhs_seq.to_string() + expected_gap_seq + rhs_seq + "AAACTGGCTGACTGAC"; + let mapped_probe = probe_set.align_probe_read(perfect_read.as_bytes()); + assert_eq!(mapped_probe.lhs_probe(), mapped_probe.rhs_probe()); + assert_eq!(mapped_probe.probes().next().unwrap(), gapfill_probe); + assert_eq!( + mapped_probe.gap.clone().unwrap().expected_gap_seq, + expected_gap_seq.to_string() + ); + assert_eq!( + mapped_probe.gap.clone().unwrap().gap_seq, + expected_gap_seq.to_string() + ); + assert!(mapped_probe.gap.clone().unwrap().gap_within_max_error()); + + // gap: GCCGTGGCC- + // |||||||||x + // exp: GCCGTGGCCG + // Alignment ops: + // [Match, Match, Match, Match, Match, Match, Match, Match, Match, Del] + let read_with_del_end_of_gap = lhs_seq.to_string() + + &expected_gap_seq[0..expected_gap_seq.len() - 1] + + rhs_seq + + "AAACTGGCTGACTGAC"; + let mapped_probe = probe_set.align_probe_read(read_with_del_end_of_gap.as_bytes()); + assert_eq!(mapped_probe.lhs_probe(), mapped_probe.rhs_probe()); + assert_eq!(mapped_probe.probes().next().unwrap(), gapfill_probe); + assert_eq!( + mapped_probe.gap.clone().unwrap().expected_gap_seq, + expected_gap_seq.to_string() + ); + assert_eq!( + mapped_probe.gap.clone().unwrap().gap_seq, + expected_gap_seq[0..expected_gap_seq.len() - 1].to_string() + ); + assert!(mapped_probe.gap.clone().unwrap().gap_within_max_error()); // 1 base del is within 90% so it has expected gap + println!( + "Alignment: \n{}", + mapped_probe.gap.clone().unwrap().get_alignment().pretty( + b"GCCGTGGCC", + b"GCCGTGGCCG", + 80 + ), + ); + println!( + "Alignment ops: \n{:?}", + mapped_probe.gap.clone().unwrap().get_alignment().operations + ); + let mgi = MappedGapAlignmentInfo { + gap_seq: mapped_probe.gap.clone().unwrap().gap_seq, + expected_gap_seq: mapped_probe.gap.clone().unwrap().expected_gap_seq, + alignment_operations: mapped_probe + .gap + .clone() + .unwrap() + .get_alignment() + .operations + .clone(), + }; + assert_eq!(mgi.get_num_matches(), 9); + assert_eq!(mgi.get_num_mismatches(), 0); + assert_eq!(mgi.get_num_insertions(), 0); + assert_eq!(mgi.get_num_deletions(), 1); + assert!(mgi.ends_with_deletion()); + assert!(!mgi.ends_with_insertion()); + assert!(!mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // gap: TTGACCATT + // \||\||| + // exp: GCCGTGGCCA + // Alignment ops: + // [Yclip(3), Subst, Match, Match, Subst, Match, Match, Match, Xclip(2)] + let read_with_complex_alignment = + lhs_seq.to_string() + "TTGACCAAC" + rhs_seq + "AAACTGGCTGACTGAC"; + let mapped_probe = probe_set.align_probe_read(read_with_complex_alignment.as_bytes()); + assert_eq!(mapped_probe.lhs_probe(), mapped_probe.rhs_probe()); + assert_eq!(mapped_probe.probes().next().unwrap(), gapfill_probe); + assert_eq!( + mapped_probe.gap.clone().unwrap().expected_gap_seq, + expected_gap_seq.to_string() + ); + assert_eq!( + mapped_probe.gap.clone().unwrap().gap_seq, + "TTGACCAAC".to_string() + ); + assert!(!mapped_probe.gap.clone().unwrap().gap_within_max_error()); + println!( + "Alignment: \n{}", + mapped_probe.gap.clone().unwrap().get_alignment().pretty( + b"TTGACCAAC", + b"GCCGTGGCCA", + 80 + ), + ); + println!( + "Alignment ops: \n{:?}", + mapped_probe.gap.clone().unwrap().get_alignment().operations + ); + + let mgi = MappedGapAlignmentInfo { + gap_seq: mapped_probe.gap.clone().unwrap().gap_seq, + expected_gap_seq: mapped_probe.gap.clone().unwrap().expected_gap_seq, + alignment_operations: mapped_probe + .gap + .clone() + .unwrap() + .get_alignment() + .operations + .clone(), + }; + + assert_eq!(mgi.get_num_matches(), 5); + assert_eq!(mgi.get_num_mismatches(), 2); + assert_eq!(mgi.get_num_insertions(), 2); + assert_eq!(mgi.get_num_deletions(), 3); + assert!(!mgi.ends_with_deletion()); + assert!(mgi.ends_with_insertion()); + assert!(mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + // gap: GCCGTGG-CA + // |||||||x|| + // exp: GCCGTGGCCA + // Alignment ops: + // [Match, Match, Match, Match, Match, Match, Match, Del, Match, Match] + let read_with_complex_alignment = + lhs_seq.to_string() + "GCCGTGGCA" + rhs_seq + "AAACTGGCTGACTGAC"; + let mapped_probe = probe_set.align_probe_read(read_with_complex_alignment.as_bytes()); + assert_eq!(mapped_probe.lhs_probe(), mapped_probe.rhs_probe()); + assert_eq!(mapped_probe.probes().next().unwrap(), gapfill_probe); + assert_eq!( + mapped_probe.gap.clone().unwrap().expected_gap_seq, + expected_gap_seq.to_string() + ); + assert_eq!( + mapped_probe.gap.clone().unwrap().gap_seq, + "GCCGTGGCA".to_string() + ); + assert!(mapped_probe.gap.clone().unwrap().gap_within_max_error()); + println!( + "Alignment: \n{}", + mapped_probe.gap.clone().unwrap().get_alignment().pretty( + b"GCCGTGGCA", + b"GCCGTGGCCA", + 80 + ), + ); + println!( + "Alignment ops: \n{:?}", + mapped_probe.gap.clone().unwrap().get_alignment().operations + ); + + let mgi = MappedGapAlignmentInfo { + gap_seq: mapped_probe.gap.clone().unwrap().gap_seq, + expected_gap_seq: mapped_probe.gap.clone().unwrap().expected_gap_seq, + alignment_operations: mapped_probe + .gap + .clone() + .unwrap() + .get_alignment() + .operations + .clone(), + }; + + assert_eq!(mgi.get_num_matches(), 9); + assert_eq!(mgi.get_num_mismatches(), 0); + assert_eq!(mgi.get_num_insertions(), 0); + assert_eq!(mgi.get_num_deletions(), 1); + assert!(!mgi.ends_with_deletion()); + assert!(!mgi.ends_with_insertion()); + assert!(!mgi.starts_with_deletion()); + assert!(!mgi.starts_with_insertion()); + + Ok(()) + } + + #[test] + fn test_probe_set_merge() -> Result<()> { + let mut writer = Vec::new(); + merge_probe_set_csvs( + &[ + TargetSetFile::from("test/probe_set_merge/set1.csv"), + TargetSetFile::from("test/probe_set_merge/set2.csv"), + ], + &mut writer, + )?; + insta::assert_snapshot!(String::from_utf8(writer)?); Ok(()) } + + #[test] + fn test_probe_set_merge_error_wrong_format() { + let mut writer = Vec::new(); + assert!(merge_probe_set_csvs( + &[ + TargetSetFile::from("test/probe_set_merge/set1.csv"), + TargetSetFile::from("test/probe_set_merge/format2.csv"), + ], + &mut writer, + ) + .is_err()); + } + + #[test] + fn test_probe_set_merge_error_wrong_columns() { + let mut writer = Vec::new(); + assert!(merge_probe_set_csvs( + &[ + TargetSetFile::from("test/probe_set_merge/set1.csv"), + TargetSetFile::from("test/probe_set_merge/additional_column.csv"), + ], + &mut writer, + ) + .is_err()); + } } diff --git a/lib/rust/cr_types/src/reference/feature_extraction.rs b/lib/rust/cr_types/src/reference/feature_extraction.rs index 39fc189..94f31fe 100644 --- a/lib/rust/cr_types/src/reference/feature_extraction.rs +++ b/lib/rust/cr_types/src/reference/feature_extraction.rs @@ -481,7 +481,6 @@ pub fn library_type_requires_feature_ref(library_type: &str) -> bool { mod tests { use super::*; use crate::reference::feature_checker::compute_feature_dist; - use crate::reference::reference_info::ReferenceInfo; use crate::types::{FeatureBarcodeType, GenomeName, LibraryType}; use arrayvec::ArrayVec; use barcode::BarcodeConstruct::GelBeadOnly; @@ -491,7 +490,6 @@ mod tests { use fastq_set::Record; use std::fs::File; use std::io::{BufReader, Cursor, Write}; - use transcriptome::Transcriptome; use umi::Umi; // helper function for checking corrections @@ -522,7 +520,7 @@ mod tests { } let read = RnaRead { read: ReadPair::new([Some(Rec { seq, qual }), Some(Rec { seq, qual }), None, None]), - barcode: SegmentedBarcode::gel_bead_only(0, b"A", NotChecked), + segmented_barcode: SegmentedBarcode::gel_bead_only(0, b"A", NotChecked), umi: Umi::new(b"A"), bc_range: GelBeadOnly(RpRange::new(WhichRead::R1, 0, None)), umi_parts: ArrayVec::new(), @@ -538,16 +536,8 @@ mod tests { fn test_load_feature_ref() -> Result<()> { let fdf_path = "test/feature/citeseq.csv"; let rdr = BufReader::new(File::open(fdf_path).unwrap()); - let fref = FeatureReference::new( - &ReferenceInfo::default(), - &Transcriptome::dummy(), - Some(rdr), - None, - None, - None, - None, - ) - .unwrap(); + let fref = + FeatureReference::new(&[], None, Some(rdr), None, None, None, None, None).unwrap(); let _fextr = FeatureExtractor::new( Arc::new(fref), Some(&[FeatureType::Barcode(FeatureBarcodeType::Antibody)].into()), @@ -561,15 +551,7 @@ mod tests { fn test_bad_feature_ref() -> Result<()> { let fdf_path = "test/feature/CRISPR_lib.v5.500.csv"; let rdr = BufReader::new(File::open(fdf_path)?); - let fref = FeatureReference::new( - &ReferenceInfo::default(), - &Transcriptome::dummy(), - Some(rdr), - None, - None, - None, - None, - )?; + let fref = FeatureReference::new(&[], None, Some(rdr), None, None, None, None, None)?; let fextr = FeatureExtractor::new( Arc::new(fref), Some(&[FeatureType::Barcode(FeatureBarcodeType::Crispr)].into()), @@ -643,16 +625,15 @@ ID1,Name1,R1,(BC),ACGT,Antibody Capture ID2,Name2,R1,(BC),ACCT,Antibody Capture ID3,Name3,R1,(BC),TTTT,Antibody Capture "#; - let ref_info = ReferenceInfo::default(); - let txome = Transcriptome::dummy(); let fref = FeatureReference::new( - &ref_info, - &txome, + &[], + None, Some(Cursor::new(fdf_csv.as_bytes())), None, None, None, None, + None, ) .unwrap(); let fdist = compute_feature_dist(vec![1i64, 10, 10], &fref).unwrap(); @@ -716,16 +697,15 @@ ID4,Name1,R1,^(BC),TT,Custom ID5,Name1,R1,^(BC),TT,Custom ID6,Name1,R1,^(BC),TT,Custom "#; - let ref_info = ReferenceInfo::default(); - let txome = Transcriptome::dummy(); let fref = FeatureReference::new( - &ref_info, - &txome, + &[], + None, Some(Cursor::new(fdf_csv.as_bytes())), None, None, None, None, + None, ) .unwrap(); @@ -752,16 +732,15 @@ ID8,N,R1,^(BC),ATAA,Custom ID9,N,R1,^(BC),TAAA,Custom "#; - let ref_info = ReferenceInfo::default(); - let txome = Transcriptome::dummy(); let fref = FeatureReference::new( - &ref_info, - &txome, + &[], + None, Some(Cursor::new(fdf_csv.as_bytes())), None, None, None, None, + None, ) .unwrap(); let fdist = compute_feature_dist(vec![0i64, 10, 1, 10, 10, 10, 10, 10, 10], &fref).unwrap(); diff --git a/lib/rust/cr_types/src/reference/feature_reference.rs b/lib/rust/cr_types/src/reference/feature_reference.rs index 0ec66c8..88a0128 100644 --- a/lib/rust/cr_types/src/reference/feature_reference.rs +++ b/lib/rust/cr_types/src/reference/feature_reference.rs @@ -1,15 +1,16 @@ -use crate::probe_set::is_deprecated_probe; +use super::probe_set_reference::TargetSetFile; +use crate::probe_set::{is_deprecated_probe, ProbeSetReferenceMetadata}; +use crate::reference::get_reference_genome_names; use crate::reference::reference_info::ReferenceInfo; -use crate::types::{FeatureBarcodeType, GenomeName}; -use crate::LibraryType; +use crate::{FeatureBarcodeType, FeatureID, FeatureName, GenomeName, LibraryType}; use anyhow::{anyhow, bail, ensure, Context, Result}; use csv::{self, StringRecord}; use fastq_set::read_pair::WhichRead; -use itertools::{process_results, Itertools}; +use itertools::Itertools; use martian::{AsMartianPrimaryType, MartianPrimaryType}; use martian_derive::{martian_filetype, MartianStruct, MartianType}; -use martian_filetypes::tabular_file::{Csv, CsvFileNoHeader, DelimitedFormat, TableConfig}; -use martian_filetypes::{table_config, LazyFileTypeIO}; +use martian_filetypes::tabular_file::CsvFileNoHeader; +use martian_filetypes::LazyFileTypeIO; use metric::{AsMetricPrefix, TxHashMap, TxHashSet}; use regex::Regex; use serde::{Deserialize, Serialize}; @@ -58,25 +59,16 @@ pub struct FeatureConfig { pub beam_mode: Option, pub specificity_controls: Option, pub functional_map: Option>, + pub hashtag_ids: Option>, } pub const MHC_ALLELE: &str = "mhc_allele"; pub const NO_ALLELE: &str = "no_allele"; +pub const HASHTAG: &str = "hashtag"; pub const SC5P_BEAM_SET_A: &str = include_str!("whitelist/SC5P_BEAM_SetA.csv"); pub const DEFAULT_BEAM_SET: &str = SC5P_BEAM_SET_A; -/* -/// Gene index TSV row -#[derive(Debug, Deserialize)] -struct GeneIndexRow { - pub transcript_id: String, - pub gene_id: String, - pub gene_name: String, - pub transcript_length: i64, -} -*/ - #[derive(PartialEq, Eq, Hash, Debug, Clone, Copy, Serialize, Deserialize, MartianType, Display)] #[serde(rename_all = "lowercase")] pub enum BeamMode { @@ -104,13 +96,14 @@ impl FromStr for BeamMode { pub fn load_feature_set>(reader: R) -> Result> { Ok(FeatureReference::new( - &ReferenceInfo::default(), - &Transcriptome::dummy(), + &[], + None, Some(Cursor::new(reader)), None, None, None, None, + None, ) .unwrap() .feature_defs) @@ -331,15 +324,13 @@ impl FeatureDef { } } - let feature_type = - FeatureBarcodeType::from_str(get_col("feature_type")).with_context(|| { - format!( - r#"Unknown feature_type: '{}'. -The 'feature_type' field in the feature reference must be one of {}."#, - get_col("feature_type"), - FeatureBarcodeType::iter().format(", ") - ) - })?; + let feature_type_str = get_col("feature_type"); + let feature_type = FeatureBarcodeType::from_str(feature_type_str).map_err(|_| { + anyhow!( + "Unknown feature_type '{feature_type_str}' in the feature reference must be one of {}", + FeatureBarcodeType::iter().format(", ") + ) + })?; let read = match WhichRead::from_str(get_col("read")) { Ok(WhichRead::R1) => WhichRead::R1, @@ -430,9 +421,6 @@ Please check that your file is in CSV format and has the required field names."# Ok(()) } -table_config!(TargetSetTable, b',', "csv", true, Some(b'#')); -pub type TargetSetFile = DelimitedFormat, Csv, TargetSetTable>; - martian_filetype! { FeatureReferenceFile, "csv" } impl FeatureReferenceFile { @@ -476,93 +464,77 @@ impl FeatureReference { feature_config: Option<&FeatureConfig>, ) -> Result { let rdr = BufReader::new(File::open(path)?); - let fref = FeatureReference::new( - &ReferenceInfo::default(), - &Transcriptome::dummy(), - Some(rdr), - None, - None, - None, - feature_config, - )?; + let fref = + FeatureReference::new(&[], None, Some(rdr), None, None, None, None, feature_config)?; Ok(fref) } - /// Load a feature reference from a gene_index file and a option `feature_reference` csv file. - /// The gene_index is extracted from `/pickle/genes.pickle`. There is python code in - /// `cellranger/mro/stages/counter/attach_bcs_and_umis/` to create a csv from the pickle, containing rows - /// that can be deserialized with the `GeneIndexRow` struct above. + /// Read a feature reference from a transcriptome reference, probe set, and feature reference CSV. pub fn from_paths( - reference_path: &Path, + transcriptome_reference_path: Option<&Path>, feature_reference: Option<&FeatureReferenceFile>, use_feature_types: Option>, target_set_name: Option<&str>, target_set_path: Option<&TargetSetFile>, target_features_path: Option<&TargetGeneIndicesFile>, feature_config: Option<&FeatureConfig>, - ) -> Result { - let ref_info = ReferenceInfo::from_reference_path(reference_path)?; - let txome = Transcriptome::from_reference_path(reference_path)?; + ) -> Result { + assert!( + transcriptome_reference_path.is_some() + || target_set_path.is_some() + || feature_reference.is_some() + ); - let target_set = if let (Some(name), Some(path)) = (target_set_name, target_features_path) { - Some(TargetSet::load(name, path)?) - } else { - None - }; + let genomes = get_reference_genome_names( + transcriptome_reference_path + .map(ReferenceInfo::from_reference_path) + .transpose()? + .as_ref(), + target_set_path + .map(ProbeSetReferenceMetadata::load_from) + .transpose()? + .as_ref(), + ); - let feature_ref_stream = if let Some(path) = feature_reference { - match File::open(path) { - Err(error) => panic!("error: {}: {error}", path.display()), - Ok(file) => Some(file), - } - } else { - None - }; + let txome = transcriptome_reference_path + .map(Transcriptome::from_reference_path) + .transpose()?; + + let target_set = target_set_name + .zip(target_features_path) + .map(|(name, path)| TargetSet::load(name, path)) + .transpose()?; - let target_gene_ids = target_set_path - .map(Self::read_target_panel_gene_ids) + let feature_ref_stream = feature_reference + .map(|x| File::open(x).with_context(|| x.display().to_string())) + .transpose()?; + + let target_genes_and_included = target_set_path + .map(|x| x.read_genes_and_included(transcriptome_reference_path)) .transpose()?; FeatureReference::new( - &ref_info, - &txome, + &genomes, + txome.as_ref(), feature_ref_stream, use_feature_types, + target_set_name, target_set, - target_gene_ids.as_deref(), + target_genes_and_included.as_deref(), feature_config, ) } - /// Read the target panel CSV file and return a list of gene IDs. - fn read_target_panel_gene_ids(target_set: &TargetSetFile) -> Result> { - let headers = target_set - .read_headers()? - .ok_or_else(|| anyhow!("headers missing in file {}", target_set.display()))?; - - ensure!( - headers[0] == "gene_id", - "Error: first column of target_set CSV header must be gene_id: {}: {}", - headers[0], - target_set.display() - ); - - process_results( - target_set - .lazy_reader()? - .map_ok(|record| record.into_iter().next().unwrap()), - |iter| iter.unique().collect(), - ) - } - /// Create a new feature reference. See `from_paths` for details. + #[allow(clippy::too_many_arguments)] pub fn new( - ref_info: &ReferenceInfo, - txome: &Transcriptome, + genomes: &[GenomeName], + txome: Option<&Transcriptome>, csv_stream: Option, use_feature_types: Option>, + target_set_name: Option<&str>, target_set: Option, - target_gene_ids: Option<&[String]>, + target_genes_and_included: Option<&[(FeatureID, FeatureName, bool)]>, feature_config: Option<&FeatureConfig>, ) -> Result { fn get_genome_from_str( @@ -593,7 +565,14 @@ impl FeatureReference { let mut fdefs = Vec::new(); let mut fmaps = HashMap::new(); let mut cmo_ids = HashMap::new(); - let mut target_set_indices = target_set.as_ref().map(|x| x.feature_indices().clone()); + let mut target_set_indices = if let Some(target_set) = &target_set { + Some(target_set.feature_indices().clone()) + } else if target_genes_and_included.is_some() { + // target_set is None when txome is None. + Some(TxHashSet::default()) + } else { + None + }; if use_feature_types .as_ref() @@ -603,8 +582,8 @@ impl FeatureReference { fmaps.insert(FeatureType::Gene, HashMap::new()); // Create gene features - for gene in &txome.genes { - let genome = get_genome_from_str(&gene.id, &ref_info.genomes, false); + for gene in txome.map_or([].as_slice(), |txome| txome.genes.as_slice()) { + let genome = get_genome_from_str(&gene.id, genomes, false); let num_fdefs = fdefs.len(); fdefs.push(FeatureDef { index: num_fdefs, @@ -618,19 +597,19 @@ impl FeatureReference { tags: HashMap::new(), }); - gene_to_index.insert(gene.to_gene().clone(), num_fdefs); + gene_to_index.insert(gene.to_gene(), num_fdefs); } // Create non-gene probe features. - if let Some(gene_ids) = target_gene_ids { - for gene_id in gene_ids { - if !txome.gene_id_to_idx.contains_key(gene_id) { - let genome = get_genome_from_str(gene_id, &ref_info.genomes, true); + if let Some(target_genes_and_included) = target_genes_and_included { + for &(ref gene_id, ref gene_name, included) in target_genes_and_included { + if !txome.is_some_and(|x| x.gene_id_to_idx.contains_key(gene_id)) { + let genome = get_genome_from_str(gene_id, genomes, true); let num_fdefs = fdefs.len(); fdefs.push(FeatureDef { index: num_fdefs, id: gene_id.clone(), - name: gene_id.clone(), + name: gene_name.clone(), genome, sequence: String::default(), pattern: String::default(), @@ -641,12 +620,12 @@ impl FeatureReference { gene_to_index.insert( Gene { id: gene_id.clone(), - name: gene_id.clone(), + name: gene_name.clone(), }, num_fdefs, ); if let Some(target_set_indices) = &mut target_set_indices { - if !is_deprecated_probe(gene_id) { + if included && !is_deprecated_probe(gene_id) { target_set_indices.insert(num_fdefs as u32); } } @@ -692,10 +671,8 @@ impl FeatureReference { }; } } - // let mut all_feature_ids = HashSet::new(); - if let Some(csv) = csv_stream { let reader = BufReader::new(csv); let mut csv_reader = csv::ReaderBuilder::new() @@ -706,6 +683,8 @@ impl FeatureReference { validate_headers(&header)?; + let hashtag_ids = feature_config.and_then(|f| f.hashtag_ids.clone()); + let mut feature_types_seen: HashSet = HashSet::new(); let mut last_feature_type: Option = None; @@ -742,33 +721,39 @@ impl FeatureReference { } } } + if fdef.feature_type == FeatureType::Barcode(FeatureBarcodeType::Antibody) + && hashtag_ids.as_ref().is_some_and(|h| h.contains(&fdef.id)) + { + fdef.add_tag(HASHTAG.to_string(), "True".to_string())?; + } if fdef.feature_type == FeatureType::Barcode(FeatureBarcodeType::Antigen) { if let Some(feature_config) = feature_config { if let Some(specificity_controls) = &feature_config.specificity_controls { // Add tags corresponding to control id // First, find allele (if beam-ab, set to None) - let allele = if fdef.tags.get(MHC_ALLELE).is_some() { - if feature_config.beam_mode == Some(BeamMode::BeamAB) { - bail!( + let allele = match fdef.tags.get(MHC_ALLELE) { + Some(allelle) => { + if feature_config.beam_mode == Some(BeamMode::BeamAB) { + bail!( "Error parsing feature reference: The `mhc_allele` column is invalid for BCR Antigen Capture." ); - } - // Throw an error if feature reference has MHC allele but not multi config csv - if !specificity_controls.has_mhc_allele_column { - bail!( + } + // Throw an error if feature reference has MHC allele but not multi config csv + if !specificity_controls.has_mhc_allele_column { + bail!( "Feature reference CSV contains `{0}` column but `{0}` is not present in the \ [antigen-specificity] section of the multi config CSV.", MHC_ALLELE ); + } + allelle.as_str() } - fdef.tags[MHC_ALLELE].to_string() - } else { - NO_ALLELE.to_string() + None => NO_ALLELE, }; // Check if multi config CSV has correct allele and control feature id pairing - if allele != *NO_ALLELE { + if allele != NO_ALLELE { for (al, ctrl) in &specificity_controls.control_for_allele { - if ctrl == &fdef.id && al != &allele { + if ctrl == &fdef.id && al != allele { bail!( "Error parsing feature reference: Feature id {} has MHC allele \ parameter {} which is incompatible with the MHC allele {} in [antigen-specificity] section of \ @@ -784,22 +769,25 @@ impl FeatureReference { if let Some(seen) = seen_this_control_id.get_mut(&fdef.id) { *seen = true; } - if let Some(seen) = seen_this_mhc_allele.get_mut(&allele) { + if let Some(seen) = seen_this_mhc_allele.get_mut(allele) { *seen = true; } - let control_id = specificity_controls.control_for_allele.get(&allele); + let control_id = specificity_controls.control_for_allele.get(allele); if let Some(control_id) = control_id { // If the control_id for the current feature is equel to the current feature id, // The current feature is non-targeting. let is_targeting = if control_id.eq(&fdef.id) { - "False".to_string() + "False" } else { - "True".to_string() + "True" }; - fdef.add_tag(TARGETING_ANTIGEN.to_string(), is_targeting)?; + fdef.add_tag( + TARGETING_ANTIGEN.to_string(), + is_targeting.to_string(), + )?; } else { // if allele is not present in the specificity_controls, then this allele does not have // a control. @@ -822,25 +810,28 @@ impl FeatureReference { fdef.add_tag(TARGETING_ANTIGEN.to_string(), "Null".to_string())?; } } - if last_feature_type.is_none() { - last_feature_type = Some(fdef.feature_type); - feature_types_seen.insert(fdef.feature_type); - } else if fdef.feature_type != last_feature_type.unwrap() - && feature_types_seen.contains(&fdef.feature_type) - { - // If we have switched from the last feature type, but the new feature type is already in the feature types seen, - // it means we have had a block of the new feature type before the block of last feature type: - // Feature ref example: - // Feature type A - // Feature type B - // Feature type B -> last feature type - // Feature type A -> new feature type - bail!( - "Features of the same type must be continous in the feature reference file." - ); - } else { - last_feature_type = Some(fdef.feature_type); - } + match last_feature_type { + None => { + feature_types_seen.insert(fdef.feature_type); + } + Some(lft) => { + if fdef.feature_type != lft + && feature_types_seen.contains(&fdef.feature_type) + { + // If we have switched from the last feature type, but the new feature type is already in the feature types seen, + // it means we have had a block of the new feature type before the block of last feature type: + // Feature ref example: + // Feature type A + // Feature type B + // Feature type B -> last feature type + // Feature type A -> new feature type + bail!( + "Features of the same type must be continous in the feature reference file." + ); + } + } + }; + last_feature_type = Some(fdef.feature_type); fmaps .entry(fdef.feature_type) .or_insert_with(HashMap::new) @@ -850,6 +841,14 @@ impl FeatureReference { fdefs.push(fdef); } + + let duplicate_ids: Vec<_> = fdefs.iter().map(|x| &x.id).duplicates().collect(); + ensure!( + duplicate_ids.is_empty(), + "{} duplicate feature ID(s) found in feature reference: {}", + duplicate_ids.len(), + duplicate_ids.into_iter().format(", ") + ); } // Validate the content of feature-functional-map in feature_config @@ -897,7 +896,7 @@ impl FeatureReference { } let updated_target_set = target_set_indices.map(|target_set_indices| { - TargetSet::from_indices(target_set.unwrap().name(), target_set_indices) + TargetSet::from_indices(target_set_name.unwrap(), target_set_indices) }); Ok(FeatureReference { @@ -979,6 +978,15 @@ impl FeatureReference { .collect() } + /// Get the set of Antibody feature ids + pub fn antibody_ids(&self) -> TxHashSet { + self.feature_defs + .iter() + .filter(|x| x.feature_type == FeatureType::Barcode(FeatureBarcodeType::Antibody)) + .map(|x| x.id.clone()) + .collect() + } + /// Get the minimum read lengths per feature type pub fn min_feature_read_lengths(&self) -> TxHashMap> { self.feature_defs @@ -1159,6 +1167,7 @@ impl FeatureReference { #[cfg(test)] mod tests { use super::*; + use insta::assert_snapshot; use std::io::Cursor; // initialize insta test harness @@ -1177,16 +1186,17 @@ id,name,read,pattern,sequence,feature_type ID1,Name1,R1,^(BC),AAAA,Antigen Capture "#; let fref = FeatureReference::new( - &ReferenceInfo::default(), - &Transcriptome::dummy(), + &[], + None, Some(Cursor::new(fdf_csv.as_bytes())), None, None, None, None, + None, ) .unwrap(); let res = fref.check_tenx_beam(); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); } } diff --git a/lib/rust/cr_types/src/reference/mod.rs b/lib/rust/cr_types/src/reference/mod.rs index aca1838..33ab221 100644 --- a/lib/rust/cr_types/src/reference/mod.rs +++ b/lib/rust/cr_types/src/reference/mod.rs @@ -2,4 +2,7 @@ pub mod feature_checker; pub mod feature_extraction; pub mod feature_reference; pub mod genome_of_chrom; +pub mod probe_set_reference; pub mod reference_info; + +pub use probe_set_reference::get_reference_genome_names; diff --git a/lib/rust/cr_types/src/reference/probe_set_reference.rs b/lib/rust/cr_types/src/reference/probe_set_reference.rs new file mode 100644 index 0000000..626b3a2 --- /dev/null +++ b/lib/rust/cr_types/src/reference/probe_set_reference.rs @@ -0,0 +1,173 @@ +//! Probe set reference CSV + +use crate::probe_set::{Probe, ProbeRegion, ProbeSetReferenceMetadata, ProbeType}; +use crate::reference::reference_info::ReferenceInfo; +use crate::{FeatureID, FeatureName, GenomeName}; +use anyhow::{bail, ensure, Context, Result}; +use itertools::Itertools; +use martian_derive::martian_filetype; +use metric::TxHashMap; +use serde::{Deserialize, Serialize}; +use std::path::Path; +use transcriptome::{Gene, Transcriptome}; + +martian_filetype! { TargetSetFile, "csv" } + +impl TargetSetFile { + /// Read a probe set reference CSV. + pub fn read(&self, transcriptome_reference_path: Option<&Path>) -> Result> { + // Read the transcriptome GTF to map gene IDs to gene names. + let gene_id_to_name: TxHashMap<_, _> = + if let Some(reference_path) = transcriptome_reference_path { + Transcriptome::from_reference_path(reference_path)? + .genes + .into_iter() + .map(|x| (x.id, x.name)) + .collect() + } else { + TxHashMap::default() + }; + + // Read the probe set reference CSV file. + let mut reader = csv::ReaderBuilder::new() + .comment(Some(b'#')) + .from_path(self) + .with_context(|| self.display().to_string())?; + + // Ensure that the headers are correct. + let header: Vec<_> = reader.headers().unwrap().iter().collect(); + assert_eq!(header[0], "gene_id"); + assert_eq!(header[1], "probe_seq"); + assert_eq!(header[2], "probe_id"); + if let Some(&included_header) = header.get(3) { + assert_eq!(included_header, "included"); + } + if let Some(®ion_header) = header.get(4) { + assert_eq!(region_header, "region"); + } + if let Some(&gene_name_header) = header.get(5) { + assert_eq!(gene_name_header, "gene_name"); + } + if let Some(&ref_name_header) = header.get(6) { + assert_eq!(ref_name_header, "ref_name"); + } + if let Some(&ref_pos_header) = header.get(7) { + assert_eq!(ref_pos_header, "ref_pos"); + } + if let Some(&cigar_header) = header.get(8) { + assert_eq!(cigar_header, "cigar"); + } + + reader + .records() + .map(|record| { + let record = record?; + let gene_id = record[0].to_string(); + let probe_seq_str = &record[1]; + let probe_seq = probe_seq_str.as_bytes(); + let probe_id = record[2].to_string(); + let included = record.get(3).map_or(Ok(true), |x| { + x.to_lowercase().parse().with_context(|| { + format!(r#"The column "included" must be "true" or "false" but saw "{x}""#) + }) + })?; + let region = record + .get(4) + .map(str::to_string) + .map(|r| ProbeRegion::new(&r)); + + // The transcriptome gene name, or the probe set gene name, or the gene ID. + let gene_name = gene_id_to_name + .get(&gene_id) + .map(String::as_str) + .or_else(|| record.get(5)) + .unwrap_or(&gene_id) + .to_string(); + + let ref_sequence_name = record.get(6).unwrap_or("").to_string(); + let ref_sequence_pos: Option = record + .get(7) + .map(|pos| { + pos.parse().with_context(|| { + format!(r#"The column "ref_pos" must be an integer but saw "{pos}""#) + }) + }) + .transpose()?; + let cigar_string = record.get(8).unwrap_or("").to_string(); + + let num_hyphens = probe_seq.iter().filter(|&&x| x == b'-').count(); + let probe_type = if probe_seq.starts_with(b"-") || probe_seq.ends_with(b"-") { + ensure!( + num_hyphens == 1, + "An unpaired probe must have exactly one hyphen \ + for probe {probe_id}: {probe_seq_str}" + ); + ProbeType::UnpairedGapAlign + } else { + match num_hyphens { + 0 | 1 => ProbeType::RTL, + 2 => ProbeType::PairedGapAlign, + 3.. => { + bail!( + "Too many hyphens in sequence of probe {probe_id}: {probe_seq_str}" + ) + } + } + }; + + Ok(Probe { + probe_id, + gene: Gene { + id: gene_id, + name: gene_name, + }, + included, + region, + probe_type, + ref_sequence_name, + ref_sequence_pos, + cigar_string, + }) + }) + .try_collect() + .with_context(|| self.display().to_string()) + } + + /// Return the gene ID, gene name, and their `included` status. + pub fn read_genes_and_included( + &self, + transcriptome_reference_path: Option<&Path>, + ) -> Result> { + let probes = self.read(transcriptome_reference_path)?; + let gene_id_to_included: TxHashMap<_, _> = probes + .iter() + .map(|probe| (&probe.gene.id, probe.included)) + .into_group_map() + .into_iter() + .map(|(gene_id, included)| (gene_id.clone(), included.into_iter().all(|x| x))) + .collect(); + Ok(probes + .into_iter() + .map(|x| (x.gene.id, x.gene.name)) + .unique() + .map(|(gene_id, gene_name)| { + let included = gene_id_to_included[&gene_id]; + (gene_id, gene_name, included) + }) + .collect()) + } +} + +/// Return the genome names from the reference transcriptome, or target set, or ["NONE"]. +pub fn get_reference_genome_names( + reference_info: Option<&ReferenceInfo>, + probe_set_metadata: Option<&ProbeSetReferenceMetadata>, +) -> Vec { + if let Some(reference_info) = reference_info { + reference_info.genomes.iter().sorted().cloned().collect() + } else if let Some(probe_set_metadata) = probe_set_metadata { + vec![GenomeName::from(probe_set_metadata.reference_genome())] + } else { + vec![GenomeName::from("NONE")] + } +} diff --git a/lib/rust/cr_types/src/rna_read.rs b/lib/rust/cr_types/src/rna_read.rs index 30e4c71..947ce86 100644 --- a/lib/rust/cr_types/src/rna_read.rs +++ b/lib/rust/cr_types/src/rna_read.rs @@ -45,17 +45,17 @@ const MAX_UMI_PARTS: usize = 4; /// /// # Tests /// * `test_rna_chunk_processor_interleaved_sc_vdj` - Test that the `RnaRead` -/// produced by the `RnaChunk` has the expected barcode, umi, read1, read2 for -/// VDJ chemistry with interleaved reads. +/// produced by the `RnaChunk` has the expected barcode, umi, read1, read2 for +/// VDJ chemistry with interleaved reads. /// * `test_rna_chunk_processor_interleaved_sc_vdj_r2` - Test that the `RnaRead` -/// produced by the `RnaChunk` has the expected barcode, umi, read1, read2 for -/// VDJ R2-only chemistry with interleaved reads. +/// produced by the `RnaChunk` has the expected barcode, umi, read1, read2 for +/// VDJ R2-only chemistry with interleaved reads. /// * `test_rna_chunk_processor_non_interleaved_sc_vdj` - Test that the `RnaRead` -/// produced by the `RnaChunk` has the expected barcode, umi, read1, read2 for -/// VDJ chemistry with non-interleaved reads. +/// produced by the `RnaChunk` has the expected barcode, umi, read1, read2 for +/// VDJ chemistry with non-interleaved reads. /// * `test_rna_chunk_processor_non_interleaved_sc_vdj_r2` - Test that the `RnaRead` -/// produced by the `RnaChunk` has the expected barcode, umi, read1, read2 for -/// VDJ R2-only chemistry with non-interleaved reads. +/// produced by the `RnaChunk` has the expected barcode, umi, read1, read2 for +/// VDJ R2-only chemistry with non-interleaved reads. #[derive(Serialize, Deserialize, Clone, PartialEq, Debug, MartianType)] pub struct RnaChunk { pub chemistry: ChemistryDef, @@ -186,7 +186,7 @@ impl RnaChunk { /// /// # Test /// * `test_rna_chunk_subsample()` - Make sure we get roughly as many - /// reads as expected after subsampling + /// reads as expected after subsampling pub fn set_subsample_rate(&mut self, value: f64) -> &mut Self { self.subsample_rate = Some(value); self @@ -195,7 +195,7 @@ impl RnaChunk { /// /// # Test /// * `prop_test_rna_chunk_trim()` - Make sure that trimming works as - /// expected for arbitrary inputs + /// expected for arbitrary inputs pub fn set_illumina_r1_trim_length(&mut self, value: usize) -> &mut Self { self.read_lengths.insert(WhichRead::R1, value); self @@ -204,7 +204,7 @@ impl RnaChunk { /// /// # Test /// * `prop_test_rna_chunk_trim()` - Make sure that trimming works as - /// expected for arbitrary inputs + /// expected for arbitrary inputs pub fn set_illumina_r2_trim_length(&mut self, value: usize) -> &mut Self { self.read_lengths.insert(WhichRead::R2, value); self @@ -374,7 +374,7 @@ impl FastqProcessor for RnaProcessor { /// happens inside: /// - Attach Barcodes and UMIs /// - Find the ranges for RNA read1 and RNA read2. Remember, RNA read1 could - /// point to illumina read2, ut it guaranteed to be empty + /// point to illumina read2, ut it guaranteed to be empty /// - Optionally hard trim the illumina R1 and R2 reads fn process_read(&self, read: ReadPair) -> ProcessResult { let chem = &self.chunk.chemistry; @@ -455,7 +455,7 @@ impl FastqProcessor for RnaProcessor { ProcessResult::Processed(RnaRead { read, - barcode, + segmented_barcode: barcode, umi: umi_seq.into(), bc_range, umi_parts, @@ -474,9 +474,9 @@ impl FastqProcessor for RnaProcessor { /// /// # Tests /// * `test_rna_chunk_fastq_panic_1()` - Make sure that we panic if - /// interleaved and r2 is not None + /// interleaved and r2 is not None /// * `test_rna_chunk_fastq_panic_2()` - Make sure that we panic if - /// not interleaved and r2 is None + /// not interleaved and r2 is None fn fastq_files(&self) -> InputFastqs { // Make sure that either // - r2 is None and interleaved @@ -524,7 +524,7 @@ impl UmiPart { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct RnaRead { pub read: ReadPair, - pub barcode: SegmentedBarcode, + pub segmented_barcode: SegmentedBarcode, pub bc_range: BarcodeConstruct, pub umi: Umi, pub umi_parts: ArrayVec<[UmiPart; MAX_UMI_PARTS]>, @@ -536,13 +536,11 @@ pub struct RnaRead { impl RnaRead { pub fn barcode(&self) -> Barcode { - self.barcode.into() + self.segmented_barcode.into() } - pub fn segmented_barcode(&self) -> SegmentedBarcode { - self.barcode - } - pub fn segmented_barcode_mut(&mut self) -> &mut SegmentedBarcode { - &mut self.barcode + + pub fn barcode_is_valid(&self) -> bool { + self.segmented_barcode.is_valid() } pub fn raw_bc_seq(&self) -> BcSeq { @@ -790,9 +788,9 @@ impl RnaRead { /// /// # Output /// * `FxHashMap` - where the key is the name of the adapter - /// and values is the `RpRange` where the adapter is found. Clearly, the adapters - /// which are not present in the read will not be part of the output. The `ReadAdapterCatalog` - /// guarantees that no two adapters share the same name, so there is no confusion. + /// and values is the `RpRange` where the adapter is found. Clearly, the adapters + /// which are not present in the read will not be part of the output. The `ReadAdapterCatalog` + /// guarantees that no two adapters share the same name, so there is no confusion. /// /// # Test /// * `test_rna_read_adapter_trim()`: Test that we can trim reads consistent with cutadapt. @@ -841,14 +839,14 @@ mod tests { use BarcodeConstruct::GelBeadOnly; fn processor(chunk: RnaChunk) -> RnaProcessor { - let whitelist = Whitelist::construct(chunk.chemistry.barcode_whitelist(), false).unwrap(); + let whitelist = Whitelist::construct(chunk.chemistry.barcode_whitelist()).unwrap(); RnaProcessor::new(chunk, whitelist) } #[test] fn test_read_10bp_umis() -> Result<()> { // make sure we can read 10bp UMIs with the v3 chemistry setup. - let chemistry = ChemistryDef::named(ChemistryName::ThreePrimeV3); + let chemistry = ChemistryDef::named(ChemistryName::ThreePrimeV3PolyA); let umi_extractor = UmiExtractor::new(&chemistry.umi); let chunk = RnaChunk { chemistry, @@ -1835,6 +1833,7 @@ mod tests { length: 19, whitelist: WhitelistSpec::TxtFile { name: "custom".into(), + translation: false, }, }, segment2: BarcodeReadComponent { @@ -1844,6 +1843,7 @@ mod tests { length: 18, whitelist: WhitelistSpec::TxtFile { name: "custom".into(), + translation: false, }, }, segment3: None, diff --git a/lib/rust/cr_types/src/sample_def.rs b/lib/rust/cr_types/src/sample_def.rs index e04814c..29038ee 100644 --- a/lib/rust/cr_types/src/sample_def.rs +++ b/lib/rust/cr_types/src/sample_def.rs @@ -72,8 +72,6 @@ pub struct SampleDef { pub sample_indices: Option>, pub sample_names: Option>, pub subsample_rate: Option, - pub target_set: Option, - pub target_set_name: Option, pub fastq_id: Option, } @@ -90,8 +88,6 @@ impl Default for SampleDef { sample_indices: None, sample_names: None, subsample_rate: None, - target_set: None, - target_set_name: None, fastq_id: None, } } diff --git a/lib/rust/cr_types/src/target_panel_summary.rs b/lib/rust/cr_types/src/target_panel_summary.rs index d3c6817..296bf5d 100644 --- a/lib/rust/cr_types/src/target_panel_summary.rs +++ b/lib/rust/cr_types/src/target_panel_summary.rs @@ -1,8 +1,8 @@ +use crate::reference::probe_set_reference::TargetSetFile; use crate::types::TargetingMethod; use martian_derive::martian_filetype; use martian_filetypes::json_file::JsonFormat; use serde::{Deserialize, Serialize}; -use std::path::PathBuf; martian_filetype!(_TargetPanelSummaryFile, "tps"); pub type TargetPanelSummaryFormat = JsonFormat<_TargetPanelSummaryFile, TargetPanelSummary>; @@ -11,7 +11,7 @@ pub type TargetPanelSummaryFormat = JsonFormat<_TargetPanelSummaryFile, TargetPa pub struct TargetPanelSummary { pub target_panel_hash: String, pub target_panel_name: String, - pub target_panel_path: PathBuf, + pub target_panel_path: TargetSetFile, pub target_panel_gene_count: i32, pub target_panel_type: String, pub targeting_method: TargetingMethod, diff --git a/lib/rust/cr_types/src/types.rs b/lib/rust/cr_types/src/types.rs index dbabfd8..cbfcb4f 100644 --- a/lib/rust/cr_types/src/types.rs +++ b/lib/rust/cr_types/src/types.rs @@ -63,6 +63,12 @@ pub type FingerprintFile = JsonFormat<_FingerprintFile, Vec>; // End File Types +/// A feature ID. +pub type FeatureID = String; + +/// A feature name. +pub type FeatureName = String; + /// A genome name. #[derive( Clone, @@ -81,6 +87,7 @@ pub type FingerprintFile = JsonFormat<_FingerprintFile, Vec>; pub struct GenomeName(String); impl GenomeName { + /// Return this genome name as a string slice. pub fn as_str(&self) -> &str { &self.0 } @@ -118,7 +125,7 @@ pub trait HasSampleIndex { /// Count of the number of UMIs observed for one feature in one barcode. Corresponds /// to a single entry in the feature x barcode matrix. -#[derive(Serialize, Deserialize, Clone, Copy, Ord, PartialOrd, Eq, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, Copy, Ord, PartialOrd, Eq, PartialEq)] pub struct FeatureBarcodeCount { pub barcode: Barcode, pub feature_idx: u32, @@ -448,13 +455,41 @@ enum_maker! { } enum_maker! { - /// Type of multiplexing, CMO or RTL. - CellMultiplexingType, - (CMO, "CMO"), + /// Multiplexing information encoded at the level of reads. + ReadLevel, (RTL, "RTL"), (OH, "OH") } +enum_maker! { + /// Multiplexing information encoded at the level of cells. + CellLevel, + (CMO, "CMO"), + (Hashtag, "Hashtag") +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[serde(untagged)] +pub enum BarcodeMultiplexingType { + CellLevel(CellLevel), + ReadLevel(ReadLevel), +} + +impl AsMartianPrimaryType for BarcodeMultiplexingType { + fn as_martian_primary_type() -> MartianPrimaryType { + MartianPrimaryType::Str + } +} + +impl fmt::Display for BarcodeMultiplexingType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + BarcodeMultiplexingType::CellLevel(cell) => cell.fmt(f), + BarcodeMultiplexingType::ReadLevel(read) => read.fmt(f), + } + } +} + enum_maker! { VdjChainType, (VdjT, "VDJ-T"), @@ -749,8 +784,8 @@ impl LibraryDef { /// are not tagged /// - `Tagged(GemWell, SampleBarcodeID)`: A subset of cells in a gem well /// which are tagged with a CMO with the given feature name -/// We can assume that no two samples within a multi run can share the same -/// `Fingerprint`. +/// We can assume that no two samples within a multi run can share the same +/// `Fingerprint`. #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum Fingerprint { Untagged { @@ -761,7 +796,7 @@ pub enum Fingerprint { tag_name: SampleBarcodeID, /// Sample barcodes that were dynamically translated into this tag. translated_tag_names: Vec, - cell_multiplexing_type: CellMultiplexingType, + barcode_multiplexing_type: BarcodeMultiplexingType, }, } @@ -774,13 +809,13 @@ impl Fingerprint { gem_well: GemWell, tag_name: SampleBarcodeID, translated_tag_names: Vec, - cell_multiplexing_type: CellMultiplexingType, + barcode_multiplexing_type: BarcodeMultiplexingType, ) -> Self { Self::Tagged { gem_well, tag_name, translated_tag_names, - cell_multiplexing_type, + barcode_multiplexing_type, } } @@ -810,26 +845,31 @@ impl Fingerprint { } } - pub fn cell_multiplexing_type(&self) -> Option { - match *self { + pub fn barcode_multiplexing_type(&self) -> Option { + match self { Fingerprint::Untagged { .. } => None, Fingerprint::Tagged { - cell_multiplexing_type, + barcode_multiplexing_type: cell_multiplexing_type, .. - } => Some(cell_multiplexing_type), + } => Some(*cell_multiplexing_type), } } pub fn is_cmo_multiplexed(&self) -> bool { - self.cell_multiplexing_type() == Some(CellMultiplexingType::CMO) + self.barcode_multiplexing_type() == Some(BarcodeMultiplexingType::CellLevel(CellLevel::CMO)) + } + + pub fn is_hashtag_multiplexed(&self) -> bool { + self.barcode_multiplexing_type() + == Some(BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag)) } pub fn is_rtl_multiplexed(&self) -> bool { - self.cell_multiplexing_type() == Some(CellMultiplexingType::RTL) + self.barcode_multiplexing_type() == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)) } pub fn is_overhang_multiplexed(&self) -> bool { - self.cell_multiplexing_type() == Some(CellMultiplexingType::OH) + self.barcode_multiplexing_type() == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::OH)) } } @@ -847,10 +887,10 @@ pub struct Sample { impl Sample { /// Returns the cell multiplexing type in use. /// Panics if more than one is found, which should be impossible. - pub fn cell_multiplexing_type(&self) -> Option { + pub fn barcode_multiplexing_type(&self) -> Option { self.fingerprints .iter() - .map(Fingerprint::cell_multiplexing_type) + .map(Fingerprint::barcode_multiplexing_type) .dedup() .exactly_one() .unwrap() @@ -1045,7 +1085,7 @@ pub struct CrMultiGraph { impl CrMultiGraph { /// Return true if this analysis is using any form of multiplexing. pub fn is_multiplexed(&self) -> bool { - self.cell_multiplexing_type().is_some() + self.barcode_multiplexing_type().is_some() } /// Return true if one or more libraries is of the specified type. @@ -1053,15 +1093,53 @@ impl CrMultiGraph { self.libraries.iter().any(|lib| lib.library_type == t) } + /// Return an iterator over all the library types in the experiment + pub fn library_types(&self) -> impl Iterator + '_ { + self.libraries.iter().map(|lib| lib.library_type) + } + /// Return the cell multiplexing type in use, if there is one. - pub fn cell_multiplexing_type(&self) -> Option { + pub fn barcode_multiplexing_type(&self) -> Option { self.samples .iter() - .map(Sample::cell_multiplexing_type) + .map(Sample::barcode_multiplexing_type) .dedup() .exactly_one() .unwrap() } + + /// Returns if the multiplexing type is read-level or not. + pub fn is_read_level_multiplexed(&self) -> bool { + matches!( + self.barcode_multiplexing_type(), + Some(BarcodeMultiplexingType::ReadLevel(_)) + ) + } + + /// Returns a map from demux tag name (e.g. OCM barcode ID or probe barcode ID) to sample ID information. + pub fn get_tag_name_to_sample_id_map( + &self, + ) -> anyhow::Result> { + self.samples + .iter() + .flat_map(|sample| { + sample.fingerprints.iter().map(|fingerprint| { + let Fingerprint::Tagged { + tag_name, + translated_tag_names, + .. + } = fingerprint + else { + bail!("found an untagged fingerprint when creating tag name map: {fingerprint:?}"); + }; + Ok(( + tag_name.as_str(), + (sample.sample_id.as_str(), translated_tag_names.as_slice()), + )) + }) + }) + .collect() + } } #[derive( @@ -1280,7 +1358,7 @@ mod py_api_tests { GemWell(1), "CMO500".into(), Vec::default(), - CellMultiplexingType::CMO, + BarcodeMultiplexingType::CellLevel(CellLevel::CMO), ), )?; @@ -1291,7 +1369,7 @@ mod py_api_tests { GemWell(2), "CMO500".into(), Vec::default(), - CellMultiplexingType::CMO, + BarcodeMultiplexingType::CellLevel(CellLevel::CMO), ), )?; @@ -1302,7 +1380,7 @@ mod py_api_tests { GemWell(1), "CMO501".into(), Vec::default(), - CellMultiplexingType::CMO, + BarcodeMultiplexingType::CellLevel(CellLevel::CMO), ), )?; @@ -1313,7 +1391,7 @@ mod py_api_tests { GemWell(2), "CMO501".into(), Vec::default(), - CellMultiplexingType::CMO, + BarcodeMultiplexingType::CellLevel(CellLevel::CMO), ), )?; diff --git a/lib/rust/cr_types/src/websummary.rs b/lib/rust/cr_types/src/websummary.rs index c95a3bf..5cdb5d5 100644 --- a/lib/rust/cr_types/src/websummary.rs +++ b/lib/rust/cr_types/src/websummary.rs @@ -1,7 +1,10 @@ //! Types shared between websummary derive macros and websummary construction. +use anyhow::{bail, ensure, Result}; use proc_macro2::TokenStream; use quote::quote; use serde::{Deserialize, Serialize}; +use std::collections::HashSet; +use std::iter::zip; #[derive(Serialize, Deserialize, Debug, Copy, Clone)] #[serde(rename_all = "snake_case")] @@ -23,64 +26,34 @@ impl quote::ToTokens for AlertIfMetricIs { } } -impl AlertIfMetricIs { - fn symbol(&self) -> proc_macro2::TokenStream { - match *self { - AlertIfMetricIs::GreaterThanOrEqual => quote![>=], - AlertIfMetricIs::LessThanOrEqual => quote![<=], - } - } -} - // Should be synced with the context in cr_websummary #[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct AlertConditions { - pub is_hybrid_capture: Option, pub is_rtl: Option, - pub is_lt_chemistry: Option, - pub is_arc_chemistry: Option, pub include_introns: Option, } impl AlertConditions { pub fn vec(&self) -> Vec> { let AlertConditions { - is_hybrid_capture, - is_lt_chemistry, - is_arc_chemistry, include_introns, is_rtl, } = self; - vec![ - *is_hybrid_capture, - *is_lt_chemistry, - *is_arc_chemistry, - *include_introns, - *is_rtl, - ] + vec![*include_introns, *is_rtl] } } impl quote::ToTokens for AlertConditions { fn to_tokens(&self, tokens: &mut TokenStream) { let Self { - is_hybrid_capture, is_rtl, - is_lt_chemistry, - is_arc_chemistry, include_introns, } = self; - let is_hybrid_capture = quote_option(is_hybrid_capture); let is_rtl = quote_option(is_rtl); - let is_lt_chemistry = quote_option(is_lt_chemistry); - let is_arc_chemistry = quote_option(is_arc_chemistry); let include_introns = quote_option(include_introns); tokens.extend(quote![ ::cr_types::websummary::AlertConditions { - is_hybrid_capture: #is_hybrid_capture, is_rtl: #is_rtl, - is_lt_chemistry: #is_lt_chemistry, - is_arc_chemistry: #is_arc_chemistry, include_introns: #include_introns, } ]); @@ -89,8 +62,6 @@ impl quote::ToTokens for AlertConditions { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct AlertConfig { - #[serde(default)] - pub rank: u8, pub error_threshold: Option, pub warn_threshold: Option, pub if_metric_is: Option, @@ -105,7 +76,6 @@ pub struct AlertConfig { impl quote::ToTokens for AlertConfig { fn to_tokens(&self, tokens: &mut TokenStream) { let Self { - rank, error_threshold, warn_threshold, if_metric_is, @@ -121,7 +91,6 @@ impl quote::ToTokens for AlertConfig { let error_title = quote_string_option(error_title); tokens.extend(quote![ ::cr_types::websummary::AlertConfig { - rank: #rank, error_threshold: #error_threshold, warn_threshold: #warn_threshold, if_metric_is: #if_metric_is, @@ -135,46 +104,40 @@ impl quote::ToTokens for AlertConfig { } impl AlertConfig { - pub fn symbol(&self, name: &str) -> proc_macro2::TokenStream { - match (self.error_threshold, self.warn_threshold) { - (Some(e), Some(w)) => { - assert!( - self.if_metric_is.is_none(), - "Do not specify `if_metric_is` in the alert for {name}. When both error and warn \ - thresholds are specified, it is automatically inferred." - ); + /// Return the comparison operation to determine if this alert should fire. + pub fn alert_if(&self) -> Result { + match (self.error_threshold, self.warn_threshold, self.if_metric_is) { + (Some(e), Some(w), None) => { if e < w { - quote![<=] + Ok(AlertIfMetricIs::LessThanOrEqual) } else if e > w { - quote![>=] + Ok(AlertIfMetricIs::GreaterThanOrEqual) } else { - panic!( - "ERROR: Error threshold ({e}) and warning threshold({w}) do not have \ - strict < or > relation for {name}" + bail!( + "error threshold ({e}) and warning threshold({w}) do not \ + have a strict < or > relation" ); } } - (Some(_), None) => { - assert!( - self.if_metric_is.is_some(), - "Please specify `if_metric_is` in the alert for {name} as one of \ - \"greater_than_or_equal\" or \"less_than_or_equal\". With only an error threshold \ - specified, it cannot be automatically inferred." + (Some(_), None, Some(if_metric_is)) | (None, Some(_), Some(if_metric_is)) => { + Ok(if_metric_is) + } + (Some(_), Some(_), Some(_)) => { + bail!( + "do not specify `if_metric_is` when both error and warn thresholds are \ + specified as it is automatically inferred" ); - self.if_metric_is.unwrap().symbol() } - (None, Some(_)) => { - assert!( - self.if_metric_is.is_some(), - "Please specify `if_metric_is` in the alert for {name} as one of \ - \"greater_than_or_equal\" or \"less_than_or_equal\". With only a warn threshold \ - specified, it cannot be automatically inferred." + (Some(_), None, None) | (None, Some(_), None) => { + bail!( + "please specify `if_metric_is` in the alert as one of \ + \"greater_than_or_equal\" or \"less_than_or_equal\"; with only a single threshold \ + specified, it cannot be automatically inferred" ); - self.if_metric_is.unwrap().symbol() } - (None, None) => panic!( - "At least one of error_threshold or warn_threshold needs to be specified \ - in the alert for {name}" + (None, None, _) => bail!( + "at least one of error_threshold or warn_threshold needs to be specified \ + in the alert" ), } } @@ -213,6 +176,27 @@ pub struct MetricConfig { pub alerts: Vec, } +impl MetricConfig { + pub fn validate(&self) -> Result<()> { + // Ensure that expected transformed type is compatible with alerts. + // FIXME extract transformer keys as constants. + ensure!( + self.alerts.is_empty() || self.ty != "String", + "metric \"{}\" cannot be used in alerts", + self.header, + ); + + let conditions: Vec<_> = self.alerts.iter().map(|a| &a.conditions).collect(); + ensure!( + check_exclusive_conditions(&conditions), + "The conditions for for the metric {} are not exclusive:\n{conditions:#?}.\ + \n Please specify mutually exclusive conditions for each alert.", + &self.header + ); + Ok(()) + } +} + impl quote::ToTokens for MetricConfig { fn to_tokens(&self, tokens: &mut TokenStream) { let Self { @@ -240,6 +224,31 @@ impl quote::ToTokens for MetricConfig { } } +fn check_exclusive_conditions(conditions: &[&AlertConditions]) -> bool { + if conditions.len() < 2 { + return true; + } + let first = conditions[0].vec(); + let mut seen_ids = HashSet::with_capacity(conditions.len()); + for cond in conditions { + let cond_vec = cond.vec(); + let mut this_id = Vec::new(); + for (left, right) in zip(&first, cond_vec) { + // Both should be None or Some + match (left, right) { + (Some(_), Some(r)) => this_id.push(r), + (None, None) => {} + _ => return false, + } + } + if seen_ids.contains(&this_id) { + return false; + } + seen_ids.insert(this_id); + } + true +} + fn quote_option(arg: &Option) -> proc_macro2::TokenStream { match arg { None => quote![None], @@ -253,3 +262,53 @@ fn quote_string_option(arg: &Option) -> proc_macro2::TokenStream { Some(x) => quote![Some(#x.to_string())], } } + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_check_exclusive_contexts() { + assert!(check_exclusive_conditions(&[])); + assert!(check_exclusive_conditions(&[&AlertConditions { + is_rtl: None, + include_introns: None + }])); + assert!(check_exclusive_conditions(&[&AlertConditions { + is_rtl: None, + include_introns: None + }])); + + assert!(!check_exclusive_conditions(&[ + &AlertConditions { + is_rtl: None, + include_introns: None + }, + &AlertConditions { + include_introns: None, + is_rtl: None + } + ])); + + assert!(check_exclusive_conditions(&[ + &AlertConditions { + is_rtl: Some(true), + include_introns: None + }, + &AlertConditions { + is_rtl: Some(false), + include_introns: None + } + ])); + + assert!(!check_exclusive_conditions(&[ + &AlertConditions { + is_rtl: Some(true), + include_introns: None + }, + &AlertConditions { + is_rtl: Some(true), + include_introns: None + } + ])); + } +} diff --git a/lib/rust/cr_vdj/Cargo.toml b/lib/rust/cr_vdj/Cargo.toml index c404bde..bae2fba 100644 --- a/lib/rust/cr_vdj/Cargo.toml +++ b/lib/rust/cr_vdj/Cargo.toml @@ -3,17 +3,21 @@ name = 'cr_vdj' test = false [dependencies] -docopt = '1' - [dependencies.anyhow] workspace = true [dependencies.clonotype_assigner] path = '../clonotype_assigner' -[dependencies.enclone_core] +[dependencies.cr_lib] +path = '../cr_lib' + +[dependencies.docopt] workspace = true +[dependencies.enclone_core] +path = '../enclone_core' + [dependencies.hdf5] workspace = true @@ -58,15 +62,14 @@ features = ['derive'] workspace = true [dependencies.vdj_ann] -workspace = true +path = '../vdj_ann' [dependencies.vdj_asm_asm] default-features = false path = '../vdj_asm_asm' -[dependencies.vdj_asm_utils] -default-features = false -path = '../vdj_asm_utils' +[dependencies.vdj_filter_barcodes] +path = '../vdj_filter_barcodes' [dependencies.websummary_build] path = '../websummary_build' diff --git a/lib/rust/cr_vdj/src/bin/cr_vdj.rs b/lib/rust/cr_vdj/src/bin/cr_vdj.rs index e3bffe5..247097e 100644 --- a/lib/rust/cr_vdj/src/bin/cr_vdj.rs +++ b/lib/rust/cr_vdj/src/bin/cr_vdj.rs @@ -88,8 +88,11 @@ fn main() -> Result<()> { clonotype_assigner::write_concat_ref_outs::WriteConcatRefOuts, clonotype_assigner::write_consensus_bam::WriteConsensusBam, clonotype_assigner::write_consensus_txt::WriteConsensusTxt, + clonotype_assigner::run_enclone_aggr::RunEncloneAggr, vdj_asm_asm::Assembly, vdj_asm_asm::asm_call_cells::AsmCallCells, + vdj_asm_asm::make_exact_clonotypes::MakeExactClonotypes, + vdj_asm_asm::filter_exact_clonotypes::FilterExactClonotypes, vdj_asm_asm::airrfilter::AirrFilter, vdj_asm_asm::write_contig_outs::WriteContigOuts, vdj_asm_asm::handle_gex_cells::HandleGexCells, @@ -97,6 +100,7 @@ fn main() -> Result<()> { vdj_asm_asm::merge_per_sample_annotations::MergePerSampleAnnotations, vdj_asm_asm::write_ann_csv::WriteAnnCsv, vdj_asm_asm::subset_assembly_outs::SubsetAssemblyOuts, + vdj_asm_asm::asm_metrics::AsmMetrics, ]; if args.cmd_martian { diff --git a/lib/rust/cr_vdj/src/summarize_vdj_filters.rs b/lib/rust/cr_vdj/src/summarize_vdj_filters.rs index 7f8314b..1802f0a 100644 --- a/lib/rust/cr_vdj/src/summarize_vdj_filters.rs +++ b/lib/rust/cr_vdj/src/summarize_vdj_filters.rs @@ -2,17 +2,17 @@ use crate::matrix::{gex_umi_counts_per_barcode, H5File}; use anyhow::Result; +use cr_lib::parquet_file::{ParquetFile, ParquetWriter, PerBarcodeFilter}; use enclone_core::barcode_fate::BarcodeFate; use itertools::Itertools; use martian::prelude::*; use martian_derive::{make_mro, martian_filetype, MartianStruct}; use martian_filetypes::json_file::JsonFile; -use martian_filetypes::lz4_file::Lz4; use martian_filetypes::tabular_file::CsvFile; use martian_filetypes::{FileTypeRead, FileTypeWrite, LazyFileTypeIO}; use metric::{AsMetricPrefix, TxHashMap}; use plotly::color::Rgba; -use plotly::common::{Marker, TextPosition, Title}; +use plotly::common::{Marker, TextPosition}; use plotly::layout::{Axis, AxisType, BarMode, HoverMode}; use plotly::{Bar, Layout, Scatter}; use rand::rngs::StdRng; @@ -27,7 +27,7 @@ use tenx_websummary::components::{HeroMetric, PlotlyChart, TitleWithHelp, WithTi use tenx_websummary::{HtmlTemplate, SinglePageHtml}; use vdj_ann::annotate::ContigAnnotation; use vdj_asm_asm::write_ann_csv::ContigAnnotationCsvRow; -use vdj_asm_utils::filter_log::FilterLogEntry; +use vdj_filter_barcodes::filter_log::{FilterLogEntry, VdjFilterLogFormat}; struct Cdr3Info { cdr3_aa: String, @@ -208,6 +208,7 @@ pub struct WebSummaryContent { pub struct FilterSummary { pub html: SinglePageHtml, pub metrics: VdjFilterMetrics, + pub per_barcode_filters: Vec, } pub enum Annotations { @@ -233,9 +234,14 @@ impl Annotations { } } fn _load_enclone_barcode_fate(bc_fate: &Path) -> Result> { - let mut filters: Vec> = JsonFile::from(bc_fate).read()?; - assert_eq!(filters.len(), 1); - Ok(filters.pop().unwrap()) + let filters_vec: Vec> = JsonFile::from(bc_fate).read()?; + let mut filters: HashMap = HashMap::new(); + for map in filters_vec { + for (bc, fate) in map { + filters.insert(bc, fate); + } + } + Ok(filters) } fn _load_barcode_info_from_json( @@ -247,7 +253,7 @@ impl Annotations { for ann in contig_reader { let ann: ContigAnnotation = ann?; if ann.is_productive() { - let enclone_fate = enclone_filters.get(&ann.barcode).cloned(); + let enclone_fate = enclone_filters.get(&ann.barcode).copied(); let chain_type = ann.chain_type().unwrap(); let e = barcode_info.entry(ann.barcode).or_insert(BarcodeInfo { is_cell: ann.is_cell, @@ -327,9 +333,10 @@ pub fn generate_filter_summary( analysis_id: &str, description: Option<&str>, annotations: Annotations, - filter_diagnostics_path_opt: Option<&Lz4>>>, + filter_diagnostics_path_opt: Option<&VdjFilterLogFormat>, raw_matrix_h5: Option<&H5File>, ) -> Result { + // Keys are valid barcodes across the whole library let asm_filters = match filter_diagnostics_path_opt { Some(filter_diagnostics_path) => { let filter_reader = filter_diagnostics_path.lazy_reader()?; @@ -348,12 +355,27 @@ pub fn generate_filter_summary( None => None, }; + // Keys are valid barcodes restricted to this sample let (barcode_info, enclone_filters) = annotations.load()?; + let vdj_filters_per_barcode = asm_filters + .as_ref() + .map_or(Vec::::new(), |asm_filters| { + make_vdj_filters_per_barcode(asm_filters, &barcode_info) + }); + + // Match definition of BarcodeCategory::AsmFilter i.e. barcodes filtered only by the assembler let barcodes_per_asm_filter: Option> = asm_filters.as_ref().map(|filters| { filters .iter() - .filter_map(|(bc, f)| barcode_info.contains_key(bc).then_some(f)) + .filter_map(|(bc, f)| { + if let Some(info) = barcode_info.get(bc) { + if info.is_gex_cell.unwrap_or(true) { + return Some(f); + } + } + None + }) .flatten() .counts() .into_iter() @@ -647,6 +669,7 @@ pub fn generate_filter_summary( .collect(), unique_cdr3s_per_chain, }, + per_barcode_filters: vdj_filters_per_barcode, }) } @@ -656,8 +679,8 @@ fn make_unique_cdr3s_plot(unique_cdr3s_per_chain: &HashMap) -> Plot PlotlyChart::with_layout_and_data( Layout::new() - .x_axis(Axis::new().title(Title::new("Chain"))) - .y_axis(Axis::new().title(Title::new("Unique CDR3s"))) + .x_axis(Axis::new().title("Chain")) + .y_axis(Axis::new().title("Unique CDR3s")) .hover_mode(HoverMode::X), vec![Bar::new(chains, unique_cdr3s)], ) @@ -703,7 +726,7 @@ fn binned_hist( bin_width: f64, ) -> (Vec, Vec, Vec) { let get_index = |value: f64| (value / bin_width).floor() as usize; - let get_mid_x = |index: usize| index as f64 * bin_width + bin_width / 2.; + let get_mid_x = |index: usize| bin_width * (index as f64 + 0.5); let get_umi_range_txt = |index: usize| { let start = bin_width * index as f64; let end = start + bin_width; @@ -748,8 +771,8 @@ fn make_umi_histogram( }; let layout = Layout::new() - .x_axis(Axis::new().title(Title::new("Log10(1+ UMIs)"))) - .y_axis(Axis::new().title(Title::new("Frequency"))) + .x_axis(Axis::new().title("Log10(1+ UMIs)")) + .y_axis(Axis::new().title("Frequency")) .bar_mode(BarMode::Overlay) .hover_mode(HoverMode::X); @@ -841,8 +864,8 @@ fn make_contigs_per_barcode_plot( PlotlyChart::with_layout_and_data( Layout::new() - .x_axis(Axis::new().title(Title::new("Number of productive contigs"))) - .y_axis(Axis::new().title(Title::new("Frequency"))) + .x_axis(Axis::new().title("Number of productive contigs")) + .y_axis(Axis::new().title("Frequency")) .bar_mode(BarMode::Stack) .hover_mode(HoverMode::X), data, @@ -901,15 +924,11 @@ fn make_cdr3_plots( Layout::new() .x_axis( Axis::new() - .title(Title::new("CDR3 Amino acid")) + .title("CDR3 Amino acid") .tick_values((0..N_CDR3).map(|i| i as f64).collect()) .tick_text(top_cdr3s.clone()), ) - .y_axis( - Axis::new() - .title(Title::new("UMI Counts")) - .type_(AxisType::Log), - ), + .y_axis(Axis::new().title("UMI Counts").type_(AxisType::Log)), umi_scatters, ); @@ -956,8 +975,8 @@ fn cdr3_frequency_plot( .collect(); PlotlyChart::with_layout_and_data( Layout::new() - .x_axis(Axis::new().title(Title::new("CDR3 Amino acid"))) - .y_axis(Axis::new().title(Title::new("Frequency"))) + .x_axis(Axis::new().title("CDR3 Amino acid")) + .y_axis(Axis::new().title("Frequency")) .bar_mode(BarMode::Stack) .hover_mode(HoverMode::X), frequency_bars, @@ -998,20 +1017,69 @@ fn make_gex_vdj_umi_scatter( PlotlyChart::with_layout_and_data( Layout::new() - .x_axis( - Axis::new() - .title(Title::new("VDJ UMIs")) - .type_(AxisType::Log), - ) - .y_axis( - Axis::new() - .title(Title::new("GEX UMIs")) - .type_(AxisType::Log), - ), + .x_axis(Axis::new().title("VDJ UMIs").type_(AxisType::Log)) + .y_axis(Axis::new().title("GEX UMIs").type_(AxisType::Log)), data, ) } +fn make_vdj_filters_per_barcode( + asm_filters: &HashMap>, + barcode_info: &HashMap, +) -> Vec { + let mut bc_filters: Vec = Vec::new(); + for (bc, info) in barcode_info { + let mut this_bc = PerBarcodeFilter { + barcode: bc.clone(), + is_cell: info.is_cell, + is_gex_cell: info.is_gex_cell, + is_asm_cell: info.is_asm_cell, + low_umi: false, + no_v_region: false, + low_junction_support: false, + no_conf_contig: false, + low_rpu: false, + non_dominant_junction: false, + weak_junction: false, + chimeric: false, + common_clone: false, + gel_bead_contamination: false, + gel_bead_indel: None, + enclone_fate: info.enclone_fate.map(|f| f.label().to_string()), + insert_priming: false, + }; + // Evaluate state of per barcode assembly filters + if let Some(filters) = asm_filters.get(bc) { + // filters scoped at the barcode level + this_bc.low_umi = filters.contains(&"LOW_UMI"); + this_bc.no_v_region = filters.contains(&"NO_V_REGION"); + this_bc.low_junction_support = filters.contains(&"LOW_JUNCTION_SUPPORT"); + this_bc.no_conf_contig = filters.contains(&"NO_CONF_CONTIG"); + this_bc.low_rpu = filters.contains(&"LOW_RPU"); + + // filters scoped at contig level and restricted to bcs that passed + let was_excluded = this_bc.low_umi + || this_bc.no_v_region + || this_bc.low_junction_support + || this_bc.no_conf_contig + || this_bc.low_rpu; + if !was_excluded { + this_bc.gel_bead_indel = Some(filters.contains(&"GB_INDEL")); + } + + // filters scoped across the library level + this_bc.non_dominant_junction = filters.contains(&"NON_DOMINANT_JUNCTION"); + this_bc.weak_junction = filters.contains(&"WEAK_JUNCTION"); + this_bc.chimeric = filters.contains(&"CHIMERIC"); + this_bc.common_clone = filters.contains(&"COMMON_CLONE"); + this_bc.gel_bead_contamination = filters.contains(&"GB_CONTAMINATION"); + this_bc.insert_priming = filters.contains(&"INSERT_PRIMING"); + } + + bc_filters.push(this_bc); + } + bc_filters +} martian_filetype! {HtmlFile, "html"} #[derive(Clone, Deserialize, MartianStruct)] @@ -1019,7 +1087,7 @@ pub struct SummarizeVdjFiltersStageInputs { sample_id: String, sample_description: Option, all_contig_annotations: JsonFile>, - asm_filter_diagnostics: Option>>>, + asm_filter_diagnostics: Option, enclone_barcode_fate: JsonFile<()>, raw_matrix_h5: Option, } @@ -1028,6 +1096,7 @@ pub struct SummarizeVdjFiltersStageInputs { pub struct SummarizeVdjFiltersStageOutputs { filter_summary: HtmlFile, metrics_summary: JsonFile, + per_bc_filters: ParquetFile, } pub struct SummarizeVdjFilters; @@ -1038,7 +1107,11 @@ impl MartianMain for SummarizeVdjFilters { type StageOutputs = SummarizeVdjFiltersStageOutputs; fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { - let FilterSummary { html, metrics } = generate_filter_summary( + let FilterSummary { + html, + metrics, + per_barcode_filters, + } = generate_filter_summary( &args.sample_id, args.sample_description.as_deref(), Annotations::json(&args.all_contig_annotations, &args.enclone_barcode_fate), @@ -1056,9 +1129,15 @@ impl MartianMain for SummarizeVdjFilters { let metrics_summary: JsonFile<_> = rover.make_path("metrics_summary"); metrics_summary.write(&metrics)?; + let per_bc_filter_pq: ParquetFile = rover.make_path("per_bc_filter"); + let mut pq_writer: ParquetWriter = + per_bc_filter_pq.writer(PerBarcodeFilter::ROW_GROUP_SIZE)?; + pq_writer.write_all(&per_barcode_filters)?; + Ok(SummarizeVdjFiltersStageOutputs { filter_summary: filter_summary_html, metrics_summary, + per_bc_filters: per_bc_filter_pq, }) } } diff --git a/lib/rust/cr_websummary/Cargo.toml b/lib/rust/cr_websummary/Cargo.toml index 7d2a0e4..905f221 100644 --- a/lib/rust/cr_websummary/Cargo.toml +++ b/lib/rust/cr_websummary/Cargo.toml @@ -1,20 +1,22 @@ [dependencies] -csv = '1' -thousands = '0.2' - [dependencies.anyhow] workspace = true [dependencies.cr_types] path = '../cr_types' +[dependencies.csv] +workspace = true + [dependencies.hclust] -branch = 'main' -git = 'https://github.com/10XGenomics/scan-rs' +workspace = true [dependencies.itertools] workspace = true +[dependencies.log] +workspace = true + [dependencies.martian-filetypes] workspace = true @@ -25,16 +27,13 @@ path = '../metric' workspace = true [dependencies.ordered-float] -features = ['serde'] -version = '3' +workspace = true [dependencies.plotly] workspace = true [dependencies.regex] -default-features = false -features = ['std', 'perf'] -version = '1' +workspace = true [dependencies.serde] workspace = true @@ -45,6 +44,16 @@ workspace = true [dependencies.statrs] workspace = true +[dependencies.tenx-websummary] +features = ['derive'] +workspace = true + +[dependencies.thousands] +workspace = true + +[dependencies.toml] +workspace = true + [dependencies.websummary_derive] path = '../websummary_derive' diff --git a/lib/rust/cr_websummary/src/alert.rs b/lib/rust/cr_websummary/src/alert.rs index 54e7cdc..0d8f551 100644 --- a/lib/rust/cr_websummary/src/alert.rs +++ b/lib/rust/cr_websummary/src/alert.rs @@ -2,9 +2,11 @@ //! Alarms in the websummary (aka alerts) //! +use cr_types::LibraryType; use serde::Serialize; +use std::collections::HashSet; -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "UPPERCASE")] pub enum AlertLevel { Error, @@ -31,7 +33,7 @@ pub enum AlertLevel { /// ``` /// Only the fields `level`, `title`, `formatted_value` and `message` are used in the web summary /// react code. -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, PartialEq, Eq, PartialOrd, Ord)] pub struct AlertSpec { pub level: AlertLevel, pub title: String, @@ -41,14 +43,15 @@ pub struct AlertSpec { /// Common alert configuration data that may be relevant in many contexts. #[derive(Debug, Clone, Default)] +// TODO: clean up redundant AlertContexts CELLRANGER-8969 pub struct AlertContext { - pub is_hybrid_capture: bool, pub is_rtl: bool, - pub is_lt_chemistry: bool, - pub is_arc_chemistry: bool, + pub is_arc_chemistry: bool, // TODO CELLRANGER-8969 + pub library_types: HashSet, + pub multiplexing_method: Option, pub is_fiveprime: bool, - pub is_multiplexing: bool, - pub is_antigen: bool, + pub is_cmo_multiplexed: bool, // TODO CELLRANGER-8969 + pub is_hashtag_multiplexed: bool, // TODO CELLRANGER-8969 pub include_introns: bool, pub no_preflight: bool, } diff --git a/lib/rust/cr_websummary/src/lib.rs b/lib/rust/cr_websummary/src/lib.rs index 84a9cc6..7d38b53 100644 --- a/lib/rust/cr_websummary/src/lib.rs +++ b/lib/rust/cr_websummary/src/lib.rs @@ -8,7 +8,7 @@ use alert::{Alert, AlertContext, AlertLevel, AlertSpec}; use anyhow::Result; use metric::{PercentMetric, TxHashMap}; use multi::websummary::{JsonMetricSummary, ToCsvRows, ToJsonSummary}; -use plotly::common::{Anchor, Title}; +use plotly::common::Anchor; use plotly::layout::{Axis, AxisType, HoverMode, Legend}; use plotly::Layout; use serde::{Deserialize, Serialize}; @@ -19,16 +19,6 @@ use std::iter::zip; use std::str::FromStr; use thousands::Separable; -const TABLE_HEADER_METRIC_KEYS: [&str; 7] = [ - "Physical library ID", - "Fastq ID", - "CMO Name", - "Probe barcode ID", - "Genome", - "Targeting Status", - "Feature Type", -]; - #[derive(Debug, Serialize, Deserialize, Clone)] pub enum WsCommand { #[serde(rename = "Cell Ranger")] @@ -114,14 +104,14 @@ impl Tab { } impl ToCsvRows for Tab { - fn to_csv_rows(self) -> Vec> { + fn to_csv_rows(&self) -> Vec> { self.content.to_csv_rows() } } impl ToJsonSummary for Tab { - fn to_json_summary(&self) -> Vec { - self.content.to_json_summary() + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { + self.content.to_json_summary(ctx) } } @@ -180,9 +170,6 @@ impl PrettyMetric { PrettyMetric(src.separate_with_commas()) } pub fn percent(m: f64) -> Self { - PrettyMetric(format!("{:.2}%", 100.0 * m)) - } - pub fn percent_f1(m: f64) -> Self { PrettyMetric(format!("{:.1}%", 100.0 * m)) } pub fn count_and_percent(m: PercentMetric) -> Self { @@ -252,61 +239,80 @@ impl From> for TableRow { } } +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct GroupingHeader { + header: String, + optional: bool, +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct GenericTable { #[serde(skip_serializing_if = "Option::is_none")] pub header: Option>, pub rows: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub grouping_header: Option, } impl ToCsvRows for GenericTable { - fn to_csv_rows(self) -> Vec> { - let mut csv_rows: Vec> = vec![]; - + fn to_csv_rows(&self) -> Vec> { let table_header = self .header + .as_ref() .expect("No header for table being converted to CSV."); if table_header.is_empty() { - return csv_rows; + return vec![]; } - if TABLE_HEADER_METRIC_KEYS - .iter() - .any(|x| *x == table_header[0]) - { - // in this case, the metric table has a key in the first column such as "Physical Library ID" - // we write one CSV column that says what type of ID/key it is (Physical library ID, Fastq ID, etc) - // and another CSV column that specifies that ID/key itself - let metric_key_type: String = table_header[0].clone(); // e.g. "Physical library ID" - for table_row in self.rows { - let metric_key: String = table_row.0[0].clone(); // e.g. "GEX_1" - // header value and metric value for rest of columns (non-key columns) - for (metric_name, metric_val) in zip(&table_header[1..], &table_row.0[1..]) { - let csv_row: Vec = vec![ - metric_key_type.clone(), - metric_key.clone(), - metric_name.clone(), - metric_val.clone(), - ]; - csv_rows.push(csv_row); - } + if let Some(gh) = &self.grouping_header { + if let Some(grouping_header_pos) = table_header.iter().position(|h| h == &gh.header) { + // in this case, the metric table has a key such as "Physical Library ID" + // we write one CSV column that says what type of ID/key it is (Physical library ID, Fastq ID, etc) + // and another CSV column that specifies that ID/key itself + return self + .rows + .iter() + .flat_map(|table_row| { + let grouping_val = table_row.0[grouping_header_pos].clone(); // e.g. "GEX_1" + let grouping_header = &gh.header; + zip(table_header, &table_row.0).enumerate().filter_map( + move |(i, (metric_name, metric_val))| { + // Do not output a row for the grouping header/value since + // it is included with all the other metrics. + if i == grouping_header_pos { + return None; + } + Some(vec![ + grouping_header.clone(), // e.g. "Physical library ID" + grouping_val.clone(), + metric_name.clone(), + metric_val.clone(), + ]) + }, + ) + }) + .collect(); } - } else { - // in this case, the table has no "key" in the first column and the metrics are free-standing. - for table_row in self.rows { - // header value and metric value for rest of columns (non-key columns) - for (metric_name, metric_val) in zip(&table_header, &table_row.0) { - let csv_row: Vec = vec![ + assert!( + gh.optional, + "required grouping header {} not found in header {table_header:?}", + gh.header + ); + } + + // In this case, the table has no grouping key (or it's optional and not present) and the metrics are free-standing. + self.rows + .iter() + .flat_map(|table_row| { + zip(table_header, &table_row.0).map(|(metric_name, metric_val)| { + vec![ String::default(), String::default(), metric_name.clone(), metric_val.clone(), - ]; - csv_rows.push(csv_row); - } - } - } - - csv_rows + ] + }) + }) + .collect() } } @@ -339,14 +345,14 @@ pub struct MetricCard + ToJsonSummary> { } impl + ToJsonSummary> ToCsvRows for MetricCard { - fn to_csv_rows(self) -> Vec> { + fn to_csv_rows(&self) -> Vec> { self.card.table.to_csv_rows() } } impl + ToJsonSummary> ToJsonSummary for MetricCard { - fn to_json_summary(&self) -> Vec { - self.raw.to_json_summary() + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { + self.raw.to_json_summary(ctx) } } @@ -433,12 +439,8 @@ impl PlotlyChart { .show_legend(true) .margin(plotly::layout::Margin::new().right(40).left(60).top(0)) .hover_mode(HoverMode::Closest) - .x_axis( - Axis::new() - .type_(AxisType::Category) - .title(Title::new(&x_label)), - ) - .y_axis(Axis::new().title(Title::new(&y_label))) + .x_axis(Axis::new().type_(AxisType::Category).title(x_label)) + .y_axis(Axis::new().title(y_label)) .legend( Legend::new() .y_anchor(Anchor::Top) @@ -455,16 +457,6 @@ impl PlotlyChart { #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] pub struct CountAndPercent(pub PercentMetric); -// a wrapper type for Percents with only 1 decimal place precision -#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq)] -pub struct PercentF1(pub Percent); - -impl From for PercentF1 { - fn from(src: PercentMetric) -> Self { - PercentF1(Percent::Metric(src)) - } -} - pub trait MakePretty { fn make_pretty(&self) -> String; fn as_f64(&self) -> f64; @@ -527,27 +519,6 @@ impl MakePretty for CountAndPercent { } } -impl MakePretty for PercentF1 { - fn make_pretty(&self) -> String { - match &self.0 { - Percent::Metric(m) => match m.fraction() { - Some(f) => PrettyMetric::percent_f1(f).0, - None => "---%".to_string(), - }, - Percent::Float(f) => PrettyMetric::percent(*f).0, - } - } - fn as_f64(&self) -> f64 { - match &self.0 { - Percent::Metric(m) => match m.fraction() { - Some(f) => f, - None => f64::NAN, - }, - Percent::Float(f) => *f, - } - } -} - impl MakePretty for f64 { fn make_pretty(&self) -> String { PrettyMetric::decimal(*self).0 @@ -625,6 +596,7 @@ macro_rules! card_with_table { let table = GenericTable { header: Some(vec![$($col_header.to_string(),)*]), rows: src.0.into_iter().map(|row| row.into()).collect(), + grouping_header: None, }; let help = TitleWithHelp { title: $card_title.to_string(), diff --git a/lib/rust/cr_websummary/src/multi/antigen.rs b/lib/rust/cr_websummary/src/multi/antigen.rs index 807ae96..02b6fe6 100644 --- a/lib/rust/cr_websummary/src/multi/antigen.rs +++ b/lib/rust/cr_websummary/src/multi/antigen.rs @@ -7,7 +7,7 @@ use martian_filetypes::tabular_file::CsvFile; use martian_filetypes::FileTypeRead; use ndarray::Array2; use ordered_float::OrderedFloat; -use plotly::common::{ColorBar, ColorScale, ColorScaleElement, Title}; +use plotly::common::{ColorBar, ColorScale, ColorScaleElement}; use plotly::layout::{Axis, AxisType}; use plotly::{HeatMap, Layout}; use serde::{Deserialize, Serialize}; @@ -211,7 +211,7 @@ impl ClonotypeSpecificity { let x = clonotypes .into_iter() - .map(|cl| cl.parse::().unwrap().id.to_string()) + .map(|cl| ClonotypeId::parse(&cl).unwrap().id.to_string()) .collect(); // Unnecessary duplication here since the text needs to be per z-value @@ -230,7 +230,7 @@ impl ClonotypeSpecificity { .hover_template( "Clonotype: %{x} (%{text} cells)
Antigen: %{y}
Median specificity score: %{z}", ) - .color_bar(ColorBar::new().title(Title::new("Antigen Specificity Score")).outline_width(0)) + .color_bar(ColorBar::new().title("Antigen Specificity Score").outline_width(0)) .color_scale(tenx_blue_colorscale()) .name(""), ) @@ -249,12 +249,10 @@ impl ClonotypeSpecificity { .x_axis( Axis::new() .fixed_range(false) - .title(Title::new(&format!( - "Clonotype ID ({n_clonotypes} clonotypes)" - ))) + .title(format!("Clonotype ID ({n_clonotypes} clonotypes)")) .type_(AxisType::Category), ) - .y_axis(Axis::new().auto_margin(true).title(Title::new("Antigens"))), + .y_axis(Axis::new().auto_margin(true).title("Antigens")), vec![data], ); @@ -331,7 +329,7 @@ mod tests { raw_clonotype_id: Some( ClonotypeId { id: 1, - sample_number: None, + sample_id: None, } .to_string() ), diff --git a/lib/rust/cr_websummary/src/multi/metrics.rs b/lib/rust/cr_websummary/src/multi/metrics.rs new file mode 100644 index 0000000..733483a --- /dev/null +++ b/lib/rust/cr_websummary/src/multi/metrics.rs @@ -0,0 +1,265 @@ +//! Process a specification file into a metrics ETL operation. +//! NOTE: this currently parses the tables.toml format. +//! This will be refactored along with the format of that file to be intrinsically +//! flat, without any explicit table structure. + +use super::websummary::JsonMetricSummary; +use crate::value::TryFromValue; +use crate::{FloatAsInt, Percent}; +use anyhow::{bail, Result}; +use cr_types::websummary::MetricConfig; +use cr_types::LibraryType; +use serde::Deserialize; +use serde_json::Value; +use std::collections::{BTreeMap, HashMap, HashSet}; +use toml; + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "lowercase")] +pub enum MetricTier { + Library, + Sample, +} +#[derive(Default, Debug, Deserialize)] +pub struct MetricConditions { + pub library_types: Vec, + pub is_cmo_multiplexed: Option, + /// Covers both RTL and OCM multiplexing. + pub is_read_multiplexed: Option, + pub is_rtl: Option, + pub has_gdna: Option, + pub include_introns: Option, +} + +fn matches_option(opt: Option, val: bool) -> bool { + opt.map_or(true, |v| v == val) +} + +impl MetricConditions { + pub fn matches(&self, cond: &ActiveConditions) -> bool { + self.matches_library_types(&cond.library_types) + && matches_option(self.is_cmo_multiplexed, cond.is_cmo_multiplexed) + && matches_option(self.is_read_multiplexed, cond.is_read_multiplexed) + && matches_option(self.is_rtl, cond.is_rtl) + && matches_option(self.has_gdna, cond.has_gdna) + } + + fn matches_library_types(&self, types: &HashSet) -> bool { + if self.library_types.is_empty() { + return true; + } + self.library_types + .iter() + .any(|lib_type| types.contains(lib_type)) + } +} + +#[derive(Default)] +pub struct ActiveConditions { + pub library_types: HashSet, + pub is_cmo_multiplexed: bool, + pub is_read_multiplexed: bool, + pub is_rtl: bool, + pub has_gdna: bool, + pub include_introns: bool, +} + +#[allow(unused)] +#[derive(Deserialize, Debug)] +pub struct CardWithTableToml { + title: String, + help: Option, + tier: MetricTier, + #[serde(default)] + conditions: MetricConditions, + entries: Vec, + /// table that can be used to group the metrics from the individual rows + /// together. This is a stopgap solution until we refactor tables to not be + /// table-structured. + /// + /// The value associated with the key column will be extracted and added to + /// every metric in the row when we output flattened JSON metrics. + /// + /// This mechanism is also used to populate the first two columns in the + /// metrics CSV output, so most tables should specify this key even if + /// they are only going to have one row in the websummary. + #[serde(default)] + group_by_key: Option, + #[serde(flatten)] + entry_info: BTreeMap, +} + +impl CardWithTableToml { + fn validate(&self) { + for e in &self.entries { + assert!( + self.entry_info.contains_key(e), + "Information for {} does not exist in table '{}'", + e, + self.title + ); + } + assert!( + self.entries.len() == self.entry_info.len(), + "Duplicate entries listed under table '{}'", + &self.title + ); + if let Some(group_by_key) = &self.group_by_key { + assert!( + self.entries.contains(group_by_key), + "group_by_key {group_by_key} is not present among the entries for table '{}'", + self.title + ); + } + for cfg in self.entry_info.values() { + cfg.validate().unwrap(); + } + } +} + +pub fn load_tables() { + let content = include_str!("tables.toml"); + + let parsed: BTreeMap = toml::from_str(content).unwrap(); + + for table in parsed.values() { + table.validate(); + process_table_metrics( + table, + &Default::default(), + &HashMap::new(), + &Transformers::default(), + ) + .unwrap(); + } + + // let mut keys: HashMap = HashMap::new(); + + // for (table_key, table) in parsed { + // table.validate(); + // for (key, _entry) in table.entry_info { + // if keys.contains_key(&key) { + // println!( + // "duplicate key: {key} from tables: {table_key}, {}", + // keys[&key] + // ); + // } + // keys.insert(key.clone(), table_key.clone()); + // } + // } +} + +pub type Transformer = Box Result>; + +pub struct Transformers(HashMap); + +impl Transformers { + pub fn add(&mut self, key: &str, f: impl Fn(&Value) -> Result + 'static) { + self.0.insert(key.to_string(), Box::new(f)); + } + + pub fn get(&self, key: &str) -> Option<&Transformer> { + self.0.get(key) + } +} + +impl Default for Transformers { + fn default() -> Self { + let mut trans = Self(HashMap::new()); + trans.add("usize", |v| { + Ok(serde_json::json!(usize::try_from_value(v)?)) + }); + trans.add("f64", |v| Ok(serde_json::json!(f64::try_from_value(v)?))); + trans.add("Percent", |v| { + Ok(serde_json::json!(Percent::try_from_value(v)?)) + }); + trans.add("String", |v| { + Ok(serde_json::json!(String::try_from_value(v)?)) + }); + trans.add("FloatAsInt", |v| { + Ok(serde_json::json!(FloatAsInt::try_from_value(v)?)) + }); + trans.add("CountAndPercent", |_| { + panic!("This extractor must be customized for each use case."); + }); + trans + } +} + +pub fn extract_and_transform( + key: &str, + cfg: &MetricConfig, + _conditions: &MetricConditions, + _active_conditions: &ActiveConditions, + metrics: &HashMap, + transformers: &Transformers, +) -> Result> { + // if !conditions.matches(active_conditions) { + // return None; + // } + + let Some(transformer) = transformers.get(&cfg.ty) else { + bail!("transformer {} not found", cfg.ty); + }; + + if !transformers.0.is_empty() { + return Ok(None); + } + + let key = cfg.json_key.clone().unwrap_or_else(|| key.to_string()); + let val = match metrics.get(&key) { + None if !cfg.optional => bail!("required metric {key} was not found"), + None => { + return Ok(None); + } + Some(v) => v, + }; + + Ok(Some(JsonMetricSummary { + key, + value: transformer(val)?, + category: String::new(), + library_type: String::new(), + config: cfg.clone(), + // Will populate this after all metrics are extracted. + grouping_key: None, + // TODO: populate alerts + alerts: Default::default(), + })) +} + +pub fn process_table_metrics( + table: &CardWithTableToml, + active_conditions: &ActiveConditions, + metrics: &HashMap, + transformers: &Transformers, +) -> Result> { + let mut grouping_val = None; + let mut out = Vec::new(); + for (key, cfg) in &table.entry_info { + let val = extract_and_transform( + key, + cfg, + &table.conditions, + active_conditions, + metrics, + transformers, + )?; + let Some(val) = val else { + continue; + }; + if let Some(group_by_key) = &table.group_by_key { + if group_by_key == key { + grouping_val = Some(val.value.clone()); + } + } + out.push(val); + } + + if let Some(grouping_val) = grouping_val { + for metric in &mut out { + metric.grouping_key = Some(grouping_val.clone()); + } + } + Ok(out) +} diff --git a/lib/rust/cr_websummary/src/multi/mod.rs b/lib/rust/cr_websummary/src/multi/mod.rs index 3d214cf..aa68720 100644 --- a/lib/rust/cr_websummary/src/multi/mod.rs +++ b/lib/rust/cr_websummary/src/multi/mod.rs @@ -1,4 +1,5 @@ pub mod antigen; +pub mod metrics; pub mod plots; pub mod svg; pub mod tables; diff --git a/lib/rust/cr_websummary/src/multi/plots.rs b/lib/rust/cr_websummary/src/multi/plots.rs index 3a7e2e2..7829343 100644 --- a/lib/rust/cr_websummary/src/multi/plots.rs +++ b/lib/rust/cr_websummary/src/multi/plots.rs @@ -1,45 +1,22 @@ -use crate::{CardWithMetric, ChartWithHelp, PlotlyChart, RawChartWithHelp, TitleWithHelp}; -use anyhow::Result; +use crate::{ChartWithHelp, PlotlyChart, RawChartWithHelp, TitleWithHelp}; use cr_types::TargetingMethod; -use csv::Reader; -use itertools::Itertools; use metric::{TxHashMap, TxHashSet}; -use plotly::common::{Anchor, DashType, Line, Marker, Mode, Orientation, Title}; -use plotly::layout::{Axis, HoverMode, Legend, Margin, Shape, ShapeLine, ShapeType}; +use plotly::common::{Anchor, Line, Mode}; +use plotly::layout::{Axis, HoverMode, Legend, Margin}; use plotly::traces::Scatter; use plotly::Layout; use regex::Regex; -use serde::{Deserialize, Serialize}; +use serde::Deserialize; use serde_json::Value; -use std::path::Path; // CONSTANTS / LABELS -const SATURATION_LINE: f64 = 0.9; -const ON_TARGET_COLOR: &str = "#0071D9"; -const ON_TARGET_LABEL: &str = "Targeted"; -const OFF_TARGET_COLOR: &str = "#555555"; -const OFF_TARGET_LABEL: &str = "Non-Targeted"; - -const TARGETED_ENRICHMENT_PLOT_TITLE: &str = "Reads vs UMIs per Gene by Targeting Status"; -const TARGETED_ENRICHMENT_PLOT_X_LABEL: &str = "UMIs per gene, log10"; -const TARGETED_ENRICHMENT_PLOT_Y_LABEL: &str = "Reads per gene, log10"; -const TARGETED_ENRICHMENT_PLOT_HELP_TEXT: &str = "This plot shows the number of reads per gene (log10) in cell-associated barcodes as a function of the number of UMIs per gene (log10) in cell-associated barcodes, with genes colored by whether or not they were targeted. The yellow line represents the optimal threshold (specifically, its y-intercept = log10(Reads per UMI threshold)) in a mixture model that classifies genes into two classes based on Reads per UMI values. If sequencing saturation is low, this line will not be shown. Ideally, targeted genes will lie above the dotted line while non-targeted genes will be below it."; -const TARGETED_ENRICHMENT_PLOT_SEPARATION_BOUNDARY_COLOR: &str = "#E6B72B"; - -const CMO_JIBES_BIPLOT_TITLE: &str = "Biplots of CMO Count"; -const CMO_JIBES_BIPLOT_HELP_TEXT: &str = "The plot shows the relationships between Cell Multiplexing Oligo (CMO) UMI counts for cells. Each point is a cell and the X and Y axes are UMI counts for a given CMO in the log10 scale. The CMOs on the axes can be changed with the selector. The cells which are not confidently assigned to CMO Tags are indicated. The number of cells has been downsampled to a maximum count of 100,000."; - -const CMO_TAGS_ON_TSNE_PLOT_HELP_TEXT: &str = "Shown here are the CMO tag assignments for each cell-barcode. The axes correspond to the 2-dimensional embedding produced by the t-SNE algorithm over multiplexing features. In this space, pairs of cells that are close to each other have more similar Multiplexing Capture profiles than cells that are distant from each other. The display is limited to a random subset of cells."; -const CMO_TAGS_ON_TSNE_PLOT_TITLE: &str = "t-SNE Projection of Cells by CMO"; const BARCODE_RANK_PLOT_TITLE: &str = "Barcode Rank Plot"; const BARCODE_RANK_PLOT_HELP_TEXT: &str = "The plot shows filtered UMI counts mapped to each GEM barcode. Barcode-cell associations can be determined by UMI count or expression profile, or removed by Protein Aggregate Detection and Filtering and/or High Occupancy GEM Filtering steps. Therefore, some regions of the graph contain both cell-associated and background-associated barcodes. When present, Gene Expression data is used to identify these barcode populations. The color of the graph is based on the local density of barcodes that are cell-associated in these regions. Hovering over the plot displays the total number and percentage of barcodes in that region called as cells along with the number of UMI counts for those barcodes and barcode rank, ordered in descending order of UMI counts."; const SEQUENCING_SATURATION_PLOT_X_LABEL: &str = "Mean Reads per Cell"; const SEQUENCING_SATURATION_PLOT_Y_LABEL: &str = "Sequencing Saturation"; -const SEQUENCING_SATURATION_PLOT_ONTARGET_LABEL: &str = "Targeted"; -const SEQUENCING_SATURATION_PLOT_OFFTARGET_LABEL: &str = "Non-Targeted"; -const LIBRARY_SEQUENCING_SATURATION_PLOT_HELP_TEXT: &str = "This plot shows the Sequencing Saturation metric as a function of downsampled sequencing depth (measured in mean reads per cell), up to the observed sequencing depth. Sequencing Saturation is a measure of the observed library complexity, and approaches 1.0 (100%) when all converted mRNA transcripts (or ligation products in the context of Fixed RNA Profiling libraries) have been sequenced. The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point. The dotted line is drawn at a value reasonably approximating the saturation point."; +const LIBRARY_SEQUENCING_SATURATION_PLOT_HELP_TEXT: &str = "This plot shows the Sequencing Saturation metric as a function of downsampled sequencing depth (measured in mean reads per cell), up to the observed sequencing depth. Sequencing Saturation is a measure of the observed library complexity, and approaches 1.0 (100%) when all converted mRNA transcripts (or ligation products in the context of Flex libraries) have been sequenced. The slope of the curve near the endpoint can be interpreted as an upper bound to the benefit to be gained from increasing the sequencing depth beyond this point."; const MEDIAN_GENES_PLOT_X_LABEL: &str = "Mean Reads per Cell"; const MEDIAN_GENES_PLOT_Y_LABEL: &str = "Median Genes per Cell"; @@ -53,8 +30,8 @@ pub fn standard_layout(x_label: &str, y_label: &str) -> Layout { .margin(Margin::new().left(70).right(65).top(30).bottom(70)) .show_legend(true) .hover_mode(HoverMode::Closest) - .x_axis(Axis::new().title(Title::new(x_label))) - .y_axis(Axis::new().title(Title::new(y_label))) + .x_axis(Axis::new().title(x_label)) + .y_axis(Axis::new().title(y_label)) .legend( Legend::new() .y_anchor(Anchor::Bottom) @@ -65,51 +42,40 @@ pub fn standard_layout(x_label: &str, y_label: &str) -> Layout { ) } -pub fn sequencing_saturation_layout(x_label: &str, y_label: &str, x_max: f64) -> Layout { - standard_layout(x_label, y_label) - .y_axis(Axis::new().title(Title::new(y_label)).range(vec![0.0, 1.0])) - .shapes(vec![Shape::new() - .shape_type(ShapeType::Line) - .x0(0) - .y0(SATURATION_LINE) - .x1(x_max) - .y1(SATURATION_LINE) - .line( - ShapeLine::new() - .color("#999999") - .width(4.0) - .dash(DashType::Dot), - )]) +pub fn sequencing_saturation_layout(x_label: &str, y_label: &str) -> Layout { + standard_layout(x_label, y_label).y_axis(Axis::new().title(y_label).range(vec![0.0, 1.0])) } -pub fn format_jibes_biplots(plot: &Value) -> RawChartWithHelp { +pub fn format_jibes_biplots(plot: &Value, feature: &str) -> RawChartWithHelp { RawChartWithHelp { plot: plot.clone(), help: TitleWithHelp { - help: CMO_JIBES_BIPLOT_HELP_TEXT.to_string(), - title: CMO_JIBES_BIPLOT_TITLE.to_string(), + title: format!("Biplots of {feature} UMI Counts"), + help: format!("The plot shows the relationships between {feature} UMI counts for cells. Each point is a cell and the X and Y axes are UMI counts for a given {feature} in the log10 scale. The {feature}s on the axes can be changed with the selector. The cells which are not confidently assigned to {feature}s are indicated. The number of cells has been downsampled to a maximum count of 100,000."), }, } } -pub fn format_umi_on_tsne_plot(plot: &Value, library_type: &str, title: &str) -> RawChartWithHelp { +pub fn format_umi_on_umap_plot(plot: &Value, library_type: &str, title: &str) -> RawChartWithHelp { RawChartWithHelp { plot: plot.clone(), help: TitleWithHelp { help: format!( - "Shown here are the total {library_type} UMI counts for each cell-barcode. The axes correspond to the 2-dimensional embedding produced by the t-SNE algorithm over the {library_type} features. In this space, pairs of cells that are close to each other have more similar {library_type} profiles than cells that are distant from each other. The display is limited to a random subset of cells." + "Shown here are the total {library_type} UMI counts for each cell-barcode. The axes correspond to the 2-dimensional embedding produced by the UMAP algorithm over the {library_type} features. In this space, pairs of cells that are close to each other have more similar {library_type} profiles than cells that are distant from each other. The display is limited to a random subset of cells." ), title: title.to_string(), }, } } -pub fn format_tags_on_tsne_plot(plot: &Value) -> RawChartWithHelp { +pub fn format_tags_on_umap_plot(plot: &Value, library_type: &str) -> RawChartWithHelp { RawChartWithHelp { plot: plot.clone(), help: TitleWithHelp { - help: CMO_TAGS_ON_TSNE_PLOT_HELP_TEXT.to_string(), - title: CMO_TAGS_ON_TSNE_PLOT_TITLE.to_string(), + help: format!( + "Shown here are the tag assignments for each cell-barcode. The axes correspond to the 2-dimensional embedding produced by the UMAP algorithm over {library_type} features. In this space, pairs of cells that are close to each other have more similar {library_type} profiles than cells that are distant from each other. The display is limited to a random subset of cells." + ), + title: "UMAP Projection of Cells Colored by Tag Assignment".to_string(), }, } } @@ -119,9 +85,9 @@ pub fn format_histogram(plot: &Value, feature: &str) -> RawChartWithHelp { plot: plot.clone(), help: TitleWithHelp { help: format!( - "Histogram of {feature} counts per cell, for each {feature}. The X-axis is the UMI counts in the log scale, while the Y-axis is the number of cells." + "Histogram of {feature} UMI counts per cell, for each {feature}. The X-axis is the UMI counts in the log scale, while the Y-axis is the number of cells." ), - title: format!("Histogram of {feature} Count"), + title: format!("Histogram of {feature} UMI Counts"), }, } } @@ -168,13 +134,8 @@ pub enum PlotType { // TODO: Get rid of this and create a simple deserializeable data structure representing this data inside subsample.py and pass that forward pub fn library_sequencing_saturation_plot_from_metrics( metrics: &TxHashMap, - is_targeted: bool, ) -> ChartWithHelp { - let (re_untargeted, re_ontarget, re_offtarget) = ( - r"^multi_raw_rpc_(\d+)_subsampled_duplication_frac$", - r"^multi_raw_rpc_(\d+)_subsampled_duplication_frac_ontarget$", - r"^multi_raw_rpc_(\d+)_subsampled_duplication_frac_offtarget$", - ); + let re = r"^multi_raw_rpc_(\d+)_subsampled_duplication_frac$"; let get_xy_data = |re: Regex| -> (Vec, Vec) { let mut xy_data: Vec<(f64, f64)> = vec![(0.0, 0.0)]; xy_data.extend( @@ -199,55 +160,21 @@ pub fn library_sequencing_saturation_plot_from_metrics( let help_text = LIBRARY_SEQUENCING_SATURATION_PLOT_HELP_TEXT; - if is_targeted { - let re_ontarget = Regex::new(re_ontarget).unwrap(); - let (x_data_ontarget, y_data_ontarget) = get_xy_data(re_ontarget); - let re_offtarget = Regex::new(re_offtarget).unwrap(); - let (x_data_offtarget, y_data_offtarget) = get_xy_data(re_offtarget); - let layout = sequencing_saturation_layout( - SEQUENCING_SATURATION_PLOT_X_LABEL, - SEQUENCING_SATURATION_PLOT_Y_LABEL, - *x_data_ontarget.last().unwrap_or(&0.), - ); - let data = vec![ - Scatter::new(x_data_ontarget, y_data_ontarget) - .name(SEQUENCING_SATURATION_PLOT_ONTARGET_LABEL) - .mode(Mode::Lines) - .fill_color(ON_TARGET_COLOR) - .marker(Marker::new().color(ON_TARGET_COLOR)) - .line(Line::new().width(3.0)), - Scatter::new(x_data_offtarget, y_data_offtarget) - .name(SEQUENCING_SATURATION_PLOT_OFFTARGET_LABEL) - .mode(Mode::Lines) - .fill_color(OFF_TARGET_COLOR) - .marker(Marker::new().color(OFF_TARGET_COLOR)) - .line(Line::new().width(3.0)), - ]; - ChartWithHelp { - plot: PlotlyChart::with_layout_and_data(layout.show_legend(true), data), - help: TitleWithHelp { - help: help_text.to_string(), - title: SEQUENCING_SATURATION_PLOT_Y_LABEL.to_string(), - }, - } - } else { - let re_untargeted = Regex::new(re_untargeted).unwrap(); - let (x_data_untargeted, y_data_untargeted) = get_xy_data(re_untargeted); - let layout = sequencing_saturation_layout( - SEQUENCING_SATURATION_PLOT_X_LABEL, - SEQUENCING_SATURATION_PLOT_Y_LABEL, - *x_data_untargeted.last().unwrap_or(&0.), - ); - let data = vec![Scatter::new(x_data_untargeted, y_data_untargeted) - .mode(Mode::Lines) - .line(Line::new().width(3.0))]; - ChartWithHelp { - plot: PlotlyChart::with_layout_and_data(layout.show_legend(false), data), - help: TitleWithHelp { - help: help_text.to_string(), - title: SEQUENCING_SATURATION_PLOT_Y_LABEL.to_string(), - }, - } + let re = Regex::new(re).unwrap(); + let (x_data, y_data) = get_xy_data(re); + let layout = sequencing_saturation_layout( + SEQUENCING_SATURATION_PLOT_X_LABEL, + SEQUENCING_SATURATION_PLOT_Y_LABEL, + ); + let data = vec![Scatter::new(x_data, y_data) + .mode(Mode::Lines) + .line(Line::new().width(3.0))]; + ChartWithHelp { + plot: PlotlyChart::with_layout_and_data(layout.show_legend(false), data), + help: TitleWithHelp { + help: help_text.to_string(), + title: SEQUENCING_SATURATION_PLOT_Y_LABEL.to_string(), + }, } } @@ -385,130 +312,6 @@ impl From for bool { } } -#[derive(Debug, Deserialize, PartialEq)] -struct TargetedPerFeatureMetricsRow { - feature_type: String, - feature_id: String, - feature_name: String, - feature_idx: usize, - num_umis: usize, - num_reads: usize, - num_umis_cells: usize, - num_reads_cells: usize, - dup_frac: f64, - dup_frac_cells: f64, - is_targeted: PythonBool, - mean_reads_per_umi: Option, - mean_reads_per_umi_log10: Option, - mean_reads_per_umi_cells: Option, - mean_reads_per_umi_cells_log10: Option, - enriched_rpu: Option, -} - -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] -pub struct TargetedEnrichmentTableAndPlot { - pub plot: PlotlyChart, - pub gene_targeting_table: CardWithMetric, -} - -// Rust implementation of the reads_per_umi_plot in analysis_tab.py -// does NOT support spatial whatsoever -pub fn targeted_enrichment_plot( - per_feature_metrics_csv: Option<&Path>, - log_rpu_threshold: Option, // from the metrics json -) -> Result> { - let mut rdr = match per_feature_metrics_csv { - Some(csv) => Reader::from_path(csv)?, - None => return Ok(None), - }; - // get the rows records of per-feature-metrics CSV - let per_feature_metrics: Vec = rdr.deserialize().try_collect()?; - - let (targeted_per_feature_metrics_subset, untargeted_per_feature_metrics_subset) = - per_feature_metrics - .iter() - .filter(|&x| x.num_reads_cells > 0) - .partition::, _>(|x| bool::from(x.is_targeted)); - let groups = [ - ( - OFF_TARGET_LABEL.to_string(), - untargeted_per_feature_metrics_subset, - OFF_TARGET_COLOR.to_string(), - ), - ( - ON_TARGET_LABEL.to_string(), - targeted_per_feature_metrics_subset, - ON_TARGET_COLOR.to_string(), - ), - ]; - let mut data = Vec::with_capacity(groups.len() + 1); - for (name, per_feature_metrics_subset, color) in groups { - // remove totally overlapping points - let per_feature_metrics_subset_deduped: Vec<&TargetedPerFeatureMetricsRow> = - per_feature_metrics_subset - .into_iter() - .unique_by(|x| (x.num_umis_cells, x.num_reads_cells)) - .collect(); - - let gene_name_labels: Vec = per_feature_metrics_subset_deduped - .iter() - .map(|x| format!("Gene: {}", x.feature_name)) - .collect(); - let x: Vec = per_feature_metrics_subset_deduped - .iter() - .map(|x| (x.num_umis_cells as f64).log10()) - .collect(); - let y: Vec = per_feature_metrics_subset_deduped - .iter() - .map(|x| (x.num_reads_cells as f64).log10()) - .collect(); - - data.push( - Scatter::new(x, y) - .name(name) - .mode(Mode::Markers) - .fill_color(ON_TARGET_COLOR) - .marker(Marker::new().color(color).size(5).opacity(0.5)) - .hover_text_array(gene_name_labels), - ); - } - // plot separation boundary on top, if it was determined - if let Some(b) = log_rpu_threshold { - let a = 1.0; - let x0 = 0.0; - let x1 = (per_feature_metrics - .into_iter() - .map(|x| x.num_umis_cells) - .max() - .unwrap() as f64 - + 1.0) - .log10(); - - data.push( - Scatter::new(vec![x0, x1], vec![x0 * a + b, x1 * a + b]) - .name(format!("Reads per UMI threshold {:.2}", 10.0_f64.powf(b))) - .mode(Mode::Lines) - .fill_color(OFF_TARGET_COLOR) - .marker(Marker::new().color(TARGETED_ENRICHMENT_PLOT_SEPARATION_BOUNDARY_COLOR)) - .line(Line::new().width(3.0)), - ); - } - - let layout = Layout::new() - .x_axis(Axis::new().title(Title::new(TARGETED_ENRICHMENT_PLOT_X_LABEL))) - .y_axis(Axis::new().title(Title::new(TARGETED_ENRICHMENT_PLOT_Y_LABEL))) - .legend(Legend::new().orientation(Orientation::Horizontal).y(-0.2)) - .hover_mode(HoverMode::Closest); - - Ok(Some(ChartWithHelp { - plot: PlotlyChart::with_layout_and_data(layout, data), - help: TitleWithHelp { - help: TARGETED_ENRICHMENT_PLOT_HELP_TEXT.to_string(), - title: TARGETED_ENRICHMENT_PLOT_TITLE.to_string(), - }, - })) -} - #[cfg(test)] mod tests { use super::*; diff --git a/lib/rust/cr_websummary/src/multi/svg.rs b/lib/rust/cr_websummary/src/multi/svg.rs index 0971d14..f815a45 100644 --- a/lib/rust/cr_websummary/src/multi/svg.rs +++ b/lib/rust/cr_websummary/src/multi/svg.rs @@ -1,5 +1,5 @@ use crate::{TermDesc, TitleWithTermDesc}; -use cr_types::CellMultiplexingType; +use cr_types::{BarcodeMultiplexingType, CellLevel, ReadLevel}; use serde::Serialize; #[derive(Serialize, Clone)] @@ -15,7 +15,7 @@ impl SvgGraph { pub fn new( svg_string: String, sample_node: String, - multiplexing_method: Option, + multiplexing_method: Option, ) -> Self { let mut data = vec![TermDesc::with_one_desc( "Samples", @@ -23,16 +23,22 @@ impl SvgGraph { this analysis. There will be only one sample in a non-multiplexed analysis.", )]; if let Some(multiplexing_method) = multiplexing_method { - if multiplexing_method == CellMultiplexingType::RTL { + if multiplexing_method == BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL) { data.push(TermDesc::with_one_desc( "Probe Barcode IDs", "The probe barcodes used in \ this experiment.", )); - } else if multiplexing_method == CellMultiplexingType::OH { + } else if multiplexing_method == BarcodeMultiplexingType::ReadLevel(ReadLevel::OH) { data.push(TermDesc::with_one_desc( - "Overhang IDs", - "The overhangs used in this experiment.", + "OCM Barcode IDs", + "The OCM barcode IDs used in this experiment.", + )); + } else if multiplexing_method == BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag) + { + data.push(TermDesc::with_one_desc( + "Hashtags", + "The antibody features used for cell hashing in this experiment.", )); } else { data.push(TermDesc::with_one_desc( diff --git a/lib/rust/cr_websummary/src/multi/tables.rs b/lib/rust/cr_websummary/src/multi/tables.rs index 40be380..ba49137 100644 --- a/lib/rust/cr_websummary/src/multi/tables.rs +++ b/lib/rust/cr_websummary/src/multi/tables.rs @@ -1,25 +1,5 @@ -use crate::alert::Alert; -use crate::{ - card_with_table, CardWithTable, CountAndPercent, FloatAsInt, GenericTable, MakePretty, Percent, - PercentF1, TableRow, TitleWithHelp, -}; +use crate::{CountAndPercent, FloatAsInt, Percent}; use serde::{Deserialize, Serialize}; use websummary_derive::make_tables; make_tables!("src/multi/tables.toml"); - -// TODO: Sync this with VDJ aggr table -card_with_table!( - table_name: VdjClonotypeFrequencyTable, - row_name: VdjClonotypeFrequencyRow, - title: "Top 10 Clonotype CDR3 Sequences", - help_text: "We list CDR3 sequences of the 10 most frequent clonotypes", - columns: { - id: usize : "Clonotype ID", - cdr3_aas : Vec : "CDR3s", - num_cells: usize : "Frequency", - proportion: Percent : "Proportion" - } -); - -impl Alert for VdjClonotypeFrequencyTable {} diff --git a/lib/rust/cr_websummary/src/multi/tables.toml b/lib/rust/cr_websummary/src/multi/tables.toml index 688d24c..f9268fa 100644 --- a/lib/rust/cr_websummary/src/multi/tables.toml +++ b/lib/rust/cr_websummary/src/multi/tables.toml @@ -23,8 +23,8 @@ # # Shared by GEX, AB etc. [library_cell_metrics] -title = "Cell Statistics" -help = "Summary statistics about cell-associated barcodes." +title = "Cell Calling Quality" +tier = "library" entries = [ "physical_library_id", "cell_associated_partitions", @@ -34,6 +34,7 @@ entries = [ "partitions_called_multiplets", "fraction_cells_passing_high_occupancy_filtering", ] +group_by_key = "physical_library_id" [library_cell_metrics.physical_library_id] header = "Physical library ID" @@ -41,26 +42,17 @@ entries = [ help = "Unique identifier for each library." [library_cell_metrics.cell_associated_partitions] - header = "Estimated number of cells" + header = "Cells" type = "usize" help = "The number of barcodes identified by the cell-calling algorithm as containing a cell. Barcodes removed by Protein Aggregate Detection and Filtering or High Occupancy GEM Filtering are not counted." [[library_cell_metrics.cell_associated_partitions.alerts]] - rank = 0 error_threshold = 0 warn_threshold = 100 error_title = "No Cells Detected" warn_title = "Low Number of Cells Detected" detail = "Estimated number of cells is expected to be > 100. This usually indicates poor cell handling, poor library quality, or poor sequencing quality. Application performance is likely to be affected." - [[library_cell_metrics.cell_associated_partitions.alerts]] - rank = 1 - conditions = { is_lt_chemistry = true } - error_threshold = 10000 - warn_threshold = 1000 - warn_title = "High Number of Cells Detected for LT Chemistry" - detail = "Estimated number of cells is expected to be < 1000 for LT chemistry. LT chemistry does not support cell loads higher than 1000 (multiplet rate might be high). If cell calling looks off, inspect the data to determine the appropriate cell count and use --force-cells." - [library_cell_metrics.mean_reads_per_cell_associated_partition] type = "FloatAsInt" header = "Mean reads per cell" @@ -106,39 +98,55 @@ entries = [ # -------------------------------------------------------------------------------------------------- # V(D)J Cell Statistics # -------------------------------------------------------------------------------------------------- -[vdj_library_cell_metrics] -title = "Cell Statistics" -help = "Summary statistics about cells." +[vdj_library_metrics_per_ocm_barcode] +title = "Metrics per OCM Barcode ID" +tier = "library" entries = [ - "physical_library_id", - "vdj_filtered_bcs", - "vdj_total_raw_read_pairs_per_filtered_bc", + "ocm_barcode_id", + "sample_id", + "vdj_cells_per_tag", ] +group_by_key = "ocm_barcode_id" - [vdj_library_cell_metrics.physical_library_id] - header = "Physical library ID" + [vdj_library_metrics_per_ocm_barcode.ocm_barcode_id] + header = "OCM Barcode ID" type = "String" - help = "Unique identifier for each library." + help = "The identifier of this OCM barcode." - [vdj_library_cell_metrics.vdj_filtered_bcs] - header = "Estimated number of cells" - type = "usize" - help = "The number of barcodes estimated to be associated with cells that express targeted V(D)J transcripts." + [vdj_library_metrics_per_ocm_barcode.sample_id] + header = "Sample ID" + type = "String" + help = "The identifier of the sample associated with this OCM barcode." - [[vdj_library_cell_metrics.vdj_filtered_bcs.alerts]] - error_threshold = 0 - warn_threshold = 10 - error_title = "No Cells Detected" - warn_title = "Low Number of Cells Detected" - detail = "Ideal >= 10. This usually indicates poor cell quality, poor library quality, or poor sequencing quality. Application performance is likely to be affected." + [vdj_library_metrics_per_ocm_barcode.vdj_cells_per_tag] + header = "VDJ cells" + type = "CountAndPercent" + help = "Number and fraction of VDJ cells per OCM Barcode ID amongst all VDJ cells detected in this GEM well" - [vdj_library_cell_metrics.vdj_total_raw_read_pairs_per_filtered_bc] - header = "Mean reads per cell" - type = "FloatAsInt" - help = "Number of input read pairs divided by the estimated number of cells." +[vdj_library_metrics_per_hashtag_id] +title = "Metrics per Hashtag ID" +tier = "library" +entries = [ + "hashtag_id", + "sample_id", + "vdj_cells_per_tag", +] +group_by_key = "hashtag_id" + [vdj_library_metrics_per_hashtag_id.hashtag_id] + header = "Hashtag ID" + type = "String" + help = "The identifier of this Hashtag." + [vdj_library_metrics_per_hashtag_id.sample_id] + header = "Sample ID" + type = "String" + help = "The identifier of the sample associated with this Hashtag." + [vdj_library_metrics_per_hashtag_id.vdj_cells_per_tag] + header = "VDJ cells" + type = "CountAndPercent" + help = "Number and fraction of VDJ cells per Hashtag ID amongst all VDJ cells detected in this GEM well." # -------------------------------------------------------------------------------------------------- # Sequencing Metrics per fastq id # -------------------------------------------------------------------------------------------------- @@ -146,7 +154,7 @@ entries = [ # Shared by GEX, VDJ, AB etc. [sequencing_metrics] title = "Sequencing Metrics" -help = "Metrics per sequencing run." +tier = "library" entries = [ "fastq_id", "number_of_reads", @@ -158,6 +166,7 @@ entries = [ "q30_read1", # RNA read 1 is Illumina Read 2 and RNA read 2 is None except in paired end "q30_read2", # RNA read 1 is Illumina Read 2 and RNA read 2 is None except in paired end ] +group_by_key = "fastq_id" [sequencing_metrics.fastq_id] header = "Fastq ID" @@ -175,18 +184,18 @@ entries = [ help = "Total number of read pairs that were ignored by the pipeline because they do not satisfy the minimum length requirements (for example Read-1 less that 26 bases for 3' v2/v3/v4 or 5')." [sequencing_metrics.q30_barcode] - type = "PercentF1" + type = "Percent" header = "Q30 barcodes" - help = "Fraction of cell barcode bases with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator. If the data is from multi-sample Fixed RNA Profiling, the cell barcode is the combination of the GEM barcode and probe barcode." + help = "Fraction of cell barcode bases with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator. If the data is from multi-sample Flex, the cell barcode is the combination of the GEM barcode and probe barcode." [[sequencing_metrics.q30_barcode.alerts]] error_threshold = 0.45 warn_threshold = 0.55 warn_title = "Fraction of cell barcode bases with Q-score >= 30 is low" - detail = "Ideal > 55%. Fraction of cell barcode bases (R1 for Single Cell 3' v2/v3/v4 and Single Cell 5', or either R1 or R2 for Fixed RNA Profiling) with Q-score >= 30 is low. A lower fraction might indicate poor sequencing quality." + detail = "Ideal > 55%. Fraction of cell barcode bases (R1 for Single Cell 3' v2/v3/v4 and Single Cell 5', or either R1 or R2 for Flex) with Q-score >= 30 is low. A lower fraction might indicate poor sequencing quality." [sequencing_metrics.q30_gem_barcode] - type = "PercentF1" + type = "Percent" optional = true header = "Q30 GEM barcodes" help = "Fraction of GEM barcode bases with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator." @@ -195,22 +204,22 @@ entries = [ error_threshold = 0.45 warn_threshold = 0.55 warn_title = "Fraction of GEM barcode bases with Q-score >= 30 is low" - detail = "Ideal > 55%. Fraction of GEM barcode bases (R1 for Fixed RNA Profiling) with Q-score >= 30 is low. A lower fraction might indicate poor sequencing quality." + detail = "Ideal > 55%. Fraction of GEM barcode bases (R1 for Flex) with Q-score >= 30 is low. A lower fraction might indicate poor sequencing quality." [sequencing_metrics.q30_probe_barcode] - type = "PercentF1" + type = "Percent" optional = true header = "Q30 probe barcodes" - help = "Fraction of probe barcode bases (or antibody multiplexing barcode bases for Fixed RNA Profiling with Antibody Feature Barcode) with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator." + help = "Fraction of probe barcode bases (or antibody multiplexing barcode bases for Flex with Antibody Feature Barcode) with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator." [[sequencing_metrics.q30_probe_barcode.alerts]] error_threshold = 0.45 warn_threshold = 0.8 warn_title = "Fraction of probe barcode bases with Q-score >= 30 is low" - detail = "Ideal > 80%. Fraction of probe barcode bases in the R2 read for Fixed RNA Profiling with Q-score >= 30 is low. A lower fraction might indicate poor sequencing quality. This issue can be caused by a lack of sequence diversity in the flowcell, and it may be remedied by increasing diversity by adding PhiX or other library types during sequencing." + detail = "Ideal > 80%. Fraction of probe barcode bases in the R2 read for Flex with Q-score >= 30 is low. A lower fraction might indicate poor sequencing quality. This issue can be caused by a lack of sequence diversity in the flowcell, and it may be remedied by increasing diversity by adding PhiX or other library types during sequencing." [sequencing_metrics.q30_umi] - type = "PercentF1" + type = "Percent" header = "Q30 UMI" help = "Fraction of UMI bases with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator." @@ -221,9 +230,9 @@ entries = [ detail = "Ideal > 75%. Fraction of UMI bases in the R1 read with Q-score >= 30 is low. A lower fraction might indicate poor sequencing quality." [sequencing_metrics.q30_read1] - type = "PercentF1" + type = "Percent" header = "Q30 RNA read" # RNA read 1 is Illumina Read 2 and RNA read 2 is None except in paired end - help = "Fraction of RNA Read bases (or RNA probe read bases for Fixed RNA Profiling) with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator." + help = "Fraction of RNA Read bases (or RNA probe read bases for Flex) with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator." [[sequencing_metrics.q30_read1.alerts]] error_threshold = 0.55 @@ -232,7 +241,7 @@ entries = [ detail = "Ideal > 65%. Fraction of RNA Read bases with Q-score >= 30 is low. A lower fraction might indicate poor sequencing quality." [sequencing_metrics.q30_read2] - type = "PercentF1" + type = "Percent" optional = true header = "Q30 RNA read 2" # RNA read 1 is Illumina Read 2 and RNA read 2 is None except in paired end help = "Fraction of RNA Read 2 bases with Q-score >= 30, excluding very low quality/no-call (Q <= 2) bases from the denominator." @@ -248,6 +257,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [gex_library_mapping_metrics] title = "Mapping Metrics (Amongst All Reads in Library)" +tier = "library" entries = [ "physical_library_id", "reads_in_library", @@ -260,6 +270,11 @@ entries = [ "confidently_mapped_to_intergenic_regions", "confidently_mapped_antisense", ] +group_by_key = "physical_library_id" + + [gex_library_mapping_metrics.conditions] + library_types = ["Gene Expression"] + is_rtl = false [gex_library_mapping_metrics.physical_library_id] header = "Physical library ID" @@ -270,21 +285,25 @@ entries = [ type = "usize" header = "Number of reads in the library" help = "The total number of reads in the library." + json_key = "total_read_pairs" [gex_library_mapping_metrics.mapped_to_genome] type = "Percent" header = "Mapped to genome" help = "Fraction of reads that mapped to the genome." + json_key = "multi_genome_mapped_reads_frac" [gex_library_mapping_metrics.confidently_mapped_to_genome] type = "Percent" header = "Confidently mapped to genome" help = "Fraction of reads that mapped uniquely to the genome. If a gene mapped to exonic loci from a single gene and also to non-exonic loci, it is considered uniquely mapped to one of the exonic loci." + json_key = "multi_genome_conf_mapped_reads_frac" [gex_library_mapping_metrics.confidently_mapped_to_transcriptome] type = "Percent" header = "Confidently mapped to transcriptome" help = "Fraction of reads that mapped to a unique gene in the transcriptome. The read must be consistent with annotated splice junctions. These reads are considered for UMI counting." + json_key = "multi_transcriptome_conf_mapped_reads_frac" [[gex_library_mapping_metrics.confidently_mapped_to_transcriptome.alerts]] error_threshold = 0.2 @@ -297,62 +316,52 @@ entries = [ optional = true header = "Confidently mapped to targeted transcriptome" help = "Fraction of reads that mapped to a unique gene from the target panel. The read must be consistent with annotated splice junctions. These reads are considered for UMI counting." - + json_key = "multi_transcriptome_targeted_conf_mapped_reads_frac" [gex_library_mapping_metrics.confidently_mapped_to_intronic_regions] type = "Percent" header = "Confidently mapped to intronic regions" help = "Fraction of reads that mapped uniquely to an intronic region of the genome." + json_key = "multi_intronic_conf_mapped_reads_frac" [gex_library_mapping_metrics.confidently_mapped_to_exonic_regions] type = "Percent" header = "Confidently mapped to exonic regions" help = "Fraction of reads that mapped uniquely to an exonic region of the genome." + json_key = "multi_exonic_conf_mapped_reads_frac" [gex_library_mapping_metrics.confidently_mapped_to_intergenic_regions] type = "Percent" header = "Confidently mapped to intergenic regions" help = "Fraction of reads that mapped uniquely to an intergenic region of the genome." + json_key = "multi_intergenic_conf_mapped_reads_frac" [gex_library_mapping_metrics.confidently_mapped_antisense] type = "Percent" header = "Confidently mapped antisense" help = "Fraction of reads confidently mapped to the transcriptome, but on the opposite strand of their annotated gene. A read is counted as antisense if it has any alignments that are consistent with an exon of a transcript but antisense to it, and has no sense alignments." + json_key = "multi_antisense_reads_frac" [[gex_library_mapping_metrics.confidently_mapped_antisense.alerts]] - conditions = { include_introns = false, is_hybrid_capture = false } + conditions = { include_introns = false } error_threshold = 0.3 warn_threshold = 0.1 warn_title = "High Fraction of Reads Mapped Antisense to Genes" detail = "Ideal < 10% for single cell samples. High antisense mapping rate can indicate use of an incorrect chemistry type, an issue with the reference transcriptome, or elevated levels of antisense reads. Application performance is likely to be affected." [[gex_library_mapping_metrics.confidently_mapped_antisense.alerts]] - conditions = { include_introns = true, is_hybrid_capture = false } - error_threshold = 0.4 - warn_threshold = 0.2 - warn_title = "High Fraction of Reads Mapped Antisense to Genes" - detail = "Ideal < 20%. Rates of up to 40% are common for single nuclei samples. Higher fraction of antisense reads may indicate use of an incorrect chemistry type, or an issue with the reference transcriptome." - - [[gex_library_mapping_metrics.confidently_mapped_antisense.alerts]] - conditions = { include_introns = false, is_hybrid_capture = true } - error_threshold = 0.4 - warn_threshold = 0.2 - warn_title = "High Fraction of Reads Mapped Antisense to Genes" - detail = "Ideal < 20%. This can indicate use of an incorrect chemistry type, an issue with the reference transcriptome, or elevated levels of antisense reads. Application performance is likely to be affected." - - [[gex_library_mapping_metrics.confidently_mapped_antisense.alerts]] - conditions = { include_introns = true, is_hybrid_capture = true } + conditions = { include_introns = true } error_threshold = 0.4 warn_threshold = 0.2 warn_title = "High Fraction of Reads Mapped Antisense to Genes" detail = "Ideal < 20%. Rates of up to 40% are common for single nuclei samples. Higher fraction of antisense reads may indicate use of an incorrect chemistry type, or an issue with the reference transcriptome." - # -------------------------------------------------------------------------------------------------- # GEX (RTL) -> Mapping metrics # -------------------------------------------------------------------------------------------------- [rtl_library_mapping_metrics] title = "Mapping Metrics (Amongst All Reads in Library)" +tier = "library" entries = [ "physical_library_id", "reads_in_library", @@ -362,6 +371,11 @@ entries = [ "reads_confidently_mapped_to_probe_set", "reads_confidently_mapped_to_filtered_probe_set", ] +group_by_key = "physical_library_id" + + [rtl_library_mapping_metrics.conditions] + library_types = ["Gene Expression"] + is_rtl = true [rtl_library_mapping_metrics.physical_library_id] header = "Physical library ID" @@ -372,11 +386,13 @@ entries = [ type = "usize" header = "Number of reads in the library" help = "The total number of reads in the library." + json_key = "total_read_pairs" [rtl_library_mapping_metrics.reads_half_mapped_to_probe_set] type = "Percent" header = "Reads half-mapped to probe set" help = "Fraction of reads that mapped to unpaired ligation products." + json_key = "multi_transcriptome_half_mapped_reads_frac" [[rtl_library_mapping_metrics.reads_half_mapped_to_probe_set.alerts]] warn_threshold = 0.2 @@ -388,6 +404,7 @@ entries = [ type = "Percent" header = "Reads split-mapped to probe set" help = "Fraction of reads that mapped to mispaired ligation products." + json_key = "multi_transcriptome_split_mapped_reads_frac" [[rtl_library_mapping_metrics.reads_split_mapped_to_probe_set.alerts]] warn_threshold = 0.2 @@ -399,41 +416,50 @@ entries = [ type = "Percent" header = "Reads mapped to probe set" help = "Fraction of reads that mapped to the probe set." + json_key = "multi_transcriptome_mapped_reads_frac" [rtl_library_mapping_metrics.reads_confidently_mapped_to_probe_set] type = "Percent" header = "Reads confidently mapped to probe set" help = "Fraction of reads that mapped uniquely to a probe in the probe set." + json_key = "multi_transcriptome_conf_mapped_reads_frac" [[rtl_library_mapping_metrics.reads_confidently_mapped_to_probe_set.alerts]] error_threshold = 0.2 warn_threshold = 0.5 warn_title = "Low Fraction Reads Confidently Mapped to Probe Set" - detail = "Ideal > 50%. This can indicate low total expression, use of the wrong probe set, suboptimal sample preparation, or the use of input FASTQs from products other than Fixed RNA Profiling." + detail = "Ideal > 50%. This can indicate low total expression, use of the wrong probe set, suboptimal sample preparation, or the use of input FASTQs from products other than Flex." [rtl_library_mapping_metrics.reads_confidently_mapped_to_filtered_probe_set] type = "Percent" header = "Reads confidently mapped to filtered probe set" help = "Fraction of reads from probes that map to a unique gene. These reads are considered for UMI counting. For more information on probe filtering please visit https://www.10xgenomics.com/support" + json_key = "multi_transcriptome_targeted_conf_mapped_reads_frac" [[rtl_library_mapping_metrics.reads_confidently_mapped_to_filtered_probe_set.alerts]] error_threshold = 0.2 warn_threshold = 0.5 warn_title = "Low Fraction Reads Confidently Mapped to Filtered Probe Set" - detail = "Ideal > 50%. This can indicate low total expression, use of the wrong probe set, suboptimal sample preparation, high expression genes removed by filtering, or the use of input FASTQs from products other than Fixed RNA Profiling." + detail = "Ideal > 50%. This can indicate low total expression, use of the wrong probe set, suboptimal sample preparation, high expression genes removed by filtering, or the use of input FASTQs from products other than Flex." # -------------------------------------------------------------------------------------------------- # GEX (RTL) -> Metrics per probe barcode # -------------------------------------------------------------------------------------------------- [rtl_probe_barcode_metrics] title = "Metrics per probe barcode" +tier = "library" entries = [ "probe_barcode_id", "sample_id", "umi_per_probe_barcode", "cells_per_probe_barcode", ] +group_by_key = "probe_barcode_id" + + [rtl_probe_barcode_metrics.conditions] + library_types = ["Gene Expression"] + is_rtl = true [rtl_probe_barcode_metrics.probe_barcode_id] type = "String" @@ -457,26 +483,35 @@ entries = [ [gdna_metrics] title = "UMIs from Genomic DNA" +tier = "library" entries = [ "estimated_gdna_content", "estimated_gdna_unspliced_threshold", ] + + [gdna_metrics.conditions] + library_types = ["Gene Expression"] + has_gdna = true + + [gdna_metrics.estimated_gdna_content] type = "Percent" header = "Estimated UMIs from genomic DNA" help = "The estimated fraction of filtered UMIs derived from genomic DNA based on the discordance between probes targeting exon-junction-spanning regions and non-exon-junction-spanning regions." + json_key = "estimated_gdna_content" [gdna_metrics.estimated_gdna_unspliced_threshold] type = "FloatAsInt" header = "Estimated UMIs from genomic DNA per unspliced probe" - help = "The estimated number of UMIs derived from genomic DNA for each probe targeting non-exon-junction-spanning regions. A probe not spanning an exon junction with a total UMI count below this value has a high likelihood of its UMIs being derived primarily from hybridization to genomic DNA rather than the mRNA. For details, please visit https://www.10xgenomics.com/support/fixed-rna-profiling/documentation/steps/software" + help = "The estimated number of UMIs derived from genomic DNA for each probe targeting non-exon-junction-spanning regions. A probe not spanning an exon junction with a total UMI count below this value has a high likelihood of its UMIs being derived primarily from hybridization to genomic DNA rather than the mRNA. For details, please visit http://10xgen.com/gdna-estimation" + json_key = "estimated_gdna_unspliced_threshold" # -------------------------------------------------------------------------------------------------- # GEX -> Metrics Per Physical Library # -------------------------------------------------------------------------------------------------- [gex_physical_library_metrics] title = "Metrics Per Physical Library" -help = "Metrics calculated for each library." +tier = "library" entries = [ "physical_library_id", "number_of_reads", @@ -485,11 +520,13 @@ entries = [ "valid_probe_barcodes", "valid_umis", "sequencing_saturation", - "targeted_sequencing_saturation", "reads_in_cell_associated_partitions", "mean_reads_per_cell_associated_partition", - "mean_targeted_reads_per_cell_associated_partition", ] +group_by_key = "physical_library_id" + + [gex_physical_library_metrics.conditions] + library_types = ["Gene Expression"] [gex_physical_library_metrics.physical_library_id] header = "Physical library ID" @@ -500,17 +537,19 @@ entries = [ type = "usize" header = "Number of reads" help = "Number of read pairs from this library." + json_key = "total_read_pairs" [gex_physical_library_metrics.valid_barcodes] type = "Percent" header = "Valid barcodes" - help = "Fraction of reads with barcodes that are present in the whitelist after barcode correction. If the data is from multi-sample Fixed RNA Profiling, the cell barcode is the combination of the GEM barcode and probe barcode and both parts must be valid following correction." + help = "Fraction of reads with barcodes that are present in the whitelist after barcode correction. If the data is from multi-sample Flex, the cell barcode is the combination of the GEM barcode and probe barcode and both parts must be valid following correction." + json_key = "good_bc_frac" [[gex_physical_library_metrics.valid_barcodes.alerts]] error_threshold = 0.5 warn_threshold = 0.75 warn_title = "Low Fraction Valid Barcodes" - detail = "Ideal > 75%. This may indicate a quality issue with the R1 read for Single Cell 3' v2/v3/v4 and Single Cell 5', or either R1 or R2 for Fixed RNA Profiling. Application performance may be affected." + detail = "Ideal > 75%. This may indicate a quality issue with the R1 read for Single Cell 3' v2/v3/v4 and Single Cell 5', or either R1 or R2 for Flex. Application performance may be affected." [gex_physical_library_metrics.valid_gem_barcodes] type = "Percent" @@ -540,6 +579,7 @@ entries = [ type = "Percent" header = "Valid UMIs" help = "Fraction of reads with valid UMIs; i.e. UMI sequences that do not contain Ns and that are not homopolymers." + json_key = "good_umi_frac" [[gex_physical_library_metrics.valid_umis.alerts]] # TODO: This seems way too low? @@ -552,17 +592,13 @@ entries = [ type = "Percent" header = "Sequencing saturation" help = "The fraction of reads originating from an already-observed UMI. This is a function of library complexity and sequencing depth. More specifically, this is the fraction of confidently mapped, valid cell-barcode, valid UMI reads that had a non-unique (cell-barcode, UMI, gene). This metric was called 'cDNA PCR Duplication' in versions of Cell Ranger prior to 1.2." - - [gex_physical_library_metrics.targeted_sequencing_saturation] - type = "Percent" - optional = true - header = "Targeted sequencing saturation" - help = "The fraction of targeted reads originating from an already-observed targeted UMI. This is a function of library complexity and sequencing depth. More specifically, this is the fraction of confidently mapped, valid cell-barcode, valid targeted UMI reads that had a non-unique (cell-barcode, UMI, gene)." + json_key = "multi_cdna_pcr_dupe_reads_frac" [gex_physical_library_metrics.reads_in_cell_associated_partitions] type = "Percent" header = "Confidently mapped reads in cells" help = "The fraction of valid-barcode, valid-UMI, confidently-mapped-to-transcriptome reads with cell-associated barcodes." + json_key = "multi_filtered_bcs_conf_mapped_barcoded_reads_cum_frac" [[gex_physical_library_metrics.reads_in_cell_associated_partitions.alerts]] error_threshold = 0.5 @@ -574,118 +610,24 @@ entries = [ type = "FloatAsInt" header = "Mean reads per cell" help = "The total number of sequenced read pairs divided by the number of cell-associated barcodes." - - [gex_physical_library_metrics.mean_targeted_reads_per_cell_associated_partition] - type = "FloatAsInt" - optional = true - header = "Mean targeted reads per cell" - help = "The total number of targeted reads divided by the number of cell-assocaited barcodes." - -# -------------------------------------------------------------------------------------------------- -# GEX -> Targeted enrichment metrics -# -------------------------------------------------------------------------------------------------- -[gex_library_targeted_enrichment_metrics] -title = "Targeted Enrichment" -help = "Metrics related to targeted enrichment, provided for Targeted reads (reads mapped to genes from the target panel) and Non-Targeted reads (reads mapped to other genes not on the target panel)." - -entries = [ - "targeting_status", - "multi_frac_conf_transcriptomic_reads", - "num_genes", - "num_genes_quantifiable", - "num_rpu_enriched_genes", - "mean_reads_per_umi_per_gene_cells", - "filtered_target_umi_count_threshold", - "filtered_target_umi_reads_frac", -] - - [gex_library_targeted_enrichment_metrics.targeting_status] - header = "Targeting Status" - type = "String" - help = "Whether metrics are for Targeted (mapped to genes from the target panel) or Non-targeted (mapped to other genes) reads" - - [gex_library_targeted_enrichment_metrics.multi_frac_conf_transcriptomic_reads] - header = "Reads Confidently Mapped to the Transcriptome" - type = "Percent" - help = "Fraction of reads that mapped to a unique targeted gene in the transcriptome. The read must be consistent with annotated splice junctions when include-introns=false. These reads are considered for UMI counting." - - [gex_library_targeted_enrichment_metrics.num_genes] - header = "Number of Genes" - type = "usize" - help = "Number of genes per group. The number of targeted genes is specified via the target panel file. The number of non-targeted genes is the difference between the total number of genes in the reference and the number of targeted genes." - - [gex_library_targeted_enrichment_metrics.num_genes_quantifiable] - header = "Number of Genes >= 10 UMIs" - type = "usize" - help = "Number of genes with at least 10 filtered UMIs from cell-associated barcodes. These genes are used to calculate per-gene enrichments." - - [gex_library_targeted_enrichment_metrics.num_rpu_enriched_genes] - header = "Number of Enriched Genes" - type = "usize" - help = "Number of enriched genes per group. Genes are classified with a two-class Gaussian mixture model into two groups based on the mean reads per UMI value for each gene. Enriched genes have higher mean reads per UMI values, indicating their over-representation in the targeted library." - - [gex_library_targeted_enrichment_metrics.mean_reads_per_umi_per_gene_cells] - header = "Mean Reads per UMI per Gene" - type = "f64" - help = "Mean number of reads per UMI for each gene, averaged across genes. Only genes with >= 10 filtered UMIs from cell-associated barcodes are considered." - - [gex_library_targeted_enrichment_metrics.filtered_target_umi_count_threshold] - header = "Reads per UMI threshold for UMI filtering" - type = "f64" - help = "Minimum number of reads per UMI required to pass UMI filtering. UMIs in targeted genes with read support (strictly) lower than this threshold are filtered out. UMI filtering is not applied to non-targeted genes." - - [gex_library_targeted_enrichment_metrics.filtered_target_umi_reads_frac] - header = "Fraction of Reads Removed by UMI Filtering" - type = "Percent" - help = "Fraction of all reads confidently mapped to the targeted transcriptome and subsequently removed by targeted UMI filtering." - -# -------------------------------------------------------------------------------------------------- -# GEX -> Targeted enrichment alerts -# -------------------------------------------------------------------------------------------------- -# NOTE: this table isn't used/displayed in the websummary, but we populate it in the websummary data to propogate up its alerts if they are triggered. -[gex_library_targeted_enrichment_alerts] -title = "Targeted Enrichment Alerts" -help = "Targeted metrics only used for setting alerts" -entries = [ - "frac_on_target_genes_enriched", - "frac_off_target_genes_enriched", -] - - [gex_library_targeted_enrichment_alerts.frac_on_target_genes_enriched] - header = "Fraction on target genes enriched" - type = "Percent" - optional = true - help = "Fraction on target genes enriched" - - [[gex_library_targeted_enrichment_alerts.frac_on_target_genes_enriched.alerts]] - error_threshold = 0.5 - warn_threshold = 0.7 - warn_title = "Low Fraction of Targeted Genes Enriched" - detail = "Ideal > 70%. If sequencing saturation is sufficiently high to detect enrichment, this can indicate use of the wrong target panel, or inefficient targeting. Targeted performance may be affected." - - [gex_library_targeted_enrichment_alerts.frac_off_target_genes_enriched] - header = "Fraction off target genes enriched" - type = "Percent" - optional = true - help = "Fraction off target genes enriched" - - [[gex_library_targeted_enrichment_alerts.frac_off_target_genes_enriched.alerts]] - error_threshold = 0.5 - warn_threshold = 0.3 - warn_title = "High Fraction of Non-Targeted Genes Enriched" - detail = "Ideal < 30%. This can indicate use of the wrong target panel, or inefficient targeting. Targeted performance may be affected." + json_key = "multi_transcriptome_total_raw_reads_per_filtered_bc" # -------------------------------------------------------------------------------------------------- # VDJ-T -> Enrichment # -------------------------------------------------------------------------------------------------- [vdj_t_enrichment_metrics] title = "Enrichment" +tier = "library" entries = [ "physical_library_id", "multi_vdj_recombinome_mapped_reads_frac", "TRA_vdj_recombinome_mapped_reads_frac", "TRB_vdj_recombinome_mapped_reads_frac", ] +group_by_key = "physical_library_id" + + [vdj_t_enrichment_metrics.conditions] + library_types = ["VDJ-T"] [vdj_t_enrichment_metrics.physical_library_id] header = "Physical library ID" @@ -718,12 +660,17 @@ entries = [ # -------------------------------------------------------------------------------------------------- [vdj_tgd_enrichment_metrics] title = "Enrichment" +tier = "library" entries = [ "physical_library_id", "multi_vdj_recombinome_mapped_reads_frac", "TRG_vdj_recombinome_mapped_reads_frac", "TRD_vdj_recombinome_mapped_reads_frac", ] +group_by_key = "physical_library_id" + + [vdj_tgd_enrichment_metrics.conditions] + library_types = ["VDJ-T-GD"] [vdj_tgd_enrichment_metrics.physical_library_id] header = "Physical library ID" @@ -750,12 +697,13 @@ entries = [ type = "Percent" header = "Reads mapped to TRD" help = "Fraction of reads with valid barcodes that map partially or wholly to a germline TRD gene segment." - + # -------------------------------------------------------------------------------------------------- # VDJ-B -> Enrichment # -------------------------------------------------------------------------------------------------- [vdj_b_enrichment_metrics] title = "Enrichment" +tier = "library" entries = [ "physical_library_id", "multi_vdj_recombinome_mapped_reads_frac", @@ -763,6 +711,10 @@ entries = [ "IGK_vdj_recombinome_mapped_reads_frac", "IGL_vdj_recombinome_mapped_reads_frac", ] +group_by_key = "physical_library_id" + + [vdj_b_enrichment_metrics.conditions] + library_types = ["VDJ-B"] [vdj_b_enrichment_metrics.physical_library_id] header = "Physical library ID" @@ -795,12 +747,218 @@ entries = [ header = "Reads mapped to IGL" help = "Fraction of reads with valid barcodes that map partially or wholly to a germline IGL gene segment." +# -------------------------------------------------------------------------------------------------- +# VDJ-T -> Cell Calling Quality +# -------------------------------------------------------------------------------------------------- +[vdj_t_library_cell_metrics] +title = "Cell Calling Quality" +tier = "library" +entries = [ + "physical_library_id", + "vdj_filtered_bcs", + "multi_vdj_assembly_contig_pair_productive_full_len_bc_frac", + "TRA_TRB_vdj_assembly_contig_pair_productive_full_len_bc_frac", + "TRA_vdj_assembly_prod_cdr_bc_frac", + "TRB_vdj_assembly_prod_cdr_bc_frac", +] +group_by_key = "physical_library_id" + + [vdj_t_library_cell_metrics.conditions] + library_types = ["VDJ-T"] + + [vdj_t_library_cell_metrics.physical_library_id] + header = "Physical library ID" + type = "String" + help = "Unique identifier for each library." + + [vdj_t_library_cell_metrics.vdj_filtered_bcs] + header = "VDJ Cells" + type = "usize" + help = "The number of barcodes estimated to be associated with cells that express targeted V(D)J transcripts." + + [[vdj_t_library_cell_metrics.vdj_filtered_bcs.alerts]] + error_threshold = 0 + warn_threshold = 10 + error_title = "No Cells Detected" + warn_title = "Low Number of Cells Detected" + detail = "Ideal >= 10. This usually indicates poor cell quality, poor library quality, or poor sequencing quality. Application performance is likely to be affected." + + [vdj_t_library_cell_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive V-J spanning pair" + help = "Fraction of cell-associated barcodes with at least one productive contig for each chain of the receptor pair. A productive contig satisfies the following conditions: the contig annotations span the 5' end of the V region to the 3' end of the J region of the chain, a start codon was found in the expected part of the V sequence, an in-frame CDR3 amino acid motif was found, and no stop codons were found in the aligned V-J region." + + [[vdj_t_library_cell_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_frac.alerts]] + error_threshold = 0.2 + warn_threshold = 0.3 + warn_title = "Low Cells with productive V-J spanning pair" + detail = "Ideal > 30%. This can indicate poor cell quality, low yield from the RT reaction, poor specificity of the V(D)J enrichment, poor sequencing quality, or the use of an unsupported chemistry type (e.g., using Single Cell 3' for V(D)J assembly). Application performance may be affected" + + [vdj_t_library_cell_metrics.TRA_TRB_vdj_assembly_contig_pair_productive_full_len_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive V-J spanning (TRA, TRB) pair" + help = "Fraction of cell-associated barcodes with at least one productive contig for each chain of the (TRA, TRB) receptor pair." + + [vdj_t_library_cell_metrics.TRA_vdj_assembly_prod_cdr_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive TRA contig" + help = "Fraction of cell-associated barcodes with at least one contig that spans the 5' end of the V region to the 3' end of the J region for TRA, has a start codon in the expected part of the V sequence, has an in-frame CDR3, and has no stop codons in the aligned V-J region." + + [vdj_t_library_cell_metrics.TRB_vdj_assembly_prod_cdr_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive TRB contig" + help = "Fraction of cell-associated barcodes with at least one contig that spans the 5' end of the V region to the 3' end of the J region for TRB, has a start codon in the expected part of the V sequence, has an in-frame CDR3, and has no stop codons in the aligned V-J region." + +# -------------------------------------------------------------------------------------------------- +# VDJ-T G/D -> Cell Calling Quality +# -------------------------------------------------------------------------------------------------- +[vdj_tgd_library_cell_metrics] +title = "Cell Calling Quality" +tier = "library" +entries = [ + "physical_library_id", + "vdj_filtered_bcs", + "multi_vdj_assembly_contig_pair_productive_full_len_bc_frac", + "TRG_TRD_vdj_assembly_contig_pair_productive_full_len_bc_frac", + "TRG_vdj_assembly_prod_cdr_bc_frac", + "TRD_vdj_assembly_prod_cdr_bc_frac", +] +group_by_key = "physical_library_id" + + [vdj_tgd_library_cell_metrics.conditions] + library_types = ["VDJ-T-GD"] + + [vdj_tgd_library_cell_metrics.physical_library_id] + header = "Physical library ID" + type = "String" + help = "Unique identifier for each library." + + [vdj_tgd_library_cell_metrics.vdj_filtered_bcs] + header = "VDJ Cells" + type = "usize" + help = "The number of barcodes estimated to be associated with cells that express targeted V(D)J transcripts." + + [[vdj_tgd_library_cell_metrics.vdj_filtered_bcs.alerts]] + error_threshold = 0 + warn_threshold = 10 + error_title = "No Cells Detected" + warn_title = "Low Number of Cells Detected" + detail = "Ideal >= 10. This usually indicates poor cell quality, poor library quality, or poor sequencing quality. Application performance is likely to be affected." + + [vdj_tgd_library_cell_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive V-J spanning pair" + help = "Fraction of cell-associated barcodes with at least one productive contig for each chain of the receptor pair. A productive contig satisfies the following conditions: the contig annotations span the 5' end of the V region to the 3' end of the J region of the chain, a start codon was found in the expected part of the V sequence, an in-frame CDR3 amino acid motif was found, and no stop codons were found in the aligned V-J region." + + [vdj_tgd_library_cell_metrics.TRG_TRD_vdj_assembly_contig_pair_productive_full_len_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive V-J spanning (TRG, TRD) pair" + help = "Fraction of cell-associated barcodes with at least one productive contig for each chain of the (TRG, TRD) receptor pair." + + [vdj_tgd_library_cell_metrics.TRG_vdj_assembly_prod_cdr_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive TRG contig" + help = "Fraction of cell-associated barcodes with at least one contig that spans the 5' end of the V region to the 3' end of the J region for TRG, has a start codon in the expected part of the V sequence, has an in-frame CDR3, and has no stop codons in the aligned V-J region." + + [vdj_tgd_library_cell_metrics.TRD_vdj_assembly_prod_cdr_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive TRD contig" + help = "Fraction of cell-associated barcodes with at least one contig that spans the 5' end of the V region to the 3' end of the J region for TRD, has a start codon in the expected part of the V sequence, has an in-frame CDR3, and has no stop codons in the aligned V-J region." + +# -------------------------------------------------------------------------------------------------- +# VDJ-B -> Cell Calling Quality +# -------------------------------------------------------------------------------------------------- +[vdj_b_library_cell_metrics] +title = "Cell Calling Quality" +tier = "library" +entries = [ + "physical_library_id", + "vdj_filtered_bcs", + "multi_vdj_assembly_contig_pair_productive_full_len_bc_frac", + "IGK_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac", + "IGL_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac", + "IGH_vdj_assembly_prod_cdr_bc_frac", + "IGK_vdj_assembly_prod_cdr_bc_frac", + "IGL_vdj_assembly_prod_cdr_bc_frac", +] +group_by_key = "physical_library_id" + + [vdj_b_library_cell_metrics.conditions] + library_types = ["VDJ-B"] + + [vdj_b_library_cell_metrics.physical_library_id] + header = "Physical library ID" + type = "String" + help = "Unique identifier for each library." + + [vdj_b_library_cell_metrics.vdj_filtered_bcs] + header = "VDJ Cells" + type = "usize" + help = "The number of barcodes estimated to be associated with cells that express targeted V(D)J transcripts." + + [[vdj_b_library_cell_metrics.vdj_filtered_bcs.alerts]] + error_threshold = 0 + warn_threshold = 10 + error_title = "No Cells Detected" + warn_title = "Low Number of Cells Detected" + detail = "Ideal >= 10. This usually indicates poor cell quality, poor library quality, or poor sequencing quality. Application performance is likely to be affected." + + [vdj_b_library_cell_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive V-J spanning pair" + help = "Fraction of cell-associated barcodes with at least one productive contig for each chain of the receptor pair. A productive contig satisfies the following conditions: the contig annotations span the 5' end of the V region to the 3' end of the J region of the chain, a start codon was found in the expected part of the V sequence, an in-frame CDR3 amino acid motif was found, and no stop codons were found in the aligned V-J region." + + [[vdj_b_library_cell_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_frac.alerts]] + error_threshold = 0.2 + warn_threshold = 0.3 + warn_title = "Low Cells with Productive V-J Spanning Pair" + detail = "Ideal > 30%. This can indicate poor cell quality, low yield from the RT reaction, poor specificity of the V(D)J enrichment, poor sequencing quality, or the use of an unsupported chemistry type (e.g., using Single Cell 3' for V(D)J assembly). Application performance may be affected" + + [vdj_b_library_cell_metrics.IGK_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive V-J spanning (IGK, IGH) pair" + help = "Fraction of cell-associated barcodes with at least one productive contig for each chain of the (IGK, IGH) receptor pair." + + [vdj_b_library_cell_metrics.IGL_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive V-J spanning (IGL, IGH) pair" + help = "Fraction of cell-associated barcodes with at least one productive contig for each chain of the (IGL, IGH) receptor pair." + + [vdj_b_library_cell_metrics.IGH_vdj_assembly_prod_cdr_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive IGH contig" + help = "Fraction of cell-associated barcodes with at least one contig that spans the 5' end of the V region to the 3' end of the J region for IGH, has a start codon in the expected part of the V sequence, has an in-frame CDR3, and has no stop codons in the aligned V-J region." + + [vdj_b_library_cell_metrics.IGK_vdj_assembly_prod_cdr_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive IGK contig" + help = "Fraction of cell-associated barcodes with at least one contig that spans the 5' end of the V region to the 3' end of the J region for IGK, has a start codon in the expected part of the V sequence, has an in-frame CDR3, and has no stop codons in the aligned V-J region." + + [vdj_b_library_cell_metrics.IGL_vdj_assembly_prod_cdr_bc_frac] + type = "Percent" + optional = true + header = "Cells with productive IGL contig" + help = "Fraction of cell-associated barcodes with at least one contig that spans the 5' end of the V region to the 3' end of the J region for IGL, has a start codon in the expected part of the V sequence, has an in-frame CDR3, and has no stop codons in the aligned V-J region." # -------------------------------------------------------------------------------------------------- # VDJ -> Metrics Per Physical Library # -------------------------------------------------------------------------------------------------- [vdj_physical_library_metrics] title = "Metrics Per Physical Library" +tier = "library" entries = [ "physical_library_id", "VDJ_total_read_pairs", @@ -809,6 +967,14 @@ entries = [ "vdj_assemblable_read_pairs_per_filtered_bc", "vdj_filtered_bcs_cum_frac", ] +group_by_key = "physical_library_id" + + [vdj_physical_library_metrics.conditions] + library_types = [ + "VDJ-T", + "VDJ-B", + "VDJ-T-GD", + ] [vdj_physical_library_metrics.physical_library_id] type = "String" @@ -851,6 +1017,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [antibody_library_mapping_metrics] title = "Mapping Metrics (Amongst All Reads in Library)" +tier = "library" entries = [ "physical_library_id", "reads_in_library", @@ -858,6 +1025,10 @@ entries = [ "fraction_antibody_reads_usable", "fraction_reads_in_aggregate_barcodes", ] +group_by_key = "physical_library_id" + + [antibody_library_mapping_metrics.conditions] + library_types = ["Antibody Capture"] [antibody_library_mapping_metrics.physical_library_id] header = "Physical library ID" @@ -892,6 +1063,7 @@ entries = [ [antibody_library_mapping_metrics.fraction_reads_in_aggregate_barcodes] type = "Percent" json_key = "ANTIBODY_reads_lost_to_aggregate_GEMs" + optional = true header = "Fraction antibody reads in aggregate barcodes" help = "Fraction of read pairs with valid barcodes that were removed because they are aggregates." @@ -917,7 +1089,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [antibody_physical_library_metrics] title = "Metrics Per Physical Library" -help = "Metrics calculated for each library." +tier = "library" entries =[ "physical_library_id", "number_of_reads", @@ -929,6 +1101,10 @@ entries =[ "reads_in_cell_associated_partitions", "mean_reads_per_cell_associated_partition", ] +group_by_key = "physical_library_id" + + [antibody_physical_library_metrics.conditions] + library_types = ["Antibody Capture"] [antibody_physical_library_metrics.physical_library_id] type = "String" @@ -1008,7 +1184,7 @@ entries =[ # -------------------------------------------------------------------------------------------------- [antigen_physical_library_metrics] title = "Metrics Per Physical Library" -help = "Metrics calculated for each library." +tier = "library" entries =[ "physical_library_id", "number_of_reads", @@ -1022,6 +1198,10 @@ entries =[ "fraction_unknown_antigen", "fraction_reads_in_aggregate_barcodes", ] +group_by_key = "physical_library_id" + + [antigen_physical_library_metrics.conditions] + library_types = ["Antigen Capture"] [antigen_physical_library_metrics.physical_library_id] type = "String" @@ -1106,6 +1286,7 @@ entries =[ [antigen_physical_library_metrics.fraction_reads_in_aggregate_barcodes] type = "Percent" json_key = "ANTIGEN_reads_lost_to_aggregate_GEMs" + optional = true header = "Fraction antigen reads in aggregate barcodes" help = "Fraction of read pairs with valid barcodes that were removed because they are aggregates." @@ -1121,6 +1302,7 @@ entries =[ # -------------------------------------------------------------------------------------------------- [crispr_library_mapping_metrics] title = "Mapping Metrics (Amongst All Reads in Library)" +tier = "library" entries = [ "physical_library_id", "number_of_reads", @@ -1129,6 +1311,10 @@ entries = [ "fraction_guide_reads_usable", "fraction_protospacer_not_recognized", ] +group_by_key = "physical_library_id" + + [crispr_library_mapping_metrics.conditions] + library_types = ["CRISPR Guide Capture"] [crispr_library_mapping_metrics.physical_library_id] type = "String" @@ -1184,7 +1370,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [crispr_physical_library_metrics] title = "Metrics Per Physical Library" -help = "Metrics calculated for each library." +tier = "library" entries = [ "physical_library_id", "number_of_reads", @@ -1196,6 +1382,10 @@ entries = [ "reads_in_cell_associated_partitions", "mean_reads_per_cell_associated_partition", ] +group_by_key = "physical_library_id" + + [crispr_physical_library_metrics.conditions] + library_types = ["CRISPR Guide Capture"] [crispr_physical_library_metrics.physical_library_id] type = "String" @@ -1275,7 +1465,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [custom_feature_physical_library_metrics] title = "Metrics Per Physical Library" -help = "Metrics calculated for each library." +tier = "library" entries = [ "physical_library_id", "number_of_reads", @@ -1288,6 +1478,10 @@ entries = [ "fraction_feature_reads_usable", "fraction_unknown_feature", ] +group_by_key = "physical_library_id" + + [custom_feature_physical_library_metrics.conditions] + library_types = ["Custom"] [custom_feature_physical_library_metrics.physical_library_id] type = "String" @@ -1298,11 +1492,13 @@ entries = [ type = "usize" header = "Number of reads" help = "Total number of read pairs that were assigned to this library." + json_key = "Custom_total_read_pairs" [custom_feature_physical_library_metrics.valid_barcodes] type = "Percent" header = "Valid barcodes" help = "Fraction of reads with barcodes that are present in the whitelist after barcode correction." + json_key = "Custom_good_bc_frac" [[custom_feature_physical_library_metrics.valid_barcodes.alerts]] error_threshold = 0.5 @@ -1314,168 +1510,202 @@ entries = [ type = "Percent" header = "Valid UMIs" help = "Fraction of reads with valid UMIs; i.e. UMI sequences that do not contain Ns and that are not homopolymers." + json_key = "Custom_good_umi_frac" [custom_feature_physical_library_metrics.sequencing_saturation] type = "Percent" header = "Sequencing saturation" help = "The fraction of reads originating from an already-observed UMI. This is a function of library complexity and sequencing depth. More specifically, this is a ratio where: the denominator is the number of reads with a recognized Feature Barcode, valid cell-barcode, and valid UMI, and the numerator is the subset of those reads that had a non-unique combination of (cell-barcode, UMI, Feature Barcode)." + json_key = "Custom_multi_cdna_pcr_dupe_reads_frac" [custom_feature_physical_library_metrics.reads_in_cell_associated_partitions] type = "Percent" header = "Fraction reads in cells" help = "The fraction of valid-barcode, valid-UMI, recognized feature-barcode reads with cell-associated barcodes." + json_key = "Custom_feature_reads_in_cells" [custom_feature_physical_library_metrics.mean_reads_per_cell_associated_partition] type = "FloatAsInt" header = "Mean reads per cell" help = "The total number of sequenced read pairs divided by the number of cell-associated barcodes." + json_key = "Custom_reads_per_cell" [custom_feature_physical_library_metrics.fraction_feature_reads] type = "Percent" header = "Fraction feature reads" help = "Fraction of reads that contain a recognized feature-barcode sequence." + json_key = "Custom_recognized_feature_bc_frac" [custom_feature_physical_library_metrics.fraction_feature_reads_usable] type = "Percent" header = "Fraction feature reads usable" help = "Fraction of read pairs that contain a recognized feature-barcode, a valid UMI, and a cell-associated barcode" + json_key = "Custom_frac_feature_reads_usable" [custom_feature_physical_library_metrics.fraction_unknown_feature] type = "Percent" header = "Fraction unrecognized feature" help = "Fraction of read pairs with an unrecognized feature-barcode sequence" + json_key = "Custom_unrecognized_feature_bc_frac" # -------------------------------------------------------------------------------------------------- -# Multiplexing -> Multiplexing metrics +# Multiplexing -> Multiplexing Quality # -------------------------------------------------------------------------------------------------- -[multiplexing_library_cell_metrics] -title = "Multiplexing metrics" +[cmo_multiplexing_quality] +title = "Multiplexing Quality" +tier = "library" entries = [ "cell_associated_partitions", "samples_assigned_at_least_one_singlet", - "singlets_assigned_to_sample", + "singlets_assigned_to_a_sample", "singlet_capture_ratio", - "cell_associated_partitions_identified_as_multiplet", "median_cmo_umis_per_singlet", + "cell_associated_partitions_identified_as_multiplets", + "cell_associated_partitions_not_assigned_any_tags", ] + [cmo_multiplexing_quality.conditions] + library_types = ["Multiplexing Capture"] - [multiplexing_library_cell_metrics.cell_associated_partitions] + [cmo_multiplexing_quality.cell_associated_partitions] header = "Estimated number of cell-associated barcodes" type = "usize" - help = "Number of cell-associated barcodes called as containing one or more cells. For a more detailed explanation, please see Technical Note CG000475 on https://www.10xgenomics.com/support" + help = "Cell-associated barcodes include cell barcodes that are either (1) assigned to a sample, (2) identified as multiplets, or (3) not assigned any Hashtags or CMOs. For a more detailed explanation, please see Technical Note CG000475 on https://www.10xgenomics.com/support" + json_key = "multi_filtered_bcs" - [multiplexing_library_cell_metrics.samples_assigned_at_least_one_singlet] + [cmo_multiplexing_quality.samples_assigned_at_least_one_singlet] type = "usize" header = "Number of samples assigned at least one cell" help = "Number of samples to which at least one cell was assigned. Only cell-associated barcodes assigned exactly one CMO were assigned to a sample." + json_key = "samples_with_any_singlets" - [[multiplexing_library_cell_metrics.samples_assigned_at_least_one_singlet.alerts]] + [[cmo_multiplexing_quality.samples_assigned_at_least_one_singlet.alerts]] if_metric_is = "less_than_or_equal" error_threshold = 0 error_title = "No samples assigned a cell" - detail = "No samples have been assigned a cell. This may indicate experimental issues (CMO staining quality, cell-handling, etc.) or mistakes in CMO or sample definitions specified in the Config CSV. Only cell-associated barcodes assigned exactly one CMO can be assigned to a sample." + detail = "No samples have been assigned a cell. This may indicate experimental issues (CMO staining quality, cell-handling, etc.) or mistakes in staining or sample definitions specified in the Config CSV. Only cell-associated barcodes assigned exactly one CMO (or Hashtag) can be assigned to a sample." - [multiplexing_library_cell_metrics.singlets_assigned_to_sample] + [cmo_multiplexing_quality.singlets_assigned_to_a_sample] type = "CountAndPercent" # NOTE: Alerts for CountAndPercent are based on the count, not percent header = "Cells assigned to a sample" help = "Number and fraction of cells assigned to a sample amongst all cells detected in this GEM well. Only cell-associated barcodes assigned exactly one CMO were assigned to a sample." - [[multiplexing_library_cell_metrics.singlets_assigned_to_sample.alerts]] + [[cmo_multiplexing_quality.singlets_assigned_to_a_sample.alerts]] if_metric_is = "less_than_or_equal" error_threshold = 0 error_title = "No cells have been assigned to a sample" - detail = "No cells have been assigned to a sample. This may indicate experimental issues (CMO staining quality, cell-handling, etc.) or mistakes in CMO or sample definitions specified in the Config CSV. Only cell-associated barcodes assigned exactly one CMO can be assigned to a sample." + detail = "No cells have been assigned to a sample. This may indicate experimental issues (CMO staining quality, cell-handling, etc.) or mistakes in staining or sample definitions specified in the Config CSV. Only cell-associated barcodes assigned exactly one CMO (or Hashtag) can be assigned to a sample." - [multiplexing_library_cell_metrics.singlet_capture_ratio] + [cmo_multiplexing_quality.singlet_capture_ratio] type = "f64" header = "Singlet capture ratio" - help = "Ratio between the number of singlets (i.e. cell-associated barcodes assigned exactly one CMO) obtained and the number of singlets expected in this experiment according to Poisson statistics." + help = "Ratio between the number of singlets (i.e. cell-associated barcodes assigned exactly one CMO) obtained and the number of singlets expected in this experiment." + json_key = "MULTIPLEXING_sc_rec_efficiency_jibes" - [[multiplexing_library_cell_metrics.singlet_capture_ratio.alerts]] + [[cmo_multiplexing_quality.singlet_capture_ratio.alerts]] error_threshold = 0.5 warn_threshold = 0.75 warn_title = "Fewer than expected number of singlets recovered" - detail = "Ideal >= 0.85. The ratio of observed and expected (according to Poisson statistics) number of singlets (i.e. cell-associated barcodes assigned exactly one CMO) is less than ideal - fewer than expected number of singlets have been recovered. This may indicate experimental issues (CMO staining quality, cell-handling, etc.) or mistakes in CMO or sample definitions specified in the Config CSV." + detail = "Ideal >= 0.85. The ratio of observed and expected number of singlets (i.e. cell-associated barcodes assigned exactly one CMO) is less than ideal - fewer than expected number of singlets have been recovered. This may indicate experimental issues (CMO staining quality, cell-handling, etc.) or mistakes in CMO or sample definitions specified in the Config CSV." + + [cmo_multiplexing_quality.median_cmo_umis_per_singlet] + type = "FloatAsInt" + header = "Median CMO UMI Counts per cell assigned to a sample" + help = "Median number of CMO UMIs captured per cell-associated barcode assigned exactly one CMO." + json_key = "MULTIPLEXING_median_cmo_umis_per_singlet" - [multiplexing_library_cell_metrics.cell_associated_partitions_identified_as_multiplet] + [cmo_multiplexing_quality.cell_associated_partitions_identified_as_multiplets] type = "CountAndPercent" # NOTE: Alerts for CountAndPercent are based on the count, not percent header = "Cell-associated barcodes identified as multiplets" - help = "Fraction of cell-associated barcodes that were assigned more than one CMO and hence identified as multiplets." + help = "Cell-associated barcodes that were assigned more than one CMO and hence determined to be multiplets." - [multiplexing_library_cell_metrics.median_cmo_umis_per_singlet] - type = "FloatAsInt" - header = "Median CMO UMIs per cell" - help = "Median number of CMO UMIs captured per cell-associated barcode assigned exactly one CMO." + [cmo_multiplexing_quality.cell_associated_partitions_not_assigned_any_tags] + type = "CountAndPercent" # NOTE: Alerts for CountAndPercent are based on the count, not percent + header = "Cell-associated barcodes not assigned any CMOs" + help = "Cell-associated barcodes that either (i) did not have enough CMO molecules above background or (ii) could not be confidently assigned to a singlet or multiplet state." # -------------------------------------------------------------------------------------------------- -# Multiplexing -> Multiplexing sample assignments +# Hashtag -> Multiplexing Quality # -------------------------------------------------------------------------------------------------- -[multiplexing_sample_assignments] -title = "Multiplexing sample assignments" +[hashtag_multiplexing_quality] +title = "Multiplexing Quality" +tier = "library" entries =[ - "physical_library_id", "cell_associated_partitions", - "mean_reads_per_cell", "samples_assigned_at_least_one_singlet", "singlets_assigned_to_a_sample", + "median_hashtag_umis_per_singlet", + "hashtag_singlet_capture_ratio", "cell_associated_partitions_identified_as_multiplets", - "cell_associated_partitions_not_assigned_any_cmos", - "median_cmo_umis_per_cell_associated_partition", + "cell_associated_partitions_not_assigned_any_tags", ] + [hashtag_multiplexing_quality.conditions] + library_types = ["Antibody Capture"] - [multiplexing_sample_assignments.physical_library_id] - type = "String" - header = "Physical library ID" - help = "Unique identifier for each library." - - [multiplexing_sample_assignments.cell_associated_partitions] + [hashtag_multiplexing_quality.cell_associated_partitions] type = "usize" - header = "Estimated number of cell-associated barcodes" + header = "Cell-associated barcodes" help = "Number of cell-associated barcodes called as containing one or more cells." + json_key = "multi_filtered_bcs" - [[multiplexing_sample_assignments.cell_associated_partitions.alerts]] + [[hashtag_multiplexing_quality.cell_associated_partitions.alerts]] error_threshold = 0 warn_threshold = 100 error_title = "No Cells Detected" warn_title = "Low Number of Cells Detected" detail = "Estimated number of cell-associated barcodes is expected to be > 100. This usually indicates poor cell handling, poor library quality, or poor sequencing quality. Application performance is likely to be affected." - [multiplexing_sample_assignments.mean_reads_per_cell] - type = "FloatAsInt" - header = "Mean reads per cell-associated barcode" - help = "The total number of sequenced read pairs divided by the number of cell-associated barcodes." - - [multiplexing_sample_assignments.samples_assigned_at_least_one_singlet] + [hashtag_multiplexing_quality.samples_assigned_at_least_one_singlet] type = "usize" - header = "Samples assigned at least one cell" - help = "Number of samples to which at least one cell was assigned. Only cell-associated barcodes assigned exactly one CMO were assigned to a sample." + header = "Number of samples assigned at least one cell" + help = "Number of samples to which at least one cell was assigned. Only cell-associated barcodes assigned exactly one Hashtag were assigned to a sample." + json_key = "samples_with_any_singlets" - [multiplexing_sample_assignments.singlets_assigned_to_a_sample] + [hashtag_multiplexing_quality.singlets_assigned_to_a_sample] type = "CountAndPercent" # NOTE: Alerts for CountAndPercent are based on the count, not percent - header = "Cells assigned to a sample" - help = "Number and fraction of cells assigned to a sample amongst all cells detected in this GEM well. Only cell-associated barcodes assigned exactly one CMO were assigned to a sample." + header = "Cell-associated barcodes assigned to a sample" + help = "Number and fraction of cells assigned to a sample amongst all cells detected in this GEM well. Only cell-associated barcodes assigned exactly one Hashtag were assigned to a sample." + + [[hashtag_multiplexing_quality.singlets_assigned_to_a_sample.alerts]] + if_metric_is = "less_than_or_equal" + error_threshold = 0 + error_title = "No cells have been assigned to a sample" + detail = "No cells have been assigned to a sample. This may indicate experimental issues (Hashtag staining quality, cell-handling, etc.) or mistakes in staining or sample definitions specified in the Config CSV. Only cell-associated barcodes assigned exactly one Hashtag can be assigned to a sample." + + [hashtag_multiplexing_quality.median_hashtag_umis_per_singlet] + type = "FloatAsInt" + header = "Median Hashtag UMI Counts per cell" + help = "Median number of Hashtag UMIs captured per cell-associated barcode assigned exactly one Hashtag." + json_key = "ANTIBODY_median_cmo_umis_per_singlet" - [multiplexing_sample_assignments.cell_associated_partitions_identified_as_multiplets] + [hashtag_multiplexing_quality.cell_associated_partitions_identified_as_multiplets] type = "CountAndPercent" # NOTE: Alerts for CountAndPercent are based on the count, not percent header = "Cell-associated barcodes identified as multiplets" - help = "Cell-associated barcodes that were assigned more than one CMO and hence determined to be multiplets." + help = "Cell-associated barcodes that were assigned more than one Hashtag and hence determined to be multiplets." - [multiplexing_sample_assignments.cell_associated_partitions_not_assigned_any_cmos] + [hashtag_multiplexing_quality.cell_associated_partitions_not_assigned_any_tags] type = "CountAndPercent" # NOTE: Alerts for CountAndPercent are based on the count, not percent - header = "Cell-associated barcodes not assigned any CMOs" - help = "Cell-associated barcodes that either (i) did not have enough CMO molecules above background or (ii) could not be confidently assigned to a singlet or multiplet state." + header = "Cell-associated barcodes not assigned any Hashtags" + help = "Cell-associated barcodes that either (i) did not have enough Hashtag molecules above background or (ii) could not be confidently assigned to a singlet or multiplet state." - [multiplexing_sample_assignments.median_cmo_umis_per_cell_associated_partition] - type = "FloatAsInt" - header = "Median CMO UMIs per cell-associated barcode" - help = "Median number of CMO UMIs captured per cell-associated barcode." + [hashtag_multiplexing_quality.hashtag_singlet_capture_ratio] + type = "f64" + header = "Singlet capture ratio" + help = "Ratio between the number of singlets (i.e. cell-associated barcodes assigned exactly one Hashtag) obtained and the number of singlets expected in this experiment according to Poisson statistics." + json_key = "ANTIBODY_sc_rec_efficiency_jibes" + optional = true + [[hashtag_multiplexing_quality.hashtag_singlet_capture_ratio.alerts]] + error_threshold = 0.5 + warn_threshold = 0.75 + warn_title = "Fewer than expected number of singlets recovered" + detail = "Ideal >= 0.85. The ratio of observed and expected (according to Poisson statistics) number of singlets (i.e. cell-associated barcodes assigned exactly one Hashtag) is less than ideal - fewer than expected number of singlets have been recovered. This may indicate experimental issues (Hashtag staining quality, cell-handling, etc.) or mistakes in Hashtag or sample definitions specified in the Config CSV." # -------------------------------------------------------------------------------------------------- # Multiplexing -> Metrics Per Physical Library # -------------------------------------------------------------------------------------------------- [multiplexing_physical_library_metrics] title = "Metrics Per Physical Library" +tier = "library" entries = [ "physical_library_id", "number_of_reads", @@ -1489,6 +1719,10 @@ entries = [ "fraction_unknown_cmo", "fraction_reads_from_multiplets", ] +group_by_key = "physical_library_id" + + [multiplexing_physical_library_metrics.conditions] + library_types = ["Multiplexing Capture"] [multiplexing_physical_library_metrics.physical_library_id] type = "String" @@ -1499,11 +1733,13 @@ entries = [ type = "usize" header = "Number of reads" help = "Total number of read pairs that were assigned to this library." + json_key = "MULTIPLEXING_total_read_pairs" [multiplexing_physical_library_metrics.valid_barcodes] type = "Percent" header = "Valid barcodes" help = "Fraction of reads with barcodes that are present in the whitelist after barcode correction." + json_key = "MULTIPLEXING_good_bc_frac" [[multiplexing_physical_library_metrics.valid_barcodes.alerts]] error_threshold = 0.5 @@ -1515,16 +1751,19 @@ entries = [ type = "Percent" header = "Valid UMIs" help = "Fraction of reads with valid UMIs; i.e. UMI sequences that do not contain Ns and that are not homopolymers." + json_key = "MULTIPLEXING_good_umi_frac" [multiplexing_physical_library_metrics.sequencing_saturation] type = "Percent" header = "Sequencing saturation" help = "The fraction of reads originating from an already-observed UMI. This is a function of library complexity and sequencing depth. More specifically, this is a ratio where: the denominator is the number of reads with a recognized CMO barcode, valid cell-barcode, and valid UMI, and the numerator is the subset of those reads that had a non-unique combination of (cell-barcode, UMI, CMO barcode)." + json_key = "MULTIPLEXING_multi_cdna_pcr_dupe_reads_frac" [multiplexing_physical_library_metrics.reads_in_cell_associated_partitions] type = "Percent" header = "Fraction reads in cell-associated barcodes" help = "The fraction of valid-barcode, valid-UMI, recognized multiplexing-barcode reads with cell-associated barcodes." + json_key = "MULTIPLEXING_feature_reads_in_cells" [[multiplexing_physical_library_metrics.reads_in_cell_associated_partitions.alerts]] error_threshold = 0.20 @@ -1536,21 +1775,25 @@ entries = [ type = "FloatAsInt" header = "Mean reads per cell-associated barcode" help = "The total number of sequenced read pairs divided by the number of cell-associated barcodes." + json_key = "MULTIPLEXING_multi_total_raw_reads_per_filtered_bc" [multiplexing_physical_library_metrics.fraction_cmo_reads] type = "Percent" header = "Fraction CMO reads" help = "Fraction of reads that contain a recognized CMO sequence." + json_key = "MULTIPLEXING_recognized_feature_bc_frac" [multiplexing_physical_library_metrics.fraction_cmo_reads_usable] type = "Percent" header = "Fraction CMO reads usable" help = "Fraction of read pairs that contain a recognized CMO sequence, a valid UMI, and a cell-associated barcode" + json_key = "MULTIPLEXING_frac_feature_reads_usable" [multiplexing_physical_library_metrics.fraction_unknown_cmo] type = "Percent" header = "Fraction unrecognized CMO" help = "Fraction of read pairs with an unrecognized CMO sequence." + json_key = "MULTIPLEXING_unrecognized_feature_bc_frac" [[multiplexing_physical_library_metrics.fraction_unknown_cmo.alerts]] error_threshold = 1.0 @@ -1563,40 +1806,95 @@ entries = [ type = "Percent" header = "Fraction reads from multiplets" help = "Amongst all sequenced read pairs, fraction with a cell-barcode identified as a multiplet." + json_key = "MULTIPLEXING_frac_reads_from_multiplets" # -------------------------------------------------------------------------------------------------- # Multiplexing -> Metrics per CMO # -------------------------------------------------------------------------------------------------- -[multiplexing_cmo_metrics] +[cmo_per_tag_metrics] title = "Metrics per CMO" +tier = "library" entries = [ "gem_well_cmo", - "reads_in_cell_associated_partitions", + "sample_id", + "cmo_reads_in_cell_associated_partitions", "singlets_assigned_to_cmo", "cmo_signal_to_background_ratio", ] +group_by_key = "gem_well_cmo" - [multiplexing_cmo_metrics.gem_well_cmo] + [cmo_per_tag_metrics.conditions] + library_types = ["Multiplexing Capture"] + + [cmo_per_tag_metrics.gem_well_cmo] type = "String" header = "CMO Name" help = "Metrics in this table are provided for each CMO." - [multiplexing_cmo_metrics.reads_in_cell_associated_partitions] + [cmo_per_tag_metrics.sample_id] + type = "String" + header = "Sample ID" + help = "The identifier of the sample associated with this CMO." + + [cmo_per_tag_metrics.cmo_reads_in_cell_associated_partitions] type = "Percent" header = "Fraction reads in cell-associated barcodes" help = "Amongst all reads with a valid barcode, valid UMI, and this particular CMO sequence, fraction arising from cell-containing partitions." - [multiplexing_cmo_metrics.singlets_assigned_to_cmo] - type = "Percent" - header = "Cells assigned to CMO" + [cmo_per_tag_metrics.singlets_assigned_to_cmo] + type = "CountAndPercent" + header = "Cells per CMO" help = "Fraction of cells assigned this particular CMO (and only this CMO) amongst all cells detected in this GEM well." - [multiplexing_cmo_metrics.cmo_signal_to_background_ratio] + [cmo_per_tag_metrics.cmo_signal_to_background_ratio] type = "f64" header = "CMO signal-to-noise ratio" help = "Computed as the difference between labeled and unlabelled mean CMO counts (log scale) divided by the variance." +# -------------------------------------------------------------------------------------------------- +# Hashtag -> Metrics per Hashtag +# -------------------------------------------------------------------------------------------------- +[hashtag_per_tag_metrics] +title = "Metrics per Hashtag" +tier = "library" +entries = [ + "gem_well_hashtag", + "sample_id", + "hashtag_reads_in_cell_associated_partitions", + "singlets_assigned_to_hashtag", + "hashtag_signal_to_background_ratio", +] +group_by_key = "gem_well_hashtag" + + [hashtag_per_tag_metrics.conditions] + library_types = ["Antibody Capture"] + + [hashtag_per_tag_metrics.gem_well_hashtag] + type = "String" + header = "Hashtag Name" + help = "Metrics in this table are provided for each Hashtag." + + [hashtag_per_tag_metrics.sample_id] + type = "String" + header = "Sample ID" + help = "The identifier of the sample associated with this hashtag." + + [hashtag_per_tag_metrics.hashtag_reads_in_cell_associated_partitions] + type = "Percent" + header = "Fraction reads in cell-associated barcodes" + help = "Amongst all reads with a valid barcode, valid UMI for this particular Hashtag, fraction arising from cell-containing partitions." + + [hashtag_per_tag_metrics.singlets_assigned_to_hashtag] + type = "CountAndPercent" + header = "Cells per Hashtag" + help = "Fraction of cells assigned this particular Hashtag (and only this Hashtag) amongst all cells detected in this GEM well." + + [hashtag_per_tag_metrics.hashtag_signal_to_background_ratio] + type = "f64" + header = "Hashtag signal-to-noise ratio" + help = "Computed as the difference between labeled and unlabelled mean Hashtag counts (log scale) divided by the variance." + #################################################################################################### # Section 2: Tables that appear in the "Sample" Tab #################################################################################################### @@ -1606,19 +1904,21 @@ entries = [ # -------------------------------------------------------------------------------------------------- [gex_sample_hero_metrics] title = "Cells" +tier = "sample" entries = [ "genome", "total_singlets", "mean_reads_per_cell", - "median_reads_per_cell_on_target", "median_genes_per_singlet", - "median_genes_per_cell_on_target", "total_genes_detected", - "num_genes_detected_on_target", "median_umi_per_singlet", - "median_umis_per_cell_on_target", "confidently_mapped_reads_in_cells", ] +group_by_key = "genome" + + [gex_sample_hero_metrics.conditions] + library_types = ["Gene Expression"] + [gex_sample_hero_metrics.genome] type = "String" optional = true @@ -1643,48 +1943,24 @@ entries = [ header = "Mean reads per cell" help = "Mean number of read pairs sequenced from the cells called from this sample." - [gex_sample_hero_metrics.median_reads_per_cell_on_target] - type = "FloatAsInt" - header = "Median targeted reads per cell" - optional = true - help = "Median number of targeted read pairs sequenced from the cells called from this sample." - [gex_sample_hero_metrics.median_genes_per_singlet] type = "FloatAsInt" header = "Median genes per cell" optional = true # Not shown in targeted samples help = "The median number of genes detected per cell called from this sample. Detection is defined as the presence of at least 1 UMI count." - [gex_sample_hero_metrics.median_genes_per_cell_on_target] - type = "FloatAsInt" - optional = true - header = "Median targeted genes per cell" - help = "The median number of targeted genes detected per cell-associated barcode. Detection is defined as the presence of at least 1 UMI count." - [gex_sample_hero_metrics.total_genes_detected] type = "usize" optional = true # Not shown in targeted samples header = "Total genes detected" help = "The number of genes with at least one UMI count in the cells in this sample." - [gex_sample_hero_metrics.num_genes_detected_on_target] - type = "usize" - optional = true - header = "Total targeted genes detected" - help = "The number of targeted genes with at least one UMI count in any cell." - [gex_sample_hero_metrics.median_umi_per_singlet] type = "FloatAsInt" optional = true # Not shown in targeted samples header = "Median UMI counts per cell" help = "Median number of UMIs obtained from the cells called from this sample." - [gex_sample_hero_metrics.median_umis_per_cell_on_target] - type = "FloatAsInt" - optional = true - header = "Median targeted UMI counts per cell" - help = "The median number of targeted UMI counts per cell." - [gex_sample_hero_metrics.confidently_mapped_reads_in_cells] type = "Percent" optional = true @@ -1703,7 +1979,7 @@ entries = [ # Shared by all sample tabs when multiplexing is enabled [gex_sample_cell_metrics] title = "Cell Multiplexing" -help = "Summary statistics about cell-associated barcodes." +tier = "sample" entries = [ "physical_library_id", "singlets_assigned_to_this_sample", @@ -1711,6 +1987,16 @@ entries = [ "cell_associated_partitions_not_assigned_any_samples", "cell_associated_partitions_identified_as_multiplets", ] +group_by_key = "physical_library_id" + + [gex_sample_cell_metrics.conditions] + library_types = [ + "Gene Expression", + "Antibody Capture", + "CRISPR Guide Capture", + "Custom", + ] + is_cmo_multiplexed = true [gex_sample_cell_metrics.physical_library_id] type = "String" @@ -1743,12 +2029,22 @@ entries = [ # Shared by all sample tabs when multiplexing is enabled [rtl_sample_cell_metrics] title = "Cell Multiplexing" -help = "Summary statistics about cell-associated barcodes." +tier = "sample" entries = [ "physical_library_id", "singlets_assigned_to_this_sample", "singlets_assigned_to_other_samples", ] +group_by_key = "physical_library_id" + + [rtl_sample_cell_metrics.conditions] + library_types = [ + "Gene Expression", + "Antibody Capture", + "CRISPR Guide Capture", + "Custom", + ] + is_read_multiplexed = true [rtl_sample_cell_metrics.physical_library_id] type = "String" @@ -1763,13 +2059,14 @@ entries = [ [rtl_sample_cell_metrics.singlets_assigned_to_other_samples] type = "CountAndPercent" # NOTE: Alerts for CountAndPercent are based on the count, not percent header = "Cells detected in other samples" - help = "Number and fraction of cells detected in other samples samples among all cells detected in this GEM well." + help = "Number and fraction of cells detected in other samples among all cells detected in this GEM well." # -------------------------------------------------------------------------------------------------- # GEX -> Mapping metrics # -------------------------------------------------------------------------------------------------- [gex_sample_mapping_metrics] title = "Mapping Metrics (Amongst Reads From Cells Assigned To Sample)" +tier = "sample" entries = [ "reads_from_cells_assigned_to_sample", "mapped_to_genome", @@ -1782,25 +2079,33 @@ entries = [ "confidently_mapped_antisense", ] + [gex_sample_mapping_metrics.conditions] + library_types = ["Gene Expression"] + is_rtl = false + [gex_sample_mapping_metrics.reads_from_cells_assigned_to_sample] type = "usize" header = "Number of reads from cells called from this sample" help = "The total number of reads from cells called from this sample." + json_key = "total_read_pairs_in_filtered_barcodes" [gex_sample_mapping_metrics.mapped_to_genome] type = "Percent" header = "Mapped to genome" help = "Fraction of reads that mapped to the genome." + json_key = "multi_genome_mapped_reads_frac_in_filtered_barcodes" [gex_sample_mapping_metrics.confidently_mapped_to_genome] type = "Percent" header = "Confidently mapped to genome" help = "Fraction of reads that mapped uniquely to the genome. If a gene mapped to exonic loci from a single gene and also to non-exonic loci, it is considered uniquely mapped to one of the exonic loci." + json_key = "multi_genome_conf_mapped_reads_frac_in_filtered_barcodes" [gex_sample_mapping_metrics.confidently_mapped_to_transcriptome] type = "Percent" header = "Confidently mapped to transcriptome" help = "Fraction of reads that mapped to a unique gene in the transcriptome. The read must be consistent with annotated splice junctions. These reads are considered for UMI counting." + json_key = "multi_transcriptome_conf_mapped_reads_frac_in_filtered_barcodes" [[gex_sample_mapping_metrics.confidently_mapped_to_transcriptome.alerts]] error_threshold = 0.2 @@ -1813,61 +2118,53 @@ entries = [ optional = true header = "Confidently mapped to targeted transcriptome" help = "Fraction of reads that mapped to a unique gene from the target panel. The read must be consistent with annotated splice junctions. These reads are considered for UMI counting." + json_key = "multi_transcriptome_targeted_conf_mapped_reads_frac_in_filtered_barcodes" [gex_sample_mapping_metrics.confidently_mapped_to_intronic_regions] type = "Percent" header = "Confidently mapped to intronic regions" help = "Fraction of reads that mapped uniquely to an intronic region of the genome." + json_key = "multi_intronic_conf_mapped_reads_frac_in_filtered_barcodes" [gex_sample_mapping_metrics.confidently_mapped_to_exonic_regions] type = "Percent" header = "Confidently mapped to exonic regions" help = "Fraction of reads that mapped uniquely to an exonic region of the genome." + json_key = "multi_exonic_conf_mapped_reads_frac_in_filtered_barcodes" [gex_sample_mapping_metrics.confidently_mapped_to_intergenic_regions] type = "Percent" header = "Confidently mapped to intergenic regions" help = "Fraction of reads that mapped uniquely to an intergenic region of the genome." + json_key = "multi_intergenic_conf_mapped_reads_frac_in_filtered_barcodes" [gex_sample_mapping_metrics.confidently_mapped_antisense] type = "Percent" header = "Confidently mapped antisense" help = "Fraction of reads confidently mapped to the transcriptome, but on the opposite strand of their annotated gene. A read is counted as antisense if it has any alignments that are consistent with an exon of a transcript but antisense to it, and has no sense alignments." + json_key = "multi_antisense_reads_frac_in_filtered_barcodes" [[gex_sample_mapping_metrics.confidently_mapped_antisense.alerts]] - conditions = { include_introns = false, is_hybrid_capture = false } + conditions = { include_introns = false } error_threshold = 0.3 warn_threshold = 0.1 warn_title = "High Fraction of Reads Mapped Antisense to Genes" detail = "Ideal < 10% for single cell samples. This metric will usually be higher if run with --include_introns. This can indicate use of an incorrect chemistry type, an issue with the reference transcriptome, or elevated levels of antisense reads. Application performance is likely to be affected." [[gex_sample_mapping_metrics.confidently_mapped_antisense.alerts]] - conditions = { include_introns = true, is_hybrid_capture = false } + conditions = { include_introns = true } error_threshold = 0.4 warn_threshold = 0.2 warn_title = "High Fraction of Reads Mapped Antisense to Genes" detail = "Ideal < 10% for single cell samples, but rates of 20% to 40% are common for single nuclei samples. This metric will usually be higher if run with --include_introns. If this is a single cell sample, this can indicate use of an incorrect chemistry type, an issue with the reference transcriptome, or elevated levels of antisense reads. Application performance is likely to be affected." - [[gex_sample_mapping_metrics.confidently_mapped_antisense.alerts]] - conditions = { include_introns = false, is_hybrid_capture = true } - error_threshold = 0.4 - warn_threshold = 0.2 - warn_title = "High Fraction of Reads Mapped Antisense to Genes" - detail = "Ideal < 20%. This can indicate use of an incorrect chemistry type, an issue with the reference transcriptome, or elevated levels of antisense reads. Application performance is likely to be affected." - - [[gex_sample_mapping_metrics.confidently_mapped_antisense.alerts]] - conditions = { include_introns = true, is_hybrid_capture = true } - error_threshold = 0.4 - warn_threshold = 0.2 - warn_title = "High Fraction of Reads Mapped Antisense to Genes" - detail = "Ideal < 20%. This can indicate use of an incorrect chemistry type, an issue with the reference transcriptome, or elevated levels of antisense reads. Application performance is likely to be affected." - # -------------------------------------------------------------------------------------------------- # GEX (RTL) -> Mapping metrics # -------------------------------------------------------------------------------------------------- [rtl_sample_mapping_metrics] title = "Mapping Metrics (Amongst Reads From Cells Assigned To Sample)" +tier = "sample" entries = [ "reads_from_cells_assigned_to_sample", "reads_half_mapped_to_probe_set", @@ -1877,15 +2174,21 @@ entries = [ "reads_confidently_mapped_to_filtered_probe_set", ] + [rtl_sample_mapping_metrics.conditions] + library_types = ["Gene Expression"] + is_rtl = true + [rtl_sample_mapping_metrics.reads_from_cells_assigned_to_sample] type = "usize" header = "Number of reads from cells called from this sample" help = "The total number of reads from cells called from this sample" + json_key = "total_read_pairs_in_filtered_barcodes" [rtl_sample_mapping_metrics.reads_half_mapped_to_probe_set] type = "Percent" header = "Reads half-mapped to probe set" help = "Fraction of reads that mapped to unpaired ligation products." + json_key = "multi_transcriptome_half_mapped_reads_frac_in_filtered_barcodes" [[rtl_sample_mapping_metrics.reads_half_mapped_to_probe_set.alerts]] warn_threshold = 0.2 @@ -1897,6 +2200,7 @@ entries = [ type = "Percent" header = "Reads split-mapped to probe set" help = "Fraction of reads that mapped to mispaired ligation products." + json_key = "multi_transcriptome_split_mapped_reads_frac_in_filtered_barcodes" [[rtl_sample_mapping_metrics.reads_split_mapped_to_probe_set.alerts]] warn_threshold = 0.2 @@ -1908,28 +2212,31 @@ entries = [ type = "Percent" header = "Reads mapped to probe set" help = "Fraction of reads that mapped to the probe set." + json_key = "multi_transcriptome_mapped_reads_frac_in_filtered_barcodes" [rtl_sample_mapping_metrics.reads_confidently_mapped_to_probe_set] type = "Percent" header = "Reads confidently mapped to probe set" help = "Fraction of reads that mapped uniquely to a probe in the probe set." + json_key = "multi_transcriptome_conf_mapped_reads_frac_in_filtered_barcodes" [[rtl_sample_mapping_metrics.reads_confidently_mapped_to_probe_set.alerts]] error_threshold = 0.2 warn_threshold = 0.5 warn_title = "Low Fraction Reads Confidently Mapped to Probe Set" - detail = "Ideal > 50%. This can indicate low aggregate expression, use of the wrong probe set, or the use of input FASTQs from products other than Fixed RNA Profiling." + detail = "Ideal > 50%. This can indicate low aggregate expression, use of the wrong probe set, or the use of input FASTQs from products other than Flex." [rtl_sample_mapping_metrics.reads_confidently_mapped_to_filtered_probe_set] type = "Percent" header = "Reads confidently mapped to filtered probe set" help = "Fraction of reads from probes that map to a unique gene. These reads are considered for UMI counting. For more information on probe filtering please visit https://www.10xgenomics.com/support" + json_key = "multi_transcriptome_targeted_conf_mapped_reads_frac_in_filtered_barcodes" [[rtl_sample_mapping_metrics.reads_confidently_mapped_to_filtered_probe_set.alerts]] error_threshold = 0.2 warn_threshold = 0.5 warn_title = "Low Fraction Reads Confidently Mapped to Filtered Probe Set" - detail = "Ideal > 50%. This can indicate low aggregate expression, use of the wrong probe set, high expression genes removed by filtering, or the use of input FASTQs from products other than Fixed RNA Profiling." + detail = "Ideal > 50%. This can indicate low aggregate expression, use of the wrong probe set, high expression genes removed by filtering, or the use of input FASTQs from products other than Flex." @@ -1938,16 +2245,27 @@ entries = [ # -------------------------------------------------------------------------------------------------- [vdj_t_sample_hero_metrics] title = "T Cell Expression" +tier = "sample" entries = [ "vdj_filtered_bcs", "multi_vdj_assembly_contig_pair_productive_full_len_bc_count", "TRA_vdj_assembly_umis_per_cell_median", "TRB_vdj_assembly_umis_per_cell_median", + "vdj_filtered_bcs_cum_frac", ] + [vdj_t_sample_hero_metrics.conditions] + library_types = ["VDJ-T"] + + [vdj_t_sample_hero_metrics.vdj_filtered_bcs_cum_frac] + type = "Percent" + header = "Fraction reads in cells" + help = "Number of reads with cell-associated barcodes divided by the number of reads with valid barcodes." + optional = true + [vdj_t_sample_hero_metrics.vdj_filtered_bcs] type = "usize" - header = "Estimated number of cells" + header = "VDJ cells" help = "The number of barcodes estimated to be associated with T cells." [vdj_t_sample_hero_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_count] @@ -1984,16 +2302,27 @@ entries = [ # -------------------------------------------------------------------------------------------------- [vdj_tgd_sample_hero_metrics] title = "T Cell Expression" +tier = "sample" entries = [ "vdj_filtered_bcs", "multi_vdj_assembly_contig_pair_productive_full_len_bc_count", "TRG_vdj_assembly_umis_per_cell_median", "TRD_vdj_assembly_umis_per_cell_median", + "vdj_filtered_bcs_cum_frac", ] + [vdj_tgd_sample_hero_metrics.conditions] + library_types = ["VDJ-T-GD"] + + [vdj_tgd_sample_hero_metrics.vdj_filtered_bcs_cum_frac] + type = "Percent" + header = "Fraction reads in cells" + help = "Number of reads with cell-associated barcodes divided by the number of reads with valid barcodes." + optional = true + [vdj_tgd_sample_hero_metrics.vdj_filtered_bcs] type = "usize" - header = "Estimated number of cells" + header = "VDJ cells" help = "The number of barcodes estimated to be associated with T cells." [vdj_tgd_sample_hero_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_count] @@ -2031,17 +2360,28 @@ entries = [ # -------------------------------------------------------------------------------------------------- [vdj_b_sample_hero_metrics] title = "B Cell Expression" +tier = "sample" entries = [ "vdj_filtered_bcs", "multi_vdj_assembly_contig_pair_productive_full_len_bc_count", "IGH_vdj_assembly_umis_per_cell_median", "IGK_vdj_assembly_umis_per_cell_median", "IGL_vdj_assembly_umis_per_cell_median", + "vdj_filtered_bcs_cum_frac", ] + [vdj_b_sample_hero_metrics.conditions] + library_types = ["VDJ-B"] + + [vdj_b_sample_hero_metrics.vdj_filtered_bcs_cum_frac] + type = "Percent" + header = "Fraction reads in cells" + help = "Number of reads with cell-associated barcodes divided by the number of reads with valid barcodes." + optional = true + [vdj_b_sample_hero_metrics.vdj_filtered_bcs] type = "usize" - header = "Estimated number of cells" + header = "VDJ cells" help = "The number of barcodes estimated to be associated with B cells." [vdj_b_sample_hero_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_count] @@ -2069,9 +2409,9 @@ entries = [ [[vdj_b_sample_hero_metrics.IGK_vdj_assembly_umis_per_cell_median.alerts]] if_metric_is = "less_than_or_equal" - error_threshold = 0 - error_title = "Zero Median IGK UMIs per Cell" - detail = "Ideal > 0. This can indicate cells with extremely low IGK expression, poor cell quality, low yield from the RT reaction, or the use of an unsupported chemistry type (e.g., using Single Cell 3' for V(D)J assembly). Application performance may be affected." + warn_threshold = 0 + warn_title = "Zero Median IGK UMIs per Cell" + detail = "Ideal > 0. This can indicate cells with exclusive expression of paired IGH and IGL chains, or it could be due to cells with extremely low IGK expression, poor quality, low yield from the RT reaction, or the use of unsupported chemistry (e.g., Single Cell 3' for V(D)J assembly). The warning should be interpreted in the context of productive V-J spanning pairing rate." [vdj_b_sample_hero_metrics.IGL_vdj_assembly_umis_per_cell_median] type = "FloatAsInt" @@ -2081,10 +2421,9 @@ entries = [ [[vdj_b_sample_hero_metrics.IGL_vdj_assembly_umis_per_cell_median.alerts]] if_metric_is = "less_than_or_equal" - error_threshold = 0 - error_title = "Zero Median IGL UMIs per Cell" - detail = "Ideal > 0. This can indicate cells with extremely low IGL expression, poor cell quality, low yield from the RT reaction, or the use of an unsupported chemistry type (e.g., using Single Cell 3' for V(D)J assembly). Application performance may be affected." - + warn_threshold = 0 + warn_title = "Zero Median IGL UMIs per Cell" + detail = "Ideal > 0. This can indicate cells with exclusive expression of paired IGH and IGK chains, or it could be due to cells with extremely low IGL expression, poor quality, low yield from the RT reaction, or the use of unsupported chemistry (e.g., Single Cell 3' for V(D)J assembly). The warning should be interpreted in the context of productive V-J spanning pairing rate." # -------------------------------------------------------------------------------------------------- @@ -2092,6 +2431,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [vdj_t_sample_annotation_metrics] title = "V(D)J Annotation" +tier = "sample" entries = [ "multi_vdj_assembly_contig_pair_productive_full_len_bc_frac", "TRA_TRB_vdj_assembly_contig_pair_productive_full_len_bc_frac", @@ -2100,6 +2440,9 @@ entries = [ "multi_raw_vdj_paired_clonotype_diversity", ] + [vdj_t_sample_annotation_metrics.conditions] + library_types = ["VDJ-T"] + [vdj_t_sample_annotation_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_frac] type = "Percent" optional = true @@ -2141,6 +2484,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [vdj_tgd_sample_annotation_metrics] title = "V(D)J Annotation" +tier = "sample" entries = [ "multi_vdj_assembly_contig_pair_productive_full_len_bc_frac", "TRG_TRD_vdj_assembly_contig_pair_productive_full_len_bc_frac", @@ -2149,6 +2493,9 @@ entries = [ "multi_raw_vdj_paired_clonotype_diversity", ] + [vdj_tgd_sample_annotation_metrics.conditions] + library_types = ["VDJ-T-GD"] + [vdj_tgd_sample_annotation_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_frac] type = "Percent" optional = true @@ -2185,6 +2532,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [vdj_b_sample_annotation_metrics] title = "V(D)J Annotation" +tier = "sample" entries = [ "multi_vdj_assembly_contig_pair_productive_full_len_bc_frac", "IGK_IGH_vdj_assembly_contig_pair_productive_full_len_bc_frac", @@ -2195,6 +2543,9 @@ entries = [ "multi_raw_vdj_paired_clonotype_diversity", ] + [vdj_b_sample_annotation_metrics.conditions] + library_types = ["VDJ-B"] + [vdj_b_sample_annotation_metrics.multi_vdj_assembly_contig_pair_productive_full_len_bc_frac] type = "Percent" optional = true @@ -2248,6 +2599,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [antibody_sample_hero_metrics] title = "Antibody Expression" +tier = "sample" entries = [ "total_singlets", "median_umis_per_singlet", @@ -2255,6 +2607,9 @@ entries = [ "reads_in_cells", ] + [antibody_sample_hero_metrics.conditions] + library_types = ["Antibody Capture"] + [antibody_sample_hero_metrics.total_singlets] type = "usize" json_key = "ANTIBODY_multi_filtered_bcs" @@ -2294,12 +2649,16 @@ entries = [ # -------------------------------------------------------------------------------------------------- [antibody_sample_mapping_metrics] title = "Mapping Metrics (Amongst Reads From Cells Assigned To Sample)" +tier = "sample" entries = [ "reads_from_cells_assigned_to_sample", "fraction_antibody_reads", "fraction_reads_in_aggregate_barcodes", ] + [antibody_sample_mapping_metrics.conditions] + library_types = ["Antibody Capture"] + [antibody_sample_mapping_metrics.reads_from_cells_assigned_to_sample] type = "usize" json_key = "ANTIBODY_total_read_pairs_in_filtered_barcodes" @@ -2315,6 +2674,7 @@ entries = [ [antibody_sample_mapping_metrics.fraction_reads_in_aggregate_barcodes] type = "Percent" json_key = "ANTIBODY_reads_lost_to_aggregate_GEMs" + optional = true header = "Fraction antibody reads in aggregate barcodes" help = "Fraction of read pairs with valid barcodes that were removed because they are aggregates out of all reads with valid barcodes that are assigned to this sample (not just reads from cells)." @@ -2341,19 +2701,23 @@ entries = [ # -------------------------------------------------------------------------------------------------- [antigen_sample_hero_metrics] title = "Antigen Expression" +tier = "sample" entries = [ "feature_type", "total_singlets", "median_umis_per_singlet", "antigen_reads_usable_per_cell", ] +group_by_key = "feature_type" + + [antigen_sample_hero_metrics.conditions] + library_types = ["Antigen Capture"] [antigen_sample_hero_metrics.feature_type] type = "String" header = "Feature Type" help = "The feature type used for computing the metrics." - [antigen_sample_hero_metrics.total_singlets] type = "usize" json_key = "ANTIGEN_multi_filtered_bcs" @@ -2385,6 +2749,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [crispr_sample_hero_metrics] title = "Guide Expression" +tier = "sample" entries = [ "total_singlets", "median_umis_per_singlet", @@ -2394,6 +2759,9 @@ entries = [ "cells_with_two_or_more_protospacers_detected", ] + [crispr_sample_hero_metrics.conditions] + library_types = ["CRISPR Guide Capture"] + [crispr_sample_hero_metrics.total_singlets] type = "usize" json_key = "CRISPR_multi_filtered_bcs" @@ -2436,6 +2804,7 @@ entries = [ # -------------------------------------------------------------------------------------------------- [crispr_sample_mapping_metrics] title = "Mapping Metrics (Amongst Reads From Cells Assigned To Sample)" +tier = "sample" entries = [ "number_of_reads", "fraction_reads_with_putative_protospacer", @@ -2443,6 +2812,9 @@ entries = [ "fraction_protospacer_not_recognized", ] + [crispr_sample_mapping_metrics.conditions] + library_types = ["CRISPR Guide Capture"] + [crispr_sample_mapping_metrics.number_of_reads] type = "usize" json_key = "CRISPR_total_read_pairs_in_filtered_barcodes" @@ -2486,23 +2858,68 @@ entries = [ # -------------------------------------------------------------------------------------------------- [custom_feature_sample_hero_metrics] title = "Feature Expression" +tier = "sample" entries = [ "total_singlets", "median_umis_per_singlet", "feature_reads_usable_per_cell", ] + [custom_feature_sample_hero_metrics.conditions] + library_types = ["Custom"] + [custom_feature_sample_hero_metrics.total_singlets] type = "usize" header = "Cells" help = "Number of cells called from this sample." + json_key = "Custom_multi_filtered_bcs" [custom_feature_sample_hero_metrics.median_umis_per_singlet] type = "FloatAsInt" header = "Median UMI counts per cell" help = "Median number of UMIs obtained from the cells called from this sample." + json_key = "Custom_multi_filtered_bcs_median_counts" [custom_feature_sample_hero_metrics.feature_reads_usable_per_cell] type = "FloatAsInt" header = "Mean feature reads usable per cell" help = "Mean number of usable reads (valid UMI, recognized feature-barcode sequence) sequenced from the cells called from this sample." + json_key = "Custom_multi_usable_reads_per_filtered_bc" + +# -------------------------------------------------------------------------------------------------- +# GEX (OCM) -> Metrics per overhang +# -------------------------------------------------------------------------------------------------- +[ocm_per_overhang_metrics] +title = "Metrics per overhang" +tier = "library" +entries = [ + "ocm_barcode_id", + "sample_id", + "umi_per_ocm_barcode", + "cells_per_ocm_barcode", +] +group_by_key = "ocm_barcode_id" + + [ocm_per_overhang_metrics.conditions] + library_types = ["Gene Expression"] + is_oh_multiplexed = true + + [ocm_per_overhang_metrics.ocm_barcode_id] + type = "String" + header = "OCM Barcode ID" + help = "The identifier of this OCM barcode." + + [ocm_per_overhang_metrics.sample_id] + type = "String" + header = "Sample ID" + help = "The identifier of the sample associated with this OCM barcode." + + [ocm_per_overhang_metrics.umi_per_ocm_barcode] + type = "CountAndPercent" + header = "UMIs per OCM barcode" + help = "Number and fraction of UMIs for this overhang amongst all UMIs for that library type in the raw feature-barcode matrix." + + [ocm_per_overhang_metrics.cells_per_ocm_barcode] + type = "CountAndPercent" + header = "Cells per OCM barcode" + help = "Number and fraction of cells per OCM Barcode ID amongst all cells detected in this GEM well. Cell calling is based on gene expression data when present." diff --git a/lib/rust/cr_websummary/src/multi/websummary.rs b/lib/rust/cr_websummary/src/multi/websummary.rs index c39e8c7..b19b3be 100644 --- a/lib/rust/cr_websummary/src/multi/websummary.rs +++ b/lib/rust/cr_websummary/src/multi/websummary.rs @@ -5,19 +5,42 @@ use crate::alert::AlertLevel; use crate::multi::svg::SvgGraph; use crate::{ Alert, AlertContext, AlertSpec, CardWithMetric, ChartWithHelp, GenericTable, MakePretty, - MetricCard, PlotlyChart, RawChartWithHelp, Tab, TableRow, TitleWithHelp, WsSample, + MetricCard, Percent, PlotlyChart, RawChartWithHelp, Tab, TableRow, TitleWithHelp, WsSample, }; use anyhow::Result; -use cr_types::websummary::MetricConfig; -use cr_types::{AlignerParam, FeatureBarcodeType, LibraryType, TargetingMethod}; +use cr_types::websummary::{AlertConfig, AlertIfMetricIs, MetricConfig}; +use cr_types::{ + AlignerParam, BarcodeMultiplexingType, FeatureBarcodeType, LibraryType, TargetingMethod, +}; +use cr_websummary::CountAndPercent; use csv::Writer; use itertools::Itertools; use metric::TxHashMap; use serde::{Deserialize, Serialize}; use serde_json::value::Value; +use std::borrow::Cow; +use std::cmp::Ordering; +use std::collections::{HashMap, HashSet}; +use std::fmt::Display; use std::path::Path; +use tenx_websummary::components::{ + DifferentialExpressionTable, TableMetric, VegaLitePlot, WithTitle, +}; use websummary_derive::{Alert, ToCsvRows, ToJsonSummary}; +const CELL_ANNOTATION_FAILURE_TITLE: &str = "No cell type annotations produced!"; + +const CELL_ANNOTATION_FAILURE_MESSAGE: &str = r#"

Please check your cellranger logs. +If you wish to attempt cell type annotation again please use +cellranger annotate. +

"#; +const CELL_ANNOTATION_DE_WARN_TITLE: &str = "Cell type differential expression not run"; +const CELL_ANNOTATION_DE_WARN_MESSAGE: &str = "Too few cell types to run differential expression."; +pub const CELL_ANNOTATION_ADVERTISEMENT_STRING: &str = r#"

Automated cell type annotation is now available for Cell Ranger!
+For details on how to run cell type annotation and species we have it available for, visit our +support page.

"#; + /// The threshold to trigger a web summary alert when an unexpected probe barcode is observed or /// an expected probe barcode is not observed. pub const UMI_PER_PROBE_BARCODE_BACKGROUND_THRESHOLD: f64 = 0.005; @@ -34,7 +57,7 @@ const METRICS_SUMMARY_CSV_HEADER: [&str; 6] = [ // websummary structs implementing this trait know how to convert their contents into a metrics CSV row // the metrics CSV is represented as a Vec of CSV rows, each a Vec of String pub trait ToCsvRows { - fn to_csv_rows(self) -> Vec> + fn to_csv_rows(&self) -> Vec> where Self: Sized, { @@ -42,6 +65,8 @@ pub trait ToCsvRows { } } +impl ToCsvRows for String {} + #[derive(Clone, Serialize)] pub struct JsonMetricSummary { pub key: String, @@ -49,21 +74,122 @@ pub struct JsonMetricSummary { pub category: String, pub library_type: String, pub config: MetricConfig, + /// For metrics of the same key that may have multiple values, + /// this optional grouping key can be used to distinguish the different + /// instances from each other, and associate them with related data. + /// For example, in a table of probe barcode metrics, this would be + /// the probe barcode associated with a particular metric. + /// + /// This is a stopgap solution - improving the namespacing of metrics in the + /// first place would be a better long-term solution. + #[serde(skip_serializing_if = "Option::is_none")] + pub grouping_key: Option, + /// The collection of alerts triggered for this metric. + pub alerts: Vec, +} + +impl JsonMetricSummary { + /// Construct a JSON metric summary from input data. + /// + /// This includes computing any alerts that were triggered. + pub fn new( + key: String, + value: Option<&T>, + category: String, + library_type: String, + config: MetricConfig, + grouping_key: Option, + ctx: &AlertContext, + ) -> Self { + Self { + alerts: Self::construct_alerts(&key, value, &config.alerts, ctx), + value: serde_json::to_value(value).unwrap(), + key, + category, + library_type, + config, + grouping_key, + } + } + + /// Construct alerts for the provided data. + /// + /// This oddball static method is used as a shim to avoid code duplication + /// in the make_tables macro until it goes away. + pub fn construct_alerts( + key: &str, + val: Option<&T>, + alerts: &[AlertConfig], + ctx: &AlertContext, + ) -> Vec { + if alerts.is_empty() { + return vec![]; + } + let Some(val) = val else { + return vec![]; + }; + let (as_f64, pretty) = (val.as_f64(), val.make_pretty()); + let triggered = |thresh: Option, cond: AlertIfMetricIs| { + let Some(thresh) = thresh else { + return false; + }; + match cond { + AlertIfMetricIs::GreaterThanOrEqual => as_f64 >= thresh, + AlertIfMetricIs::LessThanOrEqual => as_f64 <= thresh, + } + }; + alerts + .iter() + .filter(|config| { + let mut matches_conditions = true; + if let Some(required_include_introns_setting) = config.conditions.include_introns { + matches_conditions = ctx.include_introns == required_include_introns_setting; + } + if let Some(required_is_rtl_setting) = config.conditions.is_rtl { + matches_conditions = ctx.is_rtl == required_is_rtl_setting; + } + matches_conditions + }) + .filter_map(|config| { + let cond = config.alert_if().unwrap(); + if triggered(config.error_threshold, cond) { + return Some(AlertSpec { + level: AlertLevel::Error, + title: config.error_title(key).to_string(), + formatted_value: pretty.clone(), + message: config.detail.clone(), + }); + } + if triggered(config.warn_threshold, cond) { + return Some(AlertSpec { + level: AlertLevel::Warn, + title: config.warn_title(key).to_string(), + formatted_value: pretty.clone(), + message: config.detail.clone(), + }); + } + None + }) + .collect() + } } -// Websummary structs implementing this trait know how to convert their contents -// into a JSON summary containing all metrics data and metadata. +/// Websummary structs implementing this trait know how to convert their contents +/// into a JSON summary containing all metrics data and metadata, and triggered +/// alerts. pub trait ToJsonSummary { - fn to_json_summary(&self) -> Vec { + fn to_json_summary(&self, _ctx: &AlertContext) -> Vec { vec![] } } +impl ToJsonSummary for String {} + impl ToCsvRows for Option where T: ToCsvRows, { - fn to_csv_rows(self) -> Vec> { + fn to_csv_rows(&self) -> Vec> { match self { Some(t) => t.to_csv_rows(), None => vec![], @@ -75,9 +201,9 @@ impl ToJsonSummary for Option where T: ToJsonSummary, { - fn to_json_summary(&self) -> Vec { + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { match self { - Some(t) => t.to_json_summary(), + Some(t) => t.to_json_summary(ctx), None => vec![], } } @@ -108,7 +234,7 @@ pub struct LibraryHeaderInfo { pub struct CountParametersTable { pub chemistry: String, pub introns_included: bool, - pub reference_path: String, + pub reference_path: Option, pub transcriptome: String, pub feature_ref_path: Option, pub cmo_set_path: Option, @@ -175,18 +301,18 @@ impl From for GenericTable { // GEX tab if library_type.is_gex() { rows.extend([ - TableRow::two_col("Reference Path", reference_path), + TableRow::two_col( + "Reference Path", + reference_path.unwrap_or_else(|| "None".to_string()), + ), TableRow::two_col("Transcriptome", transcriptome), ]); if aligner != AlignerParam::Hurtle { rows.push(TableRow::two_col("Include Introns", introns_included)); } - if let Some(targeting_method) = targeting_method { + if targeting_method.is_some() { rows.push(TableRow::two_col( - match targeting_method { - TargetingMethod::HybridCapture => "Target Panel Name", - TargetingMethod::TemplatedLigation => "Probe Set Name", - }, + "Probe Set Name", target_set_name.unwrap(), )); } @@ -233,7 +359,11 @@ impl From for GenericTable { )); } - GenericTable { header: None, rows } + GenericTable { + header: None, + rows, + grouping_header: None, + } } } @@ -241,16 +371,7 @@ impl Alert for CountParametersTable { fn alerts(&self, ctx: &AlertContext) -> Vec { let mut alerts = vec![]; - if ctx.is_hybrid_capture && ctx.include_introns && self.library_type.is_gex() { - alerts.push(AlertSpec { - level: AlertLevel::Warn, - title: "Unsupported workflow used".to_string(), - formatted_value: String::default(), - message: "Your data has been analyzed with targeted panel (target-panel) and included introns (include-introns). This is not recommended, because in the Targeted Gene Expression assay, 10x Genomics supported baits are designed to capture exons only. Results cannot be guaranteed.".to_string(), - }); - } - if ctx.is_antigen - && self.library_type.is_fb_type(FeatureBarcodeType::Antigen) + if self.library_type.is_fb_type(FeatureBarcodeType::Antigen) && !self.antigen_negative_control { alerts.push(AlertSpec { @@ -278,7 +399,10 @@ impl Alert for CountParametersTable { message: "Multiplexing performance cannot be guaranteed".to_string(), }); } - if ctx.is_fiveprime && ctx.is_multiplexing { + if ctx.is_fiveprime + && ctx.multiplexing_method + == Some(BarcodeMultiplexingType::CellLevel(cr_types::CellLevel::CMO)) + { alerts.push(AlertSpec { level: AlertLevel::Warn, title: "Unsupported combination of 5' chemistry with multiplexing".to_string(), @@ -286,11 +410,10 @@ impl Alert for CountParametersTable { message: "Multiplexing performance cannot be guaranteed".to_string(), }); } - if ctx.is_lt_chemistry && ctx.is_multiplexing { + if ctx.is_hashtag_multiplexed { alerts.push(AlertSpec { level: AlertLevel::Warn, - title: "Unsupported combination of 3' v3 LT chemistry with multiplexing" - .to_string(), + title: "Unsupported multiplexing tag used".to_string(), formatted_value: String::default(), message: "Multiplexing performance cannot be guaranteed".to_string(), }); @@ -445,10 +568,10 @@ where G: ToJsonSummary, R: ToJsonSummary, { - fn to_json_summary(&self) -> Vec { + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { match self { - GexOrRtl::Gex(g) => g.to_json_summary(), - GexOrRtl::Rtl(r) => r.to_json_summary(), + GexOrRtl::Gex(g) => g.to_json_summary(ctx), + GexOrRtl::Rtl(r) => r.to_json_summary(ctx), } } } @@ -498,10 +621,10 @@ where B: ToJsonSummary, G: ToJsonSummary, { - fn to_json_summary(&self) -> Vec { + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { match self { - AntibodyOrAntigen::Antibody(b) => b.to_json_summary(), - AntibodyOrAntigen::Antigen(g) => g.to_json_summary(), + AntibodyOrAntigen::Antibody(b) => b.to_json_summary(ctx), + AntibodyOrAntigen::Antigen(g) => g.to_json_summary(ctx), } } } @@ -509,6 +632,116 @@ where pub type AntibodyOrAntigenPhysicalLibraryMetricsTable = AntibodyOrAntigen; +#[derive(Serialize, Deserialize, Clone)] +pub enum CmoOrHashtag { + Cmo(C), + Hashtag(H), +} + +impl From> for CardWithMetric +where + CardWithMetric: From, + CardWithMetric: From, +{ + fn from(src: CmoOrHashtag) -> CardWithMetric { + match src { + CmoOrHashtag::Cmo(c) => c.into(), + CmoOrHashtag::Hashtag(h) => h.into(), + } + } +} + +impl Alert for CmoOrHashtag +where + C: Alert, + H: Alert, +{ + fn alerts(&self, ctx: &AlertContext) -> Vec { + match self { + CmoOrHashtag::Cmo(c) => c.alerts(ctx), + CmoOrHashtag::Hashtag(h) => h.alerts(ctx), + } + } +} + +impl ToJsonSummary for CmoOrHashtag +where + C: ToJsonSummary, + H: ToJsonSummary, +{ + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { + match self { + CmoOrHashtag::Cmo(c) => c.to_json_summary(ctx), + CmoOrHashtag::Hashtag(h) => h.to_json_summary(ctx), + } + } +} + +pub type CmoOrHashtagPerTagMetricsTable = + CmoOrHashtag; + +pub type CmoOrHashtagMultiplexingQualityTable = + CmoOrHashtag; + +pub struct MultiplexingTagMetricsRow { + pub gem_well_tag: Option, + pub sample_id: Option, + pub tag_reads_in_cell_associated_partitions: Option, + pub singlets_assigned_to_tag: Option, + pub tag_signal_to_background_ratio: Option, +} + +#[derive(Default)] +pub struct MultiplexingTagMetricsRows(pub Vec); + +impl MultiplexingTagMetricsRows { + pub fn sort_tag_rows(&mut self) { + self.0 + .sort_by(|a, b| match (&a.gem_well_tag, &b.gem_well_tag) { + (Some(ref _x), None) => Ordering::Greater, + (None, Some(ref _y)) => Ordering::Less, + (Some(ref x), Some(ref y)) => x.cmp(y), + (None, None) => Ordering::Equal, + }); + } +} + +impl From for crate::multi::tables::CmoPerTagMetricsTable { + fn from(src: MultiplexingTagMetricsRows) -> Self { + crate::multi::tables::CmoPerTagMetricsTable( + src.0 + .into_iter() + .map(|row| CmoPerTagMetricsRow { + gem_well_cmo: row.gem_well_tag, + sample_id: row.sample_id, + cmo_reads_in_cell_associated_partitions: row + .tag_reads_in_cell_associated_partitions, + singlets_assigned_to_cmo: row.singlets_assigned_to_tag, + cmo_signal_to_background_ratio: row.tag_signal_to_background_ratio, + }) + .collect::>(), + ) + } +} + +impl From for crate::multi::tables::HashtagPerTagMetricsTable { + fn from(src: MultiplexingTagMetricsRows) -> Self { + crate::multi::tables::HashtagPerTagMetricsTable( + src.0 + .into_iter() + .map(|row| HashtagPerTagMetricsRow { + gem_well_hashtag: row.gem_well_tag, + sample_id: row.sample_id, + hashtag_reads_in_cell_associated_partitions: row + .tag_reads_in_cell_associated_partitions, + singlets_assigned_to_hashtag: row.singlets_assigned_to_tag, + hashtag_signal_to_background_ratio: row.tag_signal_to_background_ratio, + }) + .collect::>(), + ) + } +} + // Websummary data structures may have shared _resources that they access by key // If a websummary struct has any _resources they are emptied and bubbled up and stored in the top-level _resources pub type MultiSharedResource = TxHashMap; @@ -517,7 +750,7 @@ impl Alert for MultiSharedResource {} impl ToCsvRows for MultiSharedResource {} impl ToJsonSummary for MultiSharedResource {} -#[derive(Debug, Serialize, PartialEq, Eq, Clone, Default)] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Default)] #[serde(into = "GenericTable")] pub struct VdjParametersTable { pub chemistry: String, @@ -539,12 +772,16 @@ impl From for GenericTable { TableRow::two_col("V(D)J Reference", vdj_reference), TableRow::two_col("V(D)J Reference Path", vdj_reference_path), ]; - GenericTable { header: None, rows } + GenericTable { + header: None, + rows, + grouping_header: None, + } } } impl Alert for VdjParametersTable { - fn alerts(&self, _: &AlertContext) -> Vec { + fn alerts(&self, ctx: &AlertContext) -> Vec { let mut alerts = vec![]; if self.gamma_delta { alerts.push(AlertSpec { @@ -554,10 +791,23 @@ impl Alert for VdjParametersTable { message: "Gamma Delta TCR analysis is not a supported workflow. Algorithm performance cannot be guaranteed.".to_string(), }); } + if ctx.multiplexing_method + == Some(BarcodeMultiplexingType::ReadLevel(cr_types::ReadLevel::OH)) + && !ctx.library_types.contains(&LibraryType::Gex) + && ctx.library_types.iter().any(|t: &LibraryType| t.is_vdj()) + { + alerts.push(AlertSpec { + level: AlertLevel::Info, + title: "GEX and VDJ libraries are recommended to be analyzed together for optimal results.".to_string(), + formatted_value: String::default(), + message: r#"Multiplexing performance cannot be guaranteed"#.into(), + }); + } alerts } } + impl ToCsvRows for VdjParametersTable {} impl ToJsonSummary for VdjParametersTable {} @@ -606,15 +856,20 @@ where B: ToJsonSummary, GD: ToJsonSummary, { - fn to_json_summary(&self) -> Vec { + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { match self { - VdjChainTypeSpecific::VdjT(t) => t.to_json_summary(), - VdjChainTypeSpecific::VdjB(b) => b.to_json_summary(), - VdjChainTypeSpecific::VdjTgd(t_gd) => t_gd.to_json_summary(), + VdjChainTypeSpecific::VdjT(t) => t.to_json_summary(ctx), + VdjChainTypeSpecific::VdjB(b) => b.to_json_summary(ctx), + VdjChainTypeSpecific::VdjTgd(t_gd) => t_gd.to_json_summary(ctx), } } } +pub type VdjLibraryCellMetricsTable = VdjChainTypeSpecific< + VdjTLibraryCellMetricsTable, + VdjBLibraryCellMetricsTable, + VdjTgdLibraryCellMetricsTable, +>; pub type VdjEnrichmentMetricsTable = VdjChainTypeSpecific< VdjTEnrichmentMetricsTable, VdjBEnrichmentMetricsTable, @@ -636,10 +891,14 @@ impl ToJsonSummary for Value {} #[derive(Serialize, Clone)] pub struct MultiWebSummary { + // FIXME delete this CELLRANGER-8423 pub sample: WsSample, - pub data: MultiWebSummaryData, + pub library: MultiWebSummaryLibraryData, + pub per_sample: Vec, + pub experimental_design: ExperimentalDesign, pub diagnostics: MultiDiagnostics, - pub sample_diagnostics: SampleDiagnostics, + pub sample_diagnostics: Vec, + // FIXME delete this CELLRANGER-8423 #[serde(rename = "_resources")] pub resources: MultiSharedResource, } @@ -666,6 +925,7 @@ pub struct MultiDiagnostics { pub probe_barcode_overlap_coefficients: Option, pub fraction_reads_high_occupancy_gems: Option, pub high_occupancy_probe_barcode_count_threshold: Option, + pub unknown_feature_barcode_seqs: HashMap, } #[derive(Serialize, Clone, Default)] @@ -677,10 +937,15 @@ pub struct SampleDiagnostics { } impl MultiWebSummary { - pub fn to_csv(self, filename: &Path) -> Result<()> { + pub fn to_csv(&self, filename: &Path, sample_index: usize) -> Result<()> { + let mut rows = self.library.data.to_csv_rows(); + rows.extend(self.per_sample[sample_index].data.to_csv_rows()); + rows.sort(); + rows.dedup(); + let mut writer = Writer::from_path(filename)?; writer.write_record(METRICS_SUMMARY_CSV_HEADER)?; - for row in self.data.to_csv_rows().iter().sorted().dedup() { + for row in rows { writer.write_record(row)?; } @@ -689,49 +954,33 @@ impl MultiWebSummary { } } -impl ToCsvRows for MultiWebSummary { - fn to_csv_rows(self) -> Vec> { - self.data.to_csv_rows() - } -} - -impl ToJsonSummary for MultiWebSummary { - fn to_json_summary(&self) -> Vec { - self.data.to_json_summary() - } -} - #[derive(Serialize, Clone)] -pub struct MultiWebSummaryData { - pub library_websummary: LibraryWebSummary, - pub sample_websummary: SampleWebSummary, - pub experimental_design: ExperimentalDesign, -} - -impl ToCsvRows for MultiWebSummaryData { - fn to_csv_rows(self) -> Vec> { - let mut rows = self.library_websummary.to_csv_rows(); - rows.append(&mut self.sample_websummary.to_csv_rows()); - rows - } +pub struct MultiWebSummaryLibraryData { + pub data: LibraryWebSummary, + /// All unique library types used in the analysis. + pub types: Vec, + pub metrics: Vec, } -impl ToJsonSummary for MultiWebSummaryData { - fn to_json_summary(&self) -> Vec { - let mut vals = self.library_websummary.to_json_summary(); - vals.append(&mut self.sample_websummary.to_json_summary()); - vals - } +#[derive(Serialize, Clone)] +pub struct MultiWebSummarySampleData { + pub data: SampleWebSummary, + pub metrics: Vec, } #[derive(Serialize, Clone)] pub struct ExperimentalDesign { pub svg: SvgGraph, pub csv: String, + pub multiplexing_method: Option, + /// True if this experiment is using a Flex kit. + pub is_rtl: bool, + /// A flag indicating if this is a barnyard analysis. + pub is_barnyard: bool, } fn to_csv_rows_helper( - tab: Option, + tab: &Option, label: &str, sample_or_library: &str, ) -> Vec> { @@ -756,9 +1005,10 @@ fn to_json_summary_helper( tab: Option<&T>, library_type: &str, sample_or_library: &str, + ctx: &AlertContext, ) -> Vec { let Some(tab) = tab else { return vec![] }; - let mut rows = tab.to_json_summary(); + let mut rows = tab.to_json_summary(ctx); for row in &mut rows { row.category = sample_or_library.to_string(); row.library_type = library_type.to_string(); @@ -776,6 +1026,8 @@ mod section { pub const CRISPR: &str = "CRISPR Guide Capture"; pub const CUSTOM: &str = "Custom Feature"; pub const CMO: &str = "Multiplexing Capture"; + pub const CA: &str = "Cell Annotation"; + pub const HASHTAG: &str = "Hashtag"; } const TAB_CELLS: &str = "Cells"; @@ -793,43 +1045,57 @@ pub struct LibraryWebSummary { pub crispr_tab: Option>, pub custom_feature_tab: Option>, pub cmo_tab: Option>, + pub hashtag_tab: Option>, #[serde(rename = "_resources")] pub resources: MultiSharedResource, } impl ToCsvRows for LibraryWebSummary { - fn to_csv_rows(self) -> Vec> { + fn to_csv_rows(&self) -> Vec> { [ - to_csv_rows_helper(self.gex_tab, section::GEX, TAB_LIBRARY), - to_csv_rows_helper(self.vdj_t_tab, section::VDJ_T, TAB_LIBRARY), - to_csv_rows_helper(self.vdj_t_gd_tab, section::VDJ_T_GD, TAB_LIBRARY), - to_csv_rows_helper(self.vdj_b_tab, section::VDJ_B, TAB_LIBRARY), - to_csv_rows_helper(self.antibody_tab, section::AB, TAB_LIBRARY), - to_csv_rows_helper(self.antigen_tab, section::AG, TAB_LIBRARY), - to_csv_rows_helper(self.crispr_tab, section::CRISPR, TAB_LIBRARY), - to_csv_rows_helper(self.custom_feature_tab, section::CUSTOM, TAB_LIBRARY), - to_csv_rows_helper(self.cmo_tab, section::CMO, TAB_LIBRARY), + to_csv_rows_helper(&self.gex_tab, section::GEX, TAB_LIBRARY), + to_csv_rows_helper(&self.vdj_t_tab, section::VDJ_T, TAB_LIBRARY), + to_csv_rows_helper(&self.vdj_t_gd_tab, section::VDJ_T_GD, TAB_LIBRARY), + to_csv_rows_helper(&self.vdj_b_tab, section::VDJ_B, TAB_LIBRARY), + to_csv_rows_helper(&self.antibody_tab, section::AB, TAB_LIBRARY), + to_csv_rows_helper(&self.antigen_tab, section::AG, TAB_LIBRARY), + to_csv_rows_helper(&self.crispr_tab, section::CRISPR, TAB_LIBRARY), + to_csv_rows_helper(&self.custom_feature_tab, section::CUSTOM, TAB_LIBRARY), + to_csv_rows_helper(&self.cmo_tab, section::CMO, TAB_LIBRARY), + to_csv_rows_helper(&self.hashtag_tab, section::HASHTAG, TAB_LIBRARY), ] .concat() } } impl ToJsonSummary for LibraryWebSummary { - fn to_json_summary(&self) -> Vec { + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { [ - to_json_summary_helper(self.gex_tab.as_ref(), section::GEX, TAB_LIBRARY), - to_json_summary_helper(self.vdj_t_tab.as_ref(), section::VDJ_T, TAB_LIBRARY), - to_json_summary_helper(self.vdj_t_gd_tab.as_ref(), section::VDJ_T_GD, TAB_LIBRARY), - to_json_summary_helper(self.vdj_b_tab.as_ref(), section::VDJ_B, TAB_LIBRARY), - to_json_summary_helper(self.antibody_tab.as_ref(), section::AB, TAB_LIBRARY), - to_json_summary_helper(self.antigen_tab.as_ref(), section::AG, TAB_LIBRARY), - to_json_summary_helper(self.crispr_tab.as_ref(), section::CRISPR, TAB_LIBRARY), + to_json_summary_helper(self.gex_tab.as_ref(), section::GEX, TAB_LIBRARY, ctx), + to_json_summary_helper(self.vdj_t_tab.as_ref(), section::VDJ_T, TAB_LIBRARY, ctx), + to_json_summary_helper( + self.vdj_t_gd_tab.as_ref(), + section::VDJ_T_GD, + TAB_LIBRARY, + ctx, + ), + to_json_summary_helper(self.vdj_b_tab.as_ref(), section::VDJ_B, TAB_LIBRARY, ctx), + to_json_summary_helper(self.antibody_tab.as_ref(), section::AB, TAB_LIBRARY, ctx), + to_json_summary_helper(self.antigen_tab.as_ref(), section::AG, TAB_LIBRARY, ctx), + to_json_summary_helper(self.crispr_tab.as_ref(), section::CRISPR, TAB_LIBRARY, ctx), to_json_summary_helper( self.custom_feature_tab.as_ref(), section::CUSTOM, TAB_LIBRARY, + ctx, + ), + to_json_summary_helper(self.cmo_tab.as_ref(), section::CMO, TAB_LIBRARY, ctx), + to_json_summary_helper( + self.hashtag_tab.as_ref(), + section::HASHTAG, + TAB_LIBRARY, + ctx, ), - to_json_summary_helper(self.cmo_tab.as_ref(), section::CMO, TAB_LIBRARY), ] .concat() } @@ -846,20 +1112,22 @@ pub struct SampleWebSummary { pub antigen_tab: Option>, pub crispr_tab: Option>, pub custom_feature_tab: Option>, + pub cell_annotation_tab: Option>, } impl ToCsvRows for SampleWebSummary { - fn to_csv_rows(self) -> Vec> { + fn to_csv_rows(&self) -> Vec> { let mut rows = Vec::new(); for mut v in [ - to_csv_rows_helper(self.gex_tab, section::GEX, TAB_CELLS), - to_csv_rows_helper(self.vdj_t_tab, section::VDJ_T, TAB_CELLS), - to_csv_rows_helper(self.vdj_t_gd_tab, section::VDJ_T_GD, TAB_CELLS), - to_csv_rows_helper(self.vdj_b_tab, section::VDJ_B, TAB_CELLS), - to_csv_rows_helper(self.antibody_tab, section::AB, TAB_CELLS), - to_csv_rows_helper(self.antigen_tab, section::AG, TAB_CELLS), - to_csv_rows_helper(self.crispr_tab, section::CRISPR, TAB_CELLS), - to_csv_rows_helper(self.custom_feature_tab, section::CUSTOM, TAB_CELLS), + to_csv_rows_helper(&self.gex_tab, section::GEX, TAB_CELLS), + to_csv_rows_helper(&self.vdj_t_tab, section::VDJ_T, TAB_CELLS), + to_csv_rows_helper(&self.vdj_t_gd_tab, section::VDJ_T_GD, TAB_CELLS), + to_csv_rows_helper(&self.vdj_b_tab, section::VDJ_B, TAB_CELLS), + to_csv_rows_helper(&self.antibody_tab, section::AB, TAB_CELLS), + to_csv_rows_helper(&self.antigen_tab, section::AG, TAB_CELLS), + to_csv_rows_helper(&self.crispr_tab, section::CRISPR, TAB_CELLS), + to_csv_rows_helper(&self.custom_feature_tab, section::CUSTOM, TAB_CELLS), + to_csv_rows_helper(&self.cell_annotation_tab, section::CA, TAB_CELLS), ] { rows.append(&mut v); } @@ -868,16 +1136,32 @@ impl ToCsvRows for SampleWebSummary { } impl ToJsonSummary for SampleWebSummary { - fn to_json_summary(&self) -> Vec { + fn to_json_summary(&self, ctx: &AlertContext) -> Vec { [ - to_json_summary_helper(self.gex_tab.as_ref(), section::GEX, TAB_CELLS), - to_json_summary_helper(self.vdj_t_tab.as_ref(), section::VDJ_T, TAB_CELLS), - to_json_summary_helper(self.vdj_t_gd_tab.as_ref(), section::VDJ_T_GD, TAB_CELLS), - to_json_summary_helper(self.vdj_b_tab.as_ref(), section::VDJ_B, TAB_CELLS), - to_json_summary_helper(self.antibody_tab.as_ref(), section::AB, TAB_CELLS), - to_json_summary_helper(self.antigen_tab.as_ref(), section::AG, TAB_CELLS), - to_json_summary_helper(self.crispr_tab.as_ref(), section::CRISPR, TAB_CELLS), - to_json_summary_helper(self.custom_feature_tab.as_ref(), section::CUSTOM, TAB_CELLS), + to_json_summary_helper(self.gex_tab.as_ref(), section::GEX, TAB_CELLS, ctx), + to_json_summary_helper(self.vdj_t_tab.as_ref(), section::VDJ_T, TAB_CELLS, ctx), + to_json_summary_helper( + self.vdj_t_gd_tab.as_ref(), + section::VDJ_T_GD, + TAB_CELLS, + ctx, + ), + to_json_summary_helper(self.vdj_b_tab.as_ref(), section::VDJ_B, TAB_CELLS, ctx), + to_json_summary_helper(self.antibody_tab.as_ref(), section::AB, TAB_CELLS, ctx), + to_json_summary_helper(self.antigen_tab.as_ref(), section::AG, TAB_CELLS, ctx), + to_json_summary_helper(self.crispr_tab.as_ref(), section::CRISPR, TAB_CELLS, ctx), + to_json_summary_helper( + self.custom_feature_tab.as_ref(), + section::CUSTOM, + TAB_CELLS, + ctx, + ), + to_json_summary_helper( + self.cell_annotation_tab.as_ref(), + section::CA, + TAB_CELLS, + ctx, + ), ] .concat() } @@ -895,15 +1179,20 @@ impl Alert for Option { #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct LibraryGexWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub cell_metrics_table: MetricCard, + #[serde(skip)] pub sequencing_metrics_table: MetricCard, + #[serde(skip)] pub mapping_metrics_table: MetricCard, + #[serde(skip)] pub physical_library_metrics_table: MetricCard, + #[serde(skip)] pub rtl_probe_barcode_metrics_table: Option>, + #[serde(skip)] + pub ocm_per_overhang_metrics_table: Option>, + #[serde(skip)] pub gdna_table: Option>, - pub targeted_plot: Option, - pub targeted_table: Option>, - pub targeted_alerts: Option>, pub sequencing_saturation_plot: ChartWithHelp, pub median_genes_per_cell_plot: ChartWithHelp, pub barcode_rank_plot: ChartWithHelp, @@ -912,20 +1201,31 @@ pub struct LibraryGexWebSummary { #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct LibraryVdjWebSummary { pub parameters_table: VdjParametersTable, + #[serde(skip)] pub cell_metrics_table: MetricCard, + #[serde(skip)] pub enrichment_metrics_table: MetricCard, + #[serde(skip)] pub sequencing_metrics_table: MetricCard, + #[serde(skip)] pub physical_library_metrics_table: MetricCard, pub barcode_rank_plot: Option, // None if there are 0 cells + pub metrics_per_ocm_barcode_table: Option>, + pub metrics_per_hashtag_id_table: Option>, } #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct LibraryAntibodyOrAntigenWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub cell_metrics_table: MetricCard, + #[serde(skip)] pub sequencing_metrics_table: MetricCard, + #[serde(skip)] pub mapping_metrics_table: Option>, + #[serde(skip)] pub physical_library_metrics_table: MetricCard, + #[serde(skip)] pub rtl_probe_barcode_metrics_table: Option>, pub barcode_rank_plot: ChartWithHelp, pub feature_histogram: Option, @@ -934,10 +1234,15 @@ pub struct LibraryAntibodyOrAntigenWebSummary { #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct LibraryCrisprWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub cell_metrics_table: MetricCard, + #[serde(skip)] pub sequencing_metrics_table: MetricCard, + #[serde(skip)] pub mapping_metrics_table: MetricCard, + #[serde(skip)] pub physical_library_metrics_table: MetricCard, + #[serde(skip)] pub rtl_probe_barcode_metrics_table: Option>, pub barcode_rank_plot: ChartWithHelp, } @@ -945,8 +1250,11 @@ pub struct LibraryCrisprWebSummary { #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct LibraryCustomFeatureWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub cell_metrics_table: MetricCard, + #[serde(skip)] pub sequencing_metrics_table: MetricCard, + #[serde(skip)] pub physical_library_metrics_table: MetricCard, pub barcode_rank_plot: ChartWithHelp, } @@ -954,31 +1262,55 @@ pub struct LibraryCustomFeatureWebSummary { #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct LibraryCmoWebSummary { pub parameters_table: CountParametersTable, - pub multiplexing_metrics_table: MetricCard, - pub sample_assignments_table: MetricCard, + #[serde(skip)] + pub multiplexing_quality_table: MetricCard, + #[serde(skip)] pub sequencing_metrics_table: MetricCard, + #[serde(skip)] pub physical_library_metrics_table: MetricCard, - pub cmo_metrics_table: MetricCard, + #[serde(skip)] + pub cmo_metrics_table: MetricCard, pub barcode_rank_plot: ChartWithHelp, pub jibes_biplot: Option, pub jibes_histogram: Option, - pub cmo_umi_tsne_plot: Option, - pub cmo_tags_tsne_plot: Option, + pub cmo_umi_projection_plot: Option, + pub cmo_tags_projection_plot: Option, + #[serde(rename = "_resources")] + pub resources: MultiSharedResource, +} + +#[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] +pub struct LibraryHashtagWebSummary { + pub parameters_table: CountParametersTable, + #[serde(skip)] + pub multiplexing_quality_table: MetricCard, + #[serde(skip)] + pub hashtag_metrics_table: MetricCard, + pub jibes_biplot: Option, + pub jibes_histogram: Option, + pub hashtag_umi_projection_plot: Option, + pub hashtag_tags_projection_plot: Option, #[serde(rename = "_resources")] pub resources: MultiSharedResource, } +impl Alert for Option {} #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct SampleGexWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub hero_metrics: MetricCard, /// Only for multiplexed runs + #[serde(skip)] pub cell_metrics_table: Option>, + #[serde(skip)] pub mapping_metrics_table: Option>, + #[serde(skip)] pub gdna_table: Option>, pub barcode_rank_plot: Option, pub median_genes_per_cell_plot: Option, pub clustering_and_diffexp_plots: Value, + pub disclaimer: Option, } #[derive(Serialize, Deserialize, Clone)] @@ -995,8 +1327,12 @@ impl ToJsonSummary for ClonotypeInfo {} #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct SampleVdjWebSummary { pub parameters_table: VdjParametersTable, + #[serde(skip)] pub hero_metrics: MetricCard, + #[serde(skip)] pub annotation_metrics_table: MetricCard, + #[serde(skip)] + pub enrichment_metrics_table: Option>, pub clonotype_info: Option, pub barcode_rank_plot: Option, } @@ -1004,20 +1340,24 @@ pub struct SampleVdjWebSummary { #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct SampleAntibodyWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub hero_metrics: MetricCard, pub antibody_treemap: Option, /// Only for multiplexed runs + #[serde(skip)] pub cell_metrics_table: Option>, + #[serde(skip)] pub mapping_metrics_table: MetricCard, pub barcode_rank_plot: Option, pub clustering_and_diffexp_plots: Option, - pub tsne_plot: Option, + pub projection_plot: Option, pub feature_histogram: Option, } #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct SampleAntigenWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub hero_metrics: MetricCard, pub antigen_treemap: Option, // Heatmap of clonotypes x antigen specificity hierarchically clustered @@ -1027,34 +1367,95 @@ pub struct SampleAntigenWebSummary { #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct SampleCrisprWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub hero_metrics: MetricCard, /// Only for multiplexed runs + #[serde(skip)] pub cell_metrics_table: Option>, + #[serde(skip)] pub mapping_metrics_table: MetricCard, pub barcode_rank_plot: Option, - pub tsne_plot: Option, + pub projection_plot: Option, } #[derive(Serialize, Clone, ToCsvRows, ToJsonSummary, Alert)] pub struct SampleCustomFeatureWebSummary { pub parameters_table: CountParametersTable, + #[serde(skip)] pub hero_metrics: MetricCard, /// Only for multiplexed runs + #[serde(skip)] pub cell_metrics_table: Option>, pub barcode_rank_plot: Option, - pub tsne_plot: Option, + pub projection_plot: Option, +} + +#[derive(Serialize, Clone)] +pub struct SampleCellAnnotationWebSummary { + pub parameters_table: Option, + pub disclaimer: Option, + pub cas_success: Option, + pub cell_annotation_disable_differential_expression: Option, + pub cell_annotation_cell_types_chart: Option>, + pub cell_annotation_violin_plot_chart: Option>, + pub cell_annotation_umap_plot_chart: Option>, + pub cell_annotation_diffexp_table: Option>, +} + +impl Alert for SampleCellAnnotationWebSummary { + fn alerts(&self, _ctx: &AlertContext) -> Vec { + match ( + self.cas_success, + self.cell_annotation_disable_differential_expression, + ) { + (Some(false), _) => vec![AlertSpec { + level: cr_websummary::alert::AlertLevel::Error, + title: CELL_ANNOTATION_FAILURE_TITLE.to_string(), + formatted_value: String::default(), + message: CELL_ANNOTATION_FAILURE_MESSAGE.to_string(), + }], + (_, Some(true)) => vec![AlertSpec { + level: AlertLevel::Warn, + title: CELL_ANNOTATION_DE_WARN_TITLE.to_string(), + formatted_value: String::default(), + message: CELL_ANNOTATION_DE_WARN_MESSAGE.to_string(), + }], + _ => Vec::new(), + } + } } +impl ToCsvRows for SampleCellAnnotationWebSummary {} +impl ToJsonSummary for SampleCellAnnotationWebSummary {} + #[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)] pub struct MismatchedProbeBarcodePairings { /// Probe barcode pairings declared in the config but not detected. - pub configured_not_detected: Vec, + configured_not_detected: Vec, /// Probe barcode pairings detected during detect chemistry but not declared /// in the config. - pub detected_not_configured: Vec, + detected_not_configured: Vec, } impl MismatchedProbeBarcodePairings { + pub fn new( + configured_probe_barcode_pairing: &HashSet, + detected_probe_barcode_pairing: &HashSet, + ) -> Self { + Self { + configured_not_detected: configured_probe_barcode_pairing + .difference(detected_probe_barcode_pairing) + .cloned() + .sorted() + .collect(), + detected_not_configured: detected_probe_barcode_pairing + .difference(configured_probe_barcode_pairing) + .cloned() + .sorted() + .collect(), + } + } + fn formatted_value(&self) -> String { let count = self .configured_not_detected @@ -1064,15 +1465,16 @@ impl MismatchedProbeBarcodePairings { } } -impl ToString for MismatchedProbeBarcodePairings { - fn to_string(&self) -> String { +impl Display for MismatchedProbeBarcodePairings { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let format_pairings = |pairings: &[String]| { if pairings.is_empty() { - return "none".to_string(); + return Cow::Borrowed("none"); } - pairings.join(", ") + Cow::Owned(pairings.join(", ")) }; - format!("Mismatch found between probe barcode pairing specified in config CSV file and chemistry detection. \ + write!(f, + "Mismatch found between probe barcode pairing specified in config CSV file and chemistry detection. \ Pairings specified in the config CSV but not detected: {}. \ Pairings detected but not specified in the config CSV: {}. \ This may be due to an error in the config CSV, or \ @@ -1089,8 +1491,9 @@ mod tests { use super::*; use crate::multi::plots::{format_histogram, format_jibes_biplots}; use crate::multi::tables::GexSampleHeroMetricsTable; + use cr_types::{CellLevel, ReadLevel}; use cr_websummary::*; - use insta; + use insta::assert_snapshot; use metric::PercentMetric; use std::fs; @@ -1158,11 +1561,11 @@ mod tests { fn gen_count_param_table(library_type: LibraryType) -> CountParametersTable { CountParametersTable { - chemistry: "Single Cell 5' R2-only".into(), + chemistry: "Single Cell 5' R2-only".to_string(), introns_included: false, - reference_path: "refdata-gex-GRCh38-2020-A".into(), - transcriptome: "GRCh38-2020-A".into(), - feature_ref_path: Some("some/feature/ref".into()), + reference_path: Some("refdata-gex-GRCh38-2020-A".to_string()), + transcriptome: "GRCh38-2020-A".to_string(), + feature_ref_path: Some("some/feature/ref".to_string()), cmo_set_path: None, target_set_name: None, targeting_method: None, @@ -1201,23 +1604,23 @@ mod tests { fastq_id: Some("seq_GEX_1_1".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, SequencingMetricsRow { fastq_id: Some("seq_GEX_1_2".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, ]) .into(), @@ -1244,19 +1647,15 @@ mod tests { valid_gem_barcodes: None, valid_probe_barcodes: None, valid_umis: Some(make_percent(92.80)), - targeted_sequencing_saturation: None, sequencing_saturation: Some(make_percent(15.21)), reads_in_cell_associated_partitions: Some(make_percent(91.70)), mean_reads_per_cell_associated_partition: Some(FloatAsInt(47_716.0)), - mean_targeted_reads_per_cell_associated_partition: None, }, ]) .into(), rtl_probe_barcode_metrics_table: None, + ocm_per_overhang_metrics_table: None, gdna_table: None, - targeted_table: None, - targeted_plot: None, - targeted_alerts: None, sequencing_saturation_plot: sequencing_saturation_plot( vec![0.0, 20_000.0, 40_000.0, 60_000.0], vec![0.0, 0.43, 0.63, 0.75], @@ -1279,13 +1678,9 @@ mod tests { genome: None, total_singlets: Some(1_023), mean_reads_per_cell: Some(FloatAsInt(63_575.0)), - median_reads_per_cell_on_target: None, median_genes_per_singlet: Some(FloatAsInt(2_149.0)), total_genes_detected: Some(16_313), median_umi_per_singlet: Some(FloatAsInt(19_209.0)), - median_genes_per_cell_on_target: None, - num_genes_detected_on_target: None, - median_umis_per_cell_on_target: None, confidently_mapped_reads_in_cells: Some(make_percent(99.0)), }]) .into(), @@ -1326,6 +1721,7 @@ mod tests { )), clustering_and_diffexp_plots: Value::String("CLUSTERING_PLOTS_GO_HERE".to_string()), barcode_rank_plot: None, + disclaimer: Some("This is a disclaimer".to_string()), } } @@ -1363,7 +1759,7 @@ mod tests { .into(), ), clustering_and_diffexp_plots: None, - tsne_plot: None, + projection_plot: None, barcode_rank_plot: None, feature_histogram: None, } @@ -1386,11 +1782,20 @@ mod tests { let library_vdj_tab = LibraryVdjWebSummary { parameters_table: vdj_param_table.clone(), - cell_metrics_table: VdjLibraryCellMetricsTable(vec![VdjLibraryCellMetricsRow { - physical_library_id: Some("VDJ_1".to_string()), - vdj_filtered_bcs: Some(200), - vdj_total_raw_read_pairs_per_filtered_bc: Some(FloatAsInt(1200.0)), - }]) + cell_metrics_table: VdjChainTypeSpecific::VdjT(VdjTLibraryCellMetricsTable(vec![ + VdjTLibraryCellMetricsRow { + physical_library_id: Some("VDJ_1".to_string()), + vdj_filtered_bcs: Some(200), + multi_vdj_assembly_contig_pair_productive_full_len_bc_frac: Some(make_percent( + 81.4, + )), + TRA_TRB_vdj_assembly_contig_pair_productive_full_len_bc_frac: Some( + make_percent(92.3), + ), + TRA_vdj_assembly_prod_cdr_bc_frac: Some(make_percent(87.6)), + TRB_vdj_assembly_prod_cdr_bc_frac: Some(make_percent(91.3)), + }, + ])) .into(), enrichment_metrics_table: VdjChainTypeSpecific::VdjT(VdjTEnrichmentMetricsTable(vec![ VdjTEnrichmentMetricsRow { @@ -1406,23 +1811,23 @@ mod tests { fastq_id: Some("seq_VDJ_1_1".to_string()), number_of_reads: Some(838_586), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.70))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.70)), + q30_read2: Some(make_percent(94.65)), }, SequencingMetricsRow { fastq_id: Some("seq_VDJ_1_2".to_string()), number_of_reads: Some(720_004), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.70))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.70)), + q30_read2: Some(make_percent(94.65)), }, ]) .into(), @@ -1441,6 +1846,8 @@ mod tests { vec![1.0, 100.0, 10_000.0, 10_000.0, 500_000.0, 1_000_000.0], vec![10_500.0, 10_000.0, 1000.0, 10.0, 5.0, 1.0], )), + metrics_per_ocm_barcode_table: None, + metrics_per_hashtag_id_table: None, }; let library_antibody_tab = LibraryAntibodyOrAntigenWebSummary { @@ -1462,23 +1869,23 @@ mod tests { fastq_id: Some("seq_AB_1_1".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, SequencingMetricsRow { fastq_id: Some("seq_AB_1_2".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, ]) .into(), @@ -1536,23 +1943,23 @@ mod tests { fastq_id: Some("seq_CC_1_1".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, SequencingMetricsRow { fastq_id: Some("seq_CC_1_2".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, ]) .into(), @@ -1596,23 +2003,23 @@ mod tests { fastq_id: Some("seq_GC_1_1".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, SequencingMetricsRow { fastq_id: Some("seq_GC_1_2".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, ]) .into(), @@ -1655,12 +2062,12 @@ mod tests { fastq_id: Some("seq_AG_1_1".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }]) .into(), physical_library_metrics_table: AntibodyOrAntigen::Antigen( @@ -1692,63 +2099,49 @@ mod tests { }; let library_cmo_tab = LibraryCmoWebSummary { - cmo_umi_tsne_plot: None, - cmo_tags_tsne_plot: None, + cmo_umi_projection_plot: None, + cmo_tags_projection_plot: None, parameters_table: gen_count_param_table(LibraryType::FeatureBarcodes( FeatureBarcodeType::Multiplexing, )), - multiplexing_metrics_table: MultiplexingLibraryCellMetricsTable(vec![ - MultiplexingLibraryCellMetricsRow { + multiplexing_quality_table: CmoOrHashtag::Cmo(CmoMultiplexingQualityTable(vec![ + CmoMultiplexingQualityRow { cell_associated_partitions: Some(973), samples_assigned_at_least_one_singlet: Some(9), - singlets_assigned_to_sample: Some(make_count_percent(2700, 92.5)), + singlets_assigned_to_a_sample: Some(make_count_percent(2700, 92.5)), singlet_capture_ratio: Some(0.5), - cell_associated_partitions_identified_as_multiplet: Some(make_count_percent( - 220, 20.1, - )), median_cmo_umis_per_singlet: Some(FloatAsInt(458.0)), - }, - ]) - .into(), - sample_assignments_table: MultiplexingSampleAssignmentsTable(vec![ - MultiplexingSampleAssignmentsRow { - physical_library_id: Some("MC_1".to_string()), - cell_associated_partitions: Some(1_012), - mean_reads_per_cell: Some(FloatAsInt(966.0)), - samples_assigned_at_least_one_singlet: Some(1), - singlets_assigned_to_a_sample: Some(make_count_percent(900, 90.8)), cell_associated_partitions_identified_as_multiplets: Some(make_count_percent( 60, 19.2, )), - cell_associated_partitions_not_assigned_any_cmos: Some(make_count_percent( + cell_associated_partitions_not_assigned_any_tags: Some(make_count_percent( 6, 1.9, )), - median_cmo_umis_per_cell_associated_partition: Some(FloatAsInt(479.0)), }, - ]) + ])) .into(), sequencing_metrics_table: SequencingMetricsTable(vec![ SequencingMetricsRow { fastq_id: Some("seq_MC_1_1".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, SequencingMetricsRow { fastq_id: Some("seq_MC_1_2".to_string()), number_of_reads: Some(29_374_662), unprocessed_reads: Some(0), - q30_barcode: Some(PercentF1(make_percent(90.65))), + q30_barcode: Some(make_percent(90.65)), q30_gem_barcode: None, q30_probe_barcode: None, - q30_umi: Some(PercentF1(make_percent(90.65))), - q30_read1: Some(PercentF1(make_percent(91.7))), - q30_read2: Some(PercentF1(make_percent(94.65))), + q30_umi: Some(make_percent(90.65)), + q30_read1: Some(make_percent(91.7)), + q30_read2: Some(make_percent(94.65)), }, ]) .into(), @@ -1768,34 +2161,38 @@ mod tests { }, ]) .into(), - cmo_metrics_table: MultiplexingCmoMetricsTable(vec![ - MultiplexingCmoMetricsRow { + cmo_metrics_table: CmoOrHashtag::Cmo(CmoPerTagMetricsTable(vec![ + CmoPerTagMetricsRow { gem_well_cmo: Some("CMO_2_1".to_string()), - reads_in_cell_associated_partitions: Some(make_percent(83.39)), - singlets_assigned_to_cmo: Some(make_percent(10.27)), + sample_id: Some("sample_1".to_string()), + cmo_reads_in_cell_associated_partitions: Some(make_percent(83.39)), + singlets_assigned_to_cmo: Some(make_count_percent(1027, 10.27)), cmo_signal_to_background_ratio: Some(3.0), }, - MultiplexingCmoMetricsRow { + CmoPerTagMetricsRow { gem_well_cmo: Some("CMO_2_2".to_string()), - reads_in_cell_associated_partitions: Some(make_percent(82.2)), - singlets_assigned_to_cmo: Some(make_percent(11.63)), + sample_id: Some("sample_2".to_string()), + cmo_reads_in_cell_associated_partitions: Some(make_percent(82.2)), + singlets_assigned_to_cmo: Some(make_count_percent(1163, 11.63)), cmo_signal_to_background_ratio: Some(3.0), }, - MultiplexingCmoMetricsRow { + CmoPerTagMetricsRow { gem_well_cmo: Some("CMO_2_3".to_string()), - reads_in_cell_associated_partitions: Some(make_percent(84.41)), - singlets_assigned_to_cmo: Some(make_percent(10.46)), + sample_id: Some("sample_2".to_string()), + cmo_reads_in_cell_associated_partitions: Some(make_percent(84.41)), + singlets_assigned_to_cmo: Some(make_count_percent(1046, 10.46)), cmo_signal_to_background_ratio: Some(2.0), }, - ]) + ])) .into(), barcode_rank_plot: barcode_rank_plot( vec![1.0, 100.0, 10_000.0, 10_000.0, 500_000.0, 1_000_000.0], vec![10_500.0, 10_000.0, 1000.0, 10.0, 5.0, 1.0], ), - jibes_biplot: Some(format_jibes_biplots(&serde_json::Value::String( - "BIPLOTS_GO_HERE".to_string(), - ))), + jibes_biplot: Some(format_jibes_biplots( + &serde_json::Value::String("BIPLOTS_GO_HERE".to_string()), + "CMO", + )), jibes_histogram: Some(format_histogram( &serde_json::Value::String("HISTOGRAM_GOES_HERE".to_string()), "", @@ -1819,6 +2216,7 @@ mod tests { crispr_tab: Some(Tab::new(library_crispr_tab, &ctx)), custom_feature_tab: Some(Tab::new(library_custom_feature_tab, &ctx)), cmo_tab: Some(Tab::new(library_cmo_tab, &ctx)), + hashtag_tab: None, resources: TxHashMap::default(), }; @@ -1855,6 +2253,7 @@ mod tests { multi_vdj_assembly_contig_pair_productive_full_len_bc_count: Some(380), TRA_vdj_assembly_umis_per_cell_median: Some(FloatAsInt(2.0)), TRB_vdj_assembly_umis_per_cell_median: Some(FloatAsInt(12.0)), + vdj_filtered_bcs_cum_frac: None, }, ])) .into(), @@ -1872,10 +2271,12 @@ mod tests { }], )) .into(), + enrichment_metrics_table: None, clonotype_info: Some(ClonotypeInfo { table: GenericTable { header: None, rows: Vec::new(), + grouping_header: None, }, plot: PlotlyChart::default(), help: TitleWithHelp { @@ -1922,7 +2323,7 @@ mod tests { }, ]) .into(), - tsne_plot: None, + projection_plot: None, barcode_rank_plot: None, }; @@ -1952,7 +2353,7 @@ mod tests { }])) .into(), ), - tsne_plot: None, + projection_plot: None, barcode_rank_plot: None, }; @@ -1970,21 +2371,37 @@ mod tests { antigen_tab: Some(Tab::new(sample_antigen_tab, &ctx)), crispr_tab: Some(Tab::new(sample_crispr_tab, &ctx)), custom_feature_tab: Some(Tab::new(sample_custom_tab, &ctx)), + cell_annotation_tab: None, }; MultiWebSummary { sample: WsSample::multi(SAMPLE_ID.to_string(), SAMPLE_DESC.to_string()), - data: MultiWebSummaryData { - library_websummary, - sample_websummary, - experimental_design: ExperimentalDesign { - svg: SvgGraph::new( - "svg string".into(), - "sample_1".into(), - Some(cr_types::CellMultiplexingType::CMO), - ), - csv: "csv goes here".to_string(), - }, + library: MultiWebSummaryLibraryData { + metrics: library_websummary.to_json_summary(&ctx), + types: vec![ + LibraryType::Gex, + LibraryType::Antibody, + LibraryType::Antigen, + LibraryType::Crispr, + LibraryType::Custom, + LibraryType::Vdj(cr_types::VdjChainType::VdjT), + ], + data: library_websummary, + }, + per_sample: vec![MultiWebSummarySampleData { + metrics: sample_websummary.to_json_summary(&ctx), + data: sample_websummary, + }], + experimental_design: ExperimentalDesign { + svg: SvgGraph::new( + "svg string".into(), + "sample_1".into(), + Some(BarcodeMultiplexingType::CellLevel(CellLevel::CMO)), + ), + csv: "csv goes here".to_string(), + multiplexing_method: Some(BarcodeMultiplexingType::CellLevel(CellLevel::CMO)), + is_rtl: false, + is_barnyard: false, }, diagnostics: MultiDiagnostics::default(), sample_diagnostics: Default::default(), @@ -2007,11 +2424,11 @@ mod tests { .unwrap() .into_temp_path(); generate_test_websummary() - .to_csv(&csv_path) + .to_csv(&csv_path, 0) .expect("Error generating test metrics CSV."); let csv_str: String = fs::read_to_string(&csv_path).expect("Error reading test metrics CSV."); - insta::assert_snapshot!(&csv_str); + assert_snapshot!(&csv_str); csv_path.close().expect("failed to delete temp csv"); } @@ -2079,17 +2496,25 @@ mod tests { let multi_websummary = MultiWebSummary { sample: WsSample::multi(SAMPLE_ID.to_string(), SAMPLE_DESC.to_string()), - data: MultiWebSummaryData { - library_websummary, - sample_websummary, - experimental_design: ExperimentalDesign { - svg: SvgGraph::new( - "svg string".into(), - "sample_1".into(), - Some(cr_types::CellMultiplexingType::CMO), - ), - csv: "csv goes here".to_string(), - }, + library: MultiWebSummaryLibraryData { + metrics: library_websummary.to_json_summary(&ctx), + types: vec![LibraryType::Gex, LibraryType::Antibody], + data: library_websummary, + }, + per_sample: vec![MultiWebSummarySampleData { + metrics: sample_websummary.to_json_summary(&ctx), + data: sample_websummary, + }], + experimental_design: ExperimentalDesign { + svg: SvgGraph::new( + "svg string".into(), + "sample_1".into(), + Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)), + ), + csv: "csv goes here".to_string(), + multiplexing_method: Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)), + is_rtl: true, + is_barnyard: false, }, diagnostics: Default::default(), sample_diagnostics: Default::default(), @@ -2097,7 +2522,7 @@ mod tests { }; let json = serde_json::to_value(multi_websummary).expect("Error generating JSON"); - assert!(json["data"]["library_websummary"]["antibody_tab"]["alerts"] + assert!(json["library"]["data"]["antibody_tab"]["alerts"] .as_array() .expect("No alerts generated") .iter() @@ -2173,17 +2598,25 @@ mod tests { let multi_websummary = MultiWebSummary { sample: WsSample::multi(SAMPLE_ID.to_string(), SAMPLE_DESC.to_string()), - data: MultiWebSummaryData { - library_websummary, - sample_websummary, - experimental_design: ExperimentalDesign { - svg: SvgGraph::new( - "svg string".into(), - "sample_1".into(), - Some(cr_types::CellMultiplexingType::CMO), - ), - csv: "csv goes here".to_string(), - }, + library: MultiWebSummaryLibraryData { + metrics: library_websummary.to_json_summary(&ctx), + types: vec![LibraryType::Gex, LibraryType::Antibody], + data: library_websummary, + }, + per_sample: vec![MultiWebSummarySampleData { + metrics: sample_websummary.to_json_summary(&ctx), + data: sample_websummary, + }], + experimental_design: ExperimentalDesign { + svg: SvgGraph::new( + "svg string".into(), + "sample_1".into(), + Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)), + ), + csv: "csv goes here".to_string(), + multiplexing_method: Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)), + is_rtl: true, + is_barnyard: false, }, diagnostics: Default::default(), sample_diagnostics: Default::default(), @@ -2191,17 +2624,15 @@ mod tests { }; let json = serde_json::to_value(multi_websummary).expect("Error generating JSON"); - assert!( - !json["data"]["library_websummary"]["antibody_tab"]["alerts"] - .as_array() - .expect("No alerts generated") - .iter() - .any(|v| { - v["level"].to_string().contains("WARN") - && v["title"] - .to_string() - .contains("High Fraction of Antibody Reads in Aggregate Barcodes") - }) - ); + assert!(!json["library"]["data"]["antibody_tab"]["alerts"] + .as_array() + .expect("No alerts generated") + .iter() + .any(|v| { + v["level"].to_string().contains("WARN") + && v["title"] + .to_string() + .contains("High Fraction of Antibody Reads in Aggregate Barcodes") + })); } } diff --git a/lib/rust/cr_websummary/src/value.rs b/lib/rust/cr_websummary/src/value.rs index 0fa7046..22be3a2 100644 --- a/lib/rust/cr_websummary/src/value.rs +++ b/lib/rust/cr_websummary/src/value.rs @@ -1,5 +1,6 @@ -use crate::{CountAndPercent, FloatAsInt, Percent, PercentF1}; +use crate::{CountAndPercent, FloatAsInt, Percent}; use anyhow::{anyhow, bail, Result}; +use log::warn; use serde_json::{Number, Value}; pub trait TryFromValue { @@ -44,15 +45,17 @@ impl TryFromValue for Percent { } } -impl TryFromValue for PercentF1 { - fn try_from_value(value: &Value) -> Result> { - Ok(Percent::try_from_value(value)?.map(PercentF1)) - } -} - impl TryFromValue for CountAndPercent { fn try_from_value(_: &Value) -> Result> { - unimplemented!("TryFromValue is not implemented for CountAndPercent") + // TEMP: log a warning and return None + // FIXME CELLRANGER-8444 + // We should never end up using the result of this call in output, + // since all CountAndPercent fields need to be manually constructed. + // However, we cannot use struct update syntax for populating metrics + // tables for any tables that contain CountAndPercent if we panic here. + // unimplemented!("TryFromValue is not implemented for CountAndPercent") + warn!("Attempted to call try_from_value for CountAndPercent."); + Ok(None) } } diff --git a/lib/rust/cr_wrap/Cargo.toml b/lib/rust/cr_wrap/Cargo.toml index ebf63e6..867c3e7 100644 --- a/lib/rust/cr_wrap/Cargo.toml +++ b/lib/rust/cr_wrap/Cargo.toml @@ -3,29 +3,35 @@ name = 'cellranger' test = false [dependencies] -csv = '1' dirs = '5' -hex = '0.4' -md5 = '0.7' -sha2 = '0.10' shell-escape = '0.1.5' -tempfile = '3' terminal_size = '0.3' -thiserror = '1' tiff = '0.9.1' +url = '2.5.2' [dependencies.anyhow] workspace = true [dependencies.clap] +default-features = true +features = ['derive', 'wrap_help'] workspace = true +[dependencies.cloud_utils] +path = '../cloud_utils' + [dependencies.cr_types] path = '../cr_types' +[dependencies.csv] +workspace = true + [dependencies.fastq_set] workspace = true +[dependencies.hex] +workspace = true + [dependencies.itertools] workspace = true @@ -35,14 +41,14 @@ workspace = true [dependencies.metric] path = '../metric' +[dependencies.multi] +path = '../multi' + [dependencies.ordered-float] -features = ['serde'] -version = '3' +workspace = true [dependencies.regex] -default-features = false -features = ['std', 'perf'] -version = '1' +workspace = true [dependencies.serde] workspace = true @@ -50,6 +56,18 @@ workspace = true [dependencies.serde_json] workspace = true +[dependencies.sha2] +workspace = true + +[dependencies.slide_design] +path = '../slide_design' + +[dependencies.tempfile] +workspace = true + +[dependencies.thiserror] +workspace = true + [dependencies.vdj_reference] path = '../vdj_reference' diff --git a/lib/rust/cr_wrap/src/arc/count.rs b/lib/rust/cr_wrap/src/arc/count.rs index d293231..0202517 100644 --- a/lib/rust/cr_wrap/src/arc/count.rs +++ b/lib/rust/cr_wrap/src/arc/count.rs @@ -130,7 +130,7 @@ impl CountArgs { ); } }; - sample_defs.extend(fq.get_sample_defs(l.library_type, None)?); + sample_defs.extend(fq.get_sample_defs(l.library_type)?); } if !seen_atac { bail!("Invalid libraries file: missing `Chromatin Accessibility` FASTQ files"); diff --git a/lib/rust/cr_wrap/src/arc/testrun.rs b/lib/rust/cr_wrap/src/arc/testrun.rs index 3596c23..7ebc5be 100644 --- a/lib/rust/cr_wrap/src/arc/testrun.rs +++ b/lib/rust/cr_wrap/src/arc/testrun.rs @@ -46,7 +46,7 @@ impl TestrunArgs { sample: Some(vec![String::from("tiny_arc_atac")]), lanes: None, } - .get_sample_defs(LibraryType::Atac, None)?, + .get_sample_defs(LibraryType::Atac)?, ); sample_defs.extend( FastqArgs { @@ -55,7 +55,7 @@ impl TestrunArgs { sample: Some(vec![String::from("tiny_arc_gex")]), lanes: None, } - .get_sample_defs(LibraryType::Gex, None)?, + .get_sample_defs(LibraryType::Gex)?, ); Ok(CountMro { sample_id: t.id.clone(), diff --git a/lib/rust/cr_wrap/src/bin/cellranger.rs b/lib/rust/cr_wrap/src/bin/cellranger.rs index 2ae0a3a..e2d46c8 100644 --- a/lib/rust/cr_wrap/src/bin/cellranger.rs +++ b/lib/rust/cr_wrap/src/bin/cellranger.rs @@ -1,19 +1,20 @@ -use anyhow::{bail, Context, Result}; +use anyhow::{bail, ensure, Context, Result}; use clap::{self, Parser}; -use cr_types::chemistry::{AutoOrRefinedChemistry, ChemistryName}; +use cr_types::cell_annotation::CellAnnotationModel; use cr_types::sample_def::SampleDef; use cr_types::types::FileOrBytes; use cr_types::{LibraryType, TargetingMethod}; use cr_wrap::chemistry_arg::validate_chemistry; use cr_wrap::create_bam_arg::CreateBam; +use cr_wrap::env::Initialize; use cr_wrap::fastqs::{FastqArgs, FastqArgsNoLibraries}; use cr_wrap::mkref::Mkvdjref; use cr_wrap::mrp_args::MrpArgs; use cr_wrap::shared_cmd::{self, HiddenCmd, RnaSharedCmd, SharedCmd}; +use cr_wrap::telemetry::CollectTelemetry; use cr_wrap::utils::{validate_id, AllArgs, CliPath}; -use cr_wrap::{ - check_deprecated_os, env, execute, make_mro, make_mro_with_comment, mkfastq, set_env_vars, -}; +use cr_wrap::{cloud, env, execute, make_mro, make_mro_with_comment, mkfastq}; +use multi::config::{ChemistryParam, ChemistrySet}; use serde::{self, Serialize}; use sha2::{Digest, Sha256}; use std::fs::{read_to_string, File}; @@ -67,6 +68,21 @@ struct CellRanger { env_json: Option, } +impl Initialize for CellRanger { + fn override_env_json(&self) -> Option<&std::path::Path> { + self.env_json.as_deref() + } +} + +impl CollectTelemetry for CellRanger { + fn should_collect_telemetry(&self) -> bool { + !matches!( + self.subcmd, + SubCommand::Shared(SharedCmd::Telemetry(_)) | SubCommand::Hidden(HiddenCmd::OsCheck(_)) + ) + } +} + #[derive(Parser, Debug)] enum SubCommand { /// Count gene expression and/or feature barcode reads from a single sample and GEM well. @@ -89,6 +105,10 @@ enum SubCommand { #[clap(name = "aggr")] Aggr(Aggr), + /// Annotate cell-types from outputs of a CellRanger run. + #[clap(name = "annotate")] + Annotate(Annotate), + /// Re-run secondary analysis (dimensionality reduction, clustering, etc). #[clap(name = "reanalyze")] Reanalyze(Reanalyze), @@ -98,7 +118,9 @@ enum SubCommand { /// Build a Cell Ranger V(D)J-compatible reference folder from: /// 1) A user-supplied genome FASTA and gene GTF files. /// For example, using files from ENSEMBL. + /// /// OR + /// /// 2) A FASTA file containing V(D)J segments as per the mkvdjref spec. /// For example, using files from IMGT. /// @@ -115,6 +137,10 @@ enum SubCommand { #[clap(name = "testrun")] Testrun(Testrun), + /// Invoke cloud commands + #[clap(name = "cloud")] + Cloud(AllArgs), + /// Auxiliary commands #[clap(flatten)] RnaShared(RnaSharedCmd), @@ -140,8 +166,8 @@ struct Count { description: String, /// Path of folder containing 10x-compatible transcriptome reference. - #[clap(long, value_name = "PATH")] - transcriptome: CliPath, + #[clap(long, value_name = "PATH", required_unless_present = "feature_ref")] + transcriptome: Option, // Arguments for specify fastq data -- should be shared across most pipelines. #[clap(flatten)] @@ -198,12 +224,12 @@ struct Count { /// 'SC3Pv2' or 'SC3Pv3' or 'SC3Pv4' for Single Cell 3' v1/v2/v3/v4, /// 'SC3Pv3LT' for Single Cell 3' v3 LT, /// 'SC3Pv3HT' for Single Cell 3' v3 HT, - /// 'SC5P-PE' or 'SC5P-PE-v3' or 'SC5P-R2' or 'SC5P-R2-v3', for Single Cell 5', + /// 'SC5P-PE' or 'SC5P-PE-v3' or 'SC5P-R2' or 'SC5P-R2-v3' for Single Cell 5', /// paired-end/R2-only, 'SC-FB' for Single Cell /// Antibody-only 3' v2 or 5'. To analyze the GEX portion /// of multiome data, chemistry must be set to 'ARC-v1'. #[clap(long, value_name = "CHEM", default_value = "auto", value_parser=validate_chemistry)] - chemistry: AutoOrRefinedChemistry, + chemistry: ChemistryParam, /// Proceed with processing using a --feature-ref but no /// Feature Barcode libraries specified with the @@ -215,6 +241,19 @@ struct Count { #[clap(long, value_name = "true|false")] check_library_compatibility: Option, + /// The path to the 10x Cloud Analysis user token used to enable cell annotation. + /// If not provided, will default to the location stored through cellranger cloud auth setup. + #[clap(long = "tenx-cloud-token-path", value_name = "PATH")] + tenx_cloud_token_path: Option, + + /// Cell annotation model to use. Valid model names can be viewed by running + /// `cellranger cloud annotation models` or on the 10x Genomics Support site + /// (https://www.10xgenomics.com/support). + /// If "auto", uses the default model for the species. + /// If not provided, does not run cell annotation. + #[clap(long = "cell-annotation-model", value_name = "MODEL")] + cell_annotation_model: Option, + /// Enable or disable antibody and antigen aggregate filtering during cell calling. #[clap(long, value_name = "true|false", default_value = "true", hide = true)] filter_aggregates: Option, @@ -240,13 +279,14 @@ struct Count { impl Count { pub fn to_mro_args(&self) -> Result { let c = self.clone(); + let mut tenx_cloud_token_path = c.tenx_cloud_token_path; // probe-set argument allowed in PD but bail with error message for command-line - if c.probe_set.is_some() { - bail!( - "--probe-set argument not supported by cellranger count. Please use cellranger multi for all Fixed RNA Profiling samples." - ); - } + ensure!( + c.probe_set.is_none(), + "--probe-set argument not supported by cellranger count. \ + Please use cellranger multi for all Flex samples." + ); let mut sample_defs = Vec::new(); if let Some(ref libraries) = c.libraries { @@ -260,16 +300,29 @@ impl Count { sample: Some(vec![l.sample]), lanes: None, }; - sample_defs.extend(fq.get_sample_defs(l.library_type, None)?); + sample_defs.extend(fq.get_sample_defs(l.library_type)?); } } else { // convert the fastq cmd-line args to a SampleDef - sample_defs.extend(c.fastqs.get_sample_defs(LibraryType::Gex, None)?); + sample_defs.extend(c.fastqs.get_sample_defs(LibraryType::Gex)?); + } + + // if the token path is not supplied, default to the value expected by + // cellranger cloud auth setup, which is $HOME/.config/txg/credential + // cellranger cloud [args], which is $HOME/.config/txg/credentials + if tenx_cloud_token_path.is_none() { + if let Ok(default_token_path) = cloud_utils::default_token_path() { + tenx_cloud_token_path = Some(default_token_path); + } else { + eprintln!("{}", cloud_utils::CELL_ANNOTATION_HOMEDIR_MSG); + } } Ok(CountCsMro { sample_id: c.id, sample_def: sample_defs, + target_set_name: None, + target_set: None, sample_desc: c.description, reference_path: c.transcriptome, recovered_cells: c.expect_cells, @@ -289,6 +342,12 @@ impl Count { check_library_compatibility: c.check_library_compatibility.unwrap_or(true), disable_ab_aggregate_detection: !c.filter_aggregates.unwrap_or(true), min_crispr_umi_threshold: c.min_crispr_umi_threshold, + tenx_cloud_token_path, + skip_cell_annotation: c.cell_annotation_model.is_none(), + cell_annotation_model: c + .cell_annotation_model + .as_ref() + .and_then(CellAnnotationModel::to_pipeline_inputs), }) } } @@ -296,14 +355,16 @@ impl Count { struct CountCsMro { sample_id: String, sample_def: Vec, + target_set: Option, + target_set_name: Option, sample_desc: String, - reference_path: CliPath, + reference_path: Option, recovered_cells: Option, no_bam: bool, no_secondary_analysis: bool, no_target_umi_filter: bool, force_cells: Option, - chemistry: AutoOrRefinedChemistry, + chemistry: ChemistryParam, r1_length: Option, r2_length: Option, targeting_method: Option, @@ -315,6 +376,9 @@ struct CountCsMro { check_library_compatibility: bool, disable_ab_aggregate_detection: bool, min_crispr_umi_threshold: usize, + tenx_cloud_token_path: Option, + cell_annotation_model: Option, + skip_cell_annotation: bool, } /// A subcommand for controlling testing @@ -400,7 +464,7 @@ impl MultiTemplate { /// Aggregates the feature/cell count data /// generated from multiple runs of the 'cellranger count' pipeline. // To run this pipeline, supply a CSV that enumerates the paths to the -// filtered_matrix.h5 files produced by 'cellranger count'. +// molecule_info.h5 files produced by 'cellranger count'. #[derive(Parser, Debug, Clone, Serialize)] struct Aggr { /// A unique run id and output folder name [a-zA-Z0-9_-]+. @@ -443,6 +507,14 @@ struct Aggr { )] min_crispr_umi_threshold: usize, + /// Enable t-SNE projection + #[clap( + long = "enable-tsne", + default_value = "false", + value_name = "true|false" + )] + enable_tsne: Option, + // not a cmd-line arg -- should be filled in with the working dir #[clap(hide = true, default_value = ".")] pipestance_root: PathBuf, @@ -452,6 +524,94 @@ struct Aggr { mrp: MrpArgs, } +/// Performs cell type annotation on the feature-barcode matrix +/// generated from a run of the Cell Ranger 'count' or the +/// 'multi' pipeline. To run this pipeline, filtered_matrix.h5 +/// files produced by 'count' or 'multi', a cell annotation token, +/// and a cloupe file (optional) are required. +#[derive(Parser, Debug, Clone, Serialize)] +struct Annotate { + /// A unique run id and output folder name [a-zA-Z0-9_-]+. + #[clap(long = "id", value_name = "ID", value_parser = validate_id, required = true)] + sample_id: String, + + /// Sample description to embed in output files. + #[clap(long = "description", default_value = "", value_name = "TEXT")] + sample_desc: String, + + /// Path to 10x Cloud cell annotation token file. + #[clap(long = "tenx-cloud-token-path", value_name = "PATH")] + tenx_cloud_token_path: Option, + + /// Cell annotation model to use. + #[clap(long = "cell-annotation-model")] + cell_annotation_model: Option, + + /// Cloupe file to use. + #[clap(long = "cloupe", value_name = "CLOUPE")] + sample_cloupe: Option, + + /// Name of track to add onto the cloupe file. + #[clap( + long = "cloupe-group-name", + requires = "sample_cloupe", + value_name = "TEXT" + )] + cas_track_name: Option, + + /// A feature-barcode matrix containing data for one genome. + /// Should be the filtered version. + #[clap(long = "matrix", value_name = "MATRIX_H5", required = true)] + filtered_matrix: CliPath, + + /// Do not execute the pipeline. + /// Generate a pipeline invocation (.mro) file and stop. + #[serde(skip)] + #[clap(long)] + dry: bool, + + #[serde(skip)] + #[clap(flatten)] + mrp: MrpArgs, +} + +#[derive(Serialize)] +struct AnnotateMro { + sample_id: String, + sample_desc: String, + tenx_cloud_token_path: Option, + cell_annotation_model: Option, + sample_cloupe: Option, + cas_track_name: Option, + filtered_matrix: CliPath, +} + +impl Annotate { + // set the default token path if necessary + fn with_default_cas_token(&self) -> Result { + let mut a = self.clone(); + if self.tenx_cloud_token_path.is_none() { + if let Ok(tenx_cloud_token_path) = cloud_utils::default_token_path() { + a.tenx_cloud_token_path = Some(tenx_cloud_token_path); + } else { + eprintln!("{}", cloud_utils::CELL_ANNOTATION_HOMEDIR_MSG); + } + } + Ok(AnnotateMro { + sample_id: a.sample_id, + sample_desc: a.sample_desc, + tenx_cloud_token_path: a.tenx_cloud_token_path, + cell_annotation_model: a + .cell_annotation_model + .as_ref() + .and_then(CellAnnotationModel::to_pipeline_inputs), + sample_cloupe: a.sample_cloupe, + cas_track_name: a.cas_track_name, + filtered_matrix: a.filtered_matrix, + }) + } +} + #[derive(Parser, Debug, Clone, Serialize)] struct Reanalyze { /// A unique run id and output folder name [a-zA-Z0-9_-]+. @@ -617,7 +777,7 @@ impl Testrun { // determine paths relative to build let files_path = pkg_env.build_path.join("external"); let fastqs = vec![CliPath::from(files_path.join("cellranger_tiny_fastq"))]; - let reference_path = CliPath::from(files_path.join("cellranger_tiny_ref")); + let reference_path = Some(CliPath::from(files_path.join("cellranger_tiny_ref"))); // sample defs let mut sample_def = Vec::new(); @@ -628,13 +788,15 @@ impl Testrun { sample: Some(vec![String::from("tinygex")]), lanes: None, } - .get_sample_defs(LibraryType::Gex, None)?, + .get_sample_defs(LibraryType::Gex)?, ); let t = self.clone(); Ok(CountCsMro { sample_id: t.id, sample_def, + target_set: None, + target_set_name: None, sample_desc: t.description.unwrap_or_default(), reference_path, recovered_cells: None, @@ -642,7 +804,7 @@ impl Testrun { no_secondary_analysis: false, no_target_umi_filter: false, force_cells: None, - chemistry: AutoOrRefinedChemistry::Refined(ChemistryName::ThreePrimeV3), + chemistry: ChemistryParam::Set(ChemistrySet::ThreePrimeV3), r1_length: None, r2_length: None, targeting_method: None, @@ -654,37 +816,34 @@ impl Testrun { check_library_compatibility: true, disable_ab_aggregate_detection: false, min_crispr_umi_threshold: 3, + tenx_cloud_token_path: None, + cell_annotation_model: None, + skip_cell_annotation: true, }) } } fn inner_main() -> Result { - set_env_vars(); - - // parse the cmd-line - let opts = CellRanger::parse(); - - // debugging lines - // let mut hh = Vec::new(); - // CellRanger::into_app().write_help(&mut hh); - // println!("tst help: {}", String::from_utf8(hh).unwrap()); - // println!("opts: {:#?}", opts); - - // use clap::IntoApp; - // let aa = CellRanger::into_app(); - // println!("app: {:#?}", aa); + let (opts, pkg_env, mut telemetry) = CellRanger::initialize()?; - // setup the environment - let pkg_env = env::setup_env(opts.env_json, CMD, cr_version())?; - - // check deprecated os bits using a subprocess - check_deprecated_os()?; - - // You can handle information about subcommands by requesting their matches by name - // (as below), requesting just the name used, or both at the same time match opts.subcmd { SubCommand::Count(c) => { - // Custom validation + let has_gex_library = if !c.fastqs.fastqs.is_empty() { + true + } else if let Some(libraries_csv) = &c.libraries { + cr_types::parse_legacy_libraries_csv(libraries_csv)? + .iter() + .any(|x| x.library_type == LibraryType::GeneExpression) + } else { + // CLAP ensures that either --fastqs or --libraries is present. + unreachable!(); + }; + if has_gex_library { + ensure!( + c.transcriptome.is_some(), + "A reference transcriptome is required to analyze a Gene Expression library." + ); + } // If --feature-ref is provided, require --libraries or --no-libraries. // @@ -718,7 +877,7 @@ If you want to proceed with a feature barcode reference, but no feature barcode )? }; - execute(&c.id, &mro, &c.mrp, c.dry) + execute(&c.id, &mro, &c.mrp, c.dry, &mut telemetry) } SubCommand::Multi(m) => { @@ -728,7 +887,7 @@ If you want to proceed with a feature barcode reference, but no feature barcode "rna/sc_multi_cs.mro", &read_to_string(&m.csv).with_context(|| m.csv.to_string())?, )?; - execute(&m.id, &mro, &m.mrp, m.dry) + execute(&m.id, &mro, &m.mrp, m.dry, &mut telemetry) } SubCommand::MultiTemplate(mt) => mt.print(), @@ -745,19 +904,35 @@ If you want to proceed with a feature barcode reference, but no feature barcode &read_to_string(&aggr.aggregation_csv) .with_context(|| aggr.aggregation_csv.to_string())?, )?; - execute(&aggr.sample_id, &mro, &aggr.mrp, aggr.dry) + execute(&aggr.sample_id, &mro, &aggr.mrp, aggr.dry, &mut telemetry) + } + + SubCommand::Annotate(annotate) => { + let acopy = annotate.with_default_cas_token()?; + let mro = make_mro( + "CELLRANGER_ANNOTATE_CS", + &acopy, + "rna/cell_annotation_service.mro", + )?; + execute( + &annotate.sample_id, + &mro, + &annotate.mrp, + annotate.dry, + &mut telemetry, + ) } SubCommand::Reanalyze(ra) => { // Custom validation let mro = make_mro("SC_RNA_REANALYZER_CS", &ra, "rna/sc_rna_reanalyzer_cs.mro")?; - execute(&ra.sample_id, &mro, &ra.mrp, ra.dry) + execute(&ra.sample_id, &mro, &ra.mrp, ra.dry, &mut telemetry) } SubCommand::Vdj(mut vdj) => { // convert fastq args to sample defs - vdj.sample_def = vdj.fastqs.get_sample_defs(LibraryType::VdjAuto, None)?; + vdj.sample_def = vdj.fastqs.get_sample_defs(LibraryType::VdjAuto)?; if let Some(ref ref_folder) = vdj.vdj_reference_path { vdj_reference::VdjReference::check(ref_folder).with_context(|| { @@ -769,21 +944,22 @@ If you want to proceed with a feature barcode reference, but no feature barcode } let mro = make_mro("SC_VDJ_ASSEMBLER_CS", &vdj, "rna/sc_vdj_assembler_cs.mro")?; - execute(&vdj.sample_id, &mro, &vdj.mrp, vdj.dry) + execute(&vdj.sample_id, &mro, &vdj.mrp, vdj.dry, &mut telemetry) } SubCommand::Mkfastq(m) => mkfastq::run_mkfastq(&m, "_cellranger_internal"), SubCommand::Mkvdjref(mut args) => { - args.shared.populate_version(pkg_env.tenx_version); - args.execute() + args.shared.populate_version(&pkg_env); + args.execute(&mut telemetry) } SubCommand::Testrun(t) => { let mro_args = t.to_mro_args(&pkg_env)?; let mro = make_mro("SC_RNA_COUNTER_CS", &mro_args, "rna/sc_rna_counter_cs.mro")?; - execute(&t.id, &mro, &t.mrp, t.dry) + execute(&t.id, &mro, &t.mrp, t.dry, &mut telemetry) } - SubCommand::RnaShared(args) => shared_cmd::run_rna_shared(&pkg_env, args), + SubCommand::Cloud(args) => cloud::run_cloud(&pkg_env, &args), + SubCommand::RnaShared(args) => shared_cmd::run_rna_shared(&pkg_env, args, &mut telemetry), SubCommand::Shared(args) => shared_cmd::run_shared(&pkg_env, args), SubCommand::Hidden(args) => shared_cmd::run_hidden(args), } diff --git a/lib/rust/cr_wrap/src/bin/multi-config-template.csv b/lib/rust/cr_wrap/src/bin/multi-config-template.csv index 21d5d67..39b0db5 100644 --- a/lib/rust/cr_wrap/src/bin/multi-config-template.csv +++ b/lib/rust/cr_wrap/src/bin/multi-config-template.csv @@ -1,4 +1,4 @@ -# This template shows the possible cellranger multi config CSV options for analyzing Single Cell Gene Expression with Feature Barcode Technology (Antibody Capture, CRISPR Guide Capture, Cell Multiplexing, Antigen Capture), Fixed RNA Profiling, or Single Cell Immune Profiling data. +# This template shows the possible cellranger multi config CSV options for analyzing Single Cell Gene Expression with Feature Barcode Technology (Antibody Capture, CRISPR Guide Capture, CellPlex Multiplexing, Antigen Capture), Flex Gene Expression, on-chip multiplexing, hashing with Antibody Capture, or Single Cell Immune Profiling data. # These options cannot be used all together - see section descriptions for detail. # Use 'cellranger multi-template --parameters' to see descriptions of all parameters. # Please see cellranger multi documentation for details and experimental design-specific examples at https://www.10xgenomics.com/support. @@ -6,19 +6,22 @@ [gene-expression] reference,/path/to/transcriptome create-bam,true -# probe-set,/path/to/probe/set, # Required, Fixed RNA Profiling only -# filter-probes,, # Optional, Fixed RNA Profiling only +# probe-set,/path/to/probe/set, # Required, Flex only +# filter-probes,, # Optional, Flex only # r1-length, # r2-length, # chemistry, # expect-cells, # force-cells, +# emptydrops-minimum-umis,, # See https://10xgen.com/scFFPE-cell-calling # no-secondary, # check-library-compatibility, # include-introns, -# min-assignment-confidence,<0.9>, # Optional, Cell Multiplexing only -# cmo-set,/path/to/CMO/reference, # Optional, Cell Multiplexing only -# barcode-sample-assignment,/path/to/barcode-sample-assignment/csv, # Optional, Cell Multiplexing only. +# min-assignment-confidence,<0.9>, # Optional, CellPlex Multiplexing and hashtag multiplexing only +# cmo-set,/path/to/CMO/reference, # Optional, CellPlex Multiplexing only +# barcode-sample-assignment,/path/to/barcode-sample-assignment/csv, # Optional, CellPlex Multiplexing and hashtag multiplexing only +# tenx-cloud-token-path,/path/to/cloud/token, # Optional, Cell Annotation only +# cell-annotation-model,, # Optional, Cell Annotation only [feature] # For Feature Barcode libraries only reference,/path/to/feature/reference @@ -34,26 +37,36 @@ reference,/path/to/vdj_reference [libraries] fastq_id,fastqs,feature_types -gex1,/path/to/fastqs,Gene Expression -# Antibody1,/path/to/fastqs,Antibody Capture +# GEX1,/path/to/fastqs,Gene Expression +# Antibody1,/path/to/fastqs,Antibody Capture, # Antibody and hashtag multiplexing # CRISPR1,path/to/CRISPR_fastqs,CRISPR Guide Capture -# CMO1,/path/to/fastqs,Multiplexing Capture, # Cell Multiplexing only +# CMO1,/path/to/fastqs,Multiplexing Capture, # CellPlex Multiplexing only # VDJ_B1,path/to/vdj_B_fastqs,VDJ-B, # 5' Immune Profiling only # VDJ_T1,path/to/vdj_T_fastqs,VDJ-T, # 5' Immune Profiling only # VDJ_T_GD1,path/to/vdj_T_GD_fastqs,VDJ-T-GD, # 5' Immune Profiling only for gamma-delta TCR -# Antigen1,path/to/antigen_capture_fastqs,Antigen Capture #5' Antigen Capture only +# Antigen1,path/to/antigen_capture_fastqs,Antigen Capture, # 5' Antigen Capture only [antigen-specificity] # for 5' BCR/TCR Antigen Capture only control_id,mhc_allele Antigen1,AG001 Antigen2,AG002 -[samples] # for Cell Multiplexing libraries only +[samples] # for On-chip multiplexing data only +sample_id,ocm_barcode_ids,description +sample1,OB1,Control +sample2,OB2,Treated + +[samples] # for CellPlex Multiplexing data only sample_id,cmo_ids,description sample1,CMO301,Control sample2,CMO303,Treated -[samples] # for Fixed RNA Profiling multiplexed libraries only +[samples] # for Flex multiplexed data only sample_id,probe_barcode_ids,description sample1,BC001,Control sample2,BC003,Treated + +[samples] # for hashtag multiplexing data only +sample_id,hashtag_ids,description +sample1,hashtag1,Control # ID used must match Feature ID in feature reference CSV +sample2,hashtag2,Treated diff --git a/lib/rust/cr_wrap/src/bin/parameter-descriptions.txt b/lib/rust/cr_wrap/src/bin/parameter-descriptions.txt index a019739..5233f8e 100644 --- a/lib/rust/cr_wrap/src/bin/parameter-descriptions.txt +++ b/lib/rust/cr_wrap/src/bin/parameter-descriptions.txt @@ -7,7 +7,7 @@ Section: [gene-expression] Required, Fixed RNA profiling only. Probe set CSV file, declaring probe constructs and associated barcodes. filter-probes - Optional, Fixed RNA Profiling only. Include all non-deprecated probes + Optional, Flex only. Include all non-deprecated probes listed in the probe set reference CSV file. Probes that are predicted to have off-target activity to homologous genes are excluded from analysis by default. Setting filter-probes to false will result in UMI @@ -36,6 +36,9 @@ Section: [gene-expression] force-cells Optional. Force pipeline to use this number of cells, bypassing cell detection. Default: detect cells using EmptyDrops. + emptydrops-minimum-umis + Optional. Minimum number of UMIS per barcode to consider after the initial cell calling. + Default: 500. no-secondary Optional. Disable secondary analysis, e.g. clustering. Default: false. create-bam @@ -54,14 +57,30 @@ Section: [gene-expression] Default: true. min-assignment-confidence Optional. The minimum estimated likelihood to call a sample as tagged - with a Cell Multiplexing Oligo instead of "Unassigned". Default: 0.9. - Introduced in Cell Ranger 6.0.2. + with a Cell Multiplexing Oligo (CMO) instead of "Unassigned". Users may + wish to tolerate a higher rate of mis-assignment in order to obtain more + singlets to include in their analysis, or a lower rate of mis-assignment + at the cost of obtaining fewer singlets. By default, this value is 0.9. + Contact support@10xgenomics.com for further advice. cmo-set - Optional, Cell Multiplexing only. CMO set CSV file, declaring CMO - constructs and associated barcodes. + Optional. The default CMO reference IDs are built into the Cell Ranger + software and do not need to be specified. However, this option can be + used to specify the path to a custom CMO set CSV file, declaring CMO + constructs and associated barcodes. See CMO Reference section for + details. barcode-sample-assignment - Optional, Cell Multiplexing only. Path to a barcode-sample assignment - CSV file that specifies the barcodes that belong to each sample. + Optional. Absolute path to a barcode-sample assignment CSV file that + specifies the barcodes that belong to each sample. Also applicable to + cell hashing with Antibody Capture. + tenx-cloud-token-path + Optional. The path to the 10x Cloud Analysis user token used to enable cell + annotation. If not provided, will default to the location stored + through cellranger cloud auth setup. + cell-annotation-model + Optional. Valid model names can be viewed by running + `cellranger cloud annotation models` or on the 10x Genomics Support site + (https://www.10xgenomics.com/support). If "auto", uses the default model + for the species. If not provided, does not run cell annotation. Section: [feature] @@ -77,7 +96,7 @@ Section: [feature] this length before analysis. Default: do not trim Read 2. min-crispr-umi Optional. Minimum CRISPR UMI threshold. Default: 3. - + Section: [vdj] reference @@ -93,4 +112,3 @@ Section: [vdj] r2-length Optional. Hard trim the input Read 2 of VDJ libraries to this length before analysis. Default: do not trim Read 2. - diff --git a/lib/rust/cr_wrap/src/chemistry_arg.rs b/lib/rust/cr_wrap/src/chemistry_arg.rs index 558a484..ba5b0d6 100644 --- a/lib/rust/cr_wrap/src/chemistry_arg.rs +++ b/lib/rust/cr_wrap/src/chemistry_arg.rs @@ -1,39 +1,67 @@ use anyhow::{bail, Result}; use cr_types::chemistry::{AutoChemistryName, AutoOrRefinedChemistry, ChemistryName}; use itertools::Itertools; +use multi::config::{ChemistryParam, ChemistrySet}; #[allow(clippy::enum_glob_use)] use AutoChemistryName::*; #[allow(clippy::enum_glob_use)] use AutoOrRefinedChemistry::*; #[allow(clippy::enum_glob_use)] use ChemistryName::*; +#[allow(clippy::enum_glob_use)] +use ChemistryParam::*; +#[allow(clippy::enum_glob_use)] +use ChemistrySet::*; -const ALLOWED_COUNT_CHEM_INPUTS: [(AutoOrRefinedChemistry, Option<&str>); 17] = [ - (Auto(Count), Some("auto detection (default)")), - (Auto(ThreePrime), Some("Single Cell 3'")), - (Auto(FivePrime), Some("Single Cell 5'")), - (Refined(ThreePrimeV1), Some("Single Cell 3'v1")), - (Refined(ThreePrimeV2), Some("Single Cell 3'v2")), - (Refined(ThreePrimeV3), Some("Single Cell 3'v3")), - (Refined(ThreePrimeV3HT), Some("Single Cell 3'v3 HT")), - (Refined(ThreePrimeV4), Some("Single Cell 3'v4")), - (Refined(FivePrimePE), Some("Single Cell 5' paired end")), - (Refined(FivePrimePEV3), Some("Single Cell 5' paired end v3")), - (Refined(FivePrimeR2), Some("Single Cell 5' R2-only")), - (Refined(FivePrimeR2V3), Some("Single Cell 5' R2-only v3")), - (Refined(FivePrimeHT), None), - (Refined(FivePrimeR2), None), +// NOTE: if you add or modify options here, you must update the +// equivalent matcher in the telemetry configuration. +const ALLOWED_COUNT_CHEM_INPUTS: [(ChemistryParam, Option<&str>); 17] = [ + (AutoOrRefined(Auto(Count)), Some("auto detection (default)")), + (AutoOrRefined(Auto(ThreePrime)), Some("Single Cell 3'")), + (AutoOrRefined(Auto(FivePrime)), Some("Single Cell 5'")), + ( + AutoOrRefined(Refined(ThreePrimeV1)), + Some("Single Cell 3'v1"), + ), + ( + AutoOrRefined(Refined(ThreePrimeV2)), + Some("Single Cell 3'v2"), + ), + (Set(ThreePrimeV3), Some("Single Cell 3'v3")), + (Set(ThreePrimeV3HT), Some("Single Cell 3'v3 HT")), + (Set(ThreePrimeV4), Some("Single Cell 3'v4")), + ( + AutoOrRefined(Refined(FivePrimePE)), + Some("Single Cell 5' paired end"), + ), ( - Refined(FeatureBarcodingOnly), + AutoOrRefined(Refined(FivePrimePEV3)), + Some("Single Cell 5' paired end v3"), + ), + ( + AutoOrRefined(Refined(FivePrimeR2)), + Some("Single Cell 5' R2-only"), + ), + ( + AutoOrRefined(Refined(FivePrimeR2V3)), + Some("Single Cell 5' R2-only v3"), + ), + (AutoOrRefined(Refined(FivePrimeHT)), None), + (AutoOrRefined(Refined(FivePrimeR2)), None), + ( + AutoOrRefined(Refined(FeatureBarcodingOnly)), Some("Single Cell Antibody-only 3' v2 or 5'"), ), - (Refined(SFRP), None), - (Refined(ArcV1), Some("GEX portion only of multiome")), + (AutoOrRefined(Refined(SFRP)), None), + ( + AutoOrRefined(Refined(ArcV1)), + Some("GEX portion only of multiome"), + ), ]; /// Parse the provided chemistry and validate that it is of an allowed type. /// Return a user-facing clap-compatible error message. -pub fn validate_chemistry(s: &str) -> Result { +pub fn validate_chemistry(s: &str) -> Result { let parse_err = || { format!( "{s} is an invalid input to `--chemistry`. Supported options are:\n - {}", @@ -52,7 +80,7 @@ pub fn validate_chemistry(s: &str) -> Result { { return Ok(chem); } - if chem.refined() == Some(ThreePrimeV3LT) { + if matches!(chem, AutoOrRefined(Refined(ThreePrimeV3LT))) { bail!("The chemistry SC3Pv3LT (Single Cell 3'v3 LT) is no longer supported. To analyze this data, use Cell Ranger 7.2 or earlier."); } bail!(parse_err()); diff --git a/lib/rust/cr_wrap/src/cloud.rs b/lib/rust/cr_wrap/src/cloud.rs new file mode 100644 index 0000000..f4a4206 --- /dev/null +++ b/lib/rust/cr_wrap/src/cloud.rs @@ -0,0 +1,64 @@ +use crate::env::PkgEnv; +use crate::utils::AllArgs; +use anyhow::Result; +use serde_json; +use std::env; +use std::fs::read_to_string; +use std::path::Path; +use std::process::ExitCode; +use url::Url; + +pub fn run_cloud(pkg_env: &PkgEnv, args: &AllArgs) -> Result { + // target the test-cloud environment if the right environment variables are set + let test_server = env::var("TENX_CLOUD_URL").unwrap_or_default(); + let tenx_cloud_token_path = env::var("TENX_CLOUD_TOKEN_PATH").unwrap_or_default(); + let cloud_cmd = "bin/tenkit/txg"; + if !test_server.is_empty() && !tenx_cloud_token_path.is_empty() { + let mut new_input = args.input.clone(); + // read CF access token and add token params as headers to the request + if let Ok((client_id, client_secret)) = + extract_cloud_headers(&test_server, Path::new(&tenx_cloud_token_path)) + { + new_input.push(String::from("-H")); + new_input.push(format!("cf-access-client-id: {}", client_id.clone())); + new_input.push(String::from("-H")); + new_input.push(format!( + "cf-access-client-secret: {}", + client_secret.clone() + )); + } else { + eprintln!("Could not find token path information at {tenx_cloud_token_path}"); + } + + new_input.push(String::from("--debug-url")); + new_input.push(test_server); + + let new_args = &AllArgs { input: new_input }; + return pkg_env.run_subcmd(cloud_cmd, new_args); + } + pkg_env.run_subcmd(cloud_cmd, args) +} + +// Extract a cf-access-client-id and cf-access-client-secret from the 10xcloud_token.json +// file located at the specified path. +fn extract_cloud_headers(server: &str, tenx_cloud_token_path: &Path) -> Result<(String, String)> { + // assume debug url has complete scheme and URL + let server_url = Url::parse(server)?; + let server_host = server_url.host_str().expect("No host in token url"); + let token_contents = read_to_string(tenx_cloud_token_path)?; + let token_dict: serde_json::Value = serde_json::from_str(&token_contents)?; + let server_dict = &token_dict[server_host]; + // could do serde deserialization for this object but meh + let cf_dict = &server_dict["cloudflare_token"]; + let client_id = &cf_dict["cf-access-client-id"]; + let client_secret = &cf_dict["cf-access-client-secret"]; + + if client_id.is_string() && client_secret.is_string() { + // to_string returns the quotes, weird + return Ok(( + String::from(client_id.as_str().unwrap()), + String::from(client_secret.as_str().unwrap()), + )); + } + Err(anyhow::anyhow!("Could not read CloudFlare token")) +} diff --git a/lib/rust/cr_wrap/src/env.rs b/lib/rust/cr_wrap/src/env.rs index 5ad420d..c0387ce 100644 --- a/lib/rust/cr_wrap/src/env.rs +++ b/lib/rust/cr_wrap/src/env.rs @@ -1,14 +1,100 @@ // Possibly useful in the future -- these are currently unneccesary. +use crate::telemetry::{CollectTelemetry, TelemetryCollector}; use crate::utils::AllArgs; -use crate::IntoExitCode; -use anyhow::{bail, Context, Result}; +use crate::{check_deprecated_os, IntoExitCode}; +use anyhow::{Context, Result}; +use clap::parser::ValueSource; +use clap::{CommandFactory, Parser}; +use cr_types::constants::COMMAND_LINE_ENV_VARIABLE_NAME; use serde::{Deserialize, Serialize}; +use shell_escape::escape; +use std::collections::HashMap; use std::env; +use std::ffi::OsString; use std::fs::File; use std::path::{Path, PathBuf}; use std::process::{Command, ExitCode}; +/// Specfiy how commands initialize the environment. +pub trait Initialize: Parser + CommandFactory + CollectTelemetry { + /// Return the path to the env JSON override file, if this command provides it. + fn override_env_json(&self) -> Option<&Path>; + + fn initialize() -> Result<(Self, PkgEnv, TelemetryCollector)> { + // Setup environment variables. + set_env_cmdline(); + set_env_columns(); + + let bare_cmd = Self::command(); + + // Canonicalize the CLI args and use the matches for parsing. + let (canonical_cli_args, subcommand, cmd) = { + let matches = Self::command().get_matches(); + let (subcommand, submatches) = matches.subcommand().unwrap(); + + let argmap: HashMap<_, _> = bare_cmd + .get_subcommands() + .find(|sc| sc.get_name() == subcommand) + .unwrap() + .get_arguments() + .filter_map(|arg| arg.get_long().map(|f| (arg.get_id(), f))) + .collect(); + let args = submatches + .ids() + .filter(|id| argmap.contains_key(id)) + .filter(|id| submatches.value_source(id.as_str()) == Some(ValueSource::CommandLine)) + .filter_map(|id| { + submatches + .get_raw(id.as_str()) + .map(|rv| rv.map(|val| (argmap[id], val))) + }) + .flatten() + .map(|(flag, val)| { + let mut arg: OsString = format!("--{flag}=").into(); + arg.push(val); + arg + }) + .collect(); + + ( + args, + subcommand.to_string(), + Self::from_arg_matches(&matches)?, + ) + }; + + // Initialize pkg environment. + let pkg_env = setup_env( + cmd.override_env_json(), + bare_cmd.get_name().to_string(), + bare_cmd.get_version().unwrap().to_string(), + )?; + // Initialize telemetry collection, and collect initial telemetry. + let mut telemetry = + TelemetryCollector::new_for_command(&cmd, subcommand, canonical_cli_args, &pkg_env); + telemetry.collect(None, None, None); + + check_deprecated_os()?; + Ok((cmd, pkg_env, telemetry)) + } +} + +/// Set CMDLINE to the command line arguments, needed to create the pipeline output file _cmdline. +fn set_env_cmdline() { + let cmdline: Vec<_> = std::env::args().map(|x| escape(x.into())).collect(); + std::env::set_var(COMMAND_LINE_ENV_VARIABLE_NAME, cmdline.join(" ")); +} + +// Set COLUMNS to 80 when the terminal size is unknown. +// Wrap the output of --help to 80 columns when the terminal size is unknown. +// The default value of clap is 100. +fn set_env_columns() { + if terminal_size::terminal_size().is_none() && std::env::var_os("COLUMNS").is_none() { + std::env::set_var("COLUMNS", "80"); + } +} + pub(crate) const TENX_COPYRIGHT: &str = "Copyright 2023 10x Genomics, Inc. All rights reserved."; #[derive(Serialize, Deserialize, Debug, Clone)] @@ -136,14 +222,19 @@ impl EnvSpec { pub struct PkgEnv { pub build_path: PathBuf, - pub tenx_product: &'static str, - pub tenx_version: &'static str, + pub tenx_product: String, + pub tenx_version: String, } impl PkgEnv { + /// Return the path to the binary `cmd`, specified relative to the installation root. + pub fn subcmd_path(&self, cmd: &str) -> PathBuf { + self.build_path.join(cmd) + } + /// Run the binary `cmd`, specified relative to the installation root. pub fn run_subcmd(&self, cmd: &str, args: &AllArgs) -> Result { - let path = &self.build_path.join(cmd); + let path = &self.subcmd_path(cmd); let mut scriptdir = self.build_path.clone(); scriptdir.push("bin"); @@ -165,34 +256,27 @@ impl PkgEnv { } /// Prepare the environment for running a pipestance in MRP. -/// Find the root of the build dir, load `.env.json` and update the environment accordingly. -pub fn setup_env( - override_env_json: Option, - tenx_product: &'static str, - tenx_version: &'static str, +/// Find the root of the build dir, load `env.json` and update the environment accordingly. +fn setup_env( + override_env_json: Option<&Path>, + tenx_product: String, + tenx_version: String, ) -> Result { // Path of installation is one above the binary let exe = std::env::current_exe()?; let exe_name = exe.file_name().unwrap().to_str().unwrap(); let exe_dir = exe.parent().unwrap(); - let runfiles_env_json = exe_dir.join(format!("{exe_name}.runfiles/cellranger/.env.json")); - let exe_env_json = exe_dir.parent().unwrap().join(".env.json"); + let runfiles_env_json = exe_dir.join(format!("{exe_name}.runfiles/cellranger/env.json")); + let exe_env_json = exe_dir.parent().unwrap().join("env.json"); let env_json = if let Some(override_env_json) = &override_env_json { override_env_json } else if runfiles_env_json.exists() { - &runfiles_env_json + runfiles_env_json.as_path() } else { - &exe_env_json + exe_env_json.as_path() }; - if !env_json.exists() { - bail!( - "Couldn't find the `.env.json` file, did you copy cellranger to a different directory \ - without using cp -a to also copy hidden files?: {}", - override_env_json.unwrap_or(runfiles_env_json).display() - ); - } let build_path = env_json.parent().unwrap(); let env_spec: EnvSpec = serde_json::from_reader( @@ -203,8 +287,8 @@ pub fn setup_env( .with_context(|| "error setting up pipeline environment")?; // additional environment needed by some subcommands - env::set_var("TENX_PRODUCT", tenx_product); - env::set_var("TENX_VERSION", tenx_version); + env::set_var("TENX_PRODUCT", &tenx_product); + env::set_var("TENX_VERSION", &tenx_version); env::set_var("TENX_COPYRIGHT", TENX_COPYRIGHT); Ok(PkgEnv { diff --git a/lib/rust/cr_wrap/src/fastqs.rs b/lib/rust/cr_wrap/src/fastqs.rs index 7ba4023..650bd72 100644 --- a/lib/rust/cr_wrap/src/fastqs.rs +++ b/lib/rust/cr_wrap/src/fastqs.rs @@ -10,15 +10,17 @@ use metric::TxHashSet; use std::ffi::OsStr; use std::path::{Path, PathBuf}; +pub fn get_target_set_name(target_set_csv: &Option) -> Option { + target_set_csv + .as_ref() + .map(|t| t.file_stem().unwrap().to_string_lossy().into_owned()) +} + macro_rules! impl_get_sample_defs { ($name:ident) => { impl $name { /// Convert the command-line FASTQ finding arguments into SampleDefs - pub fn get_sample_defs( - &self, - library_type: LibraryType, - target_panel: Option<&Path>, - ) -> Result> { + pub fn get_sample_defs(&self, library_type: LibraryType) -> Result> { let mut sample_defs = Vec::new(); // Get the FASTQs paths that are compatible with the given bcl2fastq project @@ -44,10 +46,6 @@ macro_rules! impl_get_sample_defs { r2_length: None, read_path: path, sample_indices: Some(vec!["any".to_string()]), - target_set: target_panel.as_ref().map(|t| t.to_path_buf()), - target_set_name: target_panel - .as_ref() - .map(|t| t.file_stem().unwrap().to_string_lossy().into_owned()), // NOTE: subsampling parameters could be added here subsample_rate: None, sample_names: Some(sample_names.into_iter().collect()), @@ -165,6 +163,7 @@ pub fn get_fastq_paths(input_paths: &[CliPath], project: Option<&str>) -> Result ///root. /// - path: The FASTQ input path. /// - project: The supplied project field. +/// /// Returns the FASTQ path that is legal for a downstream run /// Returns Err if the path/project path is illegal fn get_bcl2fastq_output_folder(path: &Path) -> Option { diff --git a/lib/rust/cr_wrap/src/lib.rs b/lib/rust/cr_wrap/src/lib.rs index 6c7d293..bb5bb98 100644 --- a/lib/rust/cr_wrap/src/lib.rs +++ b/lib/rust/cr_wrap/src/lib.rs @@ -49,6 +49,7 @@ // handling pipeline environments pub mod arc; pub mod chemistry_arg; +pub mod cloud; pub mod create_bam_arg; mod deprecated_os; pub mod env; @@ -57,28 +58,41 @@ pub mod mkfastq; pub mod mkref; pub mod mrp_args; pub mod shared_cmd; -pub mod targeted_compare; +pub mod telemetry; pub mod utils; use anyhow::{ensure, Context, Result}; use mrp_args::MrpArgs; use serde::Serialize; -use shell_escape::escape; use std::fs::{create_dir, File}; use std::io::Write; +use std::os::unix::process::ExitStatusExt; use std::path::{Path, PathBuf}; use std::process::{Command, ExitCode, ExitStatus, Stdio}; +use std::time::Instant; +use telemetry::TelemetryCollector; /// Convert something to an ExitCode. trait IntoExitCode { + fn into_u8(self) -> u8; fn into_exit_code(self) -> ExitCode; } impl IntoExitCode for ExitStatus { + /// Return the exit code, or 128 + the signal number, or 255. + fn into_u8(self) -> u8 { + if let Some(code) = self.code() { + code as u8 + } else if let Some(signal) = self.signal() { + 128 + signal as u8 + } else { + 255 + } + } + /// Convert an ExitStatus to an ExitCode. fn into_exit_code(self) -> ExitCode { - self.code() - .map_or(ExitCode::FAILURE, |x| ExitCode::from(x as u8)) + ExitCode::from(self.into_u8()) } } @@ -160,8 +174,9 @@ pub fn execute( invocation: &str, mrp_args: &MrpArgs, dry_run: bool, + telemetry: &mut TelemetryCollector, ) -> Result { - Ok(execute_to_status(job_id, invocation, mrp_args, dry_run)?.into_exit_code()) + Ok(execute_to_status(job_id, invocation, mrp_args, dry_run, telemetry)?.into_exit_code()) } /// Execute a Martian pipeline with mrp and return an ExitStatus. @@ -170,9 +185,17 @@ pub fn execute_to_status( invocation: &str, mrp_args: &MrpArgs, dry_run: bool, + telemetry: &mut TelemetryCollector, ) -> Result { let inv = MroInvocation::MroString(invocation.to_string()); - execute_any(job_id, inv, mrp_args, dry_run) + let start = Instant::now(); + let mrp_exit_status = execute_any(job_id, inv, mrp_args, dry_run)?; + telemetry.collect( + Some(&format!("{} {job_id}", mrp_args.get_args().join(" "))), + Some(&mrp_exit_status), + Some(start.elapsed()), + ); + Ok(mrp_exit_status) } pub fn execute_any( @@ -218,27 +241,6 @@ pub fn execute_any( Ok(exit_status) } -/// Set CMDLINE to the command line arguments, needed to create the pipeline output file _cmdline. -fn set_env_cmdline() { - let cmdline: Vec<_> = std::env::args().map(|x| escape(x.into())).collect(); - std::env::set_var("CMDLINE", cmdline.join(" ")); -} - -// Set COLUMNS to 80 when the terminal size is unknown. -// Wrap the output of --help to 80 columns when the terminal size is unknown. -// The default value of clap is 100. -fn set_env_columns() { - if terminal_size::terminal_size().is_none() && std::env::var_os("COLUMNS").is_none() { - std::env::set_var("COLUMNS", "80"); - } -} - -// Set environment variables. -pub fn set_env_vars() { - set_env_cmdline(); - set_env_columns(); -} - fn run_mrp(job_id: &str, mro_path: &Path, mrp_args: &MrpArgs) -> Result { if let Some(output_dir) = &mrp_args.output_dir { // Create output_dir to ensure that it is created successfully. diff --git a/lib/rust/cr_wrap/src/mkfastq.rs b/lib/rust/cr_wrap/src/mkfastq.rs index 236f735..6418235 100644 --- a/lib/rust/cr_wrap/src/mkfastq.rs +++ b/lib/rust/cr_wrap/src/mkfastq.rs @@ -7,6 +7,14 @@ use std::process::{Command, ExitCode}; /// the old shell wrapper code for mkfastq. /// (full Rust-ification is an early work in progress for now) pub fn run_mkfastq(args: &AllArgs, legacy_wrapper: &str) -> Result { + let warning_msg = r#" + The `cellranger mkfastq` pipeline is deprecated and will be removed in a future release. + Please use Illumina's BCL Convert to generate Cell Ranger-compatible FASTQ files. + For detailed guidance, refer to the Generating FASTQs support page: + https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/inputs/cr-direct-demultiplexing + "#; + eprintln!("{warning_msg}"); + let mut cmd = Command::new(legacy_wrapper); cmd.arg("mkfastq"); diff --git a/lib/rust/cr_wrap/src/mkref.rs b/lib/rust/cr_wrap/src/mkref.rs index 827abf1..9fed71c 100644 --- a/lib/rust/cr_wrap/src/mkref.rs +++ b/lib/rust/cr_wrap/src/mkref.rs @@ -1,4 +1,6 @@ +use crate::env::PkgEnv; use crate::mrp_args::MrpArgs; +use crate::telemetry::TelemetryCollector; use crate::utils::{validate_ascii_identifier, CliPath}; use crate::{execute_to_status, make_mro, IntoExitCode}; use anyhow::{bail, ensure, Result}; @@ -6,7 +8,7 @@ use clap::{self, value_parser, Parser}; use cr_types::reference::reference_info::MULTI_GENOME_SEPARATOR; use serde::Serialize; use std::fs; -use std::path::Path; +use std::path::{self, Path}; use std::process::ExitCode; #[derive(Parser, Debug, Clone, Serialize)] @@ -37,15 +39,15 @@ pub struct MkrefShared { impl MkrefShared { /// Set mkref_version to "x.y.z". `version_description` is of the form /// product-x.y.z or yyyy.mmdd.z or yyyy.mmdd.z-n-hash. - pub fn populate_version(&mut self, version: &str) { - self.mkref_version = if version.matches('-').count() == 1 { + pub fn populate_version(&mut self, pkg_env: &PkgEnv) { + let version = if pkg_env.tenx_version.matches('-').count() == 1 { // product-x.y.z - version.split_once('-').unwrap().1 + pkg_env.tenx_version.split_once('-').unwrap().1 } else { // yyyy.mmdd.z or yyyy.mmdd.z-n-hash - version - } - .to_string(); + &pkg_env.tenx_version + }; + self.mkref_version = format!("{0}-{1}", pkg_env.tenx_product, version); } } @@ -80,7 +82,7 @@ impl Mkref { /// Execute the mkref tool as a martian pipeline. /// If successful, rename the outs folder into the current directory and delete the rest of /// the pipestance folder. - pub fn execute(&self) -> Result { + pub fn execute(&self, telemetry: &mut TelemetryCollector) -> Result { ensure!( self.genome_names.len() == self.fasta_files.len(), "provided {} genome names but {} FASTA files", @@ -108,16 +110,27 @@ impl Mkref { } let mro = make_mro("MAKE_REFERENCE", self, "rna/make_reference.mro")?; - let exit_status = - execute_to_status(&pipestance_name, &mro, &self.shared.mrp, self.shared.dry)?; + let exit_status = execute_to_status( + &pipestance_name, + &mro, + &self.shared.mrp, + self.shared.dry, + telemetry, + )?; if !exit_status.success() { return Ok(exit_status.into_exit_code()); } move_outputs(&pipestance_name, &self.shared.mrp, &output_dir_name)?; + let abs_path = path::absolute(&output_dir_name)?; + let abs_path_str = abs_path.to_string_lossy(); println!( ">>> Reference successfully created! <<<\n\ + \n\ + Reference location:\n\ + {abs_path_str}\n\ + \n\ You can now specify this reference on the command line:\n\ cellranger count --transcriptome={output_dir_name} ..." ); @@ -161,7 +174,7 @@ impl Mkvdjref { /// Execute the mkref tool as a martian pipeline. /// If successful, rename the outs folder into the current directory and delete the rest of /// the pipestance folder. - pub fn execute(&self) -> Result { + pub fn execute(&self, telemetry: &mut TelemetryCollector) -> Result { let output_dir_name = &self.genome_name; let pipestance_name = format!("mkvdjref_{output_dir_name}"); @@ -203,8 +216,13 @@ impl Mkvdjref { } let mro = make_mro("MAKE_VDJ_REFERENCE", self, "rna/make_vdj_reference.mro")?; - let exit_status = - execute_to_status(&pipestance_name, &mro, &self.shared.mrp, self.shared.dry)?; + let exit_status = execute_to_status( + &pipestance_name, + &mro, + &self.shared.mrp, + self.shared.dry, + telemetry, + )?; if !exit_status.success() { return Ok(exit_status.into_exit_code()); } @@ -234,9 +252,9 @@ fn move_outputs(pipestance_name: &str, args: &MrpArgs, output_ref_dir_name: &str continue; } if item.file_type()?.is_dir() { - fs::remove_dir_all(&item.path())?; + fs::remove_dir_all(item.path())?; } else { - fs::remove_file(&item.path())?; + fs::remove_file(item.path())?; } } // Now lift the contents of the reference folder up into the user- diff --git a/lib/rust/cr_wrap/src/mrp_args.rs b/lib/rust/cr_wrap/src/mrp_args.rs index f4b271d..0dfc9f2 100644 --- a/lib/rust/cr_wrap/src/mrp_args.rs +++ b/lib/rust/cr_wrap/src/mrp_args.rs @@ -49,8 +49,8 @@ pub struct MrpArgs { /// The path to a JSON file that specifies stage-level /// overrides for cores and memory. Finer-grained /// than --localcores, --mempercore and --localmem. - /// Consult https://support.10xgenomics.com/ for an example - /// override file. + /// Consult https://10xgen.com/resource-override + /// for an example override file. #[clap(long, value_name = "PATH")] overrides: Option, diff --git a/lib/rust/cr_wrap/src/shared_cmd.rs b/lib/rust/cr_wrap/src/shared_cmd.rs index 4d08c13..e6eb86d 100644 --- a/lib/rust/cr_wrap/src/shared_cmd.rs +++ b/lib/rust/cr_wrap/src/shared_cmd.rs @@ -1,6 +1,7 @@ use crate::deprecated_os::oscheck; use crate::env::PkgEnv; use crate::mkref::Mkref; +use crate::telemetry::{TelemetryCollector, TELEMETRY_BIN_PATH}; use crate::utils::{external_subcommand, AllArgs}; use anyhow::Result; use clap::{self, Parser}; @@ -33,6 +34,10 @@ pub enum SharedCmd { /// Collect Linux system configuration information. #[clap(name = "sitecheck")] Sitecheck(AllArgs), + + /// Configure and inspect telemetry settings and data + #[clap(name = "telemetry")] + Telemetry(AllArgs), } #[derive(Parser, Debug)] @@ -70,12 +75,16 @@ pub enum HiddenCmd { OsCheck(AllArgs), } -pub fn run_rna_shared(pkg_env: &PkgEnv, args: RnaSharedCmd) -> Result { +pub fn run_rna_shared( + pkg_env: &PkgEnv, + args: RnaSharedCmd, + telemetry: &mut TelemetryCollector, +) -> Result { match args { RnaSharedCmd::Mat2csv(args) => pkg_env.run_subcmd("bin/rna/mat2csv", &args), RnaSharedCmd::Mkref(mut args) => { - args.shared.populate_version(pkg_env.tenx_version); - args.execute() + args.shared.populate_version(pkg_env); + args.execute(telemetry) } RnaSharedCmd::Mkgtf(args) => pkg_env.run_subcmd("bin/rna/mkgtf", &args), } @@ -85,6 +94,7 @@ pub fn run_shared(pkg_env: &PkgEnv, args: SharedCmd) -> Result { match args { SharedCmd::Upload(args) => pkg_env.run_subcmd("bin/tenkit/upload", &args), SharedCmd::Sitecheck(args) => pkg_env.run_subcmd("bin/tenkit/sitecheck", &args), + SharedCmd::Telemetry(args) => pkg_env.run_subcmd(TELEMETRY_BIN_PATH, &args), } } diff --git a/lib/rust/cr_wrap/src/targeted_compare.rs b/lib/rust/cr_wrap/src/targeted_compare.rs deleted file mode 100644 index 9110419..0000000 --- a/lib/rust/cr_wrap/src/targeted_compare.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::mrp_args::MrpArgs; -use crate::utils::{validate_id, CliPath}; -use clap::{self, Parser}; -use serde::Serialize; - -/// Analyze targeted enrichment performance by comparing -/// a targeted sample to its cognate parent WTA sample. -#[derive(Parser, Debug, Clone, Serialize)] -pub struct TargetedCompare { - /// A unique run id and output folder name [a-zA-Z0-9_-]+. - #[clap(long = "id", display_order = 0, value_name = "ID", value_parser = validate_id, required = true)] - pub sample_id: String, - - /// Sample description to embed in output files. - #[clap(long = "description", default_value = "", value_name = "TEXT")] - pub sample_desc: String, - - /// Path to the targeted molecule_info.h5 from a 'count --target-panel' - /// analysis run (targeted gene expression run) - #[clap(long = "targeted", value_name = "MOL_INFO_H5")] - pub targeted_molecule_info: CliPath, - - /// Path to the parent molecule_info.h5 from a 'count' - /// analysis run (parent unbiased gene expression run) - #[clap(long = "parent", value_name = "MOL_INFO_H5")] - pub parent_molecule_info: CliPath, - - /// A CSV file declaring the target gene panel used in the targeted - /// experiment. Must be the same target panel CSV file specified - /// in the 'count --target-panel' analysis run. - #[clap(long = "target-panel", value_name = "CSV")] - pub target_set: CliPath, - - /// Do not execute the pipeline. - /// Generate a pipeline invocation (.mro) file and stop. - #[serde(skip)] - #[clap(long)] - pub dry: bool, - - #[serde(skip)] - #[clap(flatten)] - pub mrp: MrpArgs, -} diff --git a/lib/rust/cr_wrap/src/telemetry.rs b/lib/rust/cr_wrap/src/telemetry.rs new file mode 100644 index 0000000..3dbad2d --- /dev/null +++ b/lib/rust/cr_wrap/src/telemetry.rs @@ -0,0 +1,127 @@ +use crate::env::PkgEnv; +use crate::IntoExitCode; +use std::ffi::OsString; +use std::os::unix::process::ExitStatusExt; +use std::path::PathBuf; +use std::process::{Child, Command, ExitStatus}; +use std::sync::mpsc::sync_channel; +use std::thread; +use std::time::{Duration, Instant}; + +/// Path to the collector binary, relative to the tarball root. +pub const TELEMETRY_BIN_PATH: &str = "lib/bin/telemetry"; + +/// Command wrappers should implement this to determine if we should collect +/// telemetry for a particular executing command. +pub trait CollectTelemetry { + /// Return true if we should collect telemetry for this command. + fn should_collect_telemetry(&self) -> bool; +} + +/// How long the telemetry collection should wait for all child processes to complete. +const JOIN_TIMEOUT: Duration = Duration::from_secs(5); + +pub struct TelemetryCollector { + /// The path to the telemetry collector binary. + collector_binary: PathBuf, + /// The CLI subcommand we're executing. + subcommand: String, + /// The CLI args, in a canonical --foo=bar form. + cli_args: Vec, + /// True if the collector should run. + should_run: bool, + /// Handles to any collector child processes we've spawned, and the time + /// at which we spawned them. + procs: Vec<(Child, Instant)>, +} + +impl TelemetryCollector { + /// Initialize a telemetry collector for a particular command. + pub fn new_for_command( + cmd: &T, + subcommand: String, + cli_args: Vec, + pkg_env: &PkgEnv, + ) -> Self { + Self { + collector_binary: pkg_env.subcmd_path(TELEMETRY_BIN_PATH), + cli_args, + subcommand, + should_run: cmd.should_collect_telemetry(), + procs: Default::default(), + } + } + + /// Start telemetry collection if configured to do so. + pub fn collect( + &mut self, + mrp_args: Option<&str>, + mrp_exit_status: Option<&ExitStatus>, + wall_time: Option, + ) { + if !self.should_run { + return; + } + let mut command = Command::new(&self.collector_binary); + command.arg("collect"); + if let Some(mrp_args) = mrp_args { + command.arg("-mrp_flags").arg(mrp_args); + } + if let Some(mrp_exit_status) = mrp_exit_status { + command + .arg("-mrp_exit_code") + .arg(mrp_exit_status.into_u8().to_string()); + } + if let Some(wall_time) = wall_time { + command + .arg("-walltime") + .arg(wall_time.as_secs_f64().to_string()); + } + // Pass the canonicalized CLI args into the collector. + command.arg("--").arg(&self.subcommand).args(&self.cli_args); + + match command.spawn() { + Ok(child) => { + self.procs.push((child, Instant::now())); + } + Err(err) => eprintln!("Failed to start telemetry collector: {err}"), + } + } + + /// Await completion of all telemetry collection processes, or time out. + /// + /// The timeout will be `JOIN_TIMEOUT` minus the time elapsed since we last + /// spawned a telemetry collector process. + /// + /// This method is called when this type is dropped, so if the location of + /// the wait isn't critical, this method does not need to be manually called. + pub fn join(&mut self) { + let Some((_, last_spawned_at)) = self.procs.iter().max_by_key(|(_, spawned_at)| spawned_at) + else { + return; + }; + let timeout = JOIN_TIMEOUT.saturating_sub(last_spawned_at.elapsed()); + // Spawn a thread to wait on the child procs, then wait on that process + // for at most the configured timeout. + let children = std::mem::take(&mut self.procs); + let (send, recv) = sync_channel::<()>(1); + thread::spawn(move || { + for (mut child, _) in children { + let Ok(exit_status) = child.wait() else { + continue; + }; + if let Some(sig) = exit_status.signal() { + eprintln!("telemetry collector terminated by signal: {sig}"); + } + } + let _ = send.send(()); + }); + let _ = recv.recv_timeout(timeout); + } +} + +impl Drop for TelemetryCollector { + fn drop(&mut self) { + self.join(); + } +} diff --git a/lib/rust/enclone/Cargo.toml b/lib/rust/enclone/Cargo.toml new file mode 100644 index 0000000..989a9c2 --- /dev/null +++ b/lib/rust/enclone/Cargo.toml @@ -0,0 +1,52 @@ +[dependencies] +[dependencies.amino] +path = '../amino' + +[dependencies.debruijn] +workspace = true + +[dependencies.enclone_core] +path = '../enclone_core' + +[dependencies.equiv] +path = '../equiv' + +[dependencies.graph_simple] +path = '../graph_simple' + +[dependencies.io_utils] +path = '../io_utils' + +[dependencies.itertools] +workspace = true + +[dependencies.petgraph] +workspace = true + +[dependencies.qd] +workspace = true + +[dependencies.rayon] +workspace = true + +[dependencies.stats_utils] +path = '../stats_utils' + +[dependencies.string_utils] +path = '../string_utils' + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'enclone' +publish = false +version = '0.1.0' diff --git a/lib/rust/enclone/src/allele.rs b/lib/rust/enclone/src/allele.rs new file mode 100644 index 0000000..d5c324b --- /dev/null +++ b/lib/rust/enclone/src/allele.rs @@ -0,0 +1,499 @@ +// Copyright (c) 2020 10X Genomics, Inc. All rights reserved. + +// This file provides functions to find alternate alleles and substitute them into references. + +use self::refx::RefData; +use debruijn::Mer; +use enclone_core::defs::{AltRef, CloneInfo, EncloneControl, ExactClonotype}; +use rayon::prelude::*; +use stats_utils::percent_ratio; +use std::cmp::{max, PartialOrd}; +use std::iter::zip; +use vdj_ann::refx; +use vector_utils::{erase_if, next_diff, next_diff1_2, next_diff1_3, reverse_sort, unique_sort}; + +/// Derive consensus sequences for alternate alleles of V segments. +/// +/// The priority of this algorithm is to reduce the likelihood of false positive joins. It +/// has been tuned and optimized for this purpose, possibly at the expense of generating some +/// 'fake' alternate alleles. However we do not actually know that this happens. If we +/// wanted to test the true accuracy of allele finding, we would need whole-genome and VDJ +/// datasets from the same donors. +/// +/// This calculation has to be made separately for each donor, which means that in a certain +/// sense the algorithm is not blinded to the truth data. However, separating this calculation +/// out per donor is the right thing to do. +/// +/// Alternate alleles might correspond to duplicated segments, which is fine, as +/// for purposes of this code that's functionally equivalent to bona fide alternate alleles. +/// +/// We do not attempt to calculate the last 15 bases of an alternate allele. These +/// bases are just copied. If we want to really know these bases we may need to +/// have actual genomic sequences which could also provide a control for these calculations. +/// +/// Attempts to also do this for J segments were unsuccessful. +/// +/// Limitations and to do items: +/// 1. Hypothetically we could make a library of alternate alleles and use that +/// as a supplement or in place of calculating on the fly. +/// 2. Document as part of algorithm. +/// 3. Make alt_refs into a more efficient data structure. +/// 4. Speed up. +/// +/// Organize data by reference ID. Note that we ignore exact subclonotypes having four chains. +pub fn find_alleles( + refdata: &RefData, + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], +) -> Vec { + let mut allxy = + vec![Vec::<(usize, Vec, Vec, usize, usize, String)>::new(); refdata.refs.len()]; + for (m, x) in exact_clonotypes.iter().enumerate() { + if x.share.len() >= 2 && x.share.len() <= 3 { + for j in 0..x.share.len() { + let y = &x.share[j]; + let id = y.v_ref_id; + + // Find the partner chains. + + let mut partner = Vec::::new(); + for ja in 0..x.share.len() { + if x.share[ja].left != x.share[j].left { + partner.push(x.share[ja].v_ref_id); + } + } + if !partner.is_empty() + && y.seq_del.len() >= refdata.refs[id].len() - ctl.heur.ref_v_trim + { + for clone in &x.clones { + let donor = clone[j].donor_index; + if let Some(donor) = donor { + allxy[id].push(( + donor, + y.seq_del.clone(), + partner.clone(), + m, + clone[j].dataset_index, + clone[0].barcode.clone(), + )); + } + } + } + } + } + } + + // Process each reference ID. + + let mut vs = Vec::::new(); + for id in 0..refdata.refs.len() { + if refdata.is_v(id) { + vs.push(id); + } + } + let mut results = Vec::<(usize, Vec)>::new(); + for v in &vs { + results.push((*v, Vec::new())); + } + results.par_iter_mut().for_each(|res| { + let id = res.0; + let mut allx = allxy[id].clone(); + + // Divide by donor. + + allx.sort(); + let mut alls = Vec::, Vec, usize, usize, String)>>::new(); + let mut i = 0; + while i < allx.len() { + // let j = next_diff1_6(&allx, i); + let mut j = i + 1; + while j < allx.len() { + if allx[j].0 != allx[i].0 { + break; + } + j += 1; + } + alls.push(allx[i..j].to_owned()); + i = j; + } + + // Process donor by donor. + + for mut all in alls { + // Data here are given by "all", the relevant entries of which are: + // 1: V..J sequence for one chain of a given info entry + // 2: the reference ID(s) of the partner chain(s) -- possibly not used + // 3: the index in exact_clonotypes + // 4: the dataset ID. + + let donor_id = all[0].0; + + // If two entries have + // * the same length CDR3 sequence and + // * the same partner chain reference ids for both V and J and + // * the same length partner chain CDR3 sequence, + // arbitrarily delete one of them. + // + // What we're trying to do here is reduce the incidence wherein multiple entries from + // the same clonotype (which we have not yet computed) contribute to the count for a + // putative alternate allele, resulting in alternate alleles that are not true + // germline changes, but rather arise from SHM. + // + // In a better system we might first compute the clonotypes, then the alternate + // alleles, however knowing the alternate alleles is in fact prerequisite to computing + // the clonotypes. + // + // Note that a vulnerability of the algorithm is that if there is a very large + // clonotype, then artifactual pairs arising from it could provide enough "evidence" + // to create an alternate allele, which in fact should not exist. This has not been + // observed, but we haven't looked carefully. Biological cases such as lymphomas + // could provide helpful test cases in this area. + + let mut to_delete = vec![false; all.len()]; + { + let mut trace = Vec::<((usize, usize, usize, usize), usize)>::new(); + for (i, item) in all.iter().enumerate() { + let u = item.3; + let ex = &exact_clonotypes[u]; + for j1 in 0..ex.share.len() { + if ex.share[j1].seq_del == item.1 { + for j2 in 0..ex.share.len() { + let (s1, s2) = (&ex.share[j1], &ex.share[j2]); + if s2.left != s1.left { + trace.push(( + ( + s1.cdr3_dna.len(), + s2.cdr3_dna.len(), + s2.v_ref_id, + s2.j_ref_id, + ), + i, + )); + } + } + } + } + } + trace.sort_unstable(); + let mut i = 0; + while i < trace.len() { + let j = next_diff1_2(&trace, i); + for k in i..j { + if !to_delete[trace[k].1] { + for l in i..j { + if l != k { + to_delete[trace[l].1] = true; + } + } + break; + } + } + i = j; + } + erase_if(&mut all, &to_delete); + } + + // Traverse the positions in the reference V segment. + + let mut ps = Vec::::new(); + for p in 0..refdata.refs[id].len() - ctl.heur.ref_v_trim { + // Let bases = {(contig base, contig index, index of the other ref V segment)}. + // The other ref V segments are there only for diagnostic purposes. + + let mut bases = Vec::<(u8, usize, Vec)>::new(); + for (i, x) in all.iter().enumerate() { + bases.push((x.1[p], i, x.2.clone())); + } + bases.sort(); + + // Let freqs = {( number of contig bases, + // {contig indices}, {other ref V segment indices}, base )}. + + let mut freqs = Vec::<(usize, Vec, Vec>, u8)>::new(); + let mut i = 0; + while i < bases.len() { + let j = next_diff1_3(&bases, i); + let mut x = Vec::::new(); + let mut y = Vec::>::new(); + for base in &bases[i..j] { + x.push(base.1); + y.push(base.2.clone()); + } + freqs.push((j - i, x, y, bases[i].0)); + i = j; + } + reverse_sort(&mut freqs); + + // If frequency of second most frequent base is high enough, save + // the position in "ps". Likewise if frequency + // of first most frequent base is high enough and it's non-reference. + // + // Note that this doesn't allow for the case where the third most frequent base + // is frequent enough. + + let x = refdata.refs[id].get(p); + let c; + if x == 0 { + c = b'A'; + } else if x == 1 { + c = b'C'; + } else if x == 2 { + c = b'G'; + } else { + c = b'T'; + } + if (!freqs.is_empty() + && freqs[0].0 >= ctl.allele_alg_opt.min_alt + && freqs[0].3 != c) + || (freqs.len() > 1 + && ctl.allele_alg_opt.min_mult * freqs[1].0 >= bases.len() + && freqs[1].0 >= ctl.allele_alg_opt.min_alt) + { + ps.push(p); + } + } + if ps.is_empty() { + continue; + } + + // Define types = { ( (contig base at each position in ps), index of contig ) }, + // and sort. + + let mut types = Vec::<(Vec, usize)>::new(); + for (loc, item) in all.iter().enumerate() { + let mut t = Vec::::new(); + for &p in &ps { + let base = item.1[p]; + t.push(base); + } + types.push((t, loc)); + } + types.sort(); + + // Traverse the types, grouping contigs that have an identical footprint at + // the positions in ps. + + let mut keep = Vec::<(Vec, usize, f64, bool, Vec)>::new(); + let mut i = 0; + let mut have_ref = false; + while i < types.len() { + let j = next_diff1_2(&types, i); + + // Determine if the contigs equal reference at the positions in ps. + + let mut is_ref = true; + for (z, p) in ps.iter().enumerate() { + let x = refdata.refs[id].get(*p); + let c; + if x == 0 { + c = b'A'; + } else if x == 1 { + c = b'C'; + } else if x == 2 { + c = b'G'; + } else { + c = b'T'; + } + if c != types[i].0[z] { + is_ref = false; + } + } + if (j - i >= ctl.allele_alg_opt.min_alt + && j - i >= types.len() / ctl.allele_alg_opt.min_mult) + || is_ref + { + let mut q = Vec::>::new(); + let mut barcodes = Vec::::new(); + for t in &types[i..j] { + let m = t.1; + q.push(all[m].2.clone()); + barcodes.push(all[m].5.clone()); + } + q.sort(); + let (mut m, mut r) = (0, 0); + while r < q.len() { + let s = next_diff(&q, r); + m = max(m, s - r); + r = s; + } + let purity = 100.0 - percent_ratio(m, q.len()); + keep.push((types[i].0.clone(), j - i, purity, is_ref, barcodes)); + if is_ref { + have_ref = true; + } + } + i = j; + } + + if keep.len() > 1 || (!keep.is_empty() && !have_ref) { + // Remove columns that are pure reference. + + let mut to_delete = vec![false; keep[0].0.len()]; + for (i, (&p, d)) in ps + .iter() + .take(keep[0].0.len()) + .zip(to_delete.iter_mut()) + .enumerate() + { + let mut is_ref = true; + for j in &keep { + let x = refdata.refs[id].get(p); + let c; + if x == 0 { + c = b'A'; + } else if x == 1 { + c = b'C'; + } else if x == 2 { + c = b'G'; + } else { + c = b'T'; + } + if c != j.0[i] { + is_ref = false; + } + } + if is_ref { + *d = true; + } + } + erase_if(&mut ps, &to_delete); + for j in &mut keep { + erase_if(&mut j.0, &to_delete); + } + let mut keep0 = Vec::>::new(); + for i in &keep { + keep0.push(i.0.clone()); + } + keep0.sort(); + keep.sort_by(|a, b| a.partial_cmp(b).unwrap()); + + // Save alternate references. + + for x in &keep { + if !x.3 { + let mut b = refdata.refs[id].clone(); + for (&x0, &ps) in x.0.iter().zip(ps.iter()) { + let c; + if x0 == b'A' { + c = 0; + } else if x0 == b'C' { + c = 1; + } else if x0 == b'G' { + c = 2; + } else { + c = 3; + } + b.set_mut(ps, c); + } + res.1.push(AltRef { + donor: donor_id, + ref_id: id, + alt_seq: b, + support: x.1, + is_ref: x.3, + }); + } + } + } + } + }); + let mut alt_refs = Vec::new(); + for mut r in results { + alt_refs.append(&mut r.1); + } + alt_refs.sort(); + alt_refs +} + +/// Update reference sequences for V segments by substituting in alt alleles if better. +/// Computational performance dubious because of full alt_refs traversal. +#[allow(clippy::needless_range_loop)] +pub fn sub_alts( + refdata: &RefData, + ctl: &EncloneControl, + alt_refs: &[AltRef], + clone_info: &mut [CloneInfo], + exact_clonotypes: &mut [ExactClonotype], +) { + for info in clone_info { + for ((v_seg, tig), vsid) in zip(zip(&mut info.vs, &info.tigs), &mut info.vsids) { + if v_seg.len() - ctl.heur.ref_v_trim <= tig.len() { + let mut errs = 0; + for l in 0..v_seg.len() - ctl.heur.ref_v_trim { + let x = v_seg.get(l); + let c; + if x == 0 { + c = b'A'; + } else if x == 1 { + c = b'C'; + } else if x == 2 { + c = b'G'; + } else { + c = b'T'; + } + if tig[l] != c { + errs += 1; + } + } + let mut donors = Vec::::new(); + let ex = &exact_clonotypes[info.clonotype_index]; + for m in 0..ex.clones.len() { + if ex.clones[m][0].donor_index.is_some() { + donors.push(ex.clones[m][0].donor_index.unwrap()); + } + } + unique_sort(&mut donors); + for donor in donors { + for m in 0..alt_refs.len() { + if alt_refs[m].donor == donor + && refdata.name[alt_refs[m].ref_id] == refdata.name[*vsid] + && alt_refs[m].alt_seq.len() - ctl.heur.ref_v_trim <= tig.len() + { + let mut alt_errs = 0; + for l in 0..alt_refs[m].alt_seq.len() - ctl.heur.ref_v_trim { + let x = alt_refs[m].alt_seq.get(l); + let c; + if x == 0 { + c = b'A'; + } else if x == 1 { + c = b'C'; + } else if x == 2 { + c = b'G'; + } else { + c = b'T'; + } + if tig[l] != c { + alt_errs += 1; + } + } + if alt_errs < errs { + *v_seg = alt_refs[m].alt_seq.clone(); + *vsid = alt_refs[m].ref_id; + let ex = &mut exact_clonotypes[info.clonotype_index]; + for shared_tig_data in &mut ex.share { + if shared_tig_data.seq == *tig { + shared_tig_data.v_ref_id = alt_refs[m].ref_id; + shared_tig_data.v_ref_id_donor = Some(m); + shared_tig_data.v_ref_id_donor_donor = Some(donor); + let mut alts = 0; + let mut mm = m; + while mm >= 1 { + mm -= 1; + if alt_refs[mm].donor == donor + && alt_refs[mm].ref_id == alt_refs[m].ref_id + { + alts += 1; + } + } + shared_tig_data.v_ref_id_donor_alt_id = Some(alts); + break; + } + } + } + } + } + } + } + } + } +} diff --git a/lib/rust/enclone/src/graph_filter.rs b/lib/rust/enclone/src/graph_filter.rs new file mode 100644 index 0000000..32f8685 --- /dev/null +++ b/lib/rust/enclone/src/graph_filter.rs @@ -0,0 +1,377 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// This file provides the single function graph_filter. + +use crate::BarcodeFilter; +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::TigData; +use graph_simple::GraphSimple; +use io_utils::fwriteln; +use petgraph::prelude::*; +use rayon::prelude::*; +use std::cmp::{max, min}; +use std::io::Write; +use string_utils::strme; +use vector_utils::{bin_member, bin_position, erase_if, lower_bound, next_diff12_3, reverse_sort}; + +/// Create a digraph which has one vertex for each V..J that appears in a productive +/// pair, and for a given light chain and a given heavy chain vertex, a weighted edge +/// from the light to the heavy, so long as they co-occur in some cell; the weight is +/// a pair (numi, ncells), where numi is the sum over all cells for which the co-occur, +/// of the minimum of the number of UMIs that support the two chains. +/// seqs = { (V..J, is_igh) } +/// Also tracking CDR3_AAs for now for exploratory purposes at least. This makes +/// things less efficient. +/// +/// As part of this, identify weak links and kill them. +/// +/// This code tiptoes around the fact that whereas these calculations should be at the clonotype +/// level, we compute here at the exact subclonotype level. The use of V segments is part of this. +/// +/// Hmm, seems like the edges go from heavy to light. +#[derive(Default)] +pub struct GraphFilter { + pub log_graph: bool, +} + +impl BarcodeFilter> for GraphFilter { + fn fate_keys(&self, item: &Vec) -> impl Iterator { + std::iter::once((item[0].dataset_index, item[0].barcode.clone())) + } + + fn filter(&self, tig_bc: &[Vec]) -> Vec> { + let mut seqs = Vec::<(&[u8], bool, &str, usize)>::new(); + for tigi in tig_bc { + for x in tigi { + seqs.push((x.seq(), x.left, x.cdr3_aa.as_str(), x.v_ref_id)); + } + } + seqs.par_sort(); + seqs.dedup(); + + // If there are multiple seqs entries whose first three elements agree, + // delete all but the first. + + let mut to_delete = vec![false; seqs.len()]; + let mut i = 0; + while i < seqs.len() { + let mut j = i + 1; + while j < seqs.len() { + if seqs[j].0 != seqs[i].0 || seqs[j].1 != seqs[i].1 || seqs[j].2 != seqs[i].2 { + break; + } + j += 1; + } + for d in &mut to_delete[i + 1..j] { + *d = true; + } + i = j; + } + erase_if(&mut seqs, &to_delete); + + // Proceed. + let results: Vec<_> = tig_bc + .par_iter() + .map(|tig_bc| { + let mut edges = Vec::new(); + for x1 in tig_bc { + if x1.left { + let p1 = + lower_bound(&seqs, &(x1.seq(), false, x1.cdr3_aa.as_str(), 0)) as usize; + for x2 in tig_bc { + if !x2.left { + let p2 = + lower_bound(&seqs, &(x2.seq(), false, x2.cdr3_aa.as_str(), 0)) + as usize; + edges.push((p1, p2, min(x1.umi_count, x2.umi_count))); + } + } + } + } + edges + }) + .collect(); + let mut edges0: Vec<_> = results.into_iter().flatten().collect(); + edges0.sort_unstable(); + let mut edges1 = Vec::new(); + let mut i = 0; + while i < edges0.len() { + let j = next_diff12_3(&edges0, i); + let mut weight = 0; + for e in &edges0[i..j] { + weight += e.2; + } + edges1.push((edges0[i].0, edges0[i].1, (weight, j - i))); + i = j; + } + let mut g = Graph::::new(); + g.reserve_exact_nodes(seqs.len()); + g.reserve_exact_edges(edges1.len()); + for i in 0..seqs.len() { + g.add_node(i as u32); + } + for (v, w, weight) in edges1 { + g.add_edge(NodeIndex::::new(v), NodeIndex::::new(w), weight); + } + + // Kill weak branches from light to heavy chains. Also kill light chain onesies that + // have too many heavy chain partners. + // + // ******************************************************************************************** + // THIS IS TURNED OFF. Reason: if a light chain is ubiquitous, then this code would be + // prejudiciously deleting pairs that use it. The code kills a lot of real cells. + // When we turned off this code, we got one additional false positive, but it seems like we + // "should" have the false positive. The code also resulted in the creation of a few more + // 5-chain clonotypes, and lots more 4-chain clonotypes (both in the ~400 dataset run). + // ******************************************************************************************** + + /* + let mut log = Vec::::new(); + fwriteln!(log, "\nBRANCHING FROM LIGHT CHAINS"); + const MIN_RATIO_KILL: usize = 8; + const MAX_KILL: usize = 5; + const MAX_KILL_CELLS: usize = 2; + const MAX_PARTNERS: usize = 50; + let mut kills = Vec::<(usize, usize)>::new(); + let mut badones = Vec::::new(); + let mut results = Vec::<(usize, Vec<(usize, usize)>, Vec, Vec)>::new(); + for v in 0..g.node_count() { + results.push((v, Vec::new(), Vec::new(), Vec::new())); + } + results.par_iter_mut().for_each(|res| { + let v = res.0; + let log = &mut res.3; + if g.n_to(v) > 1 { + let mut stats = Vec::<(usize, usize, usize)>::new(); + fwriteln!(log, "\nlight chain {} = {}", v, seqs[v].2); + for i in 0..g.n_to(v) { + let (w, e) = (g.v_to(v, i), g.e_to(v, i)); + let numi = g.edge_obj(e as u32).0; + let ncells = g.edge_obj(e as u32).1; + fwriteln!( + log, + "• heavy chain {} = {}, weight = {}/{}", + w, + seqs[w].2, + numi, + ncells + ); + stats.push((numi, ncells, w)); + } + reverse_sort(&mut stats); + for i in 1..stats.len() { + // Below, the part seqs[stats[i].2].3 != seqs[stats[0].2].3 + // is requiring that the partner V segments are different. See discussion at + // the top around the roles of clonotypes versus exact subclonotypes. + + if seqs[stats[i].2].3 != seqs[stats[0].2].3 { + let numi = stats[i].0; + let ncells = stats[i].1; + let numi_best = stats[0].0; + let ncells_best = stats[0].1; + if numi_best >= MIN_RATIO_KILL * max(1, numi) && numi <= MAX_KILL { + res.1.push((v, stats[i].2)); + } else if numi_best >= numi && ncells_best >= MIN_RATIO_KILL * max(1, ncells) { + if ncells <= MAX_KILL_CELLS { + let w = stats[i].2; + if graph { + println!( + "\nkill type 1, from {} to {}, ncells = {}, numi = {}", + seqs[v].2, seqs[w].2, ncells, numi + ); + println!( + "killed by {} to {}, ncells = {}, numi = {}", + seqs[v].2, seqs[stats[0].2].2, ncells_best, numi_best + ); + } + res.1.push((v, w)); + } else { + let w = stats[i].2; + for j in 0..g.n_from(w) { + let (vx, ex) = (g.v_from(w, j), g.e_from(w, j)); + let numix = g.edge_obj(ex as u32).0; + let ncellsx = g.edge_obj(ex as u32).1; + if vx != v + && ncellsx >= MIN_RATIO_KILL * ncells + && numix >= MIN_RATIO_KILL * numi + { + if graph { + println!( + "\nkill type 2, from {} to {}, ncells = {}, numi = {}", + seqs[v].2, seqs[w].2, ncells, numi + ); + println!( + "killed by {} to {}, ncells = {}, numi = {}", + seqs[v].2, seqs[stats[0].2].2, ncells_best, numi_best + ); + } + res.1.push((v, w)); + } + } + } + } + } + } + } + if g.n_to(v) > MAX_PARTNERS { + res.2.push(v); + } + }); + for i in 0..results.len() { + kills.append(&mut results[i].1.clone()); + badones.append(&mut results[i].2.clone()); + log.append(&mut results[i].3.clone()); + } + kills.sort(); + // presumably badly inefficient + let mut to_delete = vec![false; tig_bc.len()]; + let mut results = Vec::<(usize, bool)>::new(); + for i in 0..tig_bc.len() { + results.push((i, false)); + } + results.par_iter_mut().for_each(|res| { + let i = res.0; + for j1 in 0..tig_bc[i].len() { + if tig_bc[i][j1].left { + continue; + } + let x1 = &tig_bc[i][j1]; + let m1 = (x1.seq.clone(), x1.left, x1.cdr3_aa.clone(), x1.v_ref_id); + let p1 = bin_position(&seqs, &m1) as usize; + for j2 in 0..tig_bc[i].len() { + if !tig_bc[i][j2].left { + continue; + } + let x2 = &tig_bc[i][j2]; + let m2 = (x2.seq.clone(), x2.left, x2.cdr3_aa.clone(), x2.v_ref_id); + let p2 = bin_position(&seqs, &m2) as usize; + if bin_member(&kills, &(p1, p2)) { + res.1 = true; + } + } + } + if tig_bc[i].len() == 1 { + let x0 = &tig_bc[i][0]; + let m0 = (x0.seq.clone(), x0.left, x0.cdr3_aa.clone(), x0.v_ref_id); + let p = bin_position(&seqs, &m0) as usize; + if bin_member(&badones, &p) { + res.1 = true; + } + } + }); + for i in 0..tig_bc.len() { + to_delete[i] = results[i].1; + if to_delete[i] { + ndels += 1; + } + } + for i in 0..tig_bc.len() { + if to_delete[i] { + fate[tig_bc[i][0].dataset_index].insert( + tig_bc[i][0].barcode.clone(), + "failed GRAPH_FILTER filter".to_string(), + ); + } + } + if !ctl.gen_opt.ngraph_filter { + erase_if(&mut tig_bc, &to_delete); + } + if graph { + fwriteln!(log, ""); + print!("{}", strme(&log)); + } + */ + + // Kill weak branches from heavy to light chains. + + let mut log = Vec::::new(); + fwriteln!(log, "\nBRANCHING FROM HEAVY CHAINS"); + const MIN_RATIO_KILL_HEAVY: usize = 8; + const MAX_KILL_HEAVY: usize = 6; + const MAX_KILL_HEAVY_CELLS: usize = 1; + let mut kills = Vec::<(usize, usize)>::new(); + let mut results = Vec::<(usize, Vec<(usize, usize)>, Vec)>::new(); + for v in 0..g.node_count() { + results.push((v, Vec::new(), Vec::new())); + } + results.par_iter_mut().for_each(|res| { + let v = res.0; + let log = &mut res.2; + if g.n_from(v) > 1 { + let mut stats = Vec::<((usize, usize), usize)>::new(); + fwriteln!(log, "\nheavy chain {} = {}", v, seqs[v].2); + for i in 0..g.n_from(v) { + let w = g.v_from(v, i); + let e = g.e_from(v, i); + let weight = g.edge_obj(e as u32); + fwriteln!( + log, + "• light chain {} = {}, weight = {}/{}", + w, + seqs[w].2, + weight.1, + weight.0 + ); + stats.push((*weight, w)); + } + reverse_sort(&mut stats); + for i in 1..stats.len() { + if (stats[0].0).0 >= MIN_RATIO_KILL_HEAVY * max(1, (stats[i].0).0) + && (stats[i].0).0 <= MAX_KILL_HEAVY + && (stats[i].0).1 <= MAX_KILL_HEAVY_CELLS + { + if self.log_graph { + let w = stats[i].1; + println!( + "\nkill type 3, from {} to {}\nkilled by {} to {}", + seqs[v].2, seqs[w].2, seqs[v].2, seqs[stats[0].1].2 + ); + } + res.1.push((v, stats[i].1)); + } + } + } + }); + for (_, mut r1, mut r2) in results { + kills.append(&mut r1); + log.append(&mut r2); + } + kills.sort_unstable(); + // presumably badly inefficient + let to_delete: Vec<_> = tig_bc + .par_iter() + .map(|tig_bc| { + for tbc_0 in tig_bc { + if !tbc_0.left { + continue; + } + let x1 = &tbc_0; + let m1 = (x1.seq(), x1.left, x1.cdr3_aa.as_str(), x1.v_ref_id); + let p1 = bin_position(&seqs, &m1) as usize; + for tbc_1 in tig_bc { + if tbc_1.left { + continue; + } + let x2 = &tbc_1; + let m2 = (x2.seq(), x2.left, x2.cdr3_aa.as_str(), x2.v_ref_id); + let p2 = bin_position(&seqs, &m2) as usize; + if bin_member(&kills, &(p1, p2)) { + return Some(BarcodeFate::GraphFilter); + } + } + } + None + }) + .collect(); + + let ndels: usize = to_delete.iter().flatten().count(); + + if self.log_graph { + fwriteln!(log, ""); + print!("{}", strme(&log)); + println!("total graph filter deletions = {ndels}"); + } + + to_delete + } +} diff --git a/lib/rust/enclone/src/human_MAIT_CDR3.json b/lib/rust/enclone/src/human_MAIT_CDR3.json new file mode 100644 index 0000000..c38c4e1 --- /dev/null +++ b/lib/rust/enclone/src/human_MAIT_CDR3.json @@ -0,0 +1,70 @@ +[ + { + "cdr3": "CAVNGDDYKLSF", + "id": "PMC4113934" + }, + { + "cdr3": "CAVRDSDYKLSF", + "id": "PMC4113934" + }, + { + "cdr3": "CAVSLQDYKLSF", + "id": "PMC4113934" + }, + { + "cdr3": "CAVRDGDYKLSF", + "id": "PMC4113934" + }, + { + "cdr3": "CAVRDSNYQLIW", + "id": "PMC4113934" + }, + { + "cdr3": "CAVRDSNYQLIQW", + "id": "PMC4113934" + }, + { + "cdr3": "CAAMDSNYQLIW", + "id": "PMC4113934" + }, + { + "cdr3": "CAVLDSNYQLIW", + "id": "PMC4113934" + }, + { + "cdr3": "CARSDSNYQLIW", + "id": "PMC4113934" + }, + { + "cdr3": "CAVMDSNYQLIW", + "id": "PMC4113934" + }, + { + "cdr3": "CAVSDSNYQLIW", + "id": "PMC4113934" + }, + { + "cdr3": "CAALDSNYQLIW", + "id": "PMC4113934" + }, + { + "cdr3": "CASMDSNYQLIW", + "id": "PMC4113934" + }, + { + "cdr3": "CASSDSGESGTEAFF", + "id": "PMC4113934" + }, + { + "cdr3": "CASSQIAGGQQETQYF", + "id": "PMC4113934" + }, + { + "cdr3": "CSARQGAESREQYF", + "id": "PMC4113934" + }, + { + "cdr3": "CASSPSGGDYNEQFF", + "id": "PMC4113934" + } +] diff --git a/lib/rust/enclone/src/human_iNKT_CDR3.json b/lib/rust/enclone/src/human_iNKT_CDR3.json new file mode 100644 index 0000000..1b30200 --- /dev/null +++ b/lib/rust/enclone/src/human_iNKT_CDR3.json @@ -0,0 +1,274 @@ +[ + { + "cdr3": "CASSEYRLQETQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSELYTGGDEQFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEYGTLQETYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEFGQSADEQFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEWAGGQETQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEFDGGQETQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSGYQGGGETQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEYMEGGEKLFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSDLPETQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSFGGETQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSTGGADEKLFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEWGRTQETQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSGLLTGPDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEPTGLGTDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSPIGGHGYEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSDLMGPDNYEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEYMEAGIPTDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEAPWRDSGNTIYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSPRDRWHEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEYFAGFNEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEYESTNEKLFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSDLGLAGVIEQFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEYESTNEKLFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEWGTNEKLFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSDRLAGDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSGTGGAFDEQFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSESLAGGYNEQFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEWEDITDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEYRRRSGEKLFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSVPLRDYEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSELLRGQGRTGELFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSDGFTDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSESVETQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEGTAGTDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASTPSGGWSSDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEGTGPNSPLHF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEGGQDYEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSDRANEQFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEAGSGEKLFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSESATGFSPLHF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSRGGYTEAFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASRYYSVQGRTDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSAWDGYEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASTPRKGTDVGNTIYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASRGQGLGEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEGWEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASTSLETSQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSESGGSTEAFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSGTVTEAFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEMGQGVYTF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEALILFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSAPLAGHYEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSRGGFDEQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSELTDTQYF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSRGGGTEAFF", + "id": "PMC4792736" + }, + { + "cdr3": "CASSEEGALKESVGTQYF", + "id": "10.1038/nri3328" + }, + { + "cdr3": "CASSEFGGTERTQETQYF", + "id": ["10.1038/nri3328","10.1371/journal.pbio.1000402.t001"] + }, + { + "cdr3": "CASSGLRDRGLYEQYF", + "id": "10.1038/nri3328" + }, + { + "cdr3": "CASTGASGTYEQYF", + "id": "10.1371/journal.pbio.1000402.t001" + }, + { + "cdr3": "CASSEPSSGNTIYF", + "id": "10.1371/journal.pbio.1000402.t001" + }, + { + "cdr3": "CASSDQNTEAFF", + "id": "10.1371/journal.pbio.1000402.t001" + }, + { + "cdr3": "CASSAMDTEAFF", + "id": "10.1371/journal.pbio.1000402.t001" + }, + { + "cdr3": "CASARGVNEQYF", + "id": "10.1371/journal.pbio.1000402.t001" + }, + { + "cdr3": "CASSDRRQGAHQPQHF", + "id": "10.1371/journal.pbio.1000402.t001" + }, + { + "cdr3": "CASSGDRRQGAHQPQHF", + "id": "10.1371/journal.pbio.1000402.t001" + }, + { + "cdr3": "CASSENSGTGRIYEQYF", + "id": "10.1038/nri3328" + }, + { + "cdr3": "CASSEEGALKESVGTQYF", + "id": "10.1038/nri3328" + }, + { + "cdr3": "CASSEFGGTERTQETQYF", + "id": "10.1038/nri3328" + } +] diff --git a/lib/rust/enclone/src/info.rs b/lib/rust/enclone/src/info.rs new file mode 100644 index 0000000..a80bd9a --- /dev/null +++ b/lib/rust/enclone/src/info.rs @@ -0,0 +1,373 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// This file provides the single function build_info. + +use self::refx::RefData; +use amino::{codon_to_aa, nucleotide_to_aminoacid_sequence}; +use debruijn::dna_string::DnaString; +use debruijn::Mer; +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::{CloneInfo, ExactClonotype}; +use enclone_core::enclone_structs::BarcodeFates; +use rayon::prelude::*; +use std::convert::TryInto; +use string_utils::strme; +use vdj_ann::refx; +use vector_utils::unique_sort; + +struct Result { + clone_info: Vec, + exact_clonotype: ExactClonotype, + fate: Vec, +} + +struct ImproperFateResult { + dataset_id: usize, + barcode: String, +} + +/// Build info about clonotypes. We create a data structure info. +/// An entry in info is a clonotype having appropriate properties. +/// +/// Much of the information in a CloneInfo object is redundant. So we could probably +/// improve both time and space computational performance by reducing that redundancy. +pub fn build_info( + refdata: &RefData, + exact_clonotypes: &mut [ExactClonotype], + fate: &mut [BarcodeFates], +) -> Vec { + let results: Vec<_> = exact_clonotypes + .par_iter() + .enumerate() + .map(|(i, exact_clonotype)| { + let mut lens = Vec::::new(); + let mut tigs = Vec::>::new(); + let mut tigs_amino = Vec::>::new(); + let mut aa_mod_indel = Vec::>::new(); + let mut tigs_ins = Vec::)>>::new(); + let mut tigsp = Vec::::new(); + let mut has_del = Vec::::new(); + let (mut vs, mut js) = (Vec::::new(), Vec::::new()); + let mut vsids = Vec::::new(); + let mut jsids = Vec::::new(); + let mut cdr3s = Vec::::new(); + let mut updated_exact_clonotype = exact_clonotype.clone(); + for j in 0..updated_exact_clonotype.share.len() { + let x = &mut updated_exact_clonotype.share[j]; + tigsp.push(DnaString::from_acgt_bytes(&x.seq)); + let jid = x.j_ref_id; + js.push(refdata.refs[jid].clone()); + + // If there is a deletion in a V segment region, edit the contig sequence, + // inserting hyphens where the deletion is, and if there is an insertion, delete it. + + let vid = x.v_ref_id; + let jid = x.j_ref_id; + let mut annv = x.annv.clone(); + vsids.push(vid); + jsids.push(jid); + // DELETION + if annv.len() == 2 && annv[1].tig_start == annv[0].tig_start + annv[0].match_len { + let mut t = Vec::::new(); + let (mut del_start, mut del_stop) = (annv[0].match_len, annv[1].ref_start); + t.extend(&x.seq[..del_start.try_into().unwrap()]); + t.resize(del_stop.try_into().unwrap(), b'-'); + t.extend(&x.seq[annv[1].tig_start as usize..]); + lens.push(t.len()); + tigs.push(t.clone()); + if del_start % 3 != 0 { + // Bad solution here, should pick optimal choice. + let offset = del_start % 3 - 3; + del_start -= offset; + del_stop -= offset; + t.clear(); + t.extend(&x.seq[..del_start.try_into().unwrap()]); + t.resize(del_stop.try_into().unwrap(), b'-'); + t.extend(&x.seq[((annv[1].tig_start - offset) as usize)..]); + } + annv[0].match_len += (del_stop - del_start) + annv[1].match_len; + annv.truncate(1); + tigs_amino.push(t.clone()); + let mut aa = Vec::::new(); + for p in (0..=t.len() - 3).step_by(3) { + if t[p] == b'-' { + aa.push(b'-'); + } else { + aa.push(codon_to_aa(&t[p..p + 3])); + } + } + + aa_mod_indel.push(aa); + tigs_ins.push(Vec::new()); + has_del.push(true); + // INSERTION + } else if annv.len() == 2 + && annv[1].ref_start == annv[0].ref_start + annv[0].match_len + { + let ins_len = + (annv[1].tig_start - annv[0].tig_start - annv[0].match_len) as usize; + let ins_pos = (annv[0].tig_start + annv[0].match_len) as usize; + let mut t = Vec::::new(); + let mut nt = Vec::::new(); + for i in 0..x.seq.len() { + if i < ins_pos || i >= ins_pos + ins_len { + t.push(x.seq[i]); + } else { + nt.push(x.seq[i]); + } + } + has_del.push(true); // DOES NOT MAKE SENSE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + lens.push(t.len()); + tigs.push(t.clone()); + let ins = vec![(ins_pos, nt)]; + tigs_ins.push(ins); + tigs_amino.push(t); + + // Optimize to compute entry in aa_mod_indel and the inserted aa sequence. + + let aa_full = nucleotide_to_aminoacid_sequence(&x.seq, 0); + let ref_aa = + nucleotide_to_aminoacid_sequence(&refdata.refs[vid].to_ascii_vec(), 0); + let ins_len_aa = ins_len / 3; + const EXT: usize = 10; + let ins_pos_low = if ins_pos / 3 < EXT { + 0 + } else { + ins_pos / 3 - EXT + }; + let mut ins_pos_high = + std::cmp::min(ins_pos / 3 + EXT, aa_full.len() - ins_len_aa + 1); + ins_pos_high = std::cmp::min(ins_pos_high, ref_aa.len() - ins_len_aa + 1); + let mut mis = Vec::<(usize, usize, Vec)>::new(); + for j in ins_pos_low..ins_pos_high { + let mut y = Vec::::new(); + for (k, &aa) in aa_full.iter().enumerate() { + if k < j || k >= j + ins_len_aa { + y.push(aa); + } + } + let mut m = 0; + for l in 0..ref_aa.len() { + if l < y.len() && ref_aa[l] != y[l] { + m += 1; + } + } + mis.push((m, j, y.clone())); + } + mis.sort(); + aa_mod_indel.push(mis[0].2.clone()); + let ins_aa_pos = mis[0].1; + let mut aax = Vec::::new(); + let b = 3 * ins_aa_pos; + for p in 0..ins_len_aa { + emit_codon_color_escape(&x.seq[b + 3 * p..b + 3 * p + 3], &mut aax); + let aa = codon_to_aa(&x.seq[b + 3 * p..b + 3 * p + 3]); + aax.push(aa); + aax.append(&mut b"".to_vec()); + } + + // Finish up ann. + + annv[0].match_len += annv[1].match_len; + annv.truncate(1); + } else { + has_del.push(false); + lens.push(x.seq.len()); + tigs.push(x.seq.clone()); + tigs_amino.push(x.seq.clone()); + aa_mod_indel.push(nucleotide_to_aminoacid_sequence(&x.seq, 0)); + tigs_ins.push(Vec::new()); + } + + // Save reference V segment. However in the case where there is a + // single indel between the contig and the reference sequence, edit the + // reference V segment accordingly. + + let rt = &refdata.refs[vid]; + if x.annv.len() == 2 { + let mut r = rt.slice(0, x.annv[0].match_len as usize).to_owned(); + // deletion + if x.annv[1].tig_start == x.annv[0].tig_start + x.annv[0].match_len { + // DEAD CODE + for m in x.annv[1].ref_start as usize..rt.len() { + r.push(rt.get(m)); + } + vs.push(r.clone()); + // insertion + } else if x.annv[1].ref_start == x.annv[0].ref_start + x.annv[0].match_len { + for m in x.annv[1].ref_start as usize..rt.len() { + r.push(rt.get(m)); + } + vs.push(r.clone()); + } else { + // maybe can't happen + vs.push(rt.clone()); + } + } else { + vs.push(rt.clone()); + } + cdr3s.push(x.cdr3_dna.clone()); + + // Modify the exact subclonotype to fill in some members. + // This is the only place where build_info modifies the exact subclonotype. + + x.seq_del.clone_from(&tigs[tigs.len() - 1]); + x.seq_del_amino + .clone_from(&tigs_amino[tigs_amino.len() - 1]); + x.aa_mod_indel + .clone_from(&aa_mod_indel[aa_mod_indel.len() - 1]); + x.ins.clone_from(&tigs_ins[tigs_ins.len() - 1]); + x.vs = vs[vs.len() - 1].clone(); + x.js = js[js.len() - 1].clone(); + } + let mut origin = Vec::::new(); + for j in 0..exact_clonotype.clones.len() { + origin.push(exact_clonotype.clones[j][0].dataset_index); + } + unique_sort(&mut origin); + let shares = &exact_clonotype.share; + let mut placed = false; + let mut res = Result { + clone_info: Default::default(), + exact_clonotype: updated_exact_clonotype, + fate: Default::default(), + }; + for i1 in 0..shares.len() { + if shares[i1].left { + for i2 in 0..shares.len() { + if !shares[i2].left { + placed = true; + let lensx = [lens[i1], lens[i2]].to_vec(); + let tigsx = [tigs[i1].clone(), tigs[i2].clone()].to_vec(); + let tigs_aminox = + [tigs_amino[i1].clone(), tigs_amino[i2].clone()].to_vec(); + let tigspx = [tigsp[i1].clone(), tigsp[i2].clone()].to_vec(); + let has_delx = [has_del[i1], has_del[i2]].to_vec(); + let vsx = [vs[i1].clone(), vs[i2].clone()].to_vec(); + let jsx = [js[i1].clone(), js[i2].clone()].to_vec(); + let cdr3sx = [cdr3s[i1].clone(), cdr3s[i2].clone()].to_vec(); + let vsidsx = [vsids[i1], vsids[i2]].to_vec(); + let jsidsx = [jsids[i1], jsids[i2]].to_vec(); + let exact_cols = vec![i1, i2]; + res.clone_info.push(CloneInfo { + lens: lensx, + tigs: tigsx, + tigs_amino: tigs_aminox, + tigsp: tigspx, + has_del: has_delx, + clonotype_index: i, + exact_cols, + origin: origin.clone(), + vs: vsx.clone(), + js: jsx, + vsids: vsidsx, + jsids: jsidsx, + cdr3s: cdr3sx, + }); + } + } + } + } + + // Incorporate improper cells if they are onesies. Note that we're dropping the + // improper cells having two or more chains. + + if !placed && shares.len() > 1 { + let ex = &exact_clonotypes[i]; + for j in 0..ex.clones.len() { + res.fate.push(ImproperFateResult { + dataset_id: ex.clones[j][0].dataset_index, + barcode: ex.clones[j][0].barcode.clone(), + }); + } + } + if !placed && shares.len() == 1 { + let mut exact_cols = Vec::::new(); + for i in 0..tigs.len() { + exact_cols.push(i); + } + res.clone_info.push(CloneInfo { + lens, + tigs, + tigs_amino, + tigsp, + has_del, + clonotype_index: i, + exact_cols, + origin: origin.clone(), + vs: vs.clone(), + js, + vsids, + jsids, + cdr3s, + }); + } + res + }) + .collect(); + + // Cumulate info. This is single threaded and could probably be speeded up. + let mut info = Vec::::new(); + for (i, r) in results.into_iter().enumerate() { + info.extend(r.clone_info); + exact_clonotypes[i] = r.exact_clonotype; + for f in r.fate { + fate[f.dataset_id].insert(f.barcode, BarcodeFate::Improper); + } + } + + // Sort info. + + info.par_sort(); + + // Done. + + info +} + +fn emit_codon_color_escape(c: &[u8], log: &mut Vec) { + let mut s = 0; + if c == b"CTG" { + s = 3; + } else if c == b"AGG" { + s = 1; + } else if c == b"AGT" { + s = 2; + } else { + for i in 0..3 { + if c[i] == b'A' { + } else if c[i] == b'C' { + s += 1; + } else if c[i] == b'G' { + s += 2; + } else if c[i] == b'T' { + s += 3; + } else { + panic!("Illegal codon: \"{}\".", strme(c)); + } + } + } + let s = s % 6; + print_color(s, log); +} + +fn print_color(s: usize, log: &mut Vec) { + assert!(s < 7); + if s == 0 { + log.append(&mut b"".to_vec()); + } else if s == 1 { + log.append(&mut b"".to_vec()); + } else if s == 2 { + // At one point this was made bold, which makes it more readable when printed, but + // it's uglier if bold and overall contrast is reduced. + log.append(&mut b"".to_vec()); + } else if s == 3 { + log.append(&mut b"".to_vec()); + } else if s == 4 { + log.append(&mut b"".to_vec()); + } else if s == 5 { + log.append(&mut b"".to_vec()); + } else { + log.append(&mut b"".to_vec()); + } +} diff --git a/lib/rust/enclone/src/innate.rs b/lib/rust/enclone/src/innate.rs new file mode 100644 index 0000000..1f53597 --- /dev/null +++ b/lib/rust/enclone/src/innate.rs @@ -0,0 +1,250 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Functions relating to the identification if iNKT and MAIT cells. + +// species: return "human" or "mouse" or "unknown", based on a 60-base perfect match between +// the TRAC or IGHM sequence in the provided reference sequences, and internally provided reference +// sequences for human and mouse, for those regions. + +use enclone_core::defs::ExactClonotype; +use string_utils::TextUtils; +use vdj_ann::refx::RefData; +use vector_utils::{bin_member, reverse_sort, unique_sort}; + +pub fn species(refdata: &RefData) -> &'static str { + let mut my_trac = Vec::>::new(); + for i in 0..refdata.refs.len() { + if refdata.name[i].starts_with("TRAC") || refdata.name[i].starts_with("IGHM") { + my_trac.push(refdata.refs[i].to_ascii_vec()); + } + } + const K: usize = 60; + let mut kmers = Vec::<&[u8]>::new(); + for tr in &my_trac { + if tr.len() >= K { + for j in 0..=tr.len() - K { + kmers.push(&tr[j..j + K]); + } + } + } + unique_sort(&mut kmers); + let mut counts = Vec::<(usize, &'static str)>::new(); + for pass in 1..=2 { + let mut count = 0; + let species = if pass == 1 { "human" } else { "mouse" }; + + // Build trac. This is the concatenation, with single space separation, of the all + // the human (pass = 1) or mouse (pass = 2) reference sequences that contain + // |TRAC or |IGHM, for particular versions of these reference sequences (and probably + // that choice doesn't matter much). + + let trac = if pass == 1 { + b"GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCG\ + TTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCA\ + GCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCA\ + AGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACG\ + TGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCA\ + ACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCG\ + AGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCT\ + ACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATC\ + ACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCG\ + CCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCA\ + CCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGA\ + GCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGT\ + TCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCC\ + TGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGT\ + GCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGA\ + AGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGT\ + CCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCG\ + AGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCA\ + CCTGCTAC GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCA\ + GCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACT\ + CTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGC\ + TGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAG\ + AAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCT\ + TCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCT\ + GGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGC\ + CCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCC\ + GCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCC\ + GGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAG\ + ACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACA\ + TCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCG\ + GGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGG\ + GGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCA\ + CCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGT\ + CCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCC\ + TGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACA\ + GGGTCACCGAGAGGACCGTGGACAAGTCCACCGAGGGGGAGGTGAGCGCCGACGAGGAGGGCTTTGAGAACCTGT\ + GGGCCACCGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGTACCACCGTCACCTTGTTCAAGG\ + TGAAA ATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCC\ + TATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTG\ + TGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTG\ + CAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGC\ + TGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCC\ + TCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC" + } else { + b"AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCA\ + TGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCA\ + TCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTC\ + CCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGC\ + ATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTG\ + GCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGC\ + TAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCC\ + AAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTG\ + TGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAA\ + CCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACC\ + TGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCA\ + TGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGA\ + AGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGG\ + TGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAG\ + TCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCC\ + AAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGA\ + CTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGG\ + TGACCGAGAGGACCGTGGACAAGTCCACTGGTAAACCCACACTGTACAATGTCTCCCTGATCATGTCTGACACAG\ + GCGGCACCTGCTAT AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATA\ + AGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGA\ + ACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGC\ + AGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCA\ + AAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCAC\ + GGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGA\ + TCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACA\ + AAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATG\ + TGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCT\ + CCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCT\ + GTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAA\ + CCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAG\ + ACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCT\ + CAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGA\ + GGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAG\ + GGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTA\ + CCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGG\ + CCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGAGGGGGAGGTGAATGCTGAGGAGGAAGGCT\ + TTGAGAACCTGTGGACCACTGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGCACCACCGTCA\ + CCCTGTTCAAGGTGAAA ACATCCAGAACCCAGAACCTGCTGTGTACCAGTTAAAAGATCCTCGGTCTCAGGACA\ + GCACCCTCTGCCTGTTCACCGACTTTGACTCCCAAATCAATGTGCCGAAAACCATGGAATCTGGAACGTTCATCA\ + CTGACAAAACTGTGCTGGACATGAAAGCTATGGATTCCAAGAGCAATGGGGCCATTGCCTGGAGCAACCAGACAA\ + GCTTCACCTGCCAAGATATCTTCAAAGAGACCAACGCCACCTACCCCAGTTCAGACGTTCCCTGTGATGCCACGT\ + TGACTGAGAAAAGCTTTGAAACAGATATGAACCTAAACTTTCAAAACCTGTCAGTTATGGGACTCCGAATCCTCC\ + TGCTGAAAGTAGCCGGATTTAACCTGCTCATGACGCTGAGGCTGTGGTCCAGT" + }; + + // Test the kmers. + + for i in 0..=trac.len() - K { + let kmer = &trac[i..i + K]; + if bin_member(&kmers, &kmer) { + count += 1; + } + } + counts.push((count, species)); + } + reverse_sort(&mut counts); + if counts[0].0 == counts[1].0 { + "unknown" + } else { + counts[0].1 + } +} + +// innate_cdr3: for the given species and given class (iNKT or MAIT), return the list of CDR3_AA +// sequences that are known to occur for that class. These are defined in files in this directory. + +pub fn innate_cdr3(species: &str, class: &str) -> Vec { + assert!(class == "iNKT" || class == "MAIT"); + let mut json = String::new(); + if species == "human" && class == "iNKT" { + json = include_str!["human_iNKT_CDR3.json"].to_string(); + } else if species == "human" && class == "MAIT" { + json = include_str!["human_MAIT_CDR3.json"].to_string(); + } + let mut cdr3 = Vec::::new(); + for line in json.lines() { + if line.contains("\"cdr3\": ") { + cdr3.push(line.after("\"cdr3\": ").between("\"", "\"").to_string()); + } + } + unique_sort(&mut cdr3); + cdr3 +} + +// mark_innate: for each exact subclonotype, fill in iNKT and MAIT fields. + +pub fn mark_innate(refdata: &RefData, ex: &mut Vec) { + let species = species(refdata); + let inkt_cdr3 = innate_cdr3(species, "iNKT"); + let mait_cdr3 = innate_cdr3(species, "MAIT"); + for e in ex { + let (mut have_mait_tra, mut have_mait_trb) = (false, false); + let (mut have_mait_tra_cdr3, mut have_mait_trb_cdr3) = (false, false); + let (mut have_inkt_tra, mut have_inkt_trb) = (false, false); + let (mut have_inkt_tra_cdr3, mut have_inkt_trb_cdr3) = (false, false); + for share in &e.share { + let mut vname = refdata.name[share.v_ref_id].as_str(); + if vname.contains('*') { + vname = vname.before("*"); + } + let mut jname = refdata.name[share.j_ref_id].as_str(); + if jname.contains('*') { + jname = jname.before("*"); + } + if species == "human" { + if vname == "TRAV10" && jname == "TRAJ18" { + have_inkt_tra = true; + } + if vname == "TRBV25-1" { + have_inkt_trb = true; + } + if vname == "TRAV1-2" + && (jname == "TRAJ33" || jname == "TRAJ20" || jname == "TRAJ12") + { + have_mait_tra = true; + } + if vname.starts_with("TRBV20") || vname.starts_with("TRBV6") { + have_mait_trb = true; + } + } else if species == "mouse" { + if vname == "TRAV1" && jname == "TRAJ33" { + have_mait_tra = true; + } + if vname == "TRBV19" + || vname == "TRBV13-1" + || vname == "TRBV13-2" + || vname == "TRBV13-3" + { + have_mait_trb = true; + } + if (vname == "TRAV11" || vname == "TRAV11D") && jname == "TRAJ18" { + have_inkt_tra = true; + } + if vname == "TRBV13-2" || vname == "TRBV1" || vname == "TRBV29" { + have_inkt_trb = true; + } + } + if share.left { + if bin_member(&inkt_cdr3, &share.cdr3_aa) { + have_inkt_trb_cdr3 = true; + } + if bin_member(&mait_cdr3, &share.cdr3_aa) { + have_mait_trb_cdr3 = true; + } + } else { + if bin_member(&inkt_cdr3, &share.cdr3_aa) { + have_inkt_tra_cdr3 = true; + } + if bin_member(&mait_cdr3, &share.cdr3_aa) { + have_mait_tra_cdr3 = true; + } + } + } + for share in &mut e.share { + share.inkt_alpha_chain_gene_match = have_inkt_tra; + share.inkt_alpha_chain_junction_match = have_inkt_tra_cdr3; + share.inkt_beta_chain_gene_match = have_inkt_trb; + share.inkt_beta_chain_junction_match = have_inkt_trb_cdr3; + share.mait_alpha_chain_gene_match = have_mait_tra; + share.mait_alpha_chain_junction_match = have_mait_tra_cdr3; + share.mait_beta_chain_gene_match = have_mait_trb; + share.mait_beta_chain_junction_match = have_mait_trb_cdr3; + } + } +} diff --git a/lib/rust/enclone/src/join.rs b/lib/rust/enclone/src/join.rs new file mode 100644 index 0000000..f1867f3 --- /dev/null +++ b/lib/rust/enclone/src/join.rs @@ -0,0 +1,161 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// This file provides the single function join_exacts, which computes the equivalence relation +// on exact subclonotypes. +// +// Note that in principle the specificity of joining might be increased by using nonproductive +// contigs that represent the sequence of the "other" allele. This does not look easy to +// execute. + +use self::refx::RefData; +use crate::join2::{finish_join, JoinResult}; +use crate::join_core::join_core; +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype, PotentialJoin}; +use equiv::EquivRel; +use qd::Double; +use rayon::prelude::*; +use std::cmp::min; +use std::collections::HashMap; +use vdj_ann::refx; +use vector_utils::erase_if; + +pub fn join_exacts( + to_bc: &HashMap<(usize, usize), Vec>, + refdata: &RefData, + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + sr: &[Vec], + report_whitelist_contamination: bool, +) -> (EquivRel, Vec<(i32, i32)>) { + // Find potential joins. + + let mut i = 0; + let mut results = Vec::::new(); + while i < info.len() { + let mut j = i + 1; + while j < info.len() { + // Note that the organization of the loop here separates info entries by their + // contig lengths. One could rejigger the code to also separate by CDR3 lengths, + // but surprisingly this doesn't help much if any. It does perturb results very + // slightly. + if info[j].lens != info[i].lens { + break; + } + j += 1; + } + results.push(JoinResult::new(i, j)); + i = j; + } + + let joinf = |r: &mut JoinResult| { + let (i, j) = (r.i, r.j); + let joins = &mut r.joins; + let errors = &mut r.errors; + let mut pot = Vec::::new(); + + // Main join logic. If you change par_iter_mut to iter_mut above, and run happening, + // a lot of time shows up on the following line. If further you manually inline join_core + // here, then instead the time shows up on the results.iter_mut line. It's not clear + // what this means. + + join_core( + i, + j, + ctl, + exact_clonotypes, + info, + to_bc, + sr, + &mut pot, + refdata, + ); + + // Run two passes. + + for _ in 0..2 { + // Form the equivalence relation implied by the potential joins. + + let mut eq: EquivRel = EquivRel::new((j - i) as u32); + for pot in &pot { + let (k1, k2) = (pot.k1, pot.k2); + eq.join(k1 - i, k2 - i); + } + + // Impose a higher bar on joins that involve only two cells. (not documented) + + let mut to_pot = vec![Vec::::new(); j - i]; + for (pj, pot) in pot.iter().enumerate() { + let k1 = pot.k1; + to_pot[k1 - i].push(pj); + } + let mut to_delete = vec![false; pot.len()]; + for mut cc_iter in eq.all_sets() { + // Count the number of cells in the candidate clonotype. + + let mut ncells = 0; + for t in cc_iter.duplicate() { + let k = t + i; + let mult = exact_clonotypes[info[k].clonotype_index].ncells(); + ncells += mult; + } + + // Impose more stringent conditions if number of cells is two. + + if ncells == 2 && cc_iter.size() == 2 { + let x0 = cc_iter.next().unwrap(); + let x1 = cc_iter.next().unwrap(); + let (k1, k2) = (x0 + i, x1 + i); + let k = min(k1, k2); + for pj in &to_pot[k - i] { + let cd = pot[*pj].cd; + let shares = &pot[*pj].shares; + + // Impose higher bar. + + let min_shares = shares.iter().min().unwrap(); + if cd > *min_shares / 2 { + to_delete[*pj] = true; + } + } + } + } + erase_if(&mut pot, &to_delete); + } + + // Analyze potential joins. + + let mut eq: EquivRel = EquivRel::new((j - i) as u32); + for pj in pot { + let k1 = pj.k1; + let k2 = pj.k2; + let err = pj.err; + + // Do nothing if join could have no effect on equivalence relation. + + if eq.set_id(k1 - i) == eq.set_id(k2 - i) { + continue; + } + + // Save join and tally stats. + + r.join_list.push((k1, k2)); + *joins += 1; + if err { + *errors += 1; + } + eq.join(k1 - i, k2 - i); + } + }; + + results.par_iter_mut().for_each(joinf); + + let mut raw_joins = Vec::new(); + for r in &results { + for &j in &r.join_list { + raw_joins.push((j.0 as i32, j.1 as i32)); + } + } + let eq = finish_join(info, results, report_whitelist_contamination); + (eq, raw_joins) +} diff --git a/lib/rust/enclone/src/join2.rs b/lib/rust/enclone/src/join2.rs new file mode 100644 index 0000000..f2207fb --- /dev/null +++ b/lib/rust/enclone/src/join2.rs @@ -0,0 +1,73 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// This file provides the tail end code for join.rs, plus a small function used there. + +use enclone_core::defs::CloneInfo; +use equiv::EquivRel; +use stats_utils::percent_ratio; +use vector_utils::next_diff1_2; + +pub struct JoinResult { + pub i: usize, + pub j: usize, + pub joins: usize, + pub errors: usize, + pub join_list: Vec<(usize, usize)>, +} + +impl JoinResult { + pub fn new(i: usize, j: usize) -> Self { + Self { + i, + j, + joins: 0, + errors: 0, + join_list: Default::default(), + } + } +} + +pub fn finish_join( + info: &[CloneInfo], + results: Vec, + report_whitelist_contamination: bool, +) -> EquivRel { + // Tally results. + // Make equivalence relation. + let (mut joins, mut errors) = (0, 0); + let mut eq: EquivRel = EquivRel::new(info.len() as u32); + + for r in results { + joins += r.joins; + errors += r.errors; + for j in &r.join_list { + eq.join(j.0, j.1); + } + } + // Report whitelist contamination. + // WARNING: THIS ONLY WORKS IF YOU RUN WITH CLONES=1 AND NO OTHER FILTERS. + // TODO: we should actually make an assertion that this is true. + if report_whitelist_contamination { + let bad_rate = percent_ratio(joins, errors); + println!("whitelist contamination rate = {bad_rate:.2}%"); + } + + // Join candidate clonotypes that cross subclones of a clone. This arose because we split up multi-chain + // clonotypes into two-chain clonotypes. + + let mut ox = Vec::new(); + for (i, x) in info.iter().enumerate() { + ox.push((x.clonotype_index, eq.set_id(i))); + } + ox.sort_unstable(); + let mut i = 0; + while i < ox.len() { + let j = next_diff1_2(&ox, i); + for k in i..j - 1 { + eq.join(ox[k].1, ox[k + 1].1); + } + i = j; + } + + eq +} diff --git a/lib/rust/enclone/src/join_core.rs b/lib/rust/enclone/src/join_core.rs new file mode 100644 index 0000000..fb0ca0a --- /dev/null +++ b/lib/rust/enclone/src/join_core.rs @@ -0,0 +1,39 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype, PotentialJoin}; +use enclone_core::join_one::join_one; +use equiv::EquivRel; +use qd::Double; +use std::collections::HashMap; +use vdj_ann::refx::RefData; + +#[allow(clippy::too_many_arguments)] +pub fn join_core( + i: usize, + j: usize, + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + to_bc: &HashMap<(usize, usize), Vec>, + sr: &[Vec], + pot: &mut Vec, + refdata: &RefData, +) { + let mut eq: EquivRel = EquivRel::new((j - i) as u32); + for k1 in i..j { + for k2 in k1 + 1..j { + // Do nothing if join could have no effect on equivalence relation. + // For certain samples, this hugely reduces run time. That is the purpose of + // having the equivalence relation. Observed on MALT samples including 83808. + // MALT is a B cell cancer in which j-i is very large and in fact the number of + // exact subclonotypes in one clonotype is very large. + + if eq.set_id(k1 - i) == eq.set_id(k2 - i) { + continue; + } + if join_one(k1, k2, ctl, exact_clonotypes, info, to_bc, sr, pot, refdata) { + eq.join(k1 - i, k2 - i); + } + } + } +} diff --git a/lib/rust/enclone/src/lib.rs b/lib/rust/enclone/src/lib.rs new file mode 100644 index 0000000..e97216b --- /dev/null +++ b/lib/rust/enclone/src/lib.rs @@ -0,0 +1,41 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +use enclone_core::{barcode_fate::BarcodeFate, enclone_structs::BarcodeFates}; +use itertools::zip_eq; +use vector_utils::erase_if_iter; + +pub mod allele; +pub mod graph_filter; +pub mod info; +pub mod innate; +pub mod join; +pub mod join2; +pub mod join_core; +pub mod misc1; +pub mod misc2; +pub mod misc3; + +pub trait BarcodeFilter { + /// Filter the collection of items. + /// For any item that the filter removes, return the reason the barcode was + /// removed. + // TODO: if all filters apply a single fate, we could extract this into a + // trait constant. + fn filter(&self, items: &[T]) -> Vec>; + + /// Get the dataset ID and barcodes from this item to record fate. + fn fate_keys(&self, item: &T) -> impl Iterator; + + fn filter_items(&self, items: &mut Vec, fate: &mut [BarcodeFates]) { + let filter_result = self.filter(items); + for (item, filter_reason) in zip_eq(items.iter_mut(), &filter_result) { + let Some(reason) = filter_reason else { + continue; + }; + for (dataset_id, barcode) in self.fate_keys(item) { + fate[dataset_id].insert(barcode.to_string(), *reason); + } + } + erase_if_iter(items, filter_result.iter().map(Option::is_some)); + } +} diff --git a/lib/rust/enclone/src/misc1.rs b/lib/rust/enclone/src/misc1.rs new file mode 100644 index 0000000..5e29c52 --- /dev/null +++ b/lib/rust/enclone/src/misc1.rs @@ -0,0 +1,179 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Miscellaneous functions. + +use crate::BarcodeFilter; +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::{ExactClonotype, OriginInfo, TigData}; +use vector_utils::{bin_member, bin_position, erase_if, next_diff, next_diff1_3, unique_sort}; + +/// If a V..J segment appears in exactly one dataset, with frequency n, let x be the total +/// number of productive pairs for that dataset, and let y be the total number of productive +/// pairs for all datasets from the same origin. If (x/y)^n <= 10^-6, i.e. the probability +/// that assuming even distribution, all instances of that V..J ended up in that one dataset, +/// delete all the productive pairs for that V..J segment that do not have at least 100 +/// supporting UMIs. (Note no attempt to do Bonferroni correction.) +/// +/// For the case of two datasets for one origin, with equal numbers of productive pairs in +/// each, this corresponds roughly to the case n = 20. +/// +/// Note that we could modify this to allow *some* occurrences in other datasets. +/// +/// There are only certain ways that these misdistribution events could happen: +/// +/// 1. A cell (and particularly a plasma cell or plasmablast) bursts after drawing cells to +/// make libraries, leaving behind cell fragments that seed separate GEMs +/// (probably most likely). +/// 2. Multiple gel beads end up in one GEM. +/// 3. Something involving like cells sticking together and subsequently separating. +/// 4. Physical contamination of libraries. +/// 5. Informatic mixup of libraries. +/// 6. Nothing other than a low probability event (unlikely). +/// +/// Note that in case 1, we have evidence that a plasma cell or plasmablast existed in the +/// original cells that were drawn (perhaps breaking up in the process of drawing), and was +/// subsequently distintegrated. +pub struct CrossFilter<'a> { + pub origin_info: &'a OriginInfo, +} + +impl<'a> BarcodeFilter> for CrossFilter<'a> { + fn fate_keys(&self, item: &Vec) -> impl Iterator { + std::iter::once((item[0].dataset_index, item[0].barcode.clone())) + } + + fn filter(&self, tig_bc: &[Vec]) -> Vec> { + // Get the list of dataset origins. Here we allow the same origin name to have been used + // for more than one donor, as we haven't explicitly prohibited that. + + let mut origins = Vec::<(&str, &str)>::new(); + for i in 0..self.origin_info.n() { + origins.push(( + self.origin_info.donor_id[i].as_str(), + self.origin_info.origin_id[i].as_str(), + )); + } + unique_sort(&mut origins); + let to_origin = self + .origin_info + .donor_id + .iter() + .zip(self.origin_info.origin_id.iter()) + .map(|(donor_id, origin_id)| { + bin_position(&origins, &(donor_id.as_str(), origin_id.as_str())) as usize + }) + .collect::>(); + + // For each dataset index, and each origin, compute the total number of productive pairs. + + let mut n_dataset_index = vec![0; self.origin_info.n()]; + let mut n_origin = vec![0; origins.len()]; + for tigi in tig_bc { + for x in tigi { + n_dataset_index[x.dataset_index] += 1; + n_origin[to_origin[x.dataset_index]] += 1; + } + } + + // Find all the V..J segments, and for each, the number of times it appears in each + // dataset ID. + // + // Note that there is no point running this unless we have at least two dataset IDs, and in + // fact unless there is an origin with at least two dataset IDs. Better: just gather data + // for the origin for which there are at least two dataset IDs. Also no point if NCROSS. + + let vjx = { + let mut vjx = Vec::<(&[u8], usize, usize)>::new(); // (V..J, dataset index, count) + for tigi in tig_bc { + for x in tigi { + vjx.push((x.seq(), x.dataset_index, 1)); + } + } + vjx.sort(); + let mut to_delete = vec![false; vjx.len()]; + let mut i = 0; + while i < vjx.len() { + let j = next_diff(&vjx, i); // actually only need to check first two fields + vjx[i].2 = j - i; + for d in &mut to_delete[i + 1..j] { + *d = true; + } + i = j; + } + erase_if(&mut vjx, &to_delete); + vjx + }; + + // Now do the cross filter. + + let mut blacklist = Vec::<&[u8]>::new(); + let mut i = 0; + while i < vjx.len() { + let j = next_diff1_3(&vjx, i); + if j - i == 1 { + let dataset_index = vjx[i].1; + let n = vjx[i].2; + let x = n_dataset_index[dataset_index]; + let y = n_origin[to_origin[dataset_index]]; + if y > 0 { + let p = (x as f64 / y as f64).powi(n as i32); + if p <= 1.0e-6 { + blacklist.push(vjx[i].0); + } + } + } + i = j; + } + blacklist.sort(); + let mut to_delete = vec![None; tig_bc.len()]; + const UMIS_SAVE: usize = 100; + for (i, tigi) in tig_bc.iter().enumerate() { + for tig in tigi { + if tig.umi_count < UMIS_SAVE && bin_member(&blacklist, &tig.seq()) { + to_delete[i] = Some(BarcodeFate::Cross); + break; + } + } + } + to_delete + } +} + +/// Filter out some foursie artifacts. +pub struct ArtificialFoursieFilter; + +impl BarcodeFilter for ArtificialFoursieFilter { + fn fate_keys(&self, item: &ExactClonotype) -> impl Iterator { + item.clones + .iter() + .map(|clone| (clone[0].dataset_index, clone[0].barcode.clone())) + } + + fn filter(&self, exact_clonotypes: &[ExactClonotype]) -> Vec> { + let mut twosies = Vec::<(&[u8], &[u8])>::new(); + for ex in exact_clonotypes { + if ex.share.len() == 2 && (ex.share[0].left ^ ex.share[1].left) && ex.ncells() >= 10 { + twosies.push((ex.share[0].seq.as_ref(), ex.share[1].seq.as_ref())); + } + } + unique_sort(&mut twosies); + exact_clonotypes + .iter() + .map(|ex| { + if ex.share.len() == 4 { + for (i1, s1) in ex.share.iter().enumerate() { + for s2 in &ex.share[i1 + 1..4] { + if s1.left ^ s2.left { + let p = (s1.seq.as_ref(), s2.seq.as_ref()); + if bin_member(&twosies, &p) { + return Some(BarcodeFate::FoursieKill); + } + } + } + } + } + None + }) + .collect() + } +} diff --git a/lib/rust/enclone/src/misc2.rs b/lib/rust/enclone/src/misc2.rs new file mode 100644 index 0000000..705a4aa --- /dev/null +++ b/lib/rust/enclone/src/misc2.rs @@ -0,0 +1,341 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Miscellaneous functions. + +use crate::innate::mark_innate; +use amino::nucleotide_to_aminoacid_sequence; +use debruijn::dna_string::DnaString; +use enclone_core::defs::{ + EncloneControl, ExactClonotype, Junction, OriginInfo, TigData, TigData0, TigData1, +}; +use rayon::prelude::*; +use std::cmp::min; +use std::fmt::Write as _; +use vdj_ann::refx::RefData; +use vector_utils::{next_diff, next_diff1_2, next_diff1_3, reverse_sort}; + +pub fn create_exact_subclonotype_core( + // inputs: + tig_bc: &[Vec], + r: usize, + s: usize, +) -> (Vec, Vec>) { + let mut share = Vec::new(); + for m in 0..tig_bc[r].len() { + // Form 5'-UTR consensus sequence. + + let mut utr = Vec::::new(); + let mut pos = 0; + let mut last_calls = 0; + loop { + let mut calls = Vec::<(u8, u8)>::new(); // (base,qual) + for this_tig_bc in &tig_bc[r..s] { + if this_tig_bc[m].v_start > pos { + let p = this_tig_bc[m].v_start - pos - 1; + calls.push((this_tig_bc[m].full_seq[p], this_tig_bc[m].full_quals[p])); + } + } + if calls.is_empty() || calls.len() < last_calls / 10 { + break; + } + last_calls = calls.len(); + calls.sort_unstable(); + let mut callsx = Vec::<(usize, u8)>::new(); // (qual,base) + let mut i = 0; + while i < calls.len() { + let j = next_diff1_2(&calls, i); + let mut q = 0; + for c in &calls[i..j] { + q += c.1 as usize; + } + callsx.push((q, calls[i].0)); + i = j; + } + reverse_sort(&mut callsx); + utr.push(callsx[0].1); + pos += 1; + } + utr.reverse(); + + // Form constant region consensus sequence. + + let mut constx = Vec::::new(); + let mut pos = 0; + let mut last_calls = 0; + loop { + let mut calls = Vec::<(u8, u8)>::new(); // (base,qual) + for this_tig_bc in &tig_bc[r..s] { + if this_tig_bc[m].j_stop + pos < this_tig_bc[m].full_seq.len() { + let p = this_tig_bc[m].j_stop + pos; + calls.push((this_tig_bc[m].full_seq[p], this_tig_bc[m].full_quals[p])); + } + } + if calls.is_empty() || calls.len() < last_calls / 10 { + break; + } + last_calls = calls.len(); + calls.sort_unstable(); + let mut callsx = Vec::<(usize, u8)>::new(); // (qual,base) + let mut i = 0; + while i < calls.len() { + let j = next_diff1_2(&calls, i); + let mut q = 0; + for c in &calls[i..j] { + q += c.1 as usize; + } + callsx.push((q, calls[i].0)); + i = j; + } + reverse_sort(&mut callsx); + constx.push(callsx[0].1); + pos += 1; + } + + // Form full sequence. + + let mut full = utr.clone(); + let mut z = tig_bc[r][m].seq().to_vec(); + full.append(&mut z); + full.append(&mut constx); + + // Note that here we are taking the first entry (r), sort of assuming that all the entries + // are the same, which in principle they should be, but this is not actually always true. + // However this is hard to fix. + + let aa = nucleotide_to_aminoacid_sequence(tig_bc[r][m].seq(), 0); + let mut d_start = None; + if tig_bc[r][m].d_start.is_some() { + d_start = Some(tig_bc[r][m].d_start.unwrap() + utr.len() - tig_bc[r][m].v_start); + } + share.push(TigData1 { + cdr3_dna: tig_bc[r][m].cdr3_dna.clone(), + seq: tig_bc[r][m].seq().to_vec(), + seq_del: tig_bc[r][m].seq().to_vec(), // may get changed later + seq_del_amino: tig_bc[r][m].seq().to_vec(), // may get changed later + ins: Vec::new(), // may get changed later + aa_mod_indel: aa, // may get changed later + full_seq: full, + v_start: utr.len(), + v_stop: tig_bc[r][m].v_stop + utr.len() - tig_bc[r][m].v_start, + v_stop_ref: tig_bc[r][m].v_stop_ref, + d_start, + j_start: tig_bc[r][m].j_start + utr.len() - tig_bc[r][m].v_start, + j_start_ref: tig_bc[r][m].j_start_ref, + j_stop: tig_bc[r][m].j_stop + utr.len() - tig_bc[r][m].v_start, + u_ref_id: tig_bc[r][m].u_ref_id, + v_ref_id: tig_bc[r][m].v_ref_id, + v_ref_id_donor: None, + v_ref_id_donor_alt_id: None, + v_ref_id_donor_donor: None, + d_ref_id: tig_bc[r][m].d_ref_id, + j_ref_id: tig_bc[r][m].j_ref_id, + c_ref_id: tig_bc[r][m].c_ref_id, + fr1_start: tig_bc[r][m].fr1_start, + fr2_start: tig_bc[r][m].fr2_start, + fr3_start: tig_bc[r][m].fr3_start, + cdr1_start: tig_bc[r][m].cdr1_start, + cdr2_start: tig_bc[r][m].cdr2_start, + cdr3_aa: tig_bc[r][m].cdr3_aa.clone(), + cdr3_start: tig_bc[r][m].cdr3_start, + left: tig_bc[r][m].left, + chain_type: tig_bc[r][m].chain_type.clone(), + annv: tig_bc[r][m].annv.clone(), + // these get set when making CloneInfo objects: + vs: DnaString::new(), + js: DnaString::new(), + // iNKT and MAIT annotations + inkt_alpha_chain_gene_match: false, + inkt_alpha_chain_junction_match: false, + inkt_beta_chain_gene_match: false, + inkt_beta_chain_junction_match: false, + mait_alpha_chain_gene_match: false, + mait_alpha_chain_junction_match: false, + mait_beta_chain_gene_match: false, + mait_beta_chain_junction_match: false, + jun: Junction::default(), + }); + } + let mut clones = Vec::new(); + for this_tig_bc in &tig_bc[r..s] { + let mut x = Vec::::new(); + for tbc in this_tig_bc { + x.push(TigData0 { + quals: tbc.quals.clone(), + v_start: tbc.v_start, + j_stop: tbc.j_stop, + c_start: tbc.c_start, + full_seq: tbc.full_seq.clone(), + barcode: tbc.barcode.clone(), + tigname: tbc.tigname.clone(), + dataset_index: tbc.dataset_index, + donor_index: tbc.donor_index, + umi_count: tbc.umi_count, + read_count: tbc.read_count, + v_ref_id: tbc.v_ref_id, + }); + } + clones.push(x); + } + (share, clones) +} + +/// Find exact subclonotypes. +pub fn find_exact_subclonotypes( + ctl: &EncloneControl, + tig_bc: &[Vec], + refdata: &RefData, +) -> Vec { + let mut r: usize = 0; + let mut groups = Vec::<(usize, usize)>::new(); + while r < tig_bc.len() { + let mut s = r + 1; + while s < tig_bc.len() { + let mut ok = true; + if tig_bc[s].len() != tig_bc[r].len() { + break; + } + for m in 0..tig_bc[r].len() { + let (cid1, cid2) = (tig_bc[r][m].c_ref_id, tig_bc[s][m].c_ref_id); + if tig_bc[s][m].cdr3_dna != tig_bc[r][m].cdr3_dna + || tig_bc[s][m].seq() != tig_bc[r][m].seq() + + // Working around a bug here. See above for explanation. + + // || cid1 != cid2 { + + || ( cid1.is_none() && cid2.is_some() ) || ( cid1.is_some() && cid2.is_none() ) + || ( cid1.is_some() && cid2.is_some() + && refdata.name[cid1.unwrap()] != refdata.name[cid2.unwrap()] ) + + || ( cid1.is_some() && cid2.is_some() + && tig_bc[r][m].c_start.unwrap() + tig_bc[s][m].j_stop + < tig_bc[s][m].c_start.unwrap() + tig_bc[r][m].j_stop ) + + // Check for different donors if MIX_DONORS specified on command line. + // Note funky redundancy in checking each chain + + || ( !ctl.cr_opt.mix_donors + && tig_bc[r][m].donor_index != tig_bc[s][m].donor_index ) + { + ok = false; + break; + } + } + if !ok { + break; + } + s += 1; + } + groups.push((r, s)); + r = s; + } + + let mut exact_clonotypes: Vec<_> = groups + .into_par_iter() + .filter_map(|(r, s)| { + let mut bc = (r..s) + .map(|t| (tig_bc[t][0].barcode.as_str(), t)) + .collect::>(); + bc.sort_unstable(); + + // Create the exact subclonotype. + let (share, clones) = create_exact_subclonotype_core(tig_bc, r, s); + + // Save exact subclonotype. + + if !share.is_empty() && !clones.is_empty() { + return Some(ExactClonotype { share, clones }); + } + None + }) + .collect(); + + // Fill in iNKT and MAIT annotations. + + mark_innate(refdata, &mut exact_clonotypes); + + exact_clonotypes +} + +/// Look for barcode reuse. The primary purpose of this is to detect instances where two +/// datasets were obtained from the same cDNA (from the same GEM well). +pub fn check_for_barcode_reuse( + origin_info: &OriginInfo, + tig_bc: &[Vec], +) -> Result<(), String> { + { + const MIN_REUSE_FRAC_TO_SHOW: f64 = 0.25; + let mut all = Vec::<(&str, usize, usize)>::new(); + let mut total = vec![0; origin_info.dataset_id.len()]; + for (i, tig_i) in tig_bc.iter().enumerate() { + all.push((tig_i[0].barcode.as_str(), tig_i[0].dataset_index, i)); + total[tig_i[0].dataset_index] += 1; + } + all.par_sort(); + let mut reuse = Vec::<(usize, usize)>::new(); + let mut i = 0; + while i < all.len() { + let j = next_diff1_3(&all, i); + for k1 in i..j { + for k2 in k1 + 1..j { + // We require identity on one cdr3_aa. That seems to be about the right amount + // of concurrence that should be required. If two datasets arise from the same + // barcode in the same cDNA (from the same GEM well), there can still be + // assembly differences. + + let mut ok = false; + let (u1, u2) = (all[k1].2, all[k2].2); + for v1 in 0..tig_bc[u1].len() { + for v2 in 0..tig_bc[u2].len() { + if tig_bc[u1][v1].cdr3_aa == tig_bc[u2][v2].cdr3_aa { + ok = true; + } + } + } + if ok { + reuse.push((all[k1].1, all[k2].1)); + } + } + } + i = j; + } + reuse.sort_unstable(); + let mut i = 0; + let mut found = false; + let mut msg = String::new(); + while i < reuse.len() { + let j = next_diff(&reuse, i); + let n = j - i; + let (l1, l2) = (reuse[i].0, reuse[i].1); + let (n1, n2) = (total[l1], total[l2]); + let frac = n as f64 / min(n1, n2) as f64; + if frac >= MIN_REUSE_FRAC_TO_SHOW { + if !found { + found = true; + msg += "\nSignificant barcode reuse detected. If at least 25% of the barcodes \ + in one dataset\nare present in another dataset, is is likely that two datasets \ + arising from the\nsame library were included as input to enclone. Since this \ + would normally occur\nonly by accident, enclone exits. \ + If you wish to override this behavior,\nplease rerun with the argument \ + ACCEPT_REUSE.\n\nHere are the instances of reuse that were observed:\n\n"; + } + writeln!( + msg, + "{}, {} ==> {} of {}, {} barcodes ({:.1}%)", + origin_info.dataset_id[l1], + origin_info.dataset_id[l2], + n, + n1, + n2, + 100.0 * frac + ) + .unwrap(); + } + i = j; + } + if found { + return Err(msg); + } + } + Ok(()) +} diff --git a/lib/rust/enclone/src/misc3.rs b/lib/rust/enclone/src/misc3.rs new file mode 100644 index 0000000..93c1b79 --- /dev/null +++ b/lib/rust/enclone/src/misc3.rs @@ -0,0 +1,87 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Miscellaneous functions. + +use enclone_core::defs::TigData; + +use std::cmp::Ordering; + +use vdj_ann::refx::RefData; + +pub fn sort_tig_bc(tig_bc: &mut [Vec], refdata: &RefData, mix_donors: bool) { + tig_bc.sort_by(|x, y| -> Ordering { + for i in 0..x.len() { + // Order by number of chains. + + if i >= y.len() { + return Ordering::Greater; + } + + // Order by cdr3_dna. + + if x[i].cdr3_dna < y[i].cdr3_dna { + return Ordering::Less; + } else if x[i].cdr3_dna > y[i].cdr3_dna { + return Ordering::Greater; + + // Order by chain length. + } else if x[i].len < y[i].len { + return Ordering::Less; + } else if x[i].len > y[i].len { + return Ordering::Greater; + + // Order by chain sequence. + } else if x[i].seq() < y[i].seq() { + return Ordering::Less; + } else if x[i].seq() > y[i].seq() { + return Ordering::Greater; + } + + // Working around a bug here and below. For TCR, there are two TRBC1 records in the, + // reference, having a SNP after our primer, and we appear to pick one of + // them at random. Also not sure this fully respects the sort order. + // And of course a customer could have the same feature in their reference. + + let (cid1, cid2) = (x[i].c_ref_id, y[i].c_ref_id); + if cid1.is_none() && cid2.is_some() { + return Ordering::Less; + } else if cid2.is_none() && cid1.is_some() { + return Ordering::Greater; + + // Order by constant region name. + } else if cid1.is_some() + && cid2.is_some() + && refdata.name[cid1.unwrap()] < refdata.name[cid2.unwrap()] + { + return Ordering::Less; + } else if cid1.is_some() + && cid2.is_some() + && refdata.name[cid1.unwrap()] > refdata.name[cid2.unwrap()] + { + return Ordering::Greater; + + // Order by JC delta. + } else if x[i].c_start.is_some() + && y[i].c_start.is_some() + && x[i].c_start.unwrap() + y[i].j_stop < y[i].c_start.unwrap() + x[i].j_stop + { + return Ordering::Less; + } else if x[i].c_start.is_some() + && y[i].c_start.is_some() + && x[i].c_start.unwrap() + y[i].j_stop > y[i].c_start.unwrap() + x[i].j_stop + { + return Ordering::Greater; + + // Order by donor if MIX_DONORS option used. + } else if !mix_donors && x[i].donor_index < y[i].donor_index { + return Ordering::Less; + } else if !mix_donors && x[i].donor_index > y[i].donor_index { + return Ordering::Greater; + } + } + if x.len() < y.len() { + return Ordering::Less; + } + Ordering::Equal + }); +} diff --git a/lib/rust/enclone_args/Cargo.toml b/lib/rust/enclone_args/Cargo.toml new file mode 100644 index 0000000..6990de8 --- /dev/null +++ b/lib/rust/enclone_args/Cargo.toml @@ -0,0 +1,43 @@ +[dependencies] +[dependencies.anyhow] +workspace = true + +[dependencies.debruijn] +workspace = true + +[dependencies.enclone_core] +path = '../enclone_core' + +[dependencies.io_utils] +path = '../io_utils' + +[dependencies.itertools] +workspace = true + +[dependencies.martian-filetypes] +workspace = true + +[dependencies.rayon] +workspace = true + +[dependencies.string_utils] +path = '../string_utils' + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[dependencies.vdj_types] +path = '../vdj_types' + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'enclone_args' +publish = false +version = '0.1.0' diff --git a/lib/rust/enclone_args/src/lib.rs b/lib/rust/enclone_args/src/lib.rs new file mode 100644 index 0000000..ced598e --- /dev/null +++ b/lib/rust/enclone_args/src/lib.rs @@ -0,0 +1,4 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. +pub mod proc_args3; +pub mod proc_args_post; +pub mod read_json; diff --git a/lib/rust/enclone_args/src/proc_args3.rs b/lib/rust/enclone_args/src/proc_args3.rs new file mode 100644 index 0000000..bf1e535 --- /dev/null +++ b/lib/rust/enclone_args/src/proc_args3.rs @@ -0,0 +1,318 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// This file contains the two functions proc_xcr and proc_meta. + +use enclone_core::defs::{EncloneControl, OriginInfo}; +use io_utils::{dir_list, path_exists}; +use itertools::Itertools; +use rayon::prelude::*; +use std::fmt::Write as _; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use string_utils::TextUtils; +use vdj_types::VdjReceptor; +use vector_utils::unique_sort; + +// Functions to find the path to data. + +pub fn get_path_fail(p: &str, ctl: &EncloneControl, source: &str) -> Result { + for x in &ctl.cr_opt.pre { + let pp = format!("{x}/{p}"); + if path_exists(&pp) { + return Ok(pp); + } + } + if !path_exists(p) { + if ctl.cr_opt.pre.is_empty() { + let path = std::env::current_dir().unwrap(); + return Err(format!( + "\nIn directory {}, unable to find the path {}. This came from the {} argument.\n", + path.display(), + p, + source + )); + } + let path = std::env::current_dir().unwrap(); + let mut pre_msg = "Here are the number of entries in your PRE directories:\n".to_string(); + for x in &ctl.cr_opt.pre { + let mut count = "(does not exist)".to_string(); + if path_exists(x) { + count = dir_list(x).len().to_string(); + } + writeln!(pre_msg, "{x}: {count}").unwrap(); + } + return Err(format!( + "\nIn directory {}, unable to find the\npath {},\n\ + even if prepended by any of the directories \ + in\nPRE={}.\nThis came from the {} argument.\n{}", + path.display(), + p, + ctl.cr_opt.pre.iter().format(","), + source, + pre_msg + )); + } + Ok(p.to_string()) +} + +fn get_path(p: &str, ctl: &EncloneControl, ok: &mut bool) -> String { + *ok = false; + for x in &ctl.cr_opt.pre { + let pp = format!("{x}/{p}"); + if path_exists(&pp) { + *ok = true; + return pp; + } + } + let pp = p.to_string(); + *ok = path_exists(&pp); + pp +} + +fn get_path_or_internal_id(p: &str, ctl: &EncloneControl, source: &str) -> Result { + let mut ok = false; + let mut pp = get_path(p, ctl, &mut ok); + if !ok { + get_path_fail(&pp, ctl, source)?; + } + if !pp.ends_with("/outs") && path_exists(format!("{pp}/outs")) { + pp = format!("{pp}/outs"); + } + Ok(pp) +} + +pub fn proc_xcr( + receptor: VdjReceptor, + val: &str, + ctl: &EncloneControl, +) -> Result { + let xcr = match receptor { + VdjReceptor::IG => "BCR", + VdjReceptor::TR => "TCR", + VdjReceptor::TRGD => "TCRGD", + }; + assert!(!val.is_empty()); + + let donor_groups = vec![val]; + + let mut origin_info = OriginInfo::default(); + + for (id, d) in donor_groups.iter().enumerate() { + let origin_groups = [&d[..]]; + + for (is, s) in origin_groups.iter().enumerate() { + let mut datasets = vec![&s[..]]; + for ds in &mut datasets { + if ds.ends_with('/') { + *ds = ds.rev_before("/"); + } + } + for x in &datasets { + let donor_name = format!("d{}", id + 1); + let origin_name = format!("s{}", is + 1); + origin_info.donor_id.push(donor_name); + origin_info.origin_id.push(origin_name); + let mut dataset_name = (*x).to_string(); + if dataset_name.contains('/') { + dataset_name = dataset_name.rev_after("/").to_string(); + } + origin_info.dataset_id.push(dataset_name.clone()); + } + } + } + + // Get paths. This will need to change when cellranger switches to multi. This code is + // parallelized because this code can indirectly make many calls to path_exists, and the wall + // clock time for these can add up. There should be a way to do this that does not involve + // multithreading. + + let mut results = Vec::<(String, bool, String)>::new(); + for d in donor_groups { + let origin_groups = (*d).split(':').collect::>(); + for s in origin_groups { + let datasets = s.split(',').collect::>(); + for x in datasets { + results.push((x.to_string(), false, String::new())); + } + } + } + + results.par_iter_mut().for_each(|res| { + let p = &mut res.0; + let resx = get_path_or_internal_id(p, ctl, xcr); + match resx { + Err(resx) => res.2 = resx, + Ok(resx) => { + *p = resx; + match receptor { + VdjReceptor::IG => { + if path_exists(format!("{p}/vdj_b")) { + *p = format!("{p}/vdj_b"); + } + if path_exists(format!("{p}/multi/vdj_b")) { + *p = format!("{p}/multi/vdj_b"); + } + } + VdjReceptor::TR => { + if path_exists(format!("{p}/vdj_t")) { + *p = format!("{p}/vdj_t"); + } + if path_exists(format!("{p}/multi/vdj_t")) { + *p = format!("{p}/multi/vdj_t"); + } + } + VdjReceptor::TRGD => (), + } + } + } + }); + for result in results { + if !result.2.is_empty() { + return Err(result.2); + } + origin_info.dataset_path.push(result.0); + } + + Ok(origin_info) +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +fn proc_meta_core( + lines: &[String], + ctl: &EncloneControl, +) -> Result<(VdjReceptor, OriginInfo), String> { + let fields: Vec<_> = lines + .first() + .expect("META file is empty") + .split(',') + .collect(); + let mut fields_sorted = fields.clone(); + unique_sort(&mut fields_sorted); + if fields_sorted.len() < fields.len() { + return Err("\nThe CSV file that you specified using the META argument \ + has duplicate field names\nin its first line.\n" + .to_string()); + } + let allowed_fields = ["bcr", "donor", "origin", "tcr", "tcrgd", "color"]; + for x in &fields { + if !allowed_fields.contains(x) { + return Err(format!( + "\nThe CSV file that you specified using the META argument \ + has an illegal field name ({x}) in its first line.\n" + )); + } + } + let receptor = match ( + fields.contains(&"tcr"), + fields.contains(&"tcrgd"), + fields.contains(&"bcr"), + ) { + (true, false, false) => VdjReceptor::TR, + (false, true, false) => VdjReceptor::TRGD, + (false, false, true) => VdjReceptor::IG, + (false, false, false) => { + return Err("\nThe CSV file that you specified using the META argument \ + has neither the field tcr, tcrgd, or bcr in its first line.\n" + .to_string()); + } + _ => { + return Err("\nThe CSV file that you specified using the META argument \ + has more than one of the fields tcr, bcr, and tcrgd in its first line.\n" + .to_string()); + } + }; + + let mut origin_info = OriginInfo::default(); + + for (count, s) in lines.iter().enumerate().skip(1) { + if !s.starts_with('#') && !s.is_empty() { + let val = s.split(',').collect::>(); + if val.len() != fields.len() { + return Err(format!( + "\nMETA file line {} has a different number of fields than the \ + first line of the file.\n", + count + 1 + )); + } + let mut path = String::new(); + let mut abbr = String::new(); + let mut origin = "s1".to_string(); + let mut donor = "d1".to_string(); + for i in 0..fields.len() { + let x = &fields[i]; + let mut y = val[i].to_string(); + if y.starts_with('"') && y.ends_with('"') { + y = y.after("\"").rev_before("\"").to_string(); + } + if *x == "tcr" || *x == "bcr" || *x == "tcrgd" { + if y.contains(':') { + path = y.after(":").to_string(); + abbr = y.before(":").to_string(); + } else { + path = y.to_string(); + if path.contains('/') { + abbr = path.rev_after("/").to_string(); + } else { + abbr.clone_from(&path); + } + } + } else if *x == "origin" { + origin = y.to_string(); + } else if *x == "donor" { + donor = y.to_string(); + } + } + + path = get_path_or_internal_id(&path, ctl, "META")?; + match receptor { + VdjReceptor::IG => { + if path_exists(format!("{path}/vdj_b")) { + path = format!("{path}/vdj_b"); + } + if path_exists(format!("{path}/multi/vdj_b")) { + path = format!("{path}/multi/vdj_b"); + } + } + VdjReceptor::TR => { + if path_exists(format!("{path}/vdj_t")) { + path = format!("{path}/vdj_t"); + } + if path_exists(format!("{path}/multi/vdj_t")) { + path = format!("{path}/multi/vdj_t"); + } + } + VdjReceptor::TRGD => { + if path_exists(format!("{path}/vdj_t_gd")) { + path = format!("{path}/vdj_t_gd"); + } + if path_exists(format!("{path}/multi/vdj_t_gd")) { + path = format!("{path}/multi/vdj_t_gd"); + } + } + } + origin_info.dataset_path.push(path); + origin_info.dataset_id.push(abbr); + origin_info.donor_id.push(donor); + origin_info.origin_id.push(origin); + } + } + Ok((receptor, origin_info)) +} + +pub fn proc_meta(path: &str, ctl: &EncloneControl) -> Result<(VdjReceptor, OriginInfo), String> { + let Ok(fx) = File::open(path) else { + return Err(format!( + "\nProblem with META: unable to read from the file\n\ + \"{path}\".\nPlease check that that path makes sense and that you have read \ + permission for it.\n" + )); + }; + let f = BufReader::new(fx); + let mut lines = Vec::::new(); + for line in f.lines() { + let s = line.unwrap(); + lines.push(s); + } + proc_meta_core(&lines, ctl) +} diff --git a/lib/rust/enclone_args/src/proc_args_post.rs b/lib/rust/enclone_args/src/proc_args_post.rs new file mode 100644 index 0000000..f197d74 --- /dev/null +++ b/lib/rust/enclone_args/src/proc_args_post.rs @@ -0,0 +1,60 @@ +// Copyright (c) 2022 10X Genomics, Inc. All rights reserved. + +use crate::proc_args3::{get_path_fail, proc_meta, proc_xcr}; +use enclone_core::defs::{EncloneControl, InputSpec}; +use string_utils::TextUtils; +use vector_utils::{next_diff, unique_sort}; + +/// Process input source. +pub fn proc_input_source(ctl: &mut EncloneControl) -> Result<(), String> { + match &ctl.cr_opt.input { + None => { + return Err( + "No input data source provided; you must provide one of TCR, BCR, TCRGD, or META." + .to_string(), + ); + } + Some(InputSpec::MetaFile(path)) => { + let f = get_path_fail(path, ctl, "META")?; + if f.contains('/') { + let d = f.rev_before("/").to_string(); + if !ctl.cr_opt.pre.contains(&d) { + ctl.cr_opt.pre.push(d); + } + } + + let (receptor, origin_info) = proc_meta(&f, ctl)?; + ctl.origin_info = origin_info; + ctl.gen_opt.receptor = receptor; + } + Some(InputSpec::Explicit(receptor, arg)) => { + ctl.origin_info = proc_xcr(*receptor, arg, ctl)?; + ctl.gen_opt.receptor = *receptor; + } + } + + let mut donors = Vec::::new(); + for i in 0..ctl.origin_info.n() { + donors.push(ctl.origin_info.donor_id[i].clone()); + } + unique_sort(&mut donors); + ctl.origin_info.donor_list = donors; + Ok(()) +} + +pub fn validate_opts(ctl: &EncloneControl) -> Result<(), String> { + // Check for duplicated directory paths. + + let mut dp = ctl.origin_info.dataset_path.clone(); + dp.sort(); + let mut i = 0; + while i < dp.len() { + let j = next_diff(&dp, i); + if j - i > 1 { + return Err(format!("\nInput dataset path {} is duplicated.\n", dp[i])); + } + i = j; + } + + Ok(()) +} diff --git a/lib/rust/enclone_args/src/read_json.rs b/lib/rust/enclone_args/src/read_json.rs new file mode 100644 index 0000000..a09b843 --- /dev/null +++ b/lib/rust/enclone_args/src/read_json.rs @@ -0,0 +1,542 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use self::annotate::Annotation; +use self::refx::RefData; +use debruijn::dna_string::DnaString; +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::{EncloneControl, OriginInfo, TigData}; +use enclone_core::enclone_structs::BarcodeFates; +use martian_filetypes::json_file::JsonFile; +use martian_filetypes::LazyFileTypeIO; +use rayon::prelude::*; +use std::collections::HashMap; +use std::fmt::Write; +use string_utils::{stringme, strme, TextUtils}; +use vdj_ann::annotate::{get_cdr3_using_ann, ContigAnnotation}; +use vdj_ann::{annotate, refx}; +use vdj_types::{VdjChain, VdjReceptor, VdjRegion}; +use vector_utils::{bin_position, unique_sort}; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +fn json_error(json: Option<&str>, msg: &str) -> anyhow::Error { + let mut msgx = + "There is something wrong with the contig annotations in the cellranger output file" + .to_string(); + if let Some(json) = json { + write!(msgx, "\n{json}.").unwrap(); + } else { + msgx += "."; + } + msgx += "\n\n"; + msgx += msg; + msgx += "\n\nHere is what you should do:\n\n\ + 1. If you used cellranger version ≥ 4.0, the problem is very likely\n\ + that the directory outs/vdj_reference was not retained, so enclone\n\ + didn't see it, and had to guess what the reference sequence was.\n\ + Fix this and everything should be fine.\n\n\ + 2. If you used cellranger version 3.1, then you need to add a command-line\n\ + argument REF=, or if you already did that,\n\ + make sure it is the *same* as that which you gave cellranger.\n\n\ + 3. If you used cellranger version < 3.1 (the only other possibility), then\n\ + you have options:\n\ + • rerun cellranger using the current version\n\ + • or provide an argument REF= as above and RE to force reannotation\n\ + • or provide the argument BUILT_IN to use the current reference and force\n \ + reannotation (and MOUSE if you used mouse); only works with human and mouse.\n\n\ + Note that one way to get the error is to specify TCR when you meant BCR, or the\n\ + other way.\n\n\ + If you're stuck, please write to us at enclone@10xgenomics.com.\n"; + + anyhow::format_err!("{msgx}") +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +#[derive(Default)] +struct JsonParseResult { + vdj_cell: Option, + gex_cell: Option, + gex_cells_specified: bool, + tig: Option, +} + +#[allow(clippy::too_many_arguments)] +fn process_json_annotation( + ann: ContigAnnotation, + json: &str, + origin_info: &OriginInfo, + dataset_index: usize, + refdata: &RefData, + to_ref_index: &HashMap, + ctl: &EncloneControl, +) -> anyhow::Result { + let mut res: JsonParseResult = Default::default(); + + // Get cell status. Sometime after CR 4.0 was released, and before 4.1 was released, + // we added new fields is_asm_cell and is_gex_cell to the json file. The value of + // is_asm_cell is the original determination of "cell" in the VDJ pipeline, whereas the + // value of is_gex_cell is that for the GEX pipeline. + let mut is_cell = ann.is_cell; + if ann.is_asm_cell.is_some_and(|is_asm_cell| is_asm_cell) { + is_cell = true; + } + + if let Some(is_gex_cell) = ann.is_gex_cell { + res.gex_cells_specified = true; + if is_gex_cell { + res.gex_cell = Some(ann.barcode.clone()); + } + } + + if !is_cell { + return Ok(res); + } + + res.vdj_cell = Some(ann.barcode.clone()); + + // Proceed. + + if !ann.is_productive() { + return Ok(res); + } + if !ann.high_confidence { + return Ok(res); + } + let mut left = false; + let (mut v_ref_id, mut j_ref_id) = (1000000, 0); + let mut d_ref_id: Option = None; + let mut c_ref_id = None; + let mut chain_type = String::new(); + let mut u_ref_id = None; + let (mut tig_start, mut tig_stop) = (-1_isize, -1_isize); + let mut v_stop = 0; + let mut v_stop_ref = 0; + let mut d_start = None; + let mut j_start = 0; + let mut j_start_ref = 0; + let mut c_start = None; + let mut annv = Vec::::new(); + let mut cdr3_aa: String; + let mut cdr3_dna: String; + let mut cdr3_start: usize; + + { + // Use annotations from json file. + + cdr3_aa = ann.cdr3.unwrap(); + cdr3_dna = ann.cdr3_seq.unwrap(); + cdr3_start = ann.cdr3_start.unwrap(); + let annotations = ann.annotations; + assert!(!annotations.is_empty()); + + let mut cigarv = String::new(); // cigar for V segment + for a in annotations { + let region_type = a.feature.region_type; + let feature_id = a.feature.feature_id; + if !to_ref_index.contains_key(&feature_id) { + continue; + } + let feature_idx = to_ref_index[&feature_id]; + let ref_start = a.annotation_match_start; + if region_type == VdjRegion::V { + v_stop = a.contig_match_end; + v_stop_ref = a.annotation_match_end; + } + let gene_name = a.feature.gene_name; + if refdata.name[feature_idx] != gene_name { + return Err(anyhow::format_err!( + "\nThere is an inconsistency between the reference \ + file used to create the Cell Ranger output files in\n{}\nand the \ + reference that enclone is using.\n\nFor example, the feature \ + numbered {} is\nthe gene {} in one and the gene {} in the other.\n\n\ + As far as we know, this type of error can only occur with Cell Ranger \ + versions before 4.0.\n\n\ + If this is mouse data, please use the argument MOUSE, and that may \ + solve the problem.\n\n\ + If this is human or mouse data, and you are OK with using the current \ + built-in reference that\nenclone has, \ + you can instead add the argument BUILT_IN to the command line. This \ + forces\nrecomputation of annotations and may be somewhat slower.\n\n\ + A solution that should always work is to supply\n\ + REF=vdj_reference_fasta_filename as an argument to enclone.\n", + json.rev_before("/"), + feature_id, + gene_name, + refdata.name[feature_idx] + )); + } + if region_type == VdjRegion::V && ref_start == 0 { + let chain = a.feature.chain; + chain_type = chain.to_string(); + tig_start = a.contig_match_start as isize; + cdr3_start -= tig_start as usize; + if chain == VdjChain::IGH + || chain == VdjChain::TRB + || (chain == VdjChain::TRD && ctl.gen_opt.receptor == VdjReceptor::TRGD) + { + left = true; + } + v_ref_id = feature_idx; + cigarv = a.cigar; + } else { + // also check for IG chain????????????????????????????????????????? + let ref_stop = a.annotation_match_end; + let ref_len = a.annotation_length; + if region_type == VdjRegion::J && ref_stop == ref_len { + tig_stop = a.contig_match_end as isize; + j_ref_id = feature_idx; + j_start = a.contig_match_start; + j_start_ref = a.annotation_match_start; + } + if region_type == VdjRegion::UTR { + u_ref_id = Some(feature_idx); + } + if region_type == VdjRegion::D { + d_start = Some(a.contig_match_start); + d_ref_id = Some(feature_idx); + } + if region_type == VdjRegion::C { + c_ref_id = Some(feature_idx); + c_start = Some(a.contig_match_start); + } + } + } + if v_ref_id == 1000000 { + return Ok(res); + } + + // Compute annv from cigarv. We don't compute the mismatch entry. + + let mut cg = Vec::>::new(); // pieces of cigar string + let mut piece = Vec::::new(); + for c in cigarv.chars() { + piece.push(c as u8); + if c.is_ascii_alphabetic() { + cg.push(piece.clone()); + piece.clear(); + } + } + let t = v_ref_id as i32; + let (mut len1, mut len2) = (0, 0); + let (mut ins, mut del) = (0, 0); + for cgi in cg { + let x = strme(&cgi[0..cgi.len() - 1]).force_i32(); + if cgi[cgi.len() - 1] == b'M' { + if len1 == 0 { + len1 = x; + } else if len2 == 0 { + len2 = x; + } else { + // probably can't happen + len1 = 0; + len2 = 0; + break; + } + } + if cgi[cgi.len() - 1] == b'I' { + ins = x; + } + if cgi[cgi.len() - 1] == b'D' { + del = x; + } + } + annv.push(Annotation { + tig_start: 0, + match_len: len1, + ref_id: t, + ref_start: 0, + mismatches: 0, + }); + if ins > 0 && ins % 3 == 0 && del == 0 && len2 > 0 { + let start = len1 + ins; + annv.push(Annotation { + tig_start: start, + match_len: len2, + ref_id: t, + ref_start: len1, + mismatches: 0, + }); + } else if del > 0 && del % 3 == 0 && ins == 0 && len2 > 0 { + annv.push(Annotation { + tig_start: len1, + match_len: len2, + ref_id: t, + ref_start: len1 + del, + mismatches: 0, + }); + } + let rt = &refdata.refs[v_ref_id]; + if annv.len() == 2 && annv[0].match_len as usize > rt.len() { + let msg = format!("annv[0].1 = {}, rt.len() = {}", annv[0].match_len, rt.len()); + return Err(json_error(None, &msg)); + } + + // Check to see if the CDR3 sequence has changed. This could happen if the cellranger + // version for all_contig_annotations.json used an older version of the CDR3 calculation + // than is used in the current version of enclone. This could result in internal + // inconsistencies, leading to an assert somewhere downstream. + + let x = DnaString::from_dna_string(&ann.sequence); + let found_cdr3s = get_cdr3_using_ann(&x, refdata, &annv); + if found_cdr3s.is_empty() { + return Ok(res); + } + let cdr3 = found_cdr3s.first().unwrap(); + let cdr3_aa_alt = stringme(&cdr3.aa_seq); + if cdr3_aa != cdr3_aa_alt { + // This is particularly pathological and rare: + + if tig_start as usize > cdr3.start_position_on_contig { + return Ok(res); + } + + // Define start. + + cdr3_start = cdr3.start_position_on_contig - tig_start as usize; + + // Define cdr3. + + cdr3_aa = cdr3_aa_alt; + cdr3_dna = x + .slice(cdr3_start, cdr3_start + 3 * cdr3_aa.len()) + .to_string(); + } + } + + // Test for two very rare conditions where the CDR3 is busted. This could be confusing to + // users if they hit one of these. + // Case 1: seen on 47680, barcode CGCCAAGTCCATGAAC-1. + // Case 2: seen on 99640, barcode CAGTAACCATGTCGAT-1. + // It is not known if these correspond to bugs in cellranger that were subsequently fixed. + + if cdr3_aa.contains('*') { + return Ok(res); + } + if cdr3_start + 3 * cdr3_aa.len() > tig_stop as usize - tig_start as usize { + return Ok(res); + } + + // Keep going. + + if tig_start < 0 || tig_stop < 0 { + let msg = format!("tig_start = {tig_start}, tig_stop = {tig_stop}"); + return Err(json_error(Some(json), &msg)); + } + let (tig_start, tig_stop) = (tig_start as usize, tig_stop as usize); + let mut quals = ann.quals.as_bytes().to_vec(); + assert_eq!(ann.sequence.len(), ann.quals.as_bytes().len()); + let seq = &ann.sequence[tig_start..tig_stop].to_string(); + for qual in &mut quals { + *qual -= 33_u8; + } + let full_quals = quals; + let quals = full_quals[tig_start..tig_stop].to_vec(); + let umi_count = ann.umi_count; + let read_count = ann.read_count; + let origin = if !origin_info.origin_id[dataset_index].is_empty() { + Some(&origin_info.origin_id[dataset_index]) + } else { + None + }; + let donor = if !origin_info.origin_id[dataset_index].is_empty() { + Some(&origin_info.donor_id[dataset_index]) + } else { + None + }; + let mut donor_index = None; + if origin.is_some() { + if let Some(donor) = donor { + donor_index = Some(bin_position(&origin_info.donor_list, donor) as usize); + } + } + + res.tig = Some(TigData { + cdr3_dna, + len: seq.len(), + v_start: tig_start, + v_stop, + v_stop_ref, + d_start, + j_start, + j_start_ref, + j_stop: tig_stop, + c_start, + full_seq: ann.sequence.as_bytes().to_vec(), + v_ref_id, + d_ref_id, + j_ref_id, + c_ref_id, + u_ref_id, + fr1_start: 0, + cdr1_start: None, + fr2_start: None, + cdr2_start: None, + fr3_start: None, + cdr3_aa, + cdr3_start, + quals, + full_quals, + barcode: ann.barcode, + tigname: ann.contig_name, + left, + dataset_index, + donor_index, + umi_count, + read_count, + chain_type, + annv, + }); + Ok(res) +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Parse the JSON annotations file. +// +// Tracking contigs using bc_cdr3_aa; could improve later. +// +// This section requires 3.1. If you want to avoid that, do something to make tig_start +// and tig_stop always nonnegative. Or use the RE option. + +#[derive(Default)] +struct ReadJsonResult { + vdj_cells: Vec, + gex_cells: Vec, + gex_cells_specified: bool, + tig_bc: Vec>, +} + +fn read_json( + origin_info: &OriginInfo, + dataset_index: usize, + json: &str, + refdata: &RefData, + to_ref_index: &HashMap, + ctl: &EncloneControl, +) -> anyhow::Result { + let mut tigs = Vec::new(); + let mut vdj_cells = Vec::new(); + let mut gex_cells = Vec::new(); + let mut gex_cells_specified = false; + + let reader = JsonFile::from(json).lazy_reader()?; + + for entry in reader { + let result = process_json_annotation( + entry?, + json, + origin_info, + dataset_index, + refdata, + to_ref_index, + ctl, + )?; + if let Some(tig) = result.tig { + tigs.push(tig); + } + if let Some(c) = result.vdj_cell { + vdj_cells.push(c); + } + if let Some(c) = result.gex_cell { + gex_cells.push(c); + } + if result.gex_cells_specified { + gex_cells_specified = true; + } + } + unique_sort(&mut gex_cells); + let mut tig_bc = Vec::>::new(); + let mut r = 0; + while r < tigs.len() { + let mut s = r + 1; + while s < tigs.len() { + if tigs[s].barcode != tigs[r].barcode { + break; + } + s += 1; + } + + // For now we require at most four contigs (but we don't yet merge foursies). + + if s - r <= 4 { + let mut bc_tigs = tigs[r..s].to_vec(); + bc_tigs.sort(); + tig_bc.push(bc_tigs); + } + r = s; + } + unique_sort(&mut vdj_cells); + + // Done. + + Ok(ReadJsonResult { + vdj_cells, + gex_cells, + gex_cells_specified, + tig_bc, + }) +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub struct Annotations { + pub gex_cells: Vec>, + pub gex_cells_specified: Vec, + pub tig_bc: Vec>, + pub fate: Vec, +} + +pub fn parse_json_annotations_files( + ctl: &EncloneControl, + refdata: &RefData, +) -> anyhow::Result { + // Note: only tracking truncated seq and quals initially + let ann = "contig_annotations.json"; + let to_ref_index = refdata + .id + .iter() + .take(refdata.refs.len()) + .enumerate() + .map(|(i, &id)| (id as usize, i)) + .collect(); + let results = ctl + .origin_info + .dataset_path + .par_iter() + .enumerate() + .map(|(li, dataset_path)| { + let json = format!("{dataset_path}/{ann}"); + read_json(&ctl.origin_info, li, &json, refdata, &to_ref_index, ctl).map(|r| (li, r)) + }) + .collect::>>()?; + + let mut ann = Annotations { + tig_bc: Default::default(), + gex_cells: Default::default(), + gex_cells_specified: Default::default(), + fate: vec![HashMap::::new(); ctl.origin_info.n()], + }; + + for (i, result) in results { + let cells = &result.vdj_cells; + let mut found = vec![false; cells.len()]; + let tigs = &result.tig_bc; + for tig in tigs { + let p = bin_position(cells, &tig[0].barcode); + if p >= 0 { + found[p as usize] = true; + } + } + for j in 0..found.len() { + if !found[j] { + ann.fate[i].insert(cells[j].clone(), BarcodeFate::NonProductive); + } + } + + ann.tig_bc.extend(result.tig_bc.into_iter()); + ann.gex_cells.push(result.gex_cells); + ann.gex_cells_specified.push(result.gex_cells_specified); + } + Ok(ann) +} diff --git a/lib/rust/enclone_core/Cargo.toml b/lib/rust/enclone_core/Cargo.toml new file mode 100644 index 0000000..cfda27f --- /dev/null +++ b/lib/rust/enclone_core/Cargo.toml @@ -0,0 +1,44 @@ +[dependencies] +[dependencies.bio_edit] +path = '../bio_edit' + +[dependencies.debruijn] +workspace = true + +[dependencies.enclone_proto] +path = '../enclone_proto' + +[dependencies.qd] +workspace = true + +[dependencies.rayon] +workspace = true + +[dependencies.serde] +features = [] +workspace = true + +[dependencies.stats_utils] +path = '../stats_utils' + +[dependencies.string_utils] +path = '../string_utils' + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[dependencies.vdj_types] +path = '../vdj_types' + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'enclone_core' +publish = false +version = '0.1.0' diff --git a/lib/rust/enclone_core/src/align_to_vdj_ref.rs b/lib/rust/enclone_core/src/align_to_vdj_ref.rs new file mode 100644 index 0000000..3c51718 --- /dev/null +++ b/lib/rust/enclone_core/src/align_to_vdj_ref.rs @@ -0,0 +1,361 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. +// +// Align a sequence to a concatenated V(D)J reference, encouraging insertions exactly at +// junction points and deletions that bridge junction points. +// +// ASSESSMENT +// +// enclone BI=1-4,9 BUILT_IN SUBSET_JSON=subset/outs/all_contig_annotations.json +// MIN_EXACTS=2 MAX_EXACTS=10 +// +// (slow) +// +// enclone BCR=subset GVARS=d_inconsistent_%,d_inconsistent_n +// +// (fast) +// +// inconsistency rate from this = 13.33% +// sample size = 53,373 +// +// If you mess with this, you can test your changes with "cargo t test_enclone_d" and +// "merge_html BUILD" and then manually examine the D gene page. Note carefully that we do not +// want to worsen the placement of indels. Also run the above big test. + +use bio_edit::alignment::pairwise::{Aligner, Scoring, MIN_SCORE}; +use bio_edit::alignment::AlignmentMode; +use bio_edit::alignment::AlignmentOperation::{Del, Ins, Match, Subst}; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Create zero-one vectors corresponding to indel-free aligned parts of the D gene; a zero denotes +// a mismatch. + +pub fn zero_one( + ops: &Vec, + start: usize, + stop: usize, +) -> Vec> { + let mut zos = Vec::>::new(); + { + let mut rpos = 0; + let mut zo = Vec::::new(); + for &om in ops { + match om { + Match => { + if rpos >= start && rpos < stop { + zo.push(1); + } + rpos += 1; + } + Subst => { + if rpos >= start && rpos < stop { + zo.push(0); + } + rpos += 1; + } + Del => { + if !zo.is_empty() { + zos.push(zo.clone()); + zo.clear(); + } + rpos += 1; + } + Ins => { + if !zo.is_empty() { + zos.push(zo.clone()); + zo.clear(); + } + } + _ => {} + }; + } + if !zo.is_empty() { + zos.push(zo.clone()); + } + } + zos +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Compute a match bit score. + +pub fn match_bit_score(zos: &Vec>) -> f64 { + let mut bits = 0.0_f64; + for zo in zos { + for start in 0..zo.len() { + for stop in start + 1..=zo.len() { + let b = &zo[start..stop]; + let n = b.len(); + let mut k = 0; // number of mismatches + for &bz in b { + if bz == 0 { + k += 1; + } + } + + // Let p be the probability that a random DNA sequence of length n will match a + // given DNA sequence with ≤ k mismatches = sum{l=0..=k} (n choose l) * 3^l / 4^n. + + let mut sum = 0.0; + let mut choose = 1.0; + for l in 0..=k { + sum += choose; + choose *= (n - l) as f64; + choose /= (l + 1) as f64; + choose *= 3.0; + } + let p = sum / 4.0_f64.powi(n as i32); + + // Update bits. + + bits = bits.max(-p.log2()); + } + } + } + bits +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +#[allow(clippy::too_many_arguments)] +pub fn align_to_vdj_ref( + seq: &[u8], + vref: &[u8], + dref: &[u8], + d2ref: &[u8], + jref: &[u8], + drefname: &str, // useful for debugging + left: bool, + jscore_match: i32, + jscore_mismatch: i32, + jscore_gap_open: i32, + jscore_gap_extend: i32, + jscore_bits_multiplier: f64, +) -> (Vec, f64) { + // Define penalties. + + let matchp = jscore_match; + let mismatch = jscore_mismatch; + let gap_open = jscore_gap_open; + let gap_extend = jscore_gap_extend; + let gap_open_at_boundary = -40_i32; + let gap_extend_at_boundary = -10_i32; + let del_gap_extend_at_boundary = -20_i32; + let align_div = 10.0; + let bits_multiplier = jscore_bits_multiplier; + const MIN_BITS_FOR_D2: f64 = 14.0; + const D2_PENALTY: f64 = -15.0; + + // Define scoring function. It does not appear that the aligner is scoring in exactly the + // intended fashion in all cases. This is likely more of an issue for alv and alj. The + // problem has to do with the interpretation of being at the boundary. This is still somewhat + // of a problem since although we're rescoring to "fix" the problem, the aligner might have + // chosen a suboptimal placement in the first place. + // + // Note handling of deletions that bridge boundaries. + + let rescore = |ops: &Vec| -> f64 { + let mut score = 0_i32; + let mut i = 0; + let mut rpos = 0; + let b1 = vref.len(); + let b2 = vref.len() + dref.len(); + let b3 = vref.len() + dref.len() + d2ref.len(); + while i < ops.len() { + if ops[i] == Match { + rpos += 1; + score += matchp; + i += 1; + } else if ops[i] == Subst { + rpos += 1; + score += mismatch; + i += 1; + } else if ops[i] == Ins { + let mut j = i + 1; + while j < ops.len() && ops[j] == Ins { + j += 1; + } + if (rpos == vref.len() + dref.len() + d2ref.len()) + || (rpos == vref.len() || rpos == vref.len() + dref.len()) + { + score += gap_open_at_boundary + (j - i - 1) as i32 * gap_extend_at_boundary; + } else { + score += gap_open + (j - i - 1) as i32 * gap_extend; + } + i = j; + } else if ops[i] == Del { + let mut j = i + 1; + while j < ops.len() && ops[j] == Del { + j += 1; + } + if (rpos <= b1 && rpos + j - i >= b1) + || (rpos <= b2 && rpos + j - i >= b2) + || (rpos <= b3 && rpos + j - i >= b3) + { + score += gap_open_at_boundary + (j - i - 1) as i32 * del_gap_extend_at_boundary; + } else { + score += gap_open + (j - i - 1) as i32 * gap_extend; + } + rpos += j - i; + i = j; + } + } + score as f64 / align_div + }; + + // Build concatenation. + + let mut concat = Vec::::with_capacity(vref.len() + dref.len() + d2ref.len() + jref.len()); + concat.extend(vref); + concat.extend(dref); + concat.extend(d2ref); + concat.extend(jref); + + // Set clip penalties. Note that yclip_suffix was set to zero. This was + // accompanied by a change to bio_edit in commit ccabb0dd1768738bdeee5b62458048d74f6dcfab, + // and the entire commit is very flaky. The alignment of these two sequences illustrates + // the problem if one does not make the commit: + // TTACTGTAAAGTCATGCTCTATGATAGTCGTGGTTCTGACTACTACTACGTTATGGACGTCTGGGGC + // TTACTGTGCGAGACAGTATTACTATGATAGTAGTGGTTATTACTACATTACTACTACTACTACGGTATGGACGTCTGGGGC. + + // Make alignment. + + let mut scoring = Scoring::from_scores(gap_open, gap_extend, matchp, mismatch); + scoring.xclip_prefix = MIN_SCORE; + scoring.xclip_suffix = MIN_SCORE; + scoring.yclip_prefix = MIN_SCORE; + scoring.yclip_suffix = 0; + let mut aligner = Aligner::with_scoring(scoring); + let mut gap_open_fn = vec![0_i32; concat.len() + 1]; + for (j, gap) in gap_open_fn.iter_mut().enumerate().skip(1) { + if j == vref.len() + || j == vref.len() + dref.len() + || j == vref.len() + dref.len() + d2ref.len() + { + *gap = gap_open_at_boundary; + } else { + *gap = gap_open; + } + } + let mut gap_extend_fn = vec![0_i32; concat.len() + 1]; + for (j, gap) in gap_extend_fn.iter_mut().enumerate().skip(1) { + if j == vref.len() + || j == vref.len() + dref.len() + || j == vref.len() + dref.len() + d2ref.len() + { + *gap = gap_extend_at_boundary; + } else { + *gap = gap_extend; + } + } + let mut al = aligner.custom_with_gap_fns(seq, &concat, &gap_open_fn, &gap_extend_fn); + al.mode = AlignmentMode::Semiglobal; + let mut ops = al.operations; + + // Fix alignments. + + let mut edits = Vec::<(usize, bio_edit::alignment::AlignmentOperation)>::new(); + let mut i = 0; + let mut pos = 0; + let mut rpos = 0; + let b1 = vref.len(); + let b2 = vref.len() + dref.len(); + let b3 = vref.len() + dref.len() + d2ref.len(); + let mut edited = vec![false; ops.len()]; + while i < ops.len() { + if ops[i] == Match || ops[i] == Subst { + pos += 1; + rpos += 1; + i += 1; + } else if ops[i] == Ins { + let mut j = i + 1; + while j < ops.len() && ops[j] == Ins { + j += 1; + } + pos += j - i; + i = j; + } else if ops[i] == Del { + let mut j = i + 1; + while j < ops.len() && ops[j] == Del { + j += 1; + } + let k = j - i; + for bi in &[b1, b2, b3] { + let bi = *bi; + + // Maybe can shift right one. + + if rpos < bi + && rpos + k >= bi + && j < ops.len() + && pos < seq.len() + && rpos < concat.len() + && ops[j] == Subst + && seq[pos] == concat[rpos] + { + edits.push((i, Match)); + edits.push((j, Del)); + edited[i] = true; + edited[j] = true; + break; + + // Maybe can shift left one. + } else if rpos + k > bi + && i > 0 + && ops[i - 1] == Subst + && seq[pos - 1] == concat[rpos + k - 1] + && !edited[i - 1] + { + edits.push((i - 1, Del)); + edits.push((j - 1, Match)); + edited[i - 1] = true; + edited[j - 1] = true; + break; + } + } + rpos += j - i; + i = j; + } + } + for x in &edits { + ops[x.0] = x.1; + } + + // Create zero-one vectors corresponding to indel-free aligned parts of the D gene; a zero + // denotes a mismatch. Then compute a match bit score. + + let zos1 = zero_one(&ops, vref.len(), vref.len() + dref.len()); + let zos2 = zero_one( + &ops, + vref.len() + dref.len(), + vref.len() + dref.len() + d2ref.len(), + ); + let bits1 = match_bit_score(&zos1); + let bits2 = match_bit_score(&zos2); + let mut bits = bits1.max(bits2); + if !d2ref.is_empty() && bits1.min(bits2) < MIN_BITS_FOR_D2 { + bits = 0.0; + } + + // Add a constant times bits to the alignment score (null case handled differently). + // + // Note that we do not allow the null case if there is an insertion in the alignment. In an + // an earlier version, we allowed many more null cases, and we believe that this was distorting + // our inconsistency scoring. This is because calling null makes it easier to be consistent. + + if left && dref.is_empty() { + if !ops.contains(&Ins) { + bits = 10.0; + } else { + bits = -1000.0; + } + } + let mut full_score = rescore(&ops) + bits_multiplier * bits; + if drefname.contains(':') { + full_score += D2_PENALTY; + } + + // Return the alignment and score. + + (ops, full_score) +} diff --git a/lib/rust/enclone_core/src/barcode_fate.rs b/lib/rust/enclone_core/src/barcode_fate.rs new file mode 100644 index 0000000..7b12657 --- /dev/null +++ b/lib/rust/enclone_core/src/barcode_fate.rs @@ -0,0 +1,78 @@ +use serde::{Deserialize, Serialize}; + +/// Different reasons why a barcode which have productive contig(s) +/// are not called as cells by enclone +/// +/// For more explanation, see +/// and +#[derive(Serialize, Deserialize, Clone, Copy)] +pub enum BarcodeFate { + Doublet, + WeakChains, + /// The barcode was not called as cell by the assembler + NotAsmCell, + FoursieKill, + NotGexCell, + Signature, + /// Find and mark for deletion exact subclonotypes having a variant base in V..J that, + /// accounting for all the cells in all the exact subclonotypes, never occurs as Q60 + /// doesn't occur as Q40 twice, and disagrees with the reference. + Qual, + Umi, + UmiRatio, + /// If a V..J segment appears in exactly one dataset, with frequency n, let x be the total + /// number of productive pairs for that dataset, and let y be the total number of productive + /// pairs for all datasets from the same origin. If (x/y)^n <= 10^-6, i.e. the probability + /// that assuming even distribution, all instances of that V..J ended up in that one dataset, + /// delete all the productive pairs for that V..J segment that do not have at least 100 + /// supporting UMIs. (Note no attempt to do Bonferroni correction.) + /// + /// For the case of two datasets for one origin, with equal numbers of productive pairs in + /// each, this corresponds roughly to the case n = 20. + /// + /// Note that we could modify this to allow *some* occurrences in other datasets. + /// + /// There are only certain ways that these misdistribution events could happen: + /// + /// 1. A cell (and particularly a plasma cell or plasmablast) bursts after drawing cells to + /// make libraries, leaving behind cell fragments that seed separate GEMs + /// (probably most likely). + /// 2. Multiple gel beads end up in one GEM. + /// 3. Something involving like cells sticking together and subsequently separating. + /// 4. Physical contamination of libraries. + /// 5. Informatic mixup of libraries. + /// 6. Nothing other than a low probability event (unlikely). + /// + /// Note that in case 1, we have evidence that a plasma cell or plasmablast existed in the + /// original cells that were drawn (perhaps breaking up in the process of drawing), and was + /// subsequently distintegrated. + Cross, + /// Filter out exact subclonotypes having more than one chain, but all of the same type. + /// For example, the filter removes all exact subclonotypes having two TRA chains and + /// no other chains + Improper, + GraphFilter, + /// No productive contigs for this barcode. This will only happen + /// when certain default filters are turned off + NonProductive, +} + +impl BarcodeFate { + pub fn label(&self) -> &'static str { + match self { + BarcodeFate::Doublet => "DOUBLET", + BarcodeFate::WeakChains => "WEAK_CHAINS", + BarcodeFate::NotAsmCell => "CELL", + BarcodeFate::FoursieKill => "FOURSIE_KILL", + BarcodeFate::NotGexCell => "GEX", + BarcodeFate::Signature => "SIGNATURE", + BarcodeFate::Qual => "QUAL", + BarcodeFate::Umi => "UMI", + BarcodeFate::UmiRatio => "UMI_RATIO", + BarcodeFate::Cross => "CROSS", + BarcodeFate::Improper => "IMPROPER", + BarcodeFate::GraphFilter => "GRAPH_FILTER", + BarcodeFate::NonProductive => "PRODUCTIVE", + } + } +} diff --git a/lib/rust/enclone_core/src/defs.rs b/lib/rust/enclone_core/src/defs.rs new file mode 100644 index 0000000..0af5f83 --- /dev/null +++ b/lib/rust/enclone_core/src/defs.rs @@ -0,0 +1,582 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use debruijn::dna_string::DnaString; +use vdj_ann::annotate::Annotation; +use vdj_types::VdjReceptor; + +/// Clonotyping algorithm heuristics. +#[derive(PartialEq, Eq)] +pub struct ClonotypeHeuristics { + pub max_diffs: usize, + pub max_degradation: usize, + pub ref_v_trim: usize, + pub ref_j_trim: usize, +} + +impl Default for ClonotypeHeuristics { + fn default() -> Self { + Self { + max_diffs: 1_000_000, + max_degradation: 2, + ref_v_trim: 15, + ref_j_trim: 15, + } + } +} + +/// Origin info data structure. +#[derive(Default, PartialEq, Eq)] +pub struct OriginInfo { + // parallel vectors + /// map dataset index to vdj path + pub dataset_path: Vec, + /// map dataset index to dataset short name + pub dataset_id: Vec, + /// map dataset index to donor short name + pub donor_id: Vec, + /// map dataset id to origin (sample) short name + pub origin_id: Vec, + /// unique-sorted list of donor short names + pub donor_list: Vec, +} + +impl OriginInfo { + // number of datasets + pub fn n(&self) -> usize { + self.dataset_path.len() + } +} + +#[derive(Debug, PartialEq)] +pub enum InputSpec { + /// Explicitly-provided pair of receptor and datasets. + Explicit(VdjReceptor, String), + /// Path to a META file containing input spec. + MetaFile(String), +} + +/// The subset of configuration options used by Cellranger. +#[derive(Debug, PartialEq)] +pub struct CellrangerOpt { + /// Where we should fetch input data. + /// This also specifies which receptor we're working with. + // FIXME: we should be able to eliminate optionality. + pub input: Option, + + // FIXME: cellranger actually always sets this to an empty vec + // should eliminate this from this config. + pub pre: Vec, + + /// Path to reference. + pub refname: String, + /// Max number of threads to use for parallel processing. + pub max_cores: Option, + + /// Path to donor reference output file. + pub dref_file: String, + /// Path to protobuf output file. + pub proto: String, + /// Optional path to a json file containing metadata. + pub proto_metadata: String, + /// Optional path to write out barcode fate. + pub fate_file: String, + + /// Cell/clonotype filtering options that may be configured from Cellranger. + pub filter: CellrangerFilterOpt, + + /// allow cells from different donors to be placed in the same clonotype + pub mix_donors: bool, + + // Clonotype joining options. + /// Break up clonotypes than have `split_max_chains` chains or more + pub split_max_chains: usize, +} + +impl Default for CellrangerOpt { + fn default() -> Self { + Self { + input: Default::default(), + pre: Default::default(), + refname: Default::default(), + max_cores: Default::default(), + dref_file: Default::default(), + proto: Default::default(), + proto_metadata: Default::default(), + fate_file: Default::default(), + filter: Default::default(), + mix_donors: Default::default(), + split_max_chains: usize::MAX, + } + } +} + +#[derive(Debug, PartialEq)] +pub struct CellrangerFilterOpt { + /// heavy -> weak chain graph filtering + pub graph: bool, + /// cross-dataset filtering + pub cross_dataset: bool, + /// umi count filter + pub umi_count: bool, + /// umi ratio filter + pub umi_ratio: bool, + /// filter weak chains from clonotypes + pub weak_chains: bool, + /// filter weak foursies + pub weak_foursies: bool, + /// filter putative doublets + pub doublet: bool, + /// signature filtering + pub signature: bool, + /// filter out exact subclonotypes having a weak base + pub qual: bool, +} + +impl Default for CellrangerFilterOpt { + fn default() -> Self { + Self { + graph: true, + cross_dataset: true, + umi_count: true, + umi_ratio: true, + weak_chains: true, + weak_foursies: true, + doublet: true, + signature: true, + qual: true, + } + } +} + +impl CellrangerFilterOpt { + /// Return a filter configuration that should disable all filters. + pub fn disabled() -> Self { + Self { + graph: false, + cross_dataset: false, + umi_count: false, + umi_ratio: false, + weak_chains: false, + weak_foursies: false, + doublet: false, + signature: false, + qual: false, + } + } +} + +/// Miscellaneous general options. +#[derive(PartialEq)] +pub struct GeneralOpt { + pub receptor: VdjReceptor, + pub trace_barcode: String, + /// human or mouse or unknown, determined from the reference sequence + pub species: String, + pub jscore_match: i32, + pub jscore_mismatch: i32, + pub jscore_bits_multiplier: f64, + pub jscore_gap_open: i32, + pub jscore_gap_extend: i32, + pub no_alt_alleles: bool, +} + +impl Default for GeneralOpt { + fn default() -> Self { + Self { + receptor: Default::default(), + trace_barcode: Default::default(), + species: Default::default(), + jscore_match: 20, + jscore_mismatch: -20, + jscore_bits_multiplier: 2.2, + jscore_gap_open: -120, + jscore_gap_extend: -20, + no_alt_alleles: Default::default(), + } + } +} + +impl GeneralOpt { + pub fn is_bcr(&self) -> bool { + self.receptor == VdjReceptor::IG + } + + pub fn is_tcr(&self) -> bool { + matches!(self.receptor, VdjReceptor::TR | VdjReceptor::TRGD) + // if self.bcr { + // assert!(!self.tcr); + // return false; + // } + // // The original logic for computing this value was based on the confusing + // // assumption that this is always true if self.bcr is false. + // // I've preserved this for now, but this line might make sense to add: + // // assert!(self.tcr); + // true + } +} + +/// Allele-finding algorithmic options. +#[derive(PartialEq, Eq)] +pub struct AlleleAlgOpt { + pub min_mult: usize, + pub min_alt: usize, +} + +impl Default for AlleleAlgOpt { + fn default() -> Self { + Self { + min_mult: 4, + min_alt: 4, + } + } +} + +/// Specification of an alternative reference sequence. +#[derive(Clone, PartialOrd, Ord, PartialEq, Eq)] +pub struct AltRef { + pub donor: usize, + pub ref_id: usize, + pub alt_seq: DnaString, + pub support: usize, + pub is_ref: bool, +} + +/// Data about alleles +#[derive(Clone, Default)] +pub struct AlleleData { + pub alt_refs: Vec, +} + +/// Join algorithmic options. +#[derive(PartialEq)] +pub struct JoinAlgOpt { + /// max score for join + pub max_score: f64, + pub max_cdr3_diffs: usize, + pub join_cdr3_ident: f64, + pub fwr1_cdr12_delta: f64, + pub cdr3_normal_len: usize, + pub auto_share: usize, + pub comp_filt: usize, + pub comp_filt_bound: usize, +} + +impl Default for JoinAlgOpt { + fn default() -> Self { + Self { + max_score: 100_000.0, + max_cdr3_diffs: 1000, + join_cdr3_ident: 85.0, + fwr1_cdr12_delta: 20.0, + cdr3_normal_len: 42, + auto_share: 15, + comp_filt: 8, + comp_filt_bound: 80, + } + } +} + +/// Set up control datastructure (EncloneControl). This is stuff that is constant for a given +/// run of enclone. If you add something to this, be sure to update the "changed" section in +/// enclone_server.rs, if needed. +#[derive(Default)] +pub struct EncloneControl { + /// miscellaneous general options + pub gen_opt: GeneralOpt, + /// Config options used by cellranger. + pub cr_opt: CellrangerOpt, + /// algorithmic heuristics + pub heur: ClonotypeHeuristics, + /// origin (sample) info + pub origin_info: OriginInfo, + /// algorithmic options for allele finding + pub allele_alg_opt: AlleleAlgOpt, + /// algorithmic options for join + pub join_alg_opt: JoinAlgOpt, +} + +/// Set up data structure to track clonotype data. A TigData is for one contig; +/// a Vec is for one barcode, and an ExactClonotype is for an exact subclonotype. +#[derive(Eq, Ord, PartialEq, PartialOrd, Clone)] // not sure these are all needed +pub struct TigData { + /// CDR3 DNA sequence + pub cdr3_dna: String, + /// length of V..J sequence + pub len: usize, + /// start of V on full contig sequence + pub v_start: usize, + /// stop of aligned V on full contig sequence + pub v_stop: usize, + /// stop of aligned V on reference V + pub v_stop_ref: usize, + /// start of aligned D on full contig sequence + pub d_start: Option, + /// start of aligned J on full contig sequence + pub j_start: usize, + /// start of aligned J on reference J + pub j_start_ref: usize, + /// stop of J on full contig sequence + pub j_stop: usize, + /// start of C on full contig sequence + pub c_start: Option, + /// full contig sequence + pub full_seq: Vec, + /// index of 5'-UTR in ref file if found + pub u_ref_id: Option, + /// index of V segment reference sequence in ref file + pub v_ref_id: usize, + /// index of D segment reference sequence in ref file + pub d_ref_id: Option, + /// index of J segment reference sequence in ref file + pub j_ref_id: usize, + /// index of C segment reference sequence in ref file + pub c_ref_id: Option, + /// start position in bases of FWR1 on V..J + pub fr1_start: usize, + /// start position in bases of CDR1 on V..J + pub cdr1_start: Option, + /// start position in bases of FWR2 on V..J + pub fr2_start: Option, + /// start position in bases of CDR2 on V..J + pub cdr2_start: Option, + /// start position in bases of FWR3 on V..J + pub fr3_start: Option, + /// CDR3 amino acid sequence + pub cdr3_aa: String, + /// start position in bases of CDR3 on V..J + pub cdr3_start: usize, + /// quality scores, truncated to V..J + pub quals: Vec, + /// quality scores + pub full_quals: Vec, + /// barcode + pub barcode: String, + /// name of contig + pub tigname: String, + /// true if this is IGH or TRB (or TRD in gamma/delta mode) + pub left: bool, + /// index of dataset + pub dataset_index: usize, + /// index of donor + pub donor_index: Option, + /// number of UMIs supporting contig + pub umi_count: usize, + /// number of reads supporting contig + pub read_count: usize, + /// e.g. IGH + pub chain_type: String, + /// V annotation (one or two entries), for V..J + pub annv: Vec, +} + +impl TigData { + pub fn seq(&self) -> &[u8] { + &self.full_seq[self.v_start..self.j_stop] + } +} + +/// The ExactClonotype data structure stores information that could be exhibited as a +/// Vec>>, but it avoids repetition of identical data. +/// +/// TigData0: data for each cell +/// TigData1: shared data +#[derive(Clone)] +pub struct TigData0 { + /// quality scores, truncated to V..J + pub quals: Vec, + /// start of V on full contig sequence + pub v_start: usize, + /// stop of J on full contig sequence + pub j_stop: usize, + /// start of C on full contig sequence + pub c_start: Option, + /// full contig sequence + pub full_seq: Vec, + /// barcode + pub barcode: String, + /// name of contig + pub tigname: String, + /// index of dataset + pub dataset_index: usize, + /// index of donor + pub donor_index: Option, + /// number of UMIs supporting contig + pub umi_count: usize, + /// number of reads supporting contig + pub read_count: usize, + /// index of V segment reference sequence in ref file + pub v_ref_id: usize, +} + +#[derive(Clone, Default)] +pub struct Junction { + /// junction alignment complexity + pub hcomp: usize, +} + +/// The ExactClonotype data structure stores information that could be exhibited as a +/// Vec>>, but it avoids repetition of identical data. +/// +/// TigData0: data for each cell +/// TigData1: shared data +#[derive(Clone)] +pub struct TigData1 { + /// CDR3 DNA sequence + pub cdr3_dna: String, + /// V..J contig subsequence + pub seq: Vec, + /// V..J, possibly with mod 3 del + pub seq_del: Vec, + /// V..J, possibly with mod 3 del at mod 3 start + pub seq_del_amino: Vec, + /// amino acid sequence, after removing indel if present + pub aa_mod_indel: Vec, + /// insertions in V..J (currently at most one) = {(pos, seq)} + /// **before** the given position + pub ins: Vec<(usize, Vec)>, + + /// full contig sequence (consensus) + pub full_seq: Vec, + /// start of V on full contig sequence + pub v_start: usize, + /// stop of aligned V on full contig sequence + pub v_stop: usize, + /// stop of aligned V on reference V + pub v_stop_ref: usize, + /// start of aligned D on full contig sequence + pub d_start: Option, + /// start of aligned J on full contig sequence + pub j_start: usize, + /// start of aligned J on reference J + pub j_start_ref: usize, + /// stop of J on full contig sequence + pub j_stop: usize, + /// index of 5'-UTR in ref file if found + pub u_ref_id: Option, + /// index of V segment reference sequence in ref file + pub v_ref_id: usize, + /// optional index into alt_refs + pub v_ref_id_donor: Option, + /// donor id for v_ref_id_donor + pub v_ref_id_donor_donor: Option, + /// alt ref id for donor id for v_ref_id_donor + pub v_ref_id_donor_alt_id: Option, + /// index of D segment reference sequence in ref file + pub d_ref_id: Option, + /// index of J segment reference sequence in ref file + pub j_ref_id: usize, + /// index of C segment reference sequence in ref file + pub c_ref_id: Option, + /// start position in bases of FWR1 on V..J + pub fr1_start: usize, + /// start position in bases of CDR1 on V..J + pub cdr1_start: Option, + /// start position in bases of FWR2 on V..J + pub fr2_start: Option, + /// start position in bases of CDR2 on V..J + pub cdr2_start: Option, + /// start position in bases of FWR3 on V..J + pub fr3_start: Option, + /// CDR3 amino acid sequence + pub cdr3_aa: String, + /// start position in bases of CDR3 on V..J + pub cdr3_start: usize, + /// true if this is IGH or TRB (or TRD in gamma/delta mode) + pub left: bool, + /// e.g. IGH + pub chain_type: String, + /// V annotation (one or two entries), for V..J + pub annv: Vec, + /// reference V segment (possibly donor allele) + pub vs: DnaString, + /// reference J segment + pub js: DnaString, + pub inkt_alpha_chain_gene_match: bool, + pub inkt_alpha_chain_junction_match: bool, + pub inkt_beta_chain_gene_match: bool, + pub inkt_beta_chain_junction_match: bool, + pub mait_alpha_chain_gene_match: bool, + pub mait_alpha_chain_junction_match: bool, + pub mait_beta_chain_gene_match: bool, + pub mait_beta_chain_junction_match: bool, + pub jun: Junction, +} + +#[derive(Clone)] +pub struct ExactClonotype { + /// clone info that is shared + pub share: Vec, + /// clone info, excluding shared stuff + pub clones: Vec>, +} + +impl ExactClonotype { + pub fn ncells(&self) -> usize { + self.clones.len() + } +} + +/// Define clonotype info data structure. The fact that we have multiple data structures +/// encapsulating the same info is legacy and should be cleaned up. +/// +/// The vectors in a CloneInfo object mostly have length two. The exceptions are in +/// improper clones (not having chains of both types). +#[derive(Eq, Ord, PartialEq, PartialOrd, Default, Clone)] // not sure we need all these +pub struct CloneInfo { + // CAUTION: this struct is sorted by a derived impl, and this sort behavior + // should probably be maintained if we refactor this struct to be a vec of + // structs instead of a struct of vecs. + /// V..J contig lengths (will sort by this) + pub lens: Vec, + /// contigs, truncated to V..J (with possible - chars inserted) + /// note only need tigs in has_del case, could improve + pub tigs: Vec>, + /// same as tigs, but deletion shifted to mod 3 position + /// if there is one (rare, so wasteful, should be Option) + pub tigs_amino: Vec>, + /// contigs, truncated to V..J, packed (doesn't show - chars) + pub tigsp: Vec, + /// if - chars inserted to represent deletion + pub has_del: Vec, + /// the columns of the exact_clonotype that were extracted (used?) + pub exact_cols: Vec, + /// index into vector of all exact subclonotypes (across origins) + pub clonotype_index: usize, + /// origin indices + pub origin: Vec, + /// reference V segments (possibly donor allele) + pub vs: Vec, + /// reference J segments + pub js: Vec, + /// ids of V segments + pub vsids: Vec, + /// ids of J segments + pub jsids: Vec, + /// cdr3 nucleotide seqs + pub cdr3s: Vec, +} + +/// Every entry in a ColInfo is a vector whose number of entries is the number of chains +/// in a clonotype. +#[derive(Clone, Default)] +pub struct ColInfo { + pub uids: Vec>, + pub vids: Vec, + pub vpids: Vec>, + pub dids: Vec>, + pub jids: Vec, + pub cids: Vec>, + pub seqss: Vec>>, + pub mat: Vec>>, +} + +// Potential join structure. + +#[derive(Default)] +pub struct PotentialJoin { + pub k1: usize, + pub k2: usize, + pub cd: isize, + pub shares: Vec, + pub err: bool, +} diff --git a/lib/rust/enclone_core/src/enclone_structs.rs b/lib/rust/enclone_core/src/enclone_structs.rs new file mode 100644 index 0000000..fae8188 --- /dev/null +++ b/lib/rust/enclone_core/src/enclone_structs.rs @@ -0,0 +1,26 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use crate::barcode_fate::BarcodeFate; +use crate::defs::{CloneInfo, ExactClonotype}; +use enclone_proto::types::DonorReferenceItem; +use qd::Double; +use std::collections::HashMap; + +pub type BarcodeFates = HashMap; + +// FIXME: this being i32 is legacy and we should replace this with either u32, +// usize, or a newtype index. +pub type CloneInfoIndex = i32; + +pub type CandidateClonotype = Vec; + +#[derive(Default, Clone)] +pub struct EncloneExacts { + pub to_bc: HashMap<(usize, usize), Vec>, + pub exact_clonotypes: Vec, + pub raw_joins: Vec>, + pub info: Vec, + pub candidate_clonotypes: Vec, + pub drefs: Vec, + pub sr: Vec>, +} diff --git a/lib/rust/enclone_core/src/hcomp.rs b/lib/rust/enclone_core/src/hcomp.rs new file mode 100644 index 0000000..cc75044 --- /dev/null +++ b/lib/rust/enclone_core/src/hcomp.rs @@ -0,0 +1,137 @@ +// Copyright (c) 2022 10X Genomics, Inc. All rights reserved. + +use crate::align_to_vdj_ref::align_to_vdj_ref; +use crate::defs::{EncloneControl, ExactClonotype, Junction}; +use crate::opt_d::{jflank, opt_d}; +use bio_edit::alignment::AlignmentOperation::{Del, Ins, Subst}; +use enclone_proto::types::DonorReferenceItem; +use rayon::prelude::*; +use vdj_ann::refx::RefData; + +// This is largely copied from align_n. + +pub fn heavy_complexity( + refdata: &RefData, + exact_clonotypes: &[ExactClonotype], + ctl: &EncloneControl, + dref: &[DonorReferenceItem], +) -> Vec { + let mut results = Vec::<(usize, Junction)>::new(); + for i in 0..exact_clonotypes.len() { + results.push((i, Junction::default())); + } + results.par_iter_mut().for_each(|res| { + let i = res.0; + let ex = &exact_clonotypes[i]; + for r in 0..ex.share.len() { + if ex.share[r].left && ex.share.len() == 2 && !ex.share[1 - r].left { + let seq = ex.share[r].seq_del.as_ref(); + let mut vref = refdata.refs[ex.share[r].v_ref_id].to_ascii_vec(); + if ex.share[r].v_ref_id_donor.is_some() { + vref.clone_from(&dref[ex.share[r].v_ref_id_donor.unwrap()].nt_sequence); + } + let mut vstart = ex.share[r].cdr3_start - 2; + + // Compensate for indel. Code here and next work imperfectly and + // there would be value in investigating the error cases. + + if !ex.share[r].ins.is_empty() { + vstart -= ex.share[r].ins[0].1.len(); + } else if ex.share[r].seq.len() < ex.share[r].seq_del.len() { + vstart += ex.share[r].seq_del.len() - ex.share[r].seq.len(); + } + + // Prevent crash (working around bug). + + if vstart > vref.len() { + vstart = vref.len(); + } + + // Keep going. + + let vref = &vref[vstart..vref.len()]; + let mut drefx = Vec::::new(); + let mut d2ref = Vec::::new(); + let mut drefname = String::new(); + let mut ds = Vec::>::new(); + opt_d( + ex.share[r].v_ref_id, + ex.share[r].j_ref_id, + &ex.share[r].seq_del, + &ex.share[r].annv, + &ex.share[r].cdr3_aa, + refdata, + dref, + &mut ds, + ctl.gen_opt.jscore_match, + ctl.gen_opt.jscore_mismatch, + ctl.gen_opt.jscore_gap_open, + ctl.gen_opt.jscore_gap_extend, + ctl.gen_opt.jscore_bits_multiplier, + ex.share[r].v_ref_id_donor, + ); + let mut opt = Vec::new(); + if !ds.is_empty() { + opt.clone_from(&ds[0]); + } + for (j, d) in opt.into_iter().enumerate() { + if j == 0 { + drefx = refdata.refs[d].to_ascii_vec(); + } else { + d2ref = refdata.refs[d].to_ascii_vec(); + } + if j > 0 { + drefname += ":"; + } + drefname += &mut refdata.name[d].clone(); + } + let jref = refdata.refs[ex.share[r].j_ref_id].to_ascii_vec(); + let jend = jflank(seq, &jref); + let mut seq_start = vstart as isize; + // probably not exactly right + if ex.share[r].annv.len() > 1 { + let q1 = ex.share[r].annv[0].tig_start + ex.share[r].annv[0].match_len; + let q2 = ex.share[r].annv[1].tig_start; + seq_start += q2 as isize - q1 as isize; + } + let mut seq_end = seq.len() - (jref.len() - jend); + // very flaky bug workaround + // asserted on BCR=180030 CDR3=CARERDLIWFGPW JALIGN1 + if seq_start as usize > seq_end { + seq_start = vstart as isize; + } + if seq_end <= seq_start as usize { + seq_end = seq.len(); // bug fix for problem found by customer, + // couldn't reproduce internally + } + let seq = &seq[seq_start as usize..seq_end]; + let jref = &jref[..jend]; + let (ops, _score) = align_to_vdj_ref( + seq, + vref, + &drefx, + &d2ref, + jref, + &drefname, + true, + ctl.gen_opt.jscore_match, + ctl.gen_opt.jscore_mismatch, + ctl.gen_opt.jscore_gap_open, + ctl.gen_opt.jscore_gap_extend, + ctl.gen_opt.jscore_bits_multiplier, + ); + let mut hcomp = 0; + for i in 0..ops.len() { + if (ops[i] == Subst) + || (ops[i] == Ins) + || (ops[i] == Del && (i == 0 || ops[i - 1] != Del)) + { + hcomp += 1; + } + } + res.1 = Junction { hcomp }; + } + } + }); + results.into_iter().map(|ri| ri.1).collect() +} diff --git a/lib/rust/enclone_core/src/join_one.rs b/lib/rust/enclone_core/src/join_one.rs new file mode 100644 index 0000000..4e085ee --- /dev/null +++ b/lib/rust/enclone_core/src/join_one.rs @@ -0,0 +1,591 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use crate::defs::{CloneInfo, EncloneControl, ExactClonotype, PotentialJoin}; +use debruijn::dna_string::ndiffs; +use debruijn::Mer; +use qd::{dd, Double}; +use stats_utils::abs_diff; +use std::cmp::min; +use std::collections::HashMap; +use string_utils::TextUtils; +use vdj_ann::refx::RefData; +// use stirling_numbers::p_at_most_m_distinct_in_sample_of_x_from_n; +use vector_utils::{meet, unique_sort}; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// This is a copy of p_at_most_m_distinct_in_sample_of_x_from_n from the stirling_numbers crate, +// that has been modified to use higher precision internal math. This should go into that crate +// (along with the stirling numbers ratio table code) when and if the qr crate is published. + +pub fn p_at_most_m_distinct_in_sample_of_x_from_n_double( + m: usize, + x: usize, + n: usize, + sr: &[Vec], +) -> f64 { + let mut p = dd![1.0]; + for u in m + 1..=x { + let mut z = dd![sr[x][u]]; + for _ in 0..x { + z *= dd![u as f64] / dd![n as f64]; + } + for v in 1..=u { + z *= dd![(n - v + 1) as f64] / dd![(u - v + 1) as f64]; + } + p -= z; + } + if p < dd![0.0] { + p = dd![0.0]; + } + f64::from(p) +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// partial_bernoulli_sum( n, k ): return sum( choose(n,i), i = 0..=k ). +// +// Beware of overflow. + +pub fn partial_bernoulli_sum(n: usize, k: usize) -> f64 { + assert!(n >= 1); + assert!(k <= n); + let mut sum = 0.0; + let mut choose = 1.0; + for i in 0..=k { + sum += choose; + choose *= (n - i) as f64; + choose /= (i + 1) as f64; + } + sum +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +#[allow(clippy::too_many_arguments)] +pub fn join_one<'a>( + k1: usize, + k2: usize, + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + to_bc: &'a HashMap<(usize, usize), Vec>, + sr: &[Vec], + pot: &mut Vec, + refdata: &RefData, +) -> bool { + let is_bcr = ctl.gen_opt.is_bcr(); + // Do not merge onesies or foursies with anything. Deferred until later. + // Note that perhaps some foursies should be declared doublets and deleted. + // Note onesies merging above is turned off so this appears to be moot. + + let (info1, info2) = (&info[k1], &info[k2]); + let (clono1, clono2) = (info1.clonotype_index, info2.clonotype_index); + let chains1 = exact_clonotypes[clono1].share.len(); + let chains2 = exact_clonotypes[clono2].share.len(); + if !(2..=3).contains(&chains1) || !(2..=3).contains(&chains2) { + return false; + } + // NEED FOR THIS SEEMS LIKE A BUG: + if info1.vs.len() == 1 || info2.vs.len() == 4 { + return false; + } + if info1.vs.len() > 2 { + return false; + } + + // Require that CDR3s have the same length. Ugly. + // First part should be a tautology. + + let (x1, x2) = (&info[k1].cdr3s, &info[k2].cdr3s); + if x1.len() != x2.len() { + return false; + } + for i in 0..x1.len() { + if x1[i].len() != x2[i].len() { + return false; + } + } + + // Put identity filter on CDR3s for BCR. + + if is_bcr { + let (x1, x2) = (&info[k1].cdr3s, &info[k2].cdr3s); + let mut cd = 0; + let mut total = 0; + for z in 0..2 { + if x1[z].len() != x2[z].len() { + return false; + } + for m in 0..x1[z].len() { + if x1[z].as_bytes()[m] != x2[z].as_bytes()[m] { + cd += 1; + } + } + total += x1[z].len(); + } + if cd as f64 / total as f64 > 1.0 - ctl.join_alg_opt.join_cdr3_ident / 100.0 { + return false; + } + } + + // Compute number of differences. The default behavior is that this is applied only to TCR. + + let (x1, x2) = (&info[k1].cdr3s, &info[k2].cdr3s); + if !is_bcr || ctl.heur.max_diffs < 1_000_000 { + let mut diffs = 0_usize; + for x in 0..info[k1].lens.len() { + if !info[k1].has_del[x] && !info[k2].has_del[x] { + // A great deal of time is spent in the call to ndiffs. Notes on this: + // 1. It is slower than if the computation is done outside + // the ndiffs function. This is mysterious but must have something to + // do with the storage of the 256-byte lookup table. + // 2. Adding #[inline(always)] in front of the ndiffs function definition + // doesn't help. + // 3. Adding a bounds test for diffs > ctl.heur.max_diffs inside the ndiffs + // function doesn't help, whether placed in the inner loop or the other + // loop. + diffs += ndiffs(&info[k1].tigsp[x], &info[k2].tigsp[x]); + } else { + for j in 0..info[k1].tigs[x].len() { + if info[k1].tigs[x][j] != info[k2].tigs[x][j] { + diffs += 1; + } + } + } + } + if diffs > ctl.heur.max_diffs { + return false; + } + if !is_bcr && diffs > 5 { + return false; + } + } + + // Compute junction diffs. + + let mut cd = 0_isize; + for l in 0..x1.len() { + for m in 0..x1[l].len() { + if x1[l].as_bytes()[m] != x2[l].as_bytes()[m] { + cd += 1; + } + } + } + + // Cap CDR3 diffs for TCR or as requested. + + if (ctl.join_alg_opt.max_cdr3_diffs < 1000 || !is_bcr) + && (cd > ctl.join_alg_opt.max_cdr3_diffs as isize || (!is_bcr && cd > 0)) + { + return false; + } + + // Unless MIX_DONORS specified, do not join across donors. + // And test for error. + // + // WARNING! There are actually two cases: where an individual exact subclonotype + // itself crosses donors, and where we cross donors in making a join. Note that + // the former case is most improbable, unless there is cross-sample contamination. + // And if that did happen, the output would be confusing and might have a greatly + // exaggerated number of fails. + + let (mut donors1, mut donors2) = (Vec::::new(), Vec::::new()); + let ex1 = &exact_clonotypes[info[k1].clonotype_index]; + let ex2 = &exact_clonotypes[info[k2].clonotype_index]; + for j in 0..ex1.clones.len() { + if ex1.clones[j][0].donor_index.is_some() { + donors1.push(ex1.clones[j][0].donor_index.unwrap()); + } + } + for j in 0..ex2.clones.len() { + if ex2.clones[j][0].donor_index.is_some() { + donors2.push(ex2.clones[j][0].donor_index.unwrap()); + } + } + unique_sort(&mut donors1); + unique_sort(&mut donors2); + if !ctl.cr_opt.mix_donors && !donors1.is_empty() && !donors2.is_empty() && donors1 != donors2 { + return false; + } + let err = donors1 != donors2 || donors1.len() != 1 || donors2.len() != 1; + + // Analyze the two clonotypes versus the reference. First traverse the reference + // sequences. Either we use the references for k1 or the references for k2, but + // these are nearly always the same. + + let mut nrefs = 1; + for m in 0..2 { + if info[k1].vs[m] != info[k2].vs[m] || info[k1].js[m] != info[k2].js[m] { + nrefs = 2; + } + } + let mut shares = vec![0; nrefs]; // shared mutations from reference + let mut shares1 = vec![0; nrefs]; + let mut shares2 = vec![0; nrefs]; + let mut indeps = vec![0; nrefs]; // independent mutations from reference + let mut total = vec![vec![0; 2]; nrefs]; // total differences from reference + for u in 0..nrefs { + let k = if u == 0 { k1 } else { k2 }; + + // Traverse the chains in the clonotype. + + let nchains = info[k1].lens.len(); + for m in 0..nchains { + let (tig1, tig2) = (&info[k1].tigs[m], &info[k2].tigs[m]); + + // Traverse the two segments (V and J). + + for si in 0..2 { + let seg = if si == 0 { + &info[k].vs[m] + } else { + &info[k].js[m] + }; + let ref_trim = if si == 1 { + ctl.heur.ref_j_trim + } else { + ctl.heur.ref_v_trim + }; + for p in 0..seg.len() - ref_trim { + let (t1, t2); + let r; + if si == 0 { + // Ugly bailout arising very rarely if the two reference + // sequences have different lengths. + if p >= tig1.len() || p >= tig2.len() { + return false; + } + t1 = tig1[p]; + t2 = tig2[p]; + // r = seg.get(p); + let rx = seg.get(p); + if rx == 0 { + r = b'A'; + } else if rx == 1 { + r = b'C'; + } else if rx == 2 { + r = b'G'; + } else { + r = b'T'; + } + } else { + t1 = tig1[tig1.len() - p - 1]; + t2 = tig2[tig2.len() - p - 1]; + // r = seg.get( seg.len() - p - 1 ); + let rx = seg.get(seg.len() - p - 1); + if rx == 0 { + r = b'A'; + } else if rx == 1 { + r = b'C'; + } else if rx == 2 { + r = b'G'; + } else { + r = b'T'; + } + } + if t1 == t2 && t1 != r { + shares[u] += 1; + if m == 1 { + shares1[u] += 1; + } else { + shares2[u] += 1; + } + } else if (t1 == r && t2 != r) || (t2 == r && t1 != r) { + indeps[u] += 1; + } else if t1 != r && t2 != r { + indeps[u] += 2; + } + if t1 != r { + total[u][0] += 1; + } + if t2 != r { + total[u][1] += 1; + } + } + } + } + } + + // Don't allow different references if one is strongly favored. + // (not documented) + + if nrefs == 2 { + for m in 0..2 { + if abs_diff(total[0][m], total[1][m]) > ctl.heur.max_degradation { + return false; + } + } + } + + // Another test for acceptable join. (not fully documented) + + let min_shares = shares.iter().min().unwrap(); + let min_indeps = indeps.iter().min().unwrap(); + + // Reject if barcode overlap. (not documented) + + let (mut bcs1, mut bcs2) = (Vec::<&'a str>::new(), Vec::<&'a str>::new()); + for origin in &info[k1].origin { + bcs1.extend( + to_bc[&(*origin, info[k1].clonotype_index)] + .iter() + .map(String::as_str), + ); + } + for origin in &info[k2].origin { + bcs2.extend( + to_bc[&(*origin, info[k2].clonotype_index)] + .iter() + .map(String::as_str), + ); + } + unique_sort(&mut bcs1); + unique_sort(&mut bcs2); + if meet(&bcs1, &bcs2) { + return false; + } + + // Test for concentration of SHM in the junction regions. + let cdr3_mult = 5.0; + if cd as f64 >= cdr3_mult * std::cmp::max(1, *min_indeps) as f64 { + return false; + } + + // Do not merge cells if they were assigned different light chain constant regions. + // Unless cd = 0. + for i in 0..info[k1].cdr3s.len() { + let (j1, j2) = (info[k1].exact_cols[i], info[k2].exact_cols[i]); + if !ex1.share[j1].left + && ex1.share[j1].c_ref_id.is_some() + && ex2.share[j2].c_ref_id.is_some() + && ex1.share[j1].c_ref_id.unwrap() != ex2.share[j2].c_ref_id.unwrap() + && cd > 0 + { + return false; + } + } + + // Estimate the probability p1 that drawing k = min_indeps + 2 * min_shares + // objects from n = 3 * (sum of VJ contig lengths) yields d = min_shares or + // more duplicates. + + let n = 3 * (info[k1].tigs[0].len() + info[k1].tigs[1].len()); + let k = *min_indeps + 2 * *min_shares; + let d = *min_shares; + let p1 = p_at_most_m_distinct_in_sample_of_x_from_n_double((k - d) as usize, k as usize, n, sr); + assert!(!p1.is_infinite()); // TODO: IS THIS SAFE? + + // Multiply by 80^cd. This is sum( choose(3cn, m), m = 0..=cd ). + // Changed to take into account CDR3 length. + + let mult = { + let mut cd1 = 0; + let n1 = x1[0].len(); + for m in 0..x1[0].len() { + if x1[0].as_bytes()[m] != x2[0].as_bytes()[m] { + cd1 += 1; + } + } + let mut cd2 = 0; + let n2 = x1[1].len(); + for m in 0..x1[1].len() { + if x1[1].as_bytes()[m] != x2[1].as_bytes()[m] { + cd2 += 1; + } + } + let cdx = ctl.join_alg_opt.cdr3_normal_len; + let mult_pow: f64 = 80.0; + mult_pow.powf(cdx as f64 * cd1 as f64 / n1 as f64) + * mult_pow.powf(cdx as f64 * cd2 as f64 / n2 as f64) + }; + + // Compute score. + + let score = p1 * mult; + + // Apply JUN_SHARE. + + let mut accept = false; + if ctl.join_alg_opt.comp_filt < 1_000_000 + && score > ctl.join_alg_opt.max_score + && *min_shares < ctl.join_alg_opt.auto_share as isize + && (ctl.join_alg_opt.comp_filt_bound == 0 + || *min_indeps as usize <= ctl.join_alg_opt.comp_filt_bound) + && ex1.share.len() == 2 + && ex2.share.len() == 2 + && ex1.share[0].left != ex1.share[1].left + { + let h1 = info[k1].exact_cols[0]; + let h2 = info[k2].exact_cols[0]; + let comp = min(ex1.share[h1].jun.hcomp, ex2.share[h2].jun.hcomp); + if comp as isize - cd >= ctl.join_alg_opt.comp_filt as isize { + /* + println!("\nwould accept"); + println!("cdr3: {}", ex1.share[h1].cdr3_aa); + println!("cdr3: {}", ex2.share[h2].cdr3_aa); + */ + accept = true; + } + } + + // Threshold on score. + + if !accept + && score > ctl.join_alg_opt.max_score + && *min_shares < ctl.join_alg_opt.auto_share as isize + { + return false; + } + + // If V gene names are different (after removing trailing *...), and either + // • V gene reference sequences are different, after truncation on right to the same length + // • or 5' UTR reference sequences are different, after truncation on left to the same length, + // then the join is rejected. + + for i in 0..info[k1].cdr3s.len() { + let (j1, j2) = (info[k1].exact_cols[i], info[k2].exact_cols[i]); + let (x1, x2) = (&ex1.share[j1], &ex2.share[j2]); + let (v1, v2) = (x1.v_ref_id, x2.v_ref_id); + let (mut n1, mut n2) = (refdata.name[v1].clone(), refdata.name[v2].clone()); + if n1.contains('*') { + n1 = n1.before("*").to_string(); + } + if n2.contains('*') { + n2 = n2.before("*").to_string(); + } + if n1 != n2 { + let (y1, y2) = (&refdata.refs[v1], &refdata.refs[v2]); + if y1.len() == y2.len() { + if y1 != y2 { + return false; + } + } else { + let n = min(y1.len(), y2.len()); + for m in 0..n { + if y1.get(m) != y2.get(m) { + return false; + } + } + } + let (u1, u2) = (x1.u_ref_id, x2.u_ref_id); + if let (Some(u1), Some(u2)) = (u1, u2) { + let (x1, x2) = (&refdata.refs[u1], &refdata.refs[u2]); + let n = min(x1.len(), x2.len()); + for m in 0..n { + if x1.get(x1.len() - 1 - m) != x2.get(x2.len() - 1 - m) { + return false; + } + } + } + } + } + + // Require + // percent heavy chain nuke identity on FWR1 + // minus + // percent heavy chain nuke identity on CDR12 + // is less than 20. + + let nchains = info[k1].lens.len(); + let (mut fwr1_len, mut cdr1_len, mut cdr2_len) = (0, 0, 0); + let (mut fwr1_diffs, mut cdr1_diffs, mut cdr2_diffs) = (0, 0, 0); + for m in 0..nchains { + let (j1, j2) = (info[k1].exact_cols[m], info[k2].exact_cols[m]); + let (x1, x2) = (&ex1.share[j1], &ex2.share[j2]); + if x1.left { + if x1.cdr1_start.is_some() && x2.cdr1_start.is_some() { + let fr1_start1 = x1.fr1_start; + let fr1_stop1 = x1.cdr1_start.unwrap(); + let fr1_start2 = x2.fr1_start; + let fr1_stop2 = x2.cdr1_start.unwrap(); + let len = fr1_stop1 - fr1_start1; + if fr1_stop2 - fr1_start2 == len { + let mut diffs = 0; + for p in 0..len { + if x1.seq_del_amino[p + fr1_start1] != x2.seq_del_amino[p + fr1_start2] { + diffs += 1; + } + } + fwr1_len = len; + fwr1_diffs = diffs; + } + } + if x1.cdr1_start.is_some() + && x1.fr2_start.is_some() + && x2.cdr1_start.is_some() + && x2.fr2_start.is_some() + { + let cdr1_start1 = x1.cdr1_start.unwrap(); + let cdr1_stop1 = x1.fr2_start.unwrap(); + let cdr1_start2 = x2.cdr1_start.unwrap(); + let cdr1_stop2 = x2.fr2_start.unwrap(); + // there are some problematic annotations for which this is not upheld + if cdr1_start1 <= cdr1_stop1 && cdr1_start2 <= cdr1_stop2 { + let len = cdr1_stop1 - cdr1_start1; + if cdr1_stop2 - cdr1_start2 == len { + let mut diffs = 0; + for p in 0..len { + if x1.seq_del_amino[p + cdr1_start1] + != x2.seq_del_amino[p + cdr1_start2] + { + diffs += 1; + } + } + cdr1_len = len; + cdr1_diffs = diffs; + } + } + } + if x1.cdr2_start.is_some() + && x1.fr3_start.is_some() + && x2.cdr2_start.is_some() + && x2.fr3_start.is_some() + { + let cdr2_start1 = x1.cdr2_start.unwrap(); + let cdr2_stop1 = x1.fr3_start.unwrap(); + let cdr2_start2 = x2.cdr2_start.unwrap(); + let cdr2_stop2 = x2.fr3_start.unwrap(); + // this was violated once when using IMGT reference + if cdr2_start1 <= cdr2_stop1 && cdr2_start2 <= cdr2_stop2 { + let len = cdr2_stop1 - cdr2_start1; + if cdr2_stop2 - cdr2_start2 == len { + let mut diffs = 0; + for p in 0..len { + if x1.seq_del_amino[p + cdr2_start1] + != x2.seq_del_amino[p + cdr2_start2] + { + diffs += 1; + } + } + cdr2_len = len; + cdr2_diffs = diffs; + } + } + } + } + } + if fwr1_len > 0 && cdr1_len > 0 && cdr2_len > 0 { + let len = fwr1_len; + let diffs = fwr1_diffs; + let fwr1_identity = 100.0 * (len - diffs) as f64 / len as f64; + let len = cdr1_len + cdr2_len; + let diffs = cdr1_diffs + cdr2_diffs; + let cdr12_identity = 100.0 * (len - diffs) as f64 / len as f64; + if fwr1_identity - cdr12_identity >= ctl.join_alg_opt.fwr1_cdr12_delta { + return false; + } + } + + // Save potential joins. Note that this jacks up memory usage significantly, + // so it would likely be more efficient to duplicate some of the computations + // during the analysis phase. + + pot.push(PotentialJoin { + k1, + k2, + cd, + shares, + err, + }); + true +} diff --git a/lib/rust/enclone_core/src/lib.rs b/lib/rust/enclone_core/src/lib.rs new file mode 100644 index 0000000..a52890e --- /dev/null +++ b/lib/rust/enclone_core/src/lib.rs @@ -0,0 +1,9 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +pub mod align_to_vdj_ref; +pub mod barcode_fate; +pub mod defs; +pub mod enclone_structs; +pub mod hcomp; +pub mod join_one; +pub mod opt_d; diff --git a/lib/rust/enclone_core/src/opt_d.rs b/lib/rust/enclone_core/src/opt_d.rs new file mode 100644 index 0000000..e2693c3 --- /dev/null +++ b/lib/rust/enclone_core/src/opt_d.rs @@ -0,0 +1,237 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Find the optimal D segment, the runner up, and the delta between the scores. This uses +// the donor V and J segments that are assigned to the clonotype. Note that the optimal D +// segment may be null. This is obvious from looking at data. + +use crate::align_to_vdj_ref::{align_to_vdj_ref, match_bit_score, zero_one}; +use enclone_proto::types::DonorReferenceItem; +use std::cmp::min; +use vdj_ann::annotate::Annotation; +use vdj_ann::refx::RefData; + +pub fn vflank(_seq: &[u8], vref: &[u8]) -> usize { + let mut flank = 13; + if flank > vref.len() { + flank = vref.len(); + } + flank +} + +pub fn jflank(seq: &[u8], jref: &[u8]) -> usize { + let flank = 13; + if flank > jref.len() { + return jref.len(); + } + + // Let start be the first position on the J gene where there is a perfect match of length at + // least five to the contig. + + const MATCHLEN: usize = 5; + let mut start = 0; + for i in 0..=jref.len() - MATCHLEN { + let mut matchlen = 0; + for j in 0..MATCHLEN { + if seq[seq.len() - jref.len() + i + j] != jref[i + j] { + break; + } + matchlen += 1; + } + if matchlen == MATCHLEN { + start = i; + break; + } + } + + // Add start to the flank, so long as that's possible. + + min(flank + start, jref.len()) +} +#[allow(clippy::too_many_arguments)] +pub fn evaluate_d( + tig: &[u8], + vref: &[u8], + seq_start: usize, + ds: &[usize], + jref: &[u8], + refdata: &RefData, + jscore_match: i32, + jscore_mismatch: i32, + jscore_gap_open: i32, + jscore_gap_extend: i32, + jscore_bits_multiplier: f64, +) -> (Vec, f64) { + // Start to build reference concatenation. First append the V segment. + + let mut concat = Vec::::new(); + let vstart = vref.len() - vflank(tig, vref); + let vref = &vref[vstart..vref.len()]; + concat.extend(vref); + + // Append the D segment or segments. + + let mut dref = Vec::::new(); + let mut d2ref = Vec::::new(); + let mut drefname = String::new(); + for (j, &d) in ds.iter().enumerate() { + if j == 0 { + dref = refdata.refs[d].to_ascii_vec(); + } else if j == 1 { + d2ref = refdata.refs[d].to_ascii_vec(); + } + if j > 0 { + drefname += ":"; + } + drefname += refdata.name[d].as_str(); + } + concat.extend(&dref); + concat.extend(&d2ref); + + // Append the J segment. + + let jend = jflank(tig, jref); + + // Align the V..J sequence on the contig to the reference concatenation. + + let mut seq_end = tig.len() - (jref.len() - jend); + if seq_end <= seq_start { + seq_end = tig.len(); // bug fix for problem found by customer, couldn't reproduce internally + } + let seq = &tig[seq_start..seq_end]; + let jref = &jref[0..jend]; + concat.extend(jref); + let (ops, count) = align_to_vdj_ref( + seq, + vref, + &dref, + &d2ref, + jref, + &drefname, + true, + jscore_match, + jscore_mismatch, + jscore_gap_open, + jscore_gap_extend, + jscore_bits_multiplier, + ); + (ops, count) +} +#[allow(clippy::too_many_arguments)] +pub fn opt_d( + v_ref_id: usize, // ex.share[mid].v_ref_id + j_ref_id: usize, // ex.share[mid].j_ref_id + tig: &[u8], // ex.share[mid].seq_del + annv: &[Annotation], // ex.share[mid].annv + cdr3_aa: &str, // ex.share[mid].cdr3_aa + refdata: &RefData, + dref: &[DonorReferenceItem], + dsx: &mut Vec>, + jscore_match: i32, + jscore_mismatch: i32, + jscore_gap_open: i32, + jscore_gap_extend: i32, + jscore_bits_multiplier: f64, + v_alt: Option, +) { + let mut comp = 1000000.0; + + // Go through every D segment, or possibly every concatenation of D segments. + + let mut todo = vec![vec![]]; + for i in &refdata.ds { + todo.push(vec![*i]); + } + let mut ds = Vec::>::new(); + let mut counts = Vec::::new(); + let mut good_d = Vec::::new(); + let mut vref = refdata.refs[v_ref_id].to_ascii_vec(); + if let Some(v_alt) = v_alt { + vref.clone_from(&dref[v_alt].nt_sequence); + } + let vstart = vref.len() - vflank(tig, &vref); + let mut seq_start = vstart as isize; + // probably not exactly right + if annv.len() > 1 { + let q1 = annv[0].tig_start + annv[0].match_len; + let q2 = annv[1].tig_start; + + seq_start += q1 as isize - q2 as isize; + } + let jref = refdata.refs[j_ref_id].to_ascii_vec(); + const MIN_BITS_FOR_D2: f64 = 14.0; + for di in &todo { + let (ops, count) = evaluate_d( + tig, + &vref, + seq_start as usize, + di, + &jref, + refdata, + jscore_match, + jscore_mismatch, + jscore_gap_open, + jscore_gap_extend, + jscore_bits_multiplier, + ); + counts.push(count); + if !di.is_empty() { + let drefx = refdata.refs[di[0]].to_ascii_vec(); + let vstart = vref.len() - vflank(tig, &vref); + let vref = vref[vstart..vref.len()].to_vec(); + let zos = zero_one(&ops, vref.len(), vref.len() + drefx.len()); + let bits = match_bit_score(&zos); + if bits >= MIN_BITS_FOR_D2 { + good_d.push(di[0]); + } + } + ds.push(di.clone()); + if count > comp { + comp = count; + } + } + if cdr3_aa.len() >= 20 { + todo.clear(); + for &i1 in &good_d { + for &i2 in &good_d { + todo.push(vec![i1, i2]); + } + } + for di in &todo { + let (_ops, count) = evaluate_d( + tig, + &vref, + seq_start as usize, + di, + &jref, + refdata, + jscore_match, + jscore_mismatch, + jscore_gap_open, + jscore_gap_extend, + jscore_bits_multiplier, + ); + counts.push(count); + ds.push(di.clone()); + if count > comp { + comp = count; + } + } + } + + // Reverse sort sync (counts, ds). + + let mut counts_ds = counts + .iter() + .zip(ds.iter()) + .map(|(&c, d)| (c, d.clone())) + .collect::>(); + counts_ds.sort_by(|a, b| b.partial_cmp(a).unwrap()); // reverse sort + counts.clear(); + ds.clear(); + for count in counts_ds { + counts.push(count.0); + ds.push(count.1); + } + + *dsx = ds; +} diff --git a/lib/rust/enclone_process/Cargo.toml b/lib/rust/enclone_process/Cargo.toml new file mode 100644 index 0000000..e29f080 --- /dev/null +++ b/lib/rust/enclone_process/Cargo.toml @@ -0,0 +1,49 @@ +[dependencies] +[dependencies.amino] +path = '../amino' + +[dependencies.anyhow] +workspace = true + +[dependencies.bio_edit] +path = '../bio_edit' + +[dependencies.enclone_core] +path = '../enclone_core' + +[dependencies.enclone_proto] +path = '../enclone_proto' + +[dependencies.equiv] +path = '../equiv' + +[dependencies.itertools] +workspace = true + +[dependencies.permutation] +workspace = true + +[dependencies.qd] +workspace = true + +[dependencies.rayon] +workspace = true + +[dependencies.serde_json] +workspace = true + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'enclone_process' +publish = false +version = '0.1.0' diff --git a/lib/rust/enclone_process/src/define_column_info.rs b/lib/rust/enclone_process/src/define_column_info.rs new file mode 100644 index 0000000..ff0965f --- /dev/null +++ b/lib/rust/enclone_process/src/define_column_info.rs @@ -0,0 +1,152 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use enclone_core::defs::{ColInfo, ExactClonotype}; +use vector_utils::{erase_if, make_freq}; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Define reference segment identifiers, one per chain. For the V segment, there is +// also an optional donor reference sequence alignment. (For now. We might do the +// same thing later for J segments.) +// ◼ 1. We vote using the number of cells, whereas a better way would be to test all +// ◼ the alternatives to find the best match. +// ◼ 2. Defining a constant region identifier for the entire clonotype is +// ◼ biologically dubious. +// ◼ 3. Maybe we only need to do this for pass 2. + +pub fn define_column_info( + exacts: &[usize], + exact_clonotypes: &[ExactClonotype], + mat: Vec>>, +) -> ColInfo { + let cols = mat.len(); + + // Compute reference info. + + let mut uids = vec![None; cols]; + let mut vids = vec![0; cols]; + let mut vpids = vec![None; cols]; + let mut vpids_d = vec![None; cols]; + let mut vpids_a = vec![None; cols]; + let mut dids = vec![None; cols]; + let mut jids = vec![0; cols]; + let mut cids = vec![None; cols]; + for (m, ((uids, (vids, (vpids, (vpids_d, vpids_a)))), (dids, (jids, cids)))) in mat + .iter() + .zip( + uids.iter_mut() + .zip( + vids.iter_mut().zip( + vpids + .iter_mut() + .zip(vpids_d.iter_mut().zip(vpids_a.iter_mut())), + ), + ) + .zip(dids.iter_mut().zip(jids.iter_mut().zip(cids.iter_mut()))), + ) + .take(cols) + { + let mut u = Vec::::new(); + let mut v = Vec::::new(); + let mut vp = Vec::<(usize, Option, Option, Option)>::new(); + let mut d = Vec::::new(); + let mut j = Vec::::new(); + let mut c = Vec::::new(); + for (&clonotype_id, &m) in exacts.iter().zip(m.iter()) { + let ex = &exact_clonotypes[clonotype_id]; + if let Some(m) = m { + let x = &ex.share[m]; + let ncells = ex.ncells(); + if let Some(u_ref_id) = x.u_ref_id { + u.resize(u.len() + ncells, u_ref_id); + } + // This is not actually correct. It copies the consensus V gene assignment + // for an exact subclonotype, rather than fetch the per cell entries. However + // it would be very rare for this to make a difference. + v.resize(v.len() + ncells, x.v_ref_id); + vp.resize( + vp.len() + ncells, + ( + x.v_ref_id, + x.v_ref_id_donor, + x.v_ref_id_donor_donor, + x.v_ref_id_donor_alt_id, + ), + ); + if let Some(d_ref_id) = x.d_ref_id { + d.resize(d.len() + ncells, d_ref_id); + } + j.resize(j.len() + ncells, x.j_ref_id); + if let Some(c_ref_id) = x.c_ref_id { + c.resize(c.len() + ncells, c_ref_id); + } + } + } + u.sort_unstable(); + v.sort_unstable(); + vp.sort(); + d.sort_unstable(); + j.sort_unstable(); + c.sort_unstable(); + let mut uf = Vec::<(u32, usize)>::new(); + make_freq(&u, &mut uf); + if !uf.is_empty() { + *uids = Some(uf[0].1); + } + let mut vf = Vec::<(u32, usize)>::new(); + make_freq(&v, &mut vf); + *vids = vf[0].1; + let mut to_delete = vec![false; vp.len()]; + for i in 0..vp.len() { + if vp[i].0 != *vids { + to_delete[i] = true; + } + } + erase_if(&mut vp, &to_delete); + let mut vpf = Vec::<(u32, (usize, Option, Option, Option))>::new(); + make_freq(&vp, &mut vpf); + *vpids = (vpf[0].1).1; + *vpids_d = (vpf[0].1).2; + *vpids_a = (vpf[0].1).3; + let mut df = Vec::<(u32, usize)>::new(); + make_freq(&d, &mut df); + if !df.is_empty() { + *dids = Some(df[0].1); + } + let mut jf = Vec::<(u32, usize)>::new(); + make_freq(&j, &mut jf); + *jids = jf[0].1; + let mut cf = Vec::<(u32, usize)>::new(); + make_freq(&c, &mut cf); + if !cf.is_empty() { + *cids = Some(cf[0].1); + } + } + + // Compute seqss and seqss_amino. + + let mut seqss = Vec::>>::new(); + let nexacts = exacts.len(); + for cx in mat.iter().take(cols) { + let mut seqs = Vec::>::new(); + for (&m, &e) in cx.iter().zip(exacts.iter()).take(nexacts) { + if let Some(m) = m { + seqs.push(exact_clonotypes[e].share[m].seq_del.clone()); + } else { + seqs.push(Vec::::new()); + } + } + seqss.push(seqs.clone()); + } + + ColInfo { + uids, + vids, + vpids, + dids, + jids, + cids, + seqss, + mat, + } +} diff --git a/lib/rust/enclone_process/src/define_mat.rs b/lib/rust/enclone_process/src/define_mat.rs new file mode 100644 index 0000000..dc15346 --- /dev/null +++ b/lib/rust/enclone_process/src/define_mat.rs @@ -0,0 +1,430 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype, PotentialJoin}; +use enclone_core::join_one::join_one; +use equiv::EquivRel; +use qd::Double; +use std::cmp::max; +use std::collections::HashMap; +use vdj_ann::refx::RefData; +use vector_utils::{bin_position, next_diff12_3, next_diff1_3, unique_sort}; + +// Define an equivalence relation on the chains, introducing connections defined by the +// raw joins. Also join where there are identical V..J sequences. + +fn joiner( + infos: &[usize], + info: &[CloneInfo], + to_exacts: &HashMap, + raw_joinsx: &[Vec], + chains: &[(usize, usize)], + seq_chains: &[(Vec, usize, usize)], +) -> EquivRel { + let mut e = EquivRel::new(chains.len() as u32); + for i1 in 0..infos.len() { + let j1 = infos[i1]; + let u1 = info[j1].clonotype_index; + let v1 = to_exacts[&u1]; + let m1s = &info[j1].exact_cols; + for i2 in &raw_joinsx[i1] { + let j2 = infos[*i2]; + let u2 = info[j2].clonotype_index; + let v2 = to_exacts[&u2]; + let m2s = &info[j2].exact_cols; + for j in 0..2 { + let z1 = bin_position(chains, &(v1, m1s[j])); + let z2 = bin_position(chains, &(v2, m2s[j])); + e.join(z1 as usize, z2 as usize); + } + } + } + let mut i = 0; + while i < seq_chains.len() { + let j = next_diff1_3(seq_chains, i); + for k in i + 1..j { + let (x1, x2) = (&seq_chains[i], &seq_chains[k]); + let z1 = bin_position(chains, &(x1.1, x1.2)); + let z2 = bin_position(chains, &(x2.1, x2.2)); + e.join(z1 as usize, z2 as usize); + } + i = j; + } + e +} + +// TOOD: refactor this into a struct +pub type Od = (Vec, usize, i32); + +pub fn setup_define_mat(candidate_clonotype: &[i32], info: &[CloneInfo]) -> (Vec, Vec) { + let mut od = Vec::::new(); + for id in candidate_clonotype { + let x: &CloneInfo = &info[*id as usize]; + od.push((x.origin.clone(), x.clonotype_index, *id)); + } + od.sort(); + let mut exacts = Vec::::new(); + let mut j = 0; + while j < od.len() { + let k = next_diff12_3(&od, j); + exacts.push(od[j].1); + j = k; + } + (od, exacts) +} + +// This generates a cols x nexacts matrices for a given clonotype, where cols is defined by the +// algorithm, and is the number of columns (chains) in the clonotype table. +#[allow(clippy::too_many_arguments)] +pub fn define_mat( + to_bc: &HashMap<(usize, usize), Vec>, + sr: &[Vec], + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + exacts: &[usize], + od: &[Od], + info: &[CloneInfo], + raw_joins: &[Vec], + refdata: &RefData, +) -> Vec>> { + // Define map of indices into exacts. + + let nexacts = exacts.len(); + let to_exacts: HashMap = + exacts.iter().enumerate().map(|(u, &x)| (x, u)).collect(); + + // Get the info indices corresponding to this clonotype. + + let mut infos: Vec = od + .iter() + .filter_map(|i| { + let x = i.2 as usize; + if to_exacts.contains_key(&info[x].clonotype_index) { + Some(x) + } else { + None + } + }) + .collect(); + infos.sort_unstable(); + + // Define map of exacts to infos. + + let mut to_infos = vec![Vec::::new(); nexacts]; + for (i, &inf) in infos.iter().enumerate() { + let u = to_exacts[&info[inf].clonotype_index]; + to_infos[u].push(i); + } + + // Form the set of all chains that appear in an exact subclonotypes of this clonotype, and + // also track the V..J sequences for the chains. + + let mut chains = Vec::<(usize, usize)>::new(); + let mut seq_chains = Vec::<(Vec, usize, usize)>::new(); + for (u, &exu) in exacts.iter().enumerate() { + let ex = &exact_clonotypes[exu]; + for (m, share) in ex.share.iter().enumerate() { + chains.push((u, m)); + seq_chains.push((share.seq.clone(), u, m)); + } + } + seq_chains.sort(); + + // Gather the raw joins. + + let mut raw_joinsx = vec![Vec::::new(); infos.len()]; + for (&j1, raw_i1) in infos.iter().zip(raw_joinsx.iter_mut()) { + for x in &raw_joins[j1] { + let i2 = bin_position(&infos, x); + if i2 >= 0 { + raw_i1.push(i2 as usize); + } + } + } + + // Look for additional raw joins. In the join stage, for efficiency reasons, we don't try to + // make a join if two info elements are already in the same equivalence class. This causes + // us to miss raw joins for two reasons: + // • One reason is that where we have two exact subclonotypes, and at least one one has more + // than two chains, then we may miss a raw join that is needed here. + // • Another reason is that exact subclonotypes may have been deleted since the original + // equivalence relation was built. This we address partially. + + let mut extras = Vec::<(usize, usize)>::new(); + for (i1, (raw_i1, &j1)) in raw_joinsx.iter().zip(infos.iter()).enumerate() { + for &i2 in raw_i1 { + let j2 = infos[i2]; + let (u1, u2) = (info[j1].clonotype_index, info[j2].clonotype_index); + let (ex1, ex2) = (&exact_clonotypes[u1], &exact_clonotypes[u2]); + let (v1, v2) = (to_exacts[&u1], to_exacts[&u2]); + if ex1.share.len() > 2 || ex2.share.len() > 2 { + let (s1, s2) = (&to_infos[v1], &to_infos[v2]); + for k1 in s1 { + for k2 in s2 { + let (k1, k2) = (*k1, *k2); + if (k1 == i1 && k2 == i2) || (k1 == i2 && k2 == i1) { + continue; + } + let (l1, l2) = (infos[k1], infos[k2]); + if info[l1].lens == info[l2].lens { + let mut pot = Vec::::new(); + if join_one( + l1, + l2, + ctl, + exact_clonotypes, + info, + to_bc, + sr, + &mut pot, + refdata, + ) { + extras.push((k1, k2)); + } + } + } + } + } + } + } + for x in &extras { + raw_joinsx[x.0].push(x.1); + } + + // Define an initial equivalence relation on the chains, and get set representatives. + + let mut e = joiner(&infos, info, &to_exacts, &raw_joinsx, &chains, &seq_chains); + let r = e.set_reps(); + + // First for each pair of chain sets with one "heavy" and one "light", pick some info + // entries, if there are any. This is effectively at random. A parameter governs how + // much we pick. + + let mut rxi = Vec::<(usize, usize, usize)>::new(); // (heavy set, light set, infos index) + for (i, &inf_i) in infos.iter().enumerate() { + let z = &info[inf_i]; + let u = z.clonotype_index; + let v = to_exacts[&u]; + if z.exact_cols.len() != 2 { + continue; + } + let (m1, m2) = (z.exact_cols[0], z.exact_cols[1]); + let ex = &exact_clonotypes[u]; + if !ex.share[m1].left || ex.share[m2].left { + continue; // maybe never happens + } + let p1 = e.set_id(bin_position(&chains, &(v, m1)) as usize); + let p2 = e.set_id(bin_position(&chains, &(v, m2)) as usize); + let q1 = bin_position(&r, &p1) as usize; + let q2 = bin_position(&r, &p2) as usize; + rxi.push((q1, q2, i)); + } + rxi.sort_unstable(); + const MAX_USE: usize = 5; // knob set empirically + let mut rxir = Vec::<(usize, usize, usize)>::new(); // (heavy set, light set, info index) + let mut i = 0; + while i < rxi.len() { + let j = next_diff12_3(&rxi, i); + rxir.extend(&rxi[i..j.min(i + MAX_USE)]); + i = j; + } + + // Now for each pair of these, if they are not effectively joined, attempt to join them. + // This partially addresses the "second reason" described above. It is partial because we + // picked an info entry above at random, rather than trying them all. + + for f1 in &rxir { + for f2 in &rxir { + if f1.0 != f2.0 || f1.1 != f2.1 { + let (i1, i2) = (infos[f1.2], infos[f2.2]); + if info[i1].lens != info[i2].lens { + continue; + } + let mut pot = Vec::::new(); + if join_one( + i1, + i2, + ctl, + exact_clonotypes, + info, + to_bc, + sr, + &mut pot, + refdata, + ) { + e.join(r[f1.0], r[f2.0]); + e.join(r[f1.1], r[f2.1]); + } + } + } + } + + // Find the exact subclonotypes having three chains and list their sets, allowing for order + // to vary. + + let r = e.set_reps(); + let mut threes = Vec::>::new(); + let mut threesp = HashMap::, usize>::new(); + for u in 0..nexacts { + let ex = &exact_clonotypes[exacts[u]]; + if ex.share.len() == 3 { + let zs = [ + [0, 1, 2], + [0, 2, 1], + [1, 0, 2], + [1, 2, 0], + [2, 0, 1], + [2, 1, 0], + ]; + for z in &zs { + if ex.share[z[0]].left && !ex.share[z[2]].left { + let p1 = e.set_id(bin_position(&chains, &(u, z[0])) as usize); + let p2 = e.set_id(bin_position(&chains, &(u, z[1])) as usize); + let p3 = e.set_id(bin_position(&chains, &(u, z[2])) as usize); + let q1 = bin_position(&r, &p1) as usize; + let q2 = bin_position(&r, &p2) as usize; + let q3 = bin_position(&r, &p3) as usize; + threes.push(vec![q1, q2, q3]); + threesp.insert(vec![q1, q2, q3], u); + } + } + } + } + unique_sort(&mut threes); + + // There is one more case to deal with. This is where we have two exact subclonotypes, each + // with three chains, and we joined two of their chains, but not the third. And where the + // join algorithm would not have joined the third. In this case, if the third chains are + // "close enough", we join them anyway. As before, we only test representatives. + + for t1 in &threes { + 't2_loop: for t2 in &threes { + if t1 == t2 { + continue; + } + let (mut matches, mut mismatch) = (0, 0); + for i in 0..3 { + if t1[i] == t2[i] { + matches += 1; + } else { + mismatch = i; + } + } + if matches != 2 { + continue; + } + let (u1, u2) = (threesp[t1], threesp[t2]); + let (ex1, ex2) = (&exact_clonotypes[exacts[u1]], &exact_clonotypes[exacts[u2]]); + for (m1, ex1_sm1) in ex1.share.iter().enumerate() { + let p1 = bin_position(&chains, &(u1, m1)) as usize; + let q1 = bin_position(&r, &p1) as usize; + if q1 == t1[mismatch] { + for (m2, ex2_sm2) in ex2.share.iter().enumerate() { + let p2 = bin_position(&chains, &(u2, m2)) as usize; + let q2 = bin_position(&r, &p2) as usize; + if q2 == t2[mismatch] { + let (seq1, seq2) = (&ex1_sm1.seq, &ex2_sm2.seq); + if seq1.len() == seq2.len() { + const MAX_DIFFS: usize = 10; + let diffs = seq1 + .iter() + .zip(seq2.iter()) + .filter(|(&s1, &s2)| s1 != s2) + .count(); + if diffs <= MAX_DIFFS { + e.join(p1, p2); + break 't2_loop; + } + } + } + } + } + } + } + } + + // Get representatives for the chain sets. + let mut r = e.set_reps(); + + // Reorder the chains. This is done to get the heavy chains before the light chains and also + // to mimic the behavior of the previous version of this algorithm, to minimiize churn. Then + // update the representatives. + + let mut chainsp = Vec::<(String, usize, usize, usize)>::with_capacity(exacts.len()); + for (u, &exu) in exacts.iter().enumerate() { + let ex = &exact_clonotypes[exu]; + for (m, share_m) in ex.share.iter().enumerate() { + let mut c = share_m.chain_type.clone(); + if c.starts_with("TRB") { + c = c.replacen("TRB", "TRX", 1); + } else if c.starts_with("TRA") { + c = c.replacen("TRA", "TRY", 1); + } + chainsp.push((format!("{c}:{}", share_m.cdr3_aa), share_m.seq.len(), u, m)); + } + } + chainsp.sort(); + let mut chainso = Vec::<(usize, usize)>::new(); + let mut chainsox = Vec::<(usize, usize, usize)>::new(); + for (i, c) in chainsp.into_iter().enumerate() { + chainso.push((c.2, c.3)); + chainsox.push((c.2, c.3, i)); + } + chainsox.sort_unstable(); + for ri in &mut r { + *ri = chainsox[*ri].2; + } + r.sort_unstable(); + + // Create rmap, that sends + // (index into exact subclonotypes for this clonotype, + // index into chains for one of these exact subclonotypes) + // to an index into the set reps for the chains. + + let mut rpos = HashMap::<(usize, usize), usize>::new(); + for (i, chain) in chains.into_iter().enumerate() { + let c = e.set_id(i); + let f = chainsox[c as usize].2; + let q = bin_position(&r, &f) as usize; + rpos.insert((chain.0, chain.1), q); + } + + // Find the maximum multiplicity of each set, and the number of columns. + + let mut mm = vec![0; r.len()]; + for (u, &exu) in exacts.iter().enumerate() { + let ex = &exact_clonotypes[exu]; + let mut mm0 = vec![0; r.len()]; + for m in 0..ex.share.len() { + mm0[rpos[&(u, m)]] += 1; + } + for i in 0..r.len() { + mm[i] = max(mm[i], mm0[i]); + } + } + let cols = mm.iter().sum(); + + // Define a matrix mat[col][ex] which is the column of the exact subclonotype ex corresponding + // to the given column col of the clonotype, which may or may not be defined. + + let mut mat = vec![vec![None; nexacts]; cols]; + for (cx, cc) in mat.iter_mut().enumerate() { + // for every column + 'exact: for (u, &exu) in exacts.iter().enumerate() { + // for every exact subclonotype + let ex = &exact_clonotypes[exu]; + let mut mm0 = vec![0; r.len()]; + for m in 0..ex.share.len() { + // for every chain in the exact subclonotype: + let q = rpos[&(u, m)]; + let mut col = mm0[q]; + col += mm.iter().take(q).sum::(); + mm0[q] += 1; + if col == cx { + cc[u] = Some(m); + continue 'exact; + } + } + } + } + mat +} diff --git a/lib/rust/enclone_process/src/delete_weaks.rs b/lib/rust/enclone_process/src/delete_weaks.rs new file mode 100644 index 0000000..3a997a7 --- /dev/null +++ b/lib/rust/enclone_process/src/delete_weaks.rs @@ -0,0 +1,49 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use enclone_core::defs::ExactClonotype; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn delete_weaks( + exacts: &[usize], + exact_clonotypes: &[ExactClonotype], + mat: &[Vec>], + bads: &mut [bool], +) { + let nexacts = exacts.len(); + for u in 0..nexacts { + // NOTE: these checks are vestigial, related to filter options that + // have been removed. They are likely unreachable. + if exact_clonotypes[exacts[u]].ncells() == 0 { + bads[u] = true; + } + if exact_clonotypes[exacts[u]].share.is_empty() { + bads[u] = true; + } + } + + // Remove onesies that do not have an exact match. + let cols = mat.len(); + if cols > 1 { + for u1 in 0..nexacts { + let ex1 = &exact_clonotypes[exacts[u1]]; + if ex1.share.len() == 1 && !bads[u1] { + let mut perf = false; + 'u2: for u2 in 0..nexacts { + let ex2 = &exact_clonotypes[exacts[u2]]; + if ex2.share.len() > 1 && !bads[u2] { + for i in 0..ex2.share.len() { + if ex1.share[0].seq == ex2.share[i].seq { + perf = true; + break 'u2; + } + } + } + } + if !perf { + bads[u1] = true; + } + } + } + } +} diff --git a/lib/rust/enclone_process/src/lib.rs b/lib/rust/enclone_process/src/lib.rs new file mode 100644 index 0000000..b6dc8ad --- /dev/null +++ b/lib/rust/enclone_process/src/lib.rs @@ -0,0 +1,7 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +pub mod define_column_info; +pub mod define_mat; +pub mod delete_weaks; +pub mod loupe; +pub mod process_clonotypes; diff --git a/lib/rust/enclone_process/src/loupe.rs b/lib/rust/enclone_process/src/loupe.rs new file mode 100644 index 0000000..d792f50 --- /dev/null +++ b/lib/rust/enclone_process/src/loupe.rs @@ -0,0 +1,468 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. +// +// This set of functions writes a protobuf data structure that +// Loupe uses to access clonotype data. + +use self::refx::RefData; +use amino::codon_to_aa; +use anyhow::{Context, Result}; +use bio_edit::alignment::pairwise::Aligner; +use enclone_core::defs::{AltRef, ColInfo, EncloneControl, ExactClonotype}; +use enclone_proto::proto_io::write_proto; +use enclone_proto::types::{ + Alignment, Clonotype, ClonotypeChain, DonorReference, DonorReferenceItem, EncloneOutputs, + ExactSubClonotype, ExactSubClonotypeChain, ExactSubClonotypeChainInfo, + InvariantTCellAnnotation, Metadata, Region, UniversalReference, UniversalReferenceItem, +}; +use enclone_proto::PROTO_VERSION; +use std::fmt::Write; +use vdj_ann::refx; + +// Export donor reference/inferred alt allele sequences +pub fn make_donor_refs(alt_refs: &[AltRef], refdata: &RefData) -> Vec { + let mut drefs = Vec::::new(); + let mut i = 0; + while i < alt_refs.len() { + let mut j = i + 1; + while j < alt_refs.len() { + if alt_refs[j].donor != alt_refs[i].donor || alt_refs[j].ref_id != alt_refs[i].ref_id { + break; + } + j += 1; + } + // let j = next_diff12_5(alt_refs, i); + for (k, x) in alt_refs.iter().enumerate().take(j).skip(i) { + let donor_id = x.donor; + let ref_id = x.ref_id; + let alt = x.alt_seq.to_ascii_vec(); + let alt_name = format!( + "{}, donor {}, alt allele {}", + refdata.name[ref_id].as_str(), + donor_id, + k - i + 1 + ); + let refx = refdata.refs[ref_id].to_ascii_vec(); + let mut cigar = String::new(); + let mut matches = 0; + for p in 0..refx.len() { + if alt[p] == refx[p] { + matches += 1; + } else { + if matches > 0 { + write!(cigar, "{matches}=").unwrap(); + } + cigar.push_str("1X"); + matches = 0; + } + } + if matches > 0 { + write!(cigar, "{matches}=").unwrap(); + } + drefs.push(DonorReferenceItem { + universal_idx: ref_id as u32, + donor_idx: donor_id as u32, + display_name: alt_name, + region: Region::V.into(), + nt_sequence: alt, + universal_aln: Alignment { + ref_start: 0, + cigar, + }, + }); + } + i = j; + } + drefs +} + +fn amino_acid(seq: &[u8], start: usize) -> Vec { + seq[start..].chunks_exact(3).map(codon_to_aa).collect() +} + +pub fn make_loupe_clonotype( + exact_clonotypes: &[ExactClonotype], + exacts: &[usize], + rsi: &ColInfo, + refdata: &RefData, + dref: &[DonorReferenceItem], + ctl: &EncloneControl, +) -> Clonotype { + // Define concatenated universal and donor reference sequences. + + let mat = &rsi.mat; + let cols = rsi.uids.len(); + let mut concatu = vec![Vec::::new(); cols]; + let mut vstartu = vec![0; cols]; // Index of the start of the V region in concatu + let mut concatd = vec![Vec::::new(); cols]; + let mut vstartd = vec![0; cols]; // Index of the start of the V region in concatd + + for cx in 0..cols { + if rsi.uids[cx].is_some() { + let mut x = refdata.refs[rsi.uids[cx].unwrap()].to_ascii_vec(); + concatu[cx].append(&mut x); + concatd[cx].append(&mut x); + } + let mut x = refdata.refs[rsi.vids[cx]].to_ascii_vec(); + vstartu[cx] = concatu[cx].len(); + vstartd[cx] = concatd[cx].len(); + concatu[cx].append(&mut x); + if rsi.vpids[cx].is_none() { + concatd[cx].append(&mut x); + } else { + let mut y = dref[rsi.vpids[cx].unwrap()].nt_sequence.clone(); + concatd[cx].append(&mut y); + } + if rsi.dids[cx].is_some() { + let mut x = refdata.refs[rsi.dids[cx].unwrap()].to_ascii_vec(); + concatu[cx].append(&mut x); + concatd[cx].append(&mut x); + } + let mut x = refdata.refs[rsi.jids[cx]].to_ascii_vec(); + concatu[cx].append(&mut x); + concatd[cx].append(&mut x); + if rsi.cids[cx].is_some() { + let mut x = refdata.refs[rsi.cids[cx].unwrap()].to_ascii_vec(); + concatu[cx].append(&mut x); + concatd[cx].append(&mut x); + } + } + + // Define ClonotypeChains. + + let mut xchains = Vec::::new(); + for cx in 0..cols { + let mut m0 = 0; + let mut u0 = 0; + for z in 0..mat[cx].len() { + if mat[cx][z].is_some() { + u0 = z; + m0 = mat[cx][z].unwrap(); + break; + } + } + let ex = &exact_clonotypes[exacts[u0]]; + let nt_sequence = ex.share[m0].full_seq.clone(); + let chain_type = ex.share[m0].chain_type.clone(); + + let donor_v_idx = rsi.vpids[cx]; + let donor_j_idx = None; + let score = |a: u8, b: u8| if a == b { 1i32 } else { -1i32 }; + let universal_reference = concatu[cx].clone(); + let donor_reference = concatd[cx].clone(); + let mut aligner = Aligner::new(-6, -1, &score); + let al = aligner.semiglobal(&nt_sequence, &universal_reference); + let universal_reference_aln = Alignment::from(&al); + let al = aligner.semiglobal(&nt_sequence, &donor_reference); + let donor_reference_aln = Alignment::from(&al); + + let aa_sequence = amino_acid(&nt_sequence, ex.share[m0].v_start); + let aa_sequence_universal = amino_acid(&universal_reference, vstartu[cx]); + let aa_sequence_donor = amino_acid(&donor_reference, vstartd[cx]); + + let v_start = ex.share[m0].v_start; + let fwr1_start = Some((v_start + ex.share[m0].fr1_start) as u32); + let mut cdr1_start = None; + if ex.share[m0].cdr1_start.is_some() { + cdr1_start = Some((v_start + ex.share[m0].cdr1_start.unwrap()) as u32); + } + let mut fwr2_start = None; + if ex.share[m0].fr2_start.is_some() { + fwr2_start = Some((v_start + ex.share[m0].fr2_start.unwrap()) as u32); + } + let mut cdr2_start = None; + if ex.share[m0].cdr2_start.is_some() { + cdr2_start = Some((v_start + ex.share[m0].cdr2_start.unwrap()) as u32); + } + let mut fwr3_start = None; + if ex.share[m0].fr3_start.is_some() { + fwr3_start = Some((v_start + ex.share[m0].fr3_start.unwrap()) as u32); + } + let fwr4_end = Some((ex.share[m0].v_start + ex.share[m0].seq.len()) as u32); + + xchains.push(ClonotypeChain { + nt_sequence, + aa_sequence, + u_idx: rsi.uids[cx].map(|idx| idx as u32), + v_idx: rsi.vids[cx] as u32, + d_idx: rsi.dids[cx].map(|idx| idx as u32), + j_idx: rsi.jids[cx] as u32, + c_idx: rsi.cids[cx].map(|idx| idx as u32), + donor_v_idx: donor_v_idx.map(|idx| idx as u32), + donor_j_idx, + universal_reference, + universal_reference_aln, + aa_sequence_universal, + donor_reference, + donor_reference_aln, + aa_sequence_donor, + v_start: ex.share[m0].v_start as u32, + v_end: ex.share[m0].v_stop as u32, + v_end_ref: ex.share[m0].v_stop_ref as u32, + j_start: ex.share[m0].j_start as u32, + j_start_ref: ex.share[m0].j_start_ref as u32, + j_end: ex.share[m0].j_stop as u32, + fwr1_start, + cdr1_start, + fwr2_start, + cdr2_start, + fwr3_start, + cdr3_start: ex.share[m0].v_start as u32 + ex.share[m0].cdr3_start as u32, + cdr3_end: ex.share[m0].v_start as u32 + + (ex.share[m0].cdr3_start + 3 * ex.share[m0].cdr3_aa.len()) as u32, + fwr4_end, + chain_type, + }); + } + + // Define an EClonotype. + + let mut ecl = Vec::::new(); + for j in 0..exacts.len() { + let mut chains = Vec::>::new(); + let ex = &exact_clonotypes[exacts[j]]; + for cx in 0..cols { + let m = mat[cx][j]; + if m.is_none() { + chains.push(None); + continue; + } + let m = m.unwrap(); + let nt_sequence = ex.share[m].full_seq.clone(); + let v_start = ex.share[m].v_start; + let mut aa_sequence = Vec::::new(); + let mut p = v_start; + while p + 3 <= nt_sequence.len() { + aa_sequence.push(codon_to_aa(&nt_sequence[p..p + 3])); + p += 3; + } + let j_end = ex.share[m].j_stop; + let c_region_idx = rsi.cids[cx]; + let fwr1_start = Some((v_start + ex.share[m].fr1_start) as u32); + let mut cdr1_start = None; + if ex.share[m].cdr1_start.is_some() { + cdr1_start = Some((v_start + ex.share[m].cdr1_start.unwrap()) as u32); + } + let mut fwr2_start = None; + if ex.share[m].fr2_start.is_some() { + fwr2_start = Some((v_start + ex.share[m].fr2_start.unwrap()) as u32); + } + let mut cdr2_start = None; + if ex.share[m].cdr2_start.is_some() { + cdr2_start = Some((v_start + ex.share[m].cdr2_start.unwrap()) as u32); + } + let mut fwr3_start = None; + if ex.share[m].fr3_start.is_some() { + fwr3_start = Some((v_start + ex.share[m].fr3_start.unwrap()) as u32); + } + let cdr3_start = v_start + ex.share[m].cdr3_start; + let cdr3_end = cdr3_start + ex.share[m].cdr3_dna.len(); + let fwr4_end = Some((ex.share[m].v_start + ex.share[m].seq.len()) as u32); + let mut umi_counts = Vec::::new(); + let mut read_counts = Vec::::new(); + let mut contig_ids = Vec::::new(); + for l in 0..ex.clones.len() { + umi_counts.push(ex.clones[l][m].umi_count as u32); + read_counts.push(ex.clones[l][m].read_count as u32); + contig_ids.push(ex.clones[l][m].tigname.clone()); + } + + // Build alignments. Don't know that these are sensible + // alignment parameters. + + let score = |a: u8, b: u8| if a == b { 1i32 } else { -1i32 }; + let mut aligner = Aligner::new(-6, -1, &score); + let al = aligner.semiglobal(&nt_sequence, &xchains[cx].nt_sequence); + let clonotype_consensus_aln = Alignment::from(&al); + let al = aligner.semiglobal(&nt_sequence, &concatu[cx]); + let universal_reference_aln = Alignment::from(&al); + let al = aligner.semiglobal(&nt_sequence, &concatd[cx]); + let donor_reference_aln = Alignment::from(&al); + + // Compute nucleotide percent identity. + + let xm = &ex.share[m]; + let mut diffs = 0; + let mut denom = 0; + let seq = &xm.seq_del_amino; + let mut vref = refdata.refs[xm.v_ref_id].to_ascii_vec(); + if xm.v_ref_id_donor_alt_id.is_some() { + vref.clone_from(&dref[xm.v_ref_id_donor.unwrap()].nt_sequence); + } + let jref = refdata.refs[xm.j_ref_id].to_ascii_vec(); + let z = seq.len(); + for p in 0..z { + let b = seq[p]; + if b == b'-' { + diffs += 1; + denom += 1; + continue; + } + if p < vref.len() - ctl.heur.ref_v_trim { + denom += 1; + if b != vref[p] { + diffs += 1; + } + } + if p >= z - (jref.len() - ctl.heur.ref_j_trim) { + denom += 1; + if b != jref[jref.len() - (z - p)] { + diffs += 1; + } + } + } + let dna_percent = 100.0 * (denom - diffs) as f32 / denom as f32; + + // Compute amino acid percent identity. + + let xm = &ex.share[m]; + let mut diffs = 0; + let mut denom = 0; + let aa_seq = &xm.aa_mod_indel; + let mut vref = refdata.refs[xm.v_ref_id].to_ascii_vec(); + if xm.v_ref_id_donor_alt_id.is_some() { + vref.clone_from(&dref[xm.v_ref_id_donor.unwrap()].nt_sequence); + } + let jref = refdata.refs[xm.j_ref_id].to_ascii_vec(); + let z = 3 * aa_seq.len() + 1; + for p in 0..aa_seq.len() { + if aa_seq[p] == b'-' { + diffs += 1; + denom += 1; + continue; + } + if 3 * p + 3 <= vref.len() - ctl.heur.ref_v_trim { + denom += 1; + if aa_seq[p] != codon_to_aa(&vref[3 * p..3 * p + 3]) { + diffs += 1; + } + } + if 3 * p > z - (jref.len() - ctl.heur.ref_j_trim) + 3 { + denom += 1; + if aa_seq[p] + != codon_to_aa( + &jref[jref.len() - (z - 3 * p)..jref.len() - (z - 3 * p) + 3], + ) + { + diffs += 1; + } + } + } + let aa_percent = 100.0 * (denom - diffs) as f32 / denom as f32; + + // Finally, define the ExactClonotypeChain. + + chains.push(Some(ExactSubClonotypeChain { + nt_sequence, + aa_sequence, + v_start: v_start as u32, + j_end: j_end as u32, + c_region_idx: c_region_idx.map(|idx| idx as u32), + fwr1_start, + cdr1_start, + fwr2_start, + cdr2_start, + fwr3_start, + cdr3_start: cdr3_start as u32, + cdr3_end: cdr3_end as u32, + fwr4_end, + umi_counts, + read_counts, + contig_ids, + clonotype_consensus_aln, + donor_reference_aln, + universal_reference_aln, + dna_percent, + aa_percent, + })); + } + let mut cell_barcodes = Vec::::new(); + for l in 0..ex.clones.len() { + cell_barcodes.push(ex.clones[l][0].barcode.clone()); + } + let inkt_evidence = InvariantTCellAnnotation { + alpha_chain_gene_match: ex.share[0].inkt_alpha_chain_gene_match, + alpha_chain_junction_match: ex.share[0].inkt_alpha_chain_junction_match, + beta_chain_gene_match: ex.share[0].inkt_beta_chain_gene_match, + beta_chain_junction_match: ex.share[0].inkt_beta_chain_junction_match, + }; + let mait_evidence = InvariantTCellAnnotation { + alpha_chain_gene_match: ex.share[0].mait_alpha_chain_gene_match, + alpha_chain_junction_match: ex.share[0].mait_alpha_chain_junction_match, + beta_chain_gene_match: ex.share[0].mait_beta_chain_gene_match, + beta_chain_junction_match: ex.share[0].mait_beta_chain_junction_match, + }; + ecl.push(ExactSubClonotype { + chains: chains + .into_iter() + .enumerate() + .filter_map(|(index, opt_chain)| { + opt_chain.map(|chain| ExactSubClonotypeChainInfo { + index: index as u32, + chain, + }) + }) + .collect(), + cell_barcodes, + inkt_evidence, + mait_evidence, + }); + } + + // Build Clonotype. + + let n = ecl.iter().map(|e| e.cell_barcodes.len()).sum::(); + Clonotype { + chains: xchains, + exact_clonotypes: ecl, + frequency: n as u32, + } +} + +pub fn loupe_out( + ctl: &EncloneControl, + all_loupe_clonotypes: Vec, + refdata: &RefData, + dref: &[DonorReferenceItem], +) -> Result<()> { + if ctl.cr_opt.proto.is_empty() { + return Ok(()); + } + let mut uref = Vec::new(); + for i in 0..refdata.refs.len() { + uref.push(UniversalReferenceItem { + ref_idx: refdata.id[i] as u32, + display_name: refdata.name[i].clone(), + region: match refdata.segtype[i] { + "U" => Region::U.into(), + "V" => Region::V.into(), + "D" => Region::D.into(), + "J" => Region::J.into(), + "C" => Region::C.into(), + _ => unreachable!(), + }, + nt_sequence: refdata.refs[i].to_ascii_vec(), + }); + } + let metadata = if !ctl.cr_opt.proto_metadata.is_empty() { + let fname = &ctl.cr_opt.proto_metadata; + serde_json::from_reader( + std::fs::File::open(fname).with_context(|| format!("reading {fname}"))?, + ) + .with_context(|| format!("unable to deserialize Metadata from {fname}"))? + } else { + Metadata::default() + }; + let enclone_outputs = EncloneOutputs { + version: PROTO_VERSION.into(), + metadata, + num_clonotypes: all_loupe_clonotypes.len() as u32, + clonotypes: all_loupe_clonotypes, + universal_reference: UniversalReference { items: uref }, + donor_reference: DonorReference { + items: dref.to_vec(), + }, + }; + + write_proto(enclone_outputs, &ctl.cr_opt.proto)?; + Ok(()) +} diff --git a/lib/rust/enclone_process/src/process_clonotypes.rs b/lib/rust/enclone_process/src/process_clonotypes.rs new file mode 100644 index 0000000..cac9ea6 --- /dev/null +++ b/lib/rust/enclone_process/src/process_clonotypes.rs @@ -0,0 +1,231 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. +//! This file provides the function process_clonotypes, which performs some final +//! filtering and writes out the barcode fate and the loupe clonotype files. +//! +//! Additional behavior is injected by Enclone through the candidate clonotypeProcessor trait. + +use crate::define_column_info::define_column_info; +use crate::define_mat::{define_mat, Od}; +use crate::delete_weaks::delete_weaks; +use crate::loupe::{loupe_out, make_loupe_clonotype}; +use anyhow::Result; +use enclone_core::defs::{CloneInfo, EncloneControl}; +use enclone_core::enclone_structs::{BarcodeFates, EncloneExacts}; +use enclone_proto::types::Clonotype; +use itertools::Itertools; +use rayon::prelude::*; +use std::cmp::Reverse; +use std::fs::File; +use std::io::BufWriter; +use vdj_ann::refx::RefData; +use vector_utils::{erase_if, next_diff12_3}; + +/// Process clonotypes. +/// Filter out exact subclonotypes in candidate clonotypes that appear to be junk. +/// Write out barcode fates and loupe clonotype files. +pub fn process_clonotypes( + ctl: &EncloneControl, + refdata: &RefData, + enclone_exacts: &EncloneExacts, +) -> Result<()> { + let EncloneExacts { + to_bc, + exact_clonotypes, + raw_joins, + info, + candidate_clonotypes, + drefs: dref, + sr, + } = enclone_exacts; + + // Traverse the candidate clonotypes. + let result_iter = candidate_clonotypes.par_iter().map(|cc| { + let od: Vec<_> = cc + .iter() + .map(|id| { + let x: &CloneInfo = &info[*id as usize]; + (x.origin.clone(), x.clonotype_index, *id) + }) + .sorted() + .collect(); + + // Reconstruct the participating clones. This is needed because most exact subclonotypes + // having more than two chains have been split up. + // + // Capture these data into parallel data structures, one per exact subclonotype: + // exacts: the exact subclonotype ids + // mults: number of cells [redundant, might remove] + + let mut exacts = Vec::::new(); + let mut mults = Vec::::new(); + let mut j = 0; + while j < od.len() { + let k = next_diff12_3(&od, j); + let mut mult = 0_usize; + for l in j..k { + let x: &CloneInfo = &info[od[l].2 as usize]; + let m = x.clonotype_index; + mult = exact_clonotypes[m].clones.len(); + } + mults.push(mult); + exacts.push(od[j].1); + j = k; + } + + // Identify the exact subclonotypes that are junk. + + sort_exact_clonotypes(ctl, refdata, enclone_exacts, &od, &mut exacts, &mut mults); + + // Define a matrix mat[col][ex] which is the column of the exact subclonotype + // corresponding to the given column col of the clonotype, which may or may not be + // defined. Then define other information associated to each chain. These are + // reference sequence identifiers, CDR3 start positions, and the like. + let mat = define_mat( + to_bc, + sr, + ctl, + exact_clonotypes, + &exacts, + &od, + info, + raw_joins, + refdata, + ); + let rsi = define_column_info(&exacts, exact_clonotypes, mat); + let mat = &rsi.mat; + + // Filter. + + // Let n be the total number of cells in this pass. + let n: usize = mults.iter().sum(); + + let mut bads = vec![false; exacts.len()]; + + if n > 0 { + // Mark some weak exact subclonotypes for deletion. + delete_weaks(&exacts, exact_clonotypes, mat, &mut bads); + }; + + // Delete weak exact subclonotypes. + erase_if(&mut mults, &bads); + erase_if(&mut exacts, &bads); + + sort_exact_clonotypes(ctl, refdata, enclone_exacts, &od, &mut exacts, &mut mults); + + // Define a matrix mat[col][ex] which is the column of the exact subclonotype + // corresponding to the given column col of the clonotype, which may or may not be + // defined. Then define other information associated to each chain. These are + // reference sequence identifiers, CDR3 start positions, and the like. + let mat = define_mat( + to_bc, + sr, + ctl, + exact_clonotypes, + &exacts, + &od, + info, + raw_joins, + refdata, + ); + let rsi = define_column_info(&exacts, exact_clonotypes, mat); + + // Generate Loupe data. + + let loupe_clonotype = (!ctl.cr_opt.proto.is_empty()) + .then(|| make_loupe_clonotype(exact_clonotypes, &exacts, &rsi, refdata, dref, ctl)); + + // Let n be the total number of cells in this pass. + + let n: usize = mults.iter().sum(); + + if n == 0 { + return (0, loupe_clonotype); + } + + let num_cells: usize = exacts + .iter() + .map(|exact| exact_clonotypes[*exact].ncells()) + .sum(); + + (num_cells, loupe_clonotype) + }); + let mut results: Vec<_> = result_iter.collect(); + + // Sort results in descending order by number of cells. + + results.sort_by_key(|(num_cells, _)| Reverse(*num_cells)); + + let mut all_loupe_clonotypes = Vec::::new(); + + for (_, loupe_clonotype) in results { + all_loupe_clonotypes.extend(loupe_clonotype); + } + + // Write loupe output. + loupe_out(ctl, all_loupe_clonotypes, refdata, dref)?; + + Ok(()) +} + +/// Sort exact subclonotypes. +fn sort_exact_clonotypes( + ctl: &EncloneControl, + refdata: &RefData, + enclone_exacts: &EncloneExacts, + od: &[Od], + exacts: &mut Vec, + mults: &mut Vec, +) { + let EncloneExacts { + to_bc, + exact_clonotypes, + raw_joins, + info, + candidate_clonotypes: _, + drefs: _, + sr, + } = enclone_exacts; + let mat = define_mat( + to_bc, + sr, + ctl, + exact_clonotypes, + exacts, + od, + info, + raw_joins, + refdata, + ); + let priority = exacts + .iter() + .enumerate() + .map(|(u, &exact)| { + let typex = mat.iter().map(|col| col[u].is_some()).collect::>(); + let clonotype_id = exact; + let ex = &exact_clonotypes[clonotype_id]; + let mut utot0 = 0; + if let Some(mid) = mat[0][u] { + let ex = &exact_clonotypes[clonotype_id]; + for j in 0..ex.clones.len() { + utot0 += ex.clones[j][mid].umi_count; + } + } + (typex, ex.ncells(), utot0) + }) + .collect::>(); + let permutation = permutation::sort(&priority[..]); + *exacts = permutation.apply_slice(&exacts[..]); + *mults = permutation.apply_slice(&mults[..]); + exacts.reverse(); + mults.reverse(); +} + +pub fn write_fate(path: &str, fate: &[BarcodeFates]) -> Result<(), String> { + // Write out the fate of each filtered barcode. + if !path.is_empty() { + let mut wtr = + BufWriter::new(File::create(path).expect("Unable to open FATE_FILE for writing")); + serde_json::to_writer_pretty(&mut wtr, &fate).map_err(|e| e.to_string())?; + } + Ok(()) +} diff --git a/lib/rust/enclone_proto/Cargo.toml b/lib/rust/enclone_proto/Cargo.toml new file mode 100644 index 0000000..2f1ac32 --- /dev/null +++ b/lib/rust/enclone_proto/Cargo.toml @@ -0,0 +1,33 @@ +[dependencies] +[dependencies.bio_edit] +path = '../bio_edit' + +[dependencies.byteorder] +workspace = true + +[dependencies.prost] +workspace = true + +[dependencies.serde] +features = [] +workspace = true + +[dependencies.thiserror] +workspace = true + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'enclone_proto' +publish = false +version = '0.1.0' + +[package.metadata] +[package.metadata.cargo-machete] +ignored = ['serde'] diff --git a/lib/rust/enclone_proto/src/enclone.types.rs b/lib/rust/enclone_proto/src/enclone.types.rs new file mode 100644 index 0000000..27fafbc --- /dev/null +++ b/lib/rust/enclone_proto/src/enclone.types.rs @@ -0,0 +1,517 @@ +// This file is @generated by prost-build. +/// Evidence that a given cell is iNKT or MAIT. Each ExactSubclonotype has one +/// instantiation of this structure for iNKT and one for MAIT. +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct InvariantTCellAnnotation { + #[prost(bool, required, tag = "1")] + pub alpha_chain_gene_match: bool, + #[prost(bool, required, tag = "2")] + pub alpha_chain_junction_match: bool, + #[prost(bool, required, tag = "3")] + pub beta_chain_gene_match: bool, + #[prost(bool, required, tag = "4")] + pub beta_chain_junction_match: bool, +} +/// Representation of an alignment +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Alignment { + /// Start of the alignment in the reference + #[prost(uint32, required, tag = "1")] + pub ref_start: u32, + /// Cigar string + #[prost(string, required, tag = "2")] + pub cigar: ::prost::alloc::string::String, +} +/// Defines a chain within an exact subclonotype. +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExactSubClonotypeChain { + /// Nucleotide sequence of the chain. This will only contain ACGT alphabets + #[prost(bytes = "vec", required, tag = "1")] + pub nt_sequence: ::prost::alloc::vec::Vec, + /// Amino acid sequence from the start codon at the beginning of the V-REGION. + /// This can be inferred from the `nt_sequence` and `v_start`, but stored for + /// convenience + #[prost(bytes = "vec", required, tag = "2")] + pub aa_sequence: ::prost::alloc::vec::Vec, + /// Index of the start of the V-REGION in the `nt_sequence`. + #[prost(uint32, required, tag = "3")] + pub v_start: u32, + /// Index of the end of the J-REGION in the `nt_sequence` (exclusive). + #[prost(uint32, required, tag = "4")] + pub j_end: u32, + /// Index of the C-REGION of this chain in the universal reference. + /// TODO: Should we store UVDJ regions here for convenience? The reason why it + /// is not stored at this level is because all exact subclonotypes share the + /// same UVDJ regions. + #[prost(uint32, optional, tag = "5")] + pub c_region_idx: ::core::option::Option, + /// Index of the start of the CDR3 sequence in the `nt_sequence`. The start of + /// the CDR3 amino acid in the `aa_sequence` is `(cdr3_start - v_start)/3`. + #[prost(uint32, required, tag = "6")] + pub cdr3_start: u32, + /// Index of the end of the CDR3 sequence in the `nt_sequence` (exclusive). + /// The end of the CDR3 amino acid in the `aa_sequence` is + /// `(cdr3_end - v_start)/3`. + #[prost(uint32, required, tag = "7")] + pub cdr3_end: u32, + /// UMI counts of contigs associated with this exact subclonotype chain. The + /// number of elements in this vector is equal to the number of barcodes + /// associated with this exact subclonotype. + #[prost(uint32, repeated, packed = "false", tag = "8")] + pub umi_counts: ::prost::alloc::vec::Vec, + /// Read counts of contigs associated with this exact subclonotype chain. The + /// number of elements in this vector is equal to the number of barcodes + /// associated with this exact subclonotype. + #[prost(uint32, repeated, packed = "false", tag = "9")] + pub read_counts: ::prost::alloc::vec::Vec, + /// Names of contigs associated with this exact subclonotype chain. The number + /// of elements in this vector is equal to the number of barcodes associated + /// with this exact subclonotype. The contig name would be of the form + /// `{barcode}_contig_{id}`. + #[prost(string, repeated, tag = "10")] + pub contig_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Alignment of the `nt_sequence` to the nucleotide sequence of the clonotype + /// consensus of this chain. + /// TODO: Do we need amino acid alignment info? + #[prost(message, required, tag = "11")] + pub clonotype_consensus_aln: Alignment, + /// Alignment of the `nt_sequence` to the nucleotide sequence of the + /// concatenated donor reference of this chain (defined elsewhere in this + /// file). + /// TODO: Default donor reference to universal reference? + #[prost(message, required, tag = "12")] + pub donor_reference_aln: Alignment, + /// Alignment of the `nt_sequence` to the nucleotide sequence of the + /// concatenated universal reference of this chain (defined elsewhere in this + /// file). + #[prost(message, required, tag = "13")] + pub universal_reference_aln: Alignment, + /// Index of the start of the FWR1 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "14")] + pub fwr1_start: ::core::option::Option, + /// Index of the start of the CDR1 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "15")] + pub cdr1_start: ::core::option::Option, + /// Index of the start of the FWR2 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "16")] + pub fwr2_start: ::core::option::Option, + /// Index of the start of the CDR2 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "17")] + pub cdr2_start: ::core::option::Option, + /// Index of the start of the FWR3 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "18")] + pub fwr3_start: ::core::option::Option, + /// Index of the end of the FWR4 sequence in the `nt_sequence` (exclusive). + #[prost(uint32, optional, tag = "19")] + pub fwr4_end: ::core::option::Option, + /// Nucleotide percent identity with the donor reference, outside junction region. + #[prost(float, required, tag = "20")] + pub dna_percent: f32, + /// Amino acid percent identity with the donor reference, outside junction region. + #[prost(float, required, tag = "21")] + pub aa_percent: f32, +} +/// The chains in a clonotype are ordered an hence they have a unique index. +/// An exact subclonotype within a clonotype might not have all the chains that +/// are present in the clonotype. This structure stores the exact subclonotype +/// chain along with the `index` of the corresponding chain in the parent +/// clonotype. +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExactSubClonotypeChainInfo { + /// The index of this chain in the parent clonotype + #[prost(uint32, required, tag = "1")] + pub index: u32, + #[prost(message, required, tag = "2")] + pub chain: ExactSubClonotypeChain, +} +/// Define an exact subclonotype. +/// +/// All the barcodes within an exact subclonotype have the same number of +/// productive chains, the same sequence from the start of the V-REGION to the +/// end of the J-REGION as well as the same C-REGION annotation for each chain. +/// TODO: Maybe mutations outside V-J? +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExactSubClonotype { + /// The chains in an exact subclonotype along with the index of the chain in + /// the parent clonotype + #[prost(message, repeated, tag = "1")] + pub chains: ::prost::alloc::vec::Vec, + /// List of cell barcodes in this exact subclonotype. The number of elements in + /// this list is equal to the number of elements in the `umi_counts` and + /// `contig_ids` vector in an `ExactSubClonotypeChain`. The barcodes have the + /// appropriate gem group as the suffix. + #[prost(string, repeated, tag = "2")] + pub cell_barcodes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// For a T cell, optionally annotate the exact subclonotype as one or both of + /// iNKT/MAIT. This data structure stores the evidence we have about the + /// annotation. The evidence can be zero, and indeed this will be the case for + /// all B cells. + #[prost(message, required, tag = "3")] + pub inkt_evidence: InvariantTCellAnnotation, + #[prost(message, required, tag = "4")] + pub mait_evidence: InvariantTCellAnnotation, +} +/// Define a clonotype chain +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ClonotypeChain { + /// The nucleotide sequence of this clonotype chain consensus + /// What we actually compute here is not the consensus across the clonotype + /// (whose biological meaning is questionable), but rather the sequence of the + /// first exact subclonotype which has an entry for the given chain. Over 99% + /// of the time, this will be the first exact subclonotype. + #[prost(bytes = "vec", required, tag = "1")] + pub nt_sequence: ::prost::alloc::vec::Vec, + /// Index of the 5' UTR region in the universal reference. The region in the + /// universal reference is guaranteed to be `Region::U` + #[prost(uint32, optional, tag = "2")] + pub u_idx: ::core::option::Option, + /// Index of the Variable region in the universal reference. The region in the + /// universal reference is guaranteed to be `Region::V` + #[prost(uint32, required, tag = "3")] + pub v_idx: u32, + /// Index of the Diversity region in the universal reference. The region in the + /// universal reference is guaranteed to be `Region::D`. D-REGION is not + /// present for light/alpha chains. Even for heavy/beta chains, this might be + /// `None` if there is ambiguity in the annotation. + #[prost(uint32, optional, tag = "4")] + pub d_idx: ::core::option::Option, + /// Index of the Joining region in the universal reference. The region in the + /// universal reference is guaranteed to be `Region::J` + #[prost(uint32, required, tag = "5")] + pub j_idx: u32, + /// Index of the Constant region in the universal reference. The region in the + /// universal reference is guaranteed to be `Region::C` + #[prost(uint32, optional, tag = "6")] + pub c_idx: ::core::option::Option, + /// Index of the Variable region in the donor reference. The region in the + /// donor reference is guaranteed to be `Region::V` and the `universal_idx` in + /// the donor reference item will be equal to the `v_idx` + #[prost(uint32, optional, tag = "7")] + pub donor_v_idx: ::core::option::Option, + /// / Index of the Joining region in the donor reference. The region in the + /// / donor reference is guaranteed to be `Region::J` and the `universal_idx` in + /// / the donor reference item will be equal to the `j_idx` + #[prost(uint32, optional, tag = "8")] + pub donor_j_idx: ::core::option::Option, + /// Concatenated universal reference = + /// `nt_sequence` of universal_reference\[u_idx\] if u_idx is not None + + /// `nt_sequence` of universal_reference\[v_idx\] + + /// `nt_sequence` of universal_reference\[d_idx\] if d_idx is not None + + /// `nt_sequence` of universal_reference\[j_idx\] + + /// `nt_sequence` of universal_reference\[c_idx\] if c_idx is not None. + #[prost(bytes = "vec", required, tag = "9")] + pub universal_reference: ::prost::alloc::vec::Vec, + /// Alignment of the `nt_sequence` to the nucleotide sequence of the + /// concatenated universal reference of this chain. + #[prost(message, required, tag = "10")] + pub universal_reference_aln: Alignment, + /// The concatenated donor reference is the same as the concatenated universal + /// reference, however with substitutions: + /// `nt_sequence` of donor_reference\[donor_v_idx\] if donor_v_idx is not + /// None + /// and + /// `nt_sequence` of donor_reference\[donor_j_idx\] if donor_j_idx is not + /// None. + #[prost(bytes = "vec", required, tag = "11")] + pub donor_reference: ::prost::alloc::vec::Vec, + /// Alignment of the `nt_sequence` to the nucleotide sequence of the + /// concatenated donor reference of this chain. + #[prost(message, required, tag = "12")] + pub donor_reference_aln: Alignment, + /// Index of the start of the V-REGION in the `nt_sequence`. + #[prost(uint32, required, tag = "13")] + pub v_start: u32, + /// Index of the stop of the aligned part of the V-REGION in the `nt-sequence` + /// (exclusive). + #[prost(uint32, required, tag = "14")] + pub v_end: u32, + /// Index of the stop of the aligned part of the V-REGION in universal + /// reference V (exclusive). + #[prost(uint32, required, tag = "15")] + pub v_end_ref: u32, + /// Index of the start of the aligned part of the J-REGION in the + /// `nt_sequence`. + #[prost(uint32, required, tag = "16")] + pub j_start: u32, + /// Index of the start of the aligned part of the J-REGION in universal + /// reference J. + #[prost(uint32, required, tag = "17")] + pub j_start_ref: u32, + /// Index of the end of the J-REGION in the `nt_sequence` (exclusive). + #[prost(uint32, required, tag = "18")] + pub j_end: u32, + /// Index of the start of the CDR3 sequence in the `nt_sequence`. The start of + /// the CDR3 amino acid in the `aa_sequence` is `(cdr3_start - v_start)/3` + #[prost(uint32, required, tag = "19")] + pub cdr3_start: u32, + /// Index of the end of the CDR3 sequence in the `nt_sequence` (exclusive). The + /// end of the CDR3 amino acid in the `aa_sequence` is `(cdr3_end - v_start)/3` + #[prost(uint32, required, tag = "20")] + pub cdr3_end: u32, + /// IGH, IGK, IGL, TRA, TRB, TRD, TRG or conceivably something else. + #[prost(string, required, tag = "21")] + pub chain_type: ::prost::alloc::string::String, + /// AA sequence of the clonotype chain consensus + #[prost(bytes = "vec", required, tag = "22")] + pub aa_sequence: ::prost::alloc::vec::Vec, + /// AA sequence of the concatenated universal reference starting from the V + /// regions + #[prost(bytes = "vec", required, tag = "23")] + pub aa_sequence_universal: ::prost::alloc::vec::Vec, + /// AA sequence of the concatenated donor reference starting from the V regions + #[prost(bytes = "vec", required, tag = "24")] + pub aa_sequence_donor: ::prost::alloc::vec::Vec, + /// Index of the start of the FWR1 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "25")] + pub fwr1_start: ::core::option::Option, + /// Index of the start of the CDR1 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "26")] + pub cdr1_start: ::core::option::Option, + /// Index of the start of the FWR2 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "27")] + pub fwr2_start: ::core::option::Option, + /// Index of the start of the CDR2 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "28")] + pub cdr2_start: ::core::option::Option, + /// Index of the start of the FWR3 sequence in the `nt_sequence`. + #[prost(uint32, optional, tag = "29")] + pub fwr3_start: ::core::option::Option, + /// Index of the end of the FWR4 sequence in the `nt_sequence` (exclusive). + #[prost(uint32, optional, tag = "30")] + pub fwr4_end: ::core::option::Option, +} +/// Definition of a clonotype. +/// +/// A clonotype is composed of a list of exact subclonotypes +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Clonotype { + /// The list of chains associated with this clonotype. The ordering of the + /// chains is important as this order is preserved in the list of chains + /// specified under each exact subclonotype. By convention heavy chain/beta + /// chain comes ahead of light chain/alpha chain. + /// TODO: What is the ordering when multiple chains of same kind are present? + #[prost(message, repeated, tag = "1")] + pub chains: ::prost::alloc::vec::Vec, + /// The list of exact subclonotypes in this clonotype ordered by the number of + /// cell barcodes in the exact subclonotype in descending order (TODO: Verify + /// sort order). The number of chains listed under each exact subclonotype will + /// be equal to the number of chains in this clonotype in the same order. + /// However, some of the exact subclonotype chains could be `None`. + #[prost(message, repeated, tag = "2")] + pub exact_clonotypes: ::prost::alloc::vec::Vec, + /// The total number of cell barcodes associated with this clonotype. This can + /// be inferred by summing up the number of barcodes within each exact + /// subclonotype, but it is stored here for convenience. + #[prost(uint32, required, tag = "3")] + pub frequency: u32, +} +/// A single donor reference sequence and metadata packaged in a convenient +/// struct. In the current version of enclone, the donor reference is only +/// inferred for the V-REGIONs. But we could extend it to J-REGIONs in the +/// future. +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UniversalReferenceItem { + /// A unique identifier for this reference sequence that traces back to the + /// reference fasta. Need not be ordered or continuous + #[prost(uint32, required, tag = "1")] + pub ref_idx: u32, + /// The display name of this gene which will be shown in Loupe (optional allele + /// information) + #[prost(string, required, tag = "2")] + pub display_name: ::prost::alloc::string::String, + /// One of the U/V/D/J/C regions + #[prost(enumeration = "Region", required, tag = "3")] + pub region: i32, + /// Nucleotide sequence associated with this reference item + #[prost(bytes = "vec", required, tag = "4")] + pub nt_sequence: ::prost::alloc::vec::Vec, +} +/// List of all universal reference sequences and metadata packaged in a +/// convenient struct. Currently just a list of items. Could add metadata like +/// species etc. +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UniversalReference { + /// UV(D)JC regions associated with a clonotype chain or an exact subclonotype + /// chain are stored as indices into this vector + #[prost(message, repeated, tag = "1")] + pub items: ::prost::alloc::vec::Vec, +} +/// A single donor reference sequence and metadata packaged in a convenient +/// struct. In the current version of enclone, the donor reference is only +/// inferred for the V-REGIONs. But we could extend it to J-REGIONs in the +/// future. +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DonorReferenceItem { + /// Index of the parent sequence in the universal reference + #[prost(uint32, required, tag = "1")] + pub universal_idx: u32, + /// Index of the donor associated with this reference. If there are no donors + /// specified, this will be `0` by default. + #[prost(uint32, required, tag = "2")] + pub donor_idx: u32, + /// The display name of this gene which will be shown in Loupe (optional allele + /// information) + /// TODO: Should this be modified to explicitly point out the donor? e.g TRAV-1 + /// \[Donor 0\]? for now, like this: "TRAV-1, donor 1, alt allele 1", etc. + #[prost(string, required, tag = "3")] + pub display_name: ::prost::alloc::string::String, + /// Currently, the donor reference region will only be the V-REGION + #[prost(enumeration = "Region", required, tag = "4")] + pub region: i32, + /// The nucleotide sequence associated with this reference item + #[prost(bytes = "vec", required, tag = "5")] + pub nt_sequence: ::prost::alloc::vec::Vec, + /// Alignment of the `nt-sequence` with the nucleotide sequence of the + /// corresponding universal reference item. + #[prost(message, required, tag = "6")] + pub universal_aln: Alignment, +} +/// List of all donor reference sequences and metadata packaged in a convenient +/// struct. Currently just a list of items. Could add metadata like all donor +/// names etc. +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DonorReference { + /// All the entries in this reference + /// The donor V-REGION associated with a clonotype chain is stored as an index + /// to this vector. + #[prost(message, repeated, tag = "1")] + pub items: ::prost::alloc::vec::Vec, +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GemWellInfo { + #[prost(string, required, tag = "1")] + pub donor: ::prost::alloc::string::String, + #[prost(string, required, tag = "2")] + pub origin: ::prost::alloc::string::String, + #[prost(string, required, tag = "3")] + pub library_id: ::prost::alloc::string::String, + /// Data for all the additional columns. For convenience, we are storing it as + /// a map, rather than an array with the order defined by `additional_columns` + /// in Metadata + #[prost(map = "string, string", tag = "8")] + pub additional_data: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Metadata { + /// The additional metadata columns specified by the user + #[prost(string, repeated, tag = "1")] + pub additional_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// List of all the donors. The `donor_idx` in the `DonorReference` is an index + /// into this array. This will be empty for a single sample case + #[prost(string, repeated, tag = "2")] + pub donors: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// Key: Gem well + /// Value: Metadata for each gem well + /// This will be empty for a single sample case + #[prost(map = "uint32, message", tag = "3")] + pub per_gem_well_info: ::std::collections::HashMap, +} +/// Outputs from a single enclone run. +/// +/// This message itself is not written in the proto file, but the order of +/// messages follow the order of fields in this message +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EncloneOutputs { + #[prost(string, required, tag = "1")] + pub version: ::prost::alloc::string::String, + /// Metadata associated with this run. For single sample runs, there is no + /// useful metadata. In the context of aggr, this will be populated from the + /// user input + #[prost(message, required, tag = "10")] + pub metadata: Metadata, + /// The universal reference used. + #[prost(message, required, tag = "20")] + pub universal_reference: UniversalReference, + /// The inferred donor reference. + #[prost(message, required, tag = "30")] + pub donor_reference: DonorReference, + /// The total number of clonotypes + #[prost(uint32, required, tag = "100")] + pub num_clonotypes: u32, + /// List of all clonotypes computed in this enclone run. Each clonotype is + /// stored as an individual message in order to enable streaming. + #[prost(message, repeated, tag = "110")] + pub clonotypes: ::prost::alloc::vec::Vec, +} +/// Various regions within a VDJ transcript +#[derive( + ::serde::Serialize, + ::serde::Deserialize, + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + ::prost::Enumeration, +)] +#[repr(i32)] +pub enum Region { + /// 5' untranslated region + U = 0, + /// Variable region + V = 1, + /// Diversity region + D = 2, + /// Joining region + J = 3, + /// Constant region + C = 4, +} +impl Region { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Region::U => "U", + Region::V => "V", + Region::D => "D", + Region::J => "J", + Region::C => "C", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "U" => Some(Self::U), + "V" => Some(Self::V), + "D" => Some(Self::D), + "J" => Some(Self::J), + "C" => Some(Self::C), + _ => None, + } + } +} diff --git a/lib/rust/enclone_proto/src/lib.rs b/lib/rust/enclone_proto/src/lib.rs new file mode 100644 index 0000000..e7df1d8 --- /dev/null +++ b/lib/rust/enclone_proto/src/lib.rs @@ -0,0 +1,8 @@ +//! +//! Definition of the proto file created by enclone and readers/writers for the proto file +//! + +pub mod proto_io; +pub mod types; + +pub const PROTO_VERSION: &str = "1.0.0"; diff --git a/lib/rust/enclone_proto/src/proto_io.rs b/lib/rust/enclone_proto/src/proto_io.rs new file mode 100644 index 0000000..2ff97c9 --- /dev/null +++ b/lib/rust/enclone_proto/src/proto_io.rs @@ -0,0 +1,270 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +//! +//! Code for reading and writing custom proto files +//! +//! Protobuf format by default is not suitable for streaming. We need to write our own logic to +//! track where a message begins and ends. The documentation recommends using a length delimited +//! format (https://developers.google.com/protocol-buffers/docs/techniques#streaming). +//! +//! ## Message Format +//! We use the following format to write a single protobuf message: +//! ```text +//! +------------+----------------------------+ +//! | Length | Message | +//! | [4 bytes] | [Length Bytes] | +//! +------------+----------------------------+ +//! ``` +//! In the above diagram, +//! - `Length` is an unsigned 32 bit integer stored in **Big endian** order. +//! - If there are multiple messages, they are stored consecutively following the same format. + +use crate::types::{Clonotype, EncloneOutputs}; +use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; +use prost::Message; +use std::fs::File; +use std::io::{BufReader, BufWriter, Read, Write}; +use std::path::Path; + +const BUFFER_CAPACITY: usize = 1_000_000; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("Expected to get {expected} bytes from the reader. Got {got} bytes!")] + Truncated { expected: usize, got: usize }, + + #[error(transparent)] + Io(#[from] std::io::Error), + + #[error(transparent)] + ProtoDecode(#[from] prost::DecodeError), + + #[error(transparent)] + ProtoEncode(#[from] prost::EncodeError), +} + +/// A helper struct to write a length delimited protobuf encoded message into the inner `writer`. +pub struct ProtoWriter { + // Buffer space for storing the encoded message + encode_buffer: Vec, + writer: W, +} + +impl ProtoWriter { + pub fn with_writer(writer: W) -> Self { + ProtoWriter { + encode_buffer: Vec::with_capacity(BUFFER_CAPACITY), + writer, + } + } + /// Writes a single message in length delimited format. Returns the total number + /// of bytes written + pub fn encode_and_write(&mut self, message: M) -> Result + where + M: Message, + { + // Write the message length as a big endian unsigned 32 bit integer + let encoded_len = message.encoded_len(); + self.writer.write_u32::(encoded_len as u32)?; + + // Encode the message in protobuf format and write it to the underlying writer + message.encode(&mut self.encode_buffer)?; + self.writer.write_all(&self.encode_buffer)?; + self.encode_buffer.clear(); + Ok(encoded_len + 4) // +4 because of the u32 + } + + /// Consume self and return the inner writer + pub fn finish(self) -> W { + self.writer + } +} + +/// A helper struct to read a length delimited protobuf encoded message from the inner `reader`. +pub struct ProtoReader { + decode_buffer: Vec, + reader: R, +} + +impl ProtoReader { + pub fn from_reader(reader: R) -> Self { + ProtoReader { + decode_buffer: Vec::with_capacity(BUFFER_CAPACITY), + reader, + } + } + // Clear the decode_buffer and fill it with `num_bytes` bytes from the reader + fn read_exact(&mut self, num_bytes: usize) -> Result<(), Error> { + self.decode_buffer.clear(); + self.reader + .by_ref() + .take(num_bytes as u64) + .read_to_end(&mut self.decode_buffer)?; + // If we did not get num_bytes bytes, return an error + if self.decode_buffer.len() != num_bytes { + return Err(Error::Truncated { + expected: num_bytes, + got: self.decode_buffer.len(), + }); + } + Ok(()) + } + // Skip a message from the underlying reader + pub fn skip(&mut self) -> Result<(), Error> { + self.read_exact(4)?; + let decoded_len = self.decode_buffer.as_slice().read_u32::()?; + self.read_exact(decoded_len as usize) + } + pub fn read_and_decode(&mut self) -> Result + where + M: Message + Default, + { + // Attempt to take 4 bytes from the buffer for length + self.read_exact(4)?; + // decode the 4 bytes as a big endian u32 + let decoded_len = self.decode_buffer.as_slice().read_u32::()?; + + // Decode the message + self.read_exact(decoded_len as usize)?; + let decoded_message = M::decode(self.decode_buffer.as_slice())?; + Ok(decoded_message) + } +} + +/// The enclone outputs are stored in the protobuf file as follows: +/// ```text +/// +------------+----------------------------+ +/// | Length | Version String |.... +/// | [4 bytes] | [Length Bytes] |.... +/// +------------+----------------------------+ +/// +/// +------------+----------------------------+ +/// | Length | Metadata (aggr) |.... +/// | [4 bytes] | [Length Bytes] |.... +/// +------------+----------------------------+ +/// +/// +------------+----------------------------+------------+------------------------+ +/// | Length | Universal Reference | Length | Donor Reference |.... +/// | [4 bytes] | [Length Bytes] | [4 bytes] | [Length Bytes] |.... +/// +------------+----------------------------+------------+------------------------+ +/// +/// +------------+-------------------------------+------------+-------------------------------+ +/// | Length | Number of clonotypes (N) | Length | Clonotype 0 |.... +/// | [4 bytes] | [Length Bytes] | [4 bytes] | [Length Bytes] |.... +/// +------------+-------------------------------+------------+-------------------------------+ +/// +/// +------------+----------------------------------------+ +/// ... | Length | Clonotype N-1 | +/// ... | [4 bytes] | [Length Bytes] | +/// +------------+----------------------------------------+ +/// ``` +/// The newlines are only showed for illustration +pub fn write_proto(enclone_outputs: EncloneOutputs, path: impl AsRef) -> Result<(), Error> { + let writer = BufWriter::new(File::create(path)?); + let mut proto_writer = ProtoWriter::with_writer(writer); + + // Write the version + proto_writer.encode_and_write(enclone_outputs.version)?; + // Write the metadata + proto_writer.encode_and_write(enclone_outputs.metadata)?; + // Write the universal reference + proto_writer.encode_and_write(enclone_outputs.universal_reference)?; + // Write the donor reference + proto_writer.encode_and_write(enclone_outputs.donor_reference)?; + // Write the number of clonotypes. Not bothering to write this raw + proto_writer.encode_and_write(enclone_outputs.clonotypes.len() as u32)?; + for cl in enclone_outputs.clonotypes { + proto_writer.encode_and_write(cl)?; + } + Ok(()) +} + +/// A read that mirrors the write above. The fields until the list of clonotypes are read here. +/// The clonotypes are assigned an empty vector. +pub fn read_proto_until_clonotypes( + path: impl AsRef, +) -> Result<(EncloneOutputs, ProtoReader), Error> { + let reader = BufReader::new(File::open(path)?); + let mut proto_reader = ProtoReader::from_reader(reader); + + // Read the version + let version = proto_reader.read_and_decode()?; + // Read the metadata + let metadata = proto_reader.read_and_decode()?; + // Read the universal reference + let universal_reference = proto_reader.read_and_decode()?; + // Read the donor reference + let donor_reference = proto_reader.read_and_decode()?; + // Number of clonotypes + let num_clonotypes: u32 = proto_reader.read_and_decode()?; + + Ok(( + EncloneOutputs { + version, + metadata, + universal_reference, + donor_reference, + num_clonotypes, + clonotypes: Vec::new(), + }, + proto_reader, + )) +} + +/// A read that mirrors the write above. It is possible to stream through the +/// clonotypes instead of loading everything into memory. +pub fn read_proto(path: impl AsRef) -> Result { + let (mut output, mut proto_reader) = read_proto_until_clonotypes(path)?; + let mut clonotypes = Vec::new(); + for _ in 0..output.num_clonotypes { + clonotypes.push(proto_reader.read_and_decode()?); + } + output.clonotypes = clonotypes; + Ok(output) +} + +/// Iterator over clonotypes +pub struct ClonotypeIter { + index: u32, + num_clonotypes: u32, + proto_reader: ProtoReader, +} + +impl ClonotypeIter> { + pub fn from_file(file: impl AsRef) -> Result { + ClonotypeIter::from_reader(BufReader::new(File::open(file)?)) + } +} + +impl ClonotypeIter { + pub fn from_reader(reader: R) -> Result { + let mut proto_reader = ProtoReader::from_reader(reader); + // Skip version, metadata, universal reference, donor reference + for _ in 0..4 { + proto_reader.skip()?; + } + let num_clonotypes: u32 = proto_reader.read_and_decode()?; + Ok(ClonotypeIter { + index: 0, + num_clonotypes, + proto_reader, + }) + } +} + +impl Iterator for ClonotypeIter { + type Item = Clonotype; + + fn next(&mut self) -> Option { + if self.index < self.num_clonotypes { + let cl = match self.proto_reader.read_and_decode() { + Ok(c) => c, + Err(e) => panic!("Failed to decode clonotype due to {e}"), + }; + self.index += 1; + Some(cl) + } else { + None + } + } +} diff --git a/lib/rust/enclone_proto/src/types.rs b/lib/rust/enclone_proto/src/types.rs new file mode 100644 index 0000000..a7780bd --- /dev/null +++ b/lib/rust/enclone_proto/src/types.rs @@ -0,0 +1,190 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +//! +//! This crate defines the data structure that would represent the clonotypes +//! computed by enclone. +//! + +use vdj_ann::annotate::Region as AnnRegion; + +include!("./enclone.types.rs"); + +impl From<&bio_edit::alignment::Alignment> for Alignment { + fn from(al: &bio_edit::alignment::Alignment) -> Self { + Alignment { + ref_start: al.ystart as u32, + cigar: al.cigar(false), + } + } +} + +fn make_ann_region( + start: Option, + end: Option, + nt_seq: &[u8], + v_start: u32, + aa_seq: &[u8], +) -> Option { + if start.is_some() && end.is_some() && start.unwrap() >= end.unwrap() { + return None; + } + let v = v_start as usize; + match (start, end) { + (Some(s), Some(e)) => { + let s = s as usize; + let e = e as usize; + Some(AnnRegion { + start: s, + stop: e, + nt_seq: std::str::from_utf8(&nt_seq[s..e]).unwrap().to_string(), + aa_seq: std::str::from_utf8(&aa_seq[(s - v) / 3..(e - v) / 3]) + .unwrap() + .to_string(), + }) + } + _ => None, + } +} + +impl ClonotypeChain { + pub fn fwr1_region(&self) -> Option { + make_ann_region( + self.fwr1_start, + self.cdr1_start, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn cdr1_region(&self) -> Option { + make_ann_region( + self.cdr1_start, + self.fwr2_start, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn fwr2_region(&self) -> Option { + make_ann_region( + self.fwr2_start, + self.cdr2_start, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn cdr2_region(&self) -> Option { + make_ann_region( + self.cdr2_start, + self.fwr3_start, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn fwr3_region(&self) -> Option { + make_ann_region( + self.fwr3_start, + Some(self.cdr3_start), + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn fwr4_region(&self) -> Option { + make_ann_region( + Some(self.cdr3_end), + self.fwr4_end, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + + pub fn cdr3_nt(&self) -> &[u8] { + &self.nt_sequence[self.cdr3_start as usize..self.cdr3_end as usize] + } + pub fn cdr3_nt_string(&self) -> String { + std::str::from_utf8(self.cdr3_nt()).unwrap().to_string() + } + pub fn cdr3_aa(&self) -> &[u8] { + let start = (self.cdr3_start - self.v_start) / 3; + let end = (self.cdr3_end - self.v_start) / 3; + &self.aa_sequence[start as usize..end as usize] + } + pub fn cdr3_aa_string(&self) -> String { + std::str::from_utf8(self.cdr3_aa()).unwrap().to_string() + } +} + +impl ExactSubClonotypeChain { + pub fn fwr1_region(&self) -> Option { + make_ann_region( + self.fwr1_start, + self.cdr1_start, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn cdr1_region(&self) -> Option { + make_ann_region( + self.cdr1_start, + self.fwr2_start, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn fwr2_region(&self) -> Option { + make_ann_region( + self.fwr2_start, + self.cdr2_start, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn cdr2_region(&self) -> Option { + make_ann_region( + self.cdr2_start, + self.fwr3_start, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn fwr3_region(&self) -> Option { + make_ann_region( + self.fwr3_start, + Some(self.cdr3_start), + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn fwr4_region(&self) -> Option { + make_ann_region( + Some(self.cdr3_end), + self.fwr4_end, + &self.nt_sequence, + self.v_start, + &self.aa_sequence, + ) + } + pub fn cdr3_nt(&self) -> &[u8] { + &self.nt_sequence[self.cdr3_start as usize..self.cdr3_end as usize] + } + pub fn cdr3_nt_string(&self) -> String { + std::str::from_utf8(self.cdr3_nt()).unwrap().to_string() + } + pub fn cdr3_aa(&self) -> &[u8] { + let start = (self.cdr3_start - self.v_start) / 3; + let end = (self.cdr3_end - self.v_start) / 3; + &self.aa_sequence[start as usize..end as usize] + } + pub fn cdr3_aa_string(&self) -> String { + std::str::from_utf8(self.cdr3_aa()).unwrap().to_string() + } +} diff --git a/lib/rust/enclone_ranger/Cargo.toml b/lib/rust/enclone_ranger/Cargo.toml new file mode 100644 index 0000000..e823a52 --- /dev/null +++ b/lib/rust/enclone_ranger/Cargo.toml @@ -0,0 +1,37 @@ +[dependencies] +[dependencies.anyhow] +workspace = true + +[dependencies.enclone] +path = '../enclone' + +[dependencies.enclone_args] +path = '../enclone_args' + +[dependencies.enclone_core] +path = '../enclone_core' + +[dependencies.enclone_process] +path = '../enclone_process' + +[dependencies.enclone_stuff] +path = '../enclone_stuff' + +[dependencies.rayon] +workspace = true + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[dependencies.vdj_types] +path = '../vdj_types' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'enclone_ranger' +publish = false +version = '0.1.0' diff --git a/lib/rust/enclone_ranger/src/lib.rs b/lib/rust/enclone_ranger/src/lib.rs new file mode 100644 index 0000000..9cad3ea --- /dev/null +++ b/lib/rust/enclone_ranger/src/lib.rs @@ -0,0 +1,3 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +pub mod main_enclone; diff --git a/lib/rust/enclone_ranger/src/main_enclone.rs b/lib/rust/enclone_ranger/src/main_enclone.rs new file mode 100644 index 0000000..7e08456 --- /dev/null +++ b/lib/rust/enclone_ranger/src/main_enclone.rs @@ -0,0 +1,82 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// This is a special entry point for cellranger, where we know that the arguments that could +// be passed are limited. The code here is simplified and could be further simplified. + +use self::refx::{make_vdj_ref_data_core, RefData}; +use anyhow::anyhow; +use enclone::innate::species; +use enclone_args::proc_args_post::{proc_input_source, validate_opts}; +use enclone_core::defs::EncloneControl; +pub use enclone_core::defs::{CellrangerFilterOpt, CellrangerOpt, InputSpec}; +use enclone_process::process_clonotypes::{process_clonotypes, write_fate}; +use enclone_stuff::start::{load_input_data, main_enclone_start}; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use vdj_ann::refx; +pub use vdj_types::VdjReceptor; + +pub fn main_enclone_ranger(cr_opt: CellrangerOpt) -> anyhow::Result<()> { + assert!(!cr_opt.dref_file.is_empty()); + assert!(cr_opt.max_cores.is_some()); + assert!(cr_opt.pre.is_empty()); + assert!(!cr_opt.proto.is_empty()); + assert!(!cr_opt.refname.is_empty()); + + let (ctl, refdata) = main_enclone_setup_ranger(cr_opt)?; + let annotations = load_input_data(&ctl, &refdata)?; + let (exacts, fate) = + main_enclone_start(&ctl, annotations, &refdata, false).map_err(|e| anyhow!(e))?; + write_fate(&ctl.cr_opt.fate_file, &fate).map_err(|e| anyhow!(e))?; + process_clonotypes(&ctl, &refdata, &exacts)?; + Ok(()) +} + +fn main_enclone_setup_ranger(cr_opt: CellrangerOpt) -> anyhow::Result<(EncloneControl, RefData)> { + let mut ctl = EncloneControl { + cr_opt, + ..Default::default() + }; + + proc_input_source(&mut ctl).map_err(|e| anyhow!(e))?; + validate_opts(&ctl).map_err(|e| anyhow!(e))?; + + if let Some(max_cores) = ctl.cr_opt.max_cores { + let _ = rayon::ThreadPoolBuilder::new() + .num_threads(max_cores) + .build_global(); + } + + // Determine the reference sequence that is to be used. + + let mut refx = String::new(); + let fx = File::open(&ctl.cr_opt.refname); + let f = BufReader::new(fx.unwrap()); + for line in f.lines() { + let s = line.unwrap(); + refx += &s; + refx += "\n"; + } + + // Build reference data. + + let refx2 = &refx; + let mut refdata = RefData::new(); + let ext_refx = String::new(); + make_vdj_ref_data_core( + &mut refdata, + refx2, + &ext_refx, + ctl.gen_opt.is_tcr(), + ctl.gen_opt.is_bcr(), + None, + ); + + // Determine if the species is human or mouse or unknown. + + ctl.gen_opt.species = species(&refdata).to_string(); + + // Return. + + Ok((ctl, refdata)) +} diff --git a/lib/rust/enclone_stuff/Cargo.toml b/lib/rust/enclone_stuff/Cargo.toml new file mode 100644 index 0000000..fc285a9 --- /dev/null +++ b/lib/rust/enclone_stuff/Cargo.toml @@ -0,0 +1,55 @@ +[dependencies] +[dependencies.amino] +path = '../amino' + +[dependencies.anyhow] +workspace = true + +[dependencies.enclone] +path = '../enclone' + +[dependencies.enclone_args] +path = '../enclone_args' + +[dependencies.enclone_core] +path = '../enclone_core' + +[dependencies.enclone_process] +path = '../enclone_process' + +[dependencies.equiv] +path = '../equiv' + +[dependencies.io_utils] +path = '../io_utils' + +[dependencies.itertools] +workspace = true + +[dependencies.qd] +workspace = true + +[dependencies.rayon] +workspace = true + +[dependencies.stats_utils] +path = '../stats_utils' + +[dependencies.string_utils] +path = '../string_utils' + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'enclone_stuff' +publish = false +version = '0.1.0' diff --git a/lib/rust/enclone_stuff/src/disintegrate.rs b/lib/rust/enclone_stuff/src/disintegrate.rs new file mode 100644 index 0000000..35bdaa4 --- /dev/null +++ b/lib/rust/enclone_stuff/src/disintegrate.rs @@ -0,0 +1,107 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. +// +// If NWEAK_ONESIES is not specified, disintegrate certain onesie clonotypes into single cell +// clonotypes. This requires editing of exact_clonotypes, info, eq, join_info and raw_joins. + +use enclone_core::defs::{CloneInfo, ExactClonotype}; +use equiv::EquivRel; +use std::collections::HashMap; +use vector_utils::unique_sort; + +pub struct DisintegrateOnesiesResult { + pub disintegrated: Vec, + pub eq: EquivRel, + pub exact_clonotypes: Vec, + pub info: Vec, + pub raw_joins: Vec<(i32, i32)>, +} + +pub fn disintegrate_onesies( + eq: EquivRel, + exact_clonotypes: Vec, + info: Vec, + raw_joins: Vec<(i32, i32)>, +) -> DisintegrateOnesiesResult { + let ncells_total = exact_clonotypes + .iter() + .map(enclone_core::defs::ExactClonotype::ncells) + .sum(); + let mut to_info = HashMap::new(); + let mut exacts2 = Vec::new(); + for (i, inf) in info.iter().enumerate() { + to_info.insert(inf.clonotype_index, i); + } + let mut to_exact_new = Vec::new(); + let mut disintegrated = Vec::new(); + for i in 0..exact_clonotypes.len() { + let ex = &exact_clonotypes[i]; + let mut enew = Vec::::new(); + if ex.share.len() == 1 + && ex.ncells() > 1 + && ex.ncells() * 1000 < ncells_total + && to_info.contains_key(&i) + && eq.size_of_set_containing(to_info[&i]) == 1 + { + for j in 0..ex.clones.len() { + enew.push(exacts2.len()); + exacts2.push(ExactClonotype { + share: ex.share.clone(), + clones: vec![ex.clones[j].clone()], + }); + disintegrated.push(true); + } + } else { + enew.push(exacts2.len()); + exacts2.push(exact_clonotypes[i].clone()); + disintegrated.push(false); + } + to_exact_new.push(enew); + } + + let exact_clonotypes = exacts2; + let mut info2 = Vec::::new(); + let mut to_info2 = Vec::>::new(); + for clone_info in info { + let mut x = Vec::::new(); + for clonotype_index in &to_exact_new[clone_info.clonotype_index] { + let mut origins = Vec::::new(); + let ex = &exact_clonotypes[*clonotype_index]; + for i in 0..ex.clones.len() { + origins.push(ex.clones[i][0].dataset_index); + } + unique_sort(&mut origins); + let origin = origins; + x.push(info2.len()); + info2.push(CloneInfo { + clonotype_index: *clonotype_index, + origin, + ..clone_info.clone() + }); + } + to_info2.push(x); + } + + let info = info2; + let raw_joins = raw_joins + .into_iter() + .map(|raw_join| { + ( + to_info2[raw_join.0 as usize][0] as i32, + to_info2[raw_join.1 as usize][0] as i32, + ) + }) + .collect(); + let mut eq2 = EquivRel::new(info.len() as u32); + for cc in eq.all_sets().filter(|cc| cc.size() > 1) { + for (o1, o2) in cc.duplicate().zip(cc.skip(1)) { + eq2.join(to_info2[o1][0], to_info2[o2][0]); + } + } + DisintegrateOnesiesResult { + disintegrated, + eq: eq2, + exact_clonotypes, + info, + raw_joins, + } +} diff --git a/lib/rust/enclone_stuff/src/doublets.rs b/lib/rust/enclone_stuff/src/doublets.rs new file mode 100644 index 0000000..33ddac8 --- /dev/null +++ b/lib/rust/enclone_stuff/src/doublets.rs @@ -0,0 +1,237 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Delete exact subclonotypes that appear to represent doublets. +// +// THIS FILTER DOESN'T PROPERLY TRACK FATE. + +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype}; +use enclone_core::enclone_structs::{BarcodeFates, CandidateClonotype}; +use enclone_process::define_mat::{define_mat, setup_define_mat}; +use itertools::Itertools; +use qd::Double; +use rayon::prelude::*; +use std::collections::HashMap; +use vdj_ann::refx::RefData; +use vector_utils::{bin_member, erase_if, next_diff, next_diff1_2, sort_sync2}; + +#[allow(clippy::too_many_arguments)] +pub fn delete_doublets( + candidate_clonotypes: &mut Vec, + to_bc: &HashMap<(usize, usize), Vec>, + sr: &[Vec], + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + raw_joins: &[Vec], + refdata: &RefData, + fate: &mut [BarcodeFates], +) { + { + // Define pure subclonotypes. To do this we break each clonotype up by chain signature. + // Note duplication of code with print_clonotypes.rs. And this is doing some + // superfluous compute. + + let mut results = Vec::<(usize, Vec>)>::new(); + for i in 0..candidate_clonotypes.len() { + results.push((i, Vec::new())); + } + let mut pures = Vec::>::new(); + + results.par_iter_mut().for_each(|res| { + let i = res.0; + let cc = candidate_clonotypes[i].clone(); + let (od, mut exacts) = setup_define_mat(&cc, info); + let mat = define_mat( + to_bc, + sr, + ctl, + exact_clonotypes, + &exacts, + &od, + info, + raw_joins, + refdata, + ); + let nexacts = mat[0].len(); + let mut priority = Vec::>::new(); + for u in 0..nexacts { + let mut typex = vec![false; mat.len()]; + for col in 0..mat.len() { + if mat[col][u].is_some() { + typex[col] = true; + } + } + priority.push(typex.clone()); + } + sort_sync2(&mut priority, &mut exacts); + let mut j = 0; + while j < priority.len() { + let k = next_diff(&priority, j); + let mut p = Vec::::new(); + for &e in &exacts[j..k] { + p.push(e); + } + res.1.push(p); + j = k; + } + }); + for mut r in results { + pures.append(&mut r.1); + } + + // Define the number of cells in each pure subclonotype. + + let mut npure = vec![0; pures.len()]; + for j in 0..pures.len() { + for id in &pures[j] { + npure[j] += exact_clonotypes[*id].ncells(); + } + } + + // Find the pairs of pure subclonotypes that share identical CDR3 sequences. + + let mut shares = Vec::<(usize, usize)>::new(); + { + let mut content = Vec::<(&str, usize)>::new(); + for (j, pure) in pures.iter().enumerate() { + for &id in pure { + let ex = &exact_clonotypes[id]; + for s in &ex.share { + content.push((s.cdr3_dna.as_str(), j)); + } + } + } + content.par_sort(); + content.dedup(); + + let mut j = 0; + while j < content.len() { + let k = next_diff1_2(&content, j); + for l1 in j..k { + for l2 in l1 + 1..k { + shares.push((content[l1].1, content[l2].1)); + shares.push((content[l2].1, content[l1].1)); + } + } + j = k; + } + shares.par_sort(); + shares.dedup(); + } + + // Find triples of pure subclonotypes in which the first two have no share, but both + // of the first two share with the third. + + const MIN_MULT_DOUBLET: usize = 5; + let mut trips = Vec::<(usize, usize, usize)>::new(); + { + let mut us = Vec::::new(); + let mut vs = Vec::>::new(); + let mut j = 0; + while j < shares.len() { + // not using next_diff1_2 here because of i32 overflow issue + let mut k = j + 1; + loop { + if k == shares.len() || shares[k].0 != shares[j].0 { + break; + } + k += 1; + } + let u = shares[j].0; + us.push(u); + let mut x = Vec::::new(); + for v in &shares[j..k] { + let v = v.1; + if MIN_MULT_DOUBLET * npure[u] <= npure[v] { + x.push(v); + } + } + vs.push(x); + j = k; + } + let mut results = Vec::<(usize, Vec<(usize, usize, usize)>)>::new(); + for i in 0..us.len() { + results.push((i, Vec::new())); + } + results.par_iter_mut().for_each(|res| { + let i = res.0; + let u = us[i]; + let vs = &vs[i]; + for l1 in 0..vs.len() { + for l2 in l1 + 1..vs.len() { + let v1 = vs[l1]; + let v2 = vs[l2]; + if !bin_member(&shares, &(v1, v2)) { + res.1.push((v1, v2, u)); + } + } + } + }); + for mut r in results { + trips.append(&mut r.1); + } + } + + // Delete some of the third members of the triples. + + let mut to_delete = vec![false; exact_clonotypes.len()]; + for (v1, v2, v0) in trips { + let verbose = false; + if verbose { + println!("\n{v0}, {v1}, {v2}"); + println!("DELETING"); + for (u, m) in pures[v0].iter().enumerate() { + let ex = &exact_clonotypes[*m]; + let mut cdrs = Vec::::new(); + for k in 0..ex.share.len() { + cdrs.push(ex.share[k].cdr3_aa.clone()); + } + println!("[{}] {}", u + 1, cdrs.iter().format(",")); + } + println!("USING"); + for (u, m) in pures[v1].iter().enumerate() { + let ex = &exact_clonotypes[*m]; + let mut cdrs = Vec::::new(); + for k in 0..ex.share.len() { + cdrs.push(ex.share[k].cdr3_aa.clone()); + } + println!("[{}] {}", u + 1, cdrs.iter().format(",")); + } + println!("AND"); + for (u, m) in pures[v2].iter().enumerate() { + let ex = &exact_clonotypes[*m]; + let mut cdrs = Vec::::new(); + for k in 0..ex.share.len() { + cdrs.push(ex.share[k].cdr3_aa.clone()); + } + println!("[{}] {}", u + 1, cdrs.iter().format(",")); + } + } + for m in &pures[v0] { + to_delete[*m] = true; + } + } + let mut candidate_clonotypes2 = Vec::>::new(); + for cc in candidate_clonotypes.iter() { + let mut cc = cc.clone(); + let mut del2 = vec![false; cc.len()]; + for j in 0..cc.len() { + let id = info[cc[j] as usize].clonotype_index; + if to_delete[id] { + del2[j] = true; + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &exact_clonotypes[x.clonotype_index]; + for k in 0..ex.ncells() { + let li = ex.clones[k][0].dataset_index; + let bc = &ex.clones[k][0].barcode; + fate[li].insert(bc.clone(), BarcodeFate::Doublet); + } + } + } + erase_if(&mut cc, &del2); + candidate_clonotypes2.push(cc); + } + *candidate_clonotypes = candidate_clonotypes2; + } +} diff --git a/lib/rust/enclone_stuff/src/filter_umi.rs b/lib/rust/enclone_stuff/src/filter_umi.rs new file mode 100644 index 0000000..9d02e0c --- /dev/null +++ b/lib/rust/enclone_stuff/src/filter_umi.rs @@ -0,0 +1,335 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Filter B cells based on UMI counts. + +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype}; +use enclone_core::enclone_structs::{BarcodeFates, CandidateClonotype}; +use stats_utils::binomial_sum; +use std::cmp::max; +use vector_utils::{erase_if, next_diff1_5, reverse_sort}; + +/// For B cells, filter based on UMI counts. More details in heuristics.html. +/// Find all clonotypes having one cell which has two chains, +/// one heavy and one light. Get the sum of the chain UMI counts for this cell. +/// +/// For each cell, let umish be the umi count for its heavy chain having the most umis, and +/// similarly define umisl. Let umitot = umish + umisl. +/// +/// If every cell in a clonotype would have been deleted, first find the exact subclonotype for +/// which the sum of its umitot values is greatest, and then in it, find the cell having +/// highest umitot value. Protect this cell, so long as it has at least two chains. +pub fn filter_umi( + ctl: &EncloneControl, + exact_clonotypes: &mut [ExactClonotype], + info: &[CloneInfo], + candidate_clonotypes: Vec, + fate: &mut [BarcodeFates], +) -> Vec> { + let mut umis = vec![Vec::::new(); ctl.origin_info.n()]; + for cc in &candidate_clonotypes { + if cc.len() == 1 { + let x: &CloneInfo = &info[cc[0] as usize]; + let ex = &exact_clonotypes[x.clonotype_index]; + if ex.ncells() == 1 && ex.share.len() == 2 && ex.share[0].left != ex.share[1].left { + umis[ex.clones[0][0].dataset_index] + .push(ex.clones[0][0].umi_count + ex.clones[0][1].umi_count); + } + } + } + let mut nu = vec![0; ctl.origin_info.n()]; + let mut umin = vec![0.0; ctl.origin_info.n()]; + for l in 0..ctl.origin_info.n() { + umis[l].sort_unstable(); + nu[l] = umis[l].len(); + if nu[l] > 0 { + let n10 = umis[l][nu[l] / 10] as f64; + let n50 = umis[l][nu[l] / 2] as f64; + umin[l] = n10.min(n50 - (4.0 * n50.sqrt())); + } + } + + // if ctl.clono_filt_opt_def.umi_filt || ctl.clono_filt_opt_def.umi_filt_mark { + const MIN_BASELINE_CELLS: usize = 20; + let candidate_clonotypes: Vec<_> = candidate_clonotypes + .into_iter() + .filter_map(|mut cc| { + let ncells = cc + .iter() + .map(|x| exact_clonotypes[info[*x as usize].clonotype_index].ncells()) + .sum(); + + if ncells > 1 { + let (mut best_ex, mut best_ex_sum) = (0, 0); + let (mut best_cell, mut best_cell_count) = (0, 0); + let mut baselined = true; + let mut protected = false; + { + let mut nbads = 0; + + for j in 0..cc.len() { + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &mut exact_clonotypes[x.clonotype_index]; + let mut ex_sum = 0; + for clone in &ex.clones { + let li = clone[0].dataset_index; + if nu[li] >= MIN_BASELINE_CELLS { + let (mut umish, mut umisl) = (0, 0); + for (s, c) in ex.share.iter().zip(clone.iter()) { + if s.left { + umish = max(umish, c.umi_count); + } else { + umisl = max(umish, c.umi_count); + } + } + let umitot = umish + umisl; + ex_sum += umitot; + if (umitot as f64) < umin[li] { + nbads += 1; + } + } else { + baselined = false; + } + } + if ex_sum > best_ex_sum { + best_ex = j; + best_ex_sum = ex_sum; + } + } + + if nbads == 0 { + protected = true; + } else { + let p = 0.1; + let bound = 0.01; + + // Find probability of observing nbads or more events of probability + // p in a sample of size ncells, and if that is at least bound, + // don't delete any cells (except onesies). + + if binomial_sum(ncells, ncells - nbads, 1.0 - p) >= bound { + protected = true; + } + } + } + { + for j in 0..cc.len() { + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &exact_clonotypes[x.clonotype_index]; + for (k, clone) in ex.clones.iter().enumerate() { + let li = clone[0].dataset_index; + if nu[li] >= MIN_BASELINE_CELLS { + let (mut umish, mut umisl) = (0, 0); + for (s, c) in ex.share.iter().zip(clone.iter()) { + if s.left { + umish = max(umish, c.umi_count); + } else { + umisl = max(umish, c.umi_count); + } + } + let umitot = umish + umisl; + if j == best_ex && umitot > best_cell_count && ex.share.len() > 1 { + best_cell = k; + best_cell_count = umitot; + } + } else { + baselined = false; + } + } + } + } + { + for j in 0..cc.len() { + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &mut exact_clonotypes[x.clonotype_index]; + let mut to_delete = vec![false; ex.ncells()]; + for (k, (clone, d)) in + ex.clones.iter_mut().zip(to_delete.iter_mut()).enumerate() + { + let li = clone[0].dataset_index; + if nu[li] >= MIN_BASELINE_CELLS { + let (mut umish, mut umisl) = (0, 0); + for (s, c) in ex.share.iter().zip(clone.iter()) { + if s.left { + umish = max(umish, c.umi_count); + } else { + umisl = max(umish, c.umi_count); + } + } + let umitot = umish + umisl; + if (umitot as f64) < umin[li] { + if protected { + if ex.share.len() == 1 { + *d = true; + } + } else if !baselined + || (best_ex, best_cell) != (j, k) + || ex.share.len() == 1 + { + *d = true; + } + } + } else { + baselined = false; + } + } + if ctl.cr_opt.filter.umi_count { + for i in 0..ex.clones.len() { + if to_delete[i] { + fate[ex.clones[i][0].dataset_index] + .insert(ex.clones[i][0].barcode.clone(), BarcodeFate::Umi); + } + } + erase_if(&mut ex.clones, &to_delete); + } + } + } + cc.retain(|x| exact_clonotypes[info[*x as usize].clonotype_index].ncells() > 0); + } + if !cc.is_empty() { + Some(cc) + } else { + None + } + }) + .collect(); + + // Filter B cells based on UMI count ratios. This assumes V..J identity to filter. + const MIN_UMI_RATIO: usize = 500; + candidate_clonotypes + .into_iter() + .filter_map(|cc| { + let mut ncells = 0; + for j in 0..cc.len() { + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &exact_clonotypes[x.clonotype_index]; + ncells += ex.ncells(); + } + let mut nbads = 0; + + let mut z = Vec::<(Vec, usize, usize, usize, usize)>::new(); + let mut to_delete = Vec::>::new(); + for j in 0..cc.len() { + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &exact_clonotypes[x.clonotype_index]; + to_delete.push(vec![false; ex.ncells()]); + for k in 0..ex.ncells() { + let mut tot = 0; + for m in 0..ex.clones[k].len() { + tot += ex.clones[k][m].umi_count; + } + for m in 0..ex.clones[k].len() { + z.push(( + ex.share[m].seq.clone(), + ex.clones[k][m].umi_count, + j, + k, + tot, + )); + } + } + } + reverse_sort(&mut z); + let mut j = 0; + while j < z.len() { + let k = next_diff1_5(&z, j); + for l in j..k { + if z[j].1 >= MIN_UMI_RATIO * z[l].4 { + to_delete[z[l].2][z[l].3] = true; + } + } + j = k; + } + for j in 0..cc.len() { + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &mut exact_clonotypes[x.clonotype_index]; + for l in 0..ex.ncells() { + if to_delete[j][l] { + nbads += 1; + } + } + } + + if nbads == 0 { + return Some(cc); + } + let p = 0.1; + let bound = 0.01; + + // Find probability of observing nbads or more events of probability + // p in a sample of size ncells, and if that is at least bound, + // don't delete any cells. + + if binomial_sum(ncells, ncells - nbads, 1.0 - p) >= bound { + return Some(cc); + } + + let mut to_deletex = vec![false; cc.len()]; + let mut z = Vec::<(Vec, usize, usize, usize, usize)>::new(); + let mut to_delete = Vec::>::new(); + for j in 0..cc.len() { + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &mut exact_clonotypes[x.clonotype_index]; + to_delete.push(vec![false; ex.ncells()]); + for k in 0..ex.ncells() { + let mut tot = 0; + for m in 0..ex.clones[k].len() { + tot += ex.clones[k][m].umi_count; + } + for m in 0..ex.clones[k].len() { + z.push(( + ex.share[m].seq.clone(), + ex.clones[k][m].umi_count, + j, + k, + tot, + )); + } + } + } + reverse_sort(&mut z); + let mut j = 0; + while j < z.len() { + let k = next_diff1_5(&z, j); + for l in j..k { + if z[j].1 >= MIN_UMI_RATIO * z[l].4 { + to_delete[z[l].2][z[l].3] = true; + } + } + j = k; + } + for j in 0..cc.len() { + let x: &CloneInfo = &info[cc[j] as usize]; + let ex = &mut exact_clonotypes[x.clonotype_index]; + for l in 0..ex.ncells() { + if to_delete[j][l] { + nbads += 1; + } + } + + if ctl.cr_opt.filter.umi_ratio { + for i in 0..ex.clones.len() { + if to_delete[j][i] { + fate[ex.clones[i][0].dataset_index] + .insert(ex.clones[i][0].barcode.clone(), BarcodeFate::UmiRatio); + } + } + erase_if(&mut ex.clones, &to_delete[j]); + if ex.ncells() == 0 { + to_deletex[j] = true; + } + } + } + + let mut cc = cc; + if ctl.cr_opt.filter.umi_ratio { + erase_if(&mut cc, &to_deletex); + } + if !cc.is_empty() { + Some(cc) + } else { + None + } + }) + .collect() +} diff --git a/lib/rust/enclone_stuff/src/flag_defective.rs b/lib/rust/enclone_stuff/src/flag_defective.rs new file mode 100644 index 0000000..a4632bc --- /dev/null +++ b/lib/rust/enclone_stuff/src/flag_defective.rs @@ -0,0 +1,258 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +// Flag defective reference sequences. + +use amino::nucleotide_to_aminoacid_sequence; +use enclone_core::defs::EncloneControl; +use io_utils::fwriteln; +use itertools::Itertools; +use std::io::Write; +use string_utils::{strme, TextUtils}; +use vdj_ann::refx::RefData; +use vdj_ann::vdj_features::{cdr2_start, cdr3_score, fr3_start, score4, score_fwr3}; +use vector_utils::unique_sort; + +pub fn flag_defective( + ctl: &EncloneControl, + refdata: &RefData, + log: &mut Vec, + broken: &mut Vec, +) { + *log = Vec::::new(); + let mut count = 0; + *broken = vec![false; refdata.refs.len()]; + + // Compute freqs. + + let mut freqs = Vec::>>::new(); + const F: &str = include_str!["fwr3_freqs.data"]; + let mut x = Vec::<(u32, u8)>::new(); + let mut y = Vec::>::new(); + let mut rlast = 0; + let mut ilast = 0; + for line in F.lines() { + let fields = line.split(',').collect::>(); + let r = fields[0].force_usize(); + let i = fields[1].force_usize(); + let count = fields[3].force_usize() as u32; + let res = fields[4].as_bytes()[0]; + if r != rlast || i != ilast { + y.push(x.clone()); + x.clear(); + if r != rlast { + freqs.push(y.clone()); + y.clear(); + } + } + x.push((count, res)); + rlast = r; + ilast = i; + } + y.push(x); + freqs.push(y); + + // Study the reference. + + for (i, ((((&rtype, refs), name), rh), broken)) in refdata + .rtype + .iter() + .zip(refdata.refs.iter()) + .zip(refdata.name.iter()) + .zip(refdata.rheaders_orig.iter()) + .zip(broken.iter_mut()) + .enumerate() + { + // Determine chain type and exclude those other than IGH, IGK, IGL, TRA and TRB. + + let chain_type; + if rtype == 0 { + chain_type = "IGH"; + } else if rtype == 1 { + chain_type = "IGK"; + } else if rtype == 2 { + chain_type = "IGL"; + } else if rtype == 3 { + chain_type = "TRA"; + } else if rtype == 4 { + chain_type = "TRB"; + } else { + continue; + } + + // Look for problems. + + if refdata.is_c(i) { + // This is very ugly. We are exempting mouse IGHG2B because is is in our current + // reference but has an extra base at the beginning. See also comments below at + // TRBV21-1. Also, we're not actually checking for mouse. + + if name == "IGHG2B" { + continue; + } + + // Continue. + + let seq = refs.to_ascii_vec(); + let aa0 = nucleotide_to_aminoacid_sequence(&seq, 0); + let aa2 = nucleotide_to_aminoacid_sequence(&seq, 2); + if aa2.contains(&b'*') && !aa0.contains(&b'*') { + count += 1; + *broken = true; + fwriteln!( + log, + "{}. The following C segment reference sequence appears to have \ + an extra base at its beginning:\n", + count + ); + fwriteln!(log, ">{}\n{}\n", rh, strme(&seq)); + } + } else if refdata.is_v(i) { + // This is very ugly. We are exempting human TRBV21-1 because it is in our current + // reference (twice), but has multiple stop codons. It should be deleted from the + // reference, and then we should remove this test. But probably in the future so as + // not to inconvenience users. + + if ctl.gen_opt.species != "mouse" && name == "TRBV21-1" { + *broken = true; + continue; + } + + // This is very ugly. We are exempting human IGHV1-12 because it is in our current + // human reference, but is only 60 amino acids long. Also we're not checking for mouse. + + if name == "IGHV1-12" { + *broken = true; + continue; + } + + // Ugly. Frameshifted. Also this is mouse and not checking for that. + + if name == "TRAV23" { + *broken = true; + continue; + } + + // Ugly. Truncated on right. Human. + + if name == "IGLV5-48" { + *broken = true; + continue; + } + + // Test for broken. + + let seq = refs.to_ascii_vec(); + let aa = nucleotide_to_aminoacid_sequence(&seq, 0); + let mut reasons = Vec::<&'static str>::new(); + if !aa.starts_with(b"M") { + reasons.push("does not begin with a start codon"); + } + let stops = aa.iter().filter(|&n| *n == b'*').count(); + if stops > 1 { + reasons.push("has more than one stop codon"); + } + if aa.len() < 100 { + reasons.push("appears truncated (has less than 100 amino acids)"); + } else if aa.len() < 105 && chain_type == "IGH" { + reasons.push("appears truncated (has less than 105 amino acids)"); + } + if aa.len() >= 30 { + let mut aap = aa.clone(); + aap.push(b'C'); + if cdr3_score(&aap, chain_type, false) > 4 + cdr3_score(&aa, chain_type, false) { + reasons.push("appears to need a C to be appended to its right end"); + } + } + if stops > 0 { + let mut fixable = false; + const TRIM: usize = 10; + for (j, &aj) in aa[..aa.len() - TRIM].iter().enumerate() { + if aj == b'*' { + let mut seqx = seq.clone(); + for _ in 1..=2 { + let _ = seqx.remove(3 * j); + let aax = nucleotide_to_aminoacid_sequence(&seqx, 0); + if !aax.contains(&b'*') { + fixable = true; + } + } + } + } + if fixable { + reasons.push("appears to be frameshifted"); + } + } + if aa.len() >= 31 { + for del in 1..=2 { + let aad = nucleotide_to_aminoacid_sequence(&seq, del); + if cdr3_score(&aad, chain_type, false) > 4 + cdr3_score(&aa, chain_type, false) + { + reasons.push("appears to be frameshifted"); + } + } + } + if reasons.is_empty() { + if let Some(cs2) = cdr2_start(&aa, chain_type, false) { + if let Some(fr3) = fr3_start(&aa, chain_type, false) { + if cs2 > fr3 { + reasons.push( + "appears to be defective, because our computed \ + CDR2 start exceeds our computed FWR3 start", + ); + } + } else { + reasons.push("appears to be defective, because no FWR3 start was found"); + } + } + } + if reasons.is_empty() && aa.len() >= 31 { + // Need to improve this frameshift test. One should see high aa and dna similarity + // to other seqs if shifted. Or use more aas. + let score = cdr3_score(&aa, chain_type, false); + let mut frameshift = false; + for del in 1..=2 { + let aad = nucleotide_to_aminoacid_sequence(&seq, del); + if score <= 6 && cdr3_score(&aad, chain_type, false) >= 3 + score { + frameshift = true; + } + } + if frameshift { + reasons.push("appears to be frameshifted"); + } + } + if reasons.is_empty() { + let r; + if chain_type == "IGH" { + r = 0; + } else if chain_type == "IGK" { + r = 1; + } else if chain_type == "IGL" { + r = 2; + } else if chain_type == "TRA" { + r = 3; + } else { + assert_eq!(chain_type, "TRB"); + r = 4; + } + let score = score_fwr3(&aa, r, &freqs); + if score < 8.0 && score4(&aa, r) < 5 { + reasons.push("appears to be frameshifted or truncated"); + } + } + + // Report results. + + unique_sort(&mut reasons); + if !reasons.is_empty() { + let msg = format!( + "The following V segment reference sequence {}", + reasons.iter().format(", and ") + ); + count += 1; + *broken = true; + fwriteln!(log, "{}. {}:\n", count, msg); + fwriteln!(log, ">{}\n{}\n", rh, strme(&seq)); + } + } + } +} diff --git a/lib/rust/enclone_stuff/src/fwr3_freqs.data b/lib/rust/enclone_stuff/src/fwr3_freqs.data new file mode 100644 index 0000000..a7382a4 --- /dev/null +++ b/lib/rust/enclone_stuff/src/fwr3_freqs.data @@ -0,0 +1,1670 @@ +0,0,0,752,C +0,0,1,4,S +0,0,2,2,Y +0,0,3,2,V +0,0,4,2,Q +0,0,5,2,I +0,0,6,1,W +0,0,7,1,M +0,0,8,1,G +0,0,9,1,F +0,0,10,1,E +0,0,11,1,A +0,1,0,638,Y +0,1,1,113,F +0,1,2,6,L +0,1,3,4,S +0,1,4,4,H +0,1,5,2,N +0,1,6,2,C +0,1,7,1,M +0,2,0,756,Y +0,2,1,5,H +0,2,2,2,I +0,2,3,1,S +0,2,4,1,N +0,2,5,1,L +0,2,6,1,K +0,2,7,1,F +0,2,8,1,D +0,2,9,1,C +0,3,0,361,V +0,3,1,200,T +0,3,2,76,M +0,3,3,75,I +0,3,4,32,L +0,3,5,19,R +0,3,6,4,A +0,3,7,1,Y +0,3,8,1,S +0,3,9,1,C +0,4,0,716,A +0,4,1,30,G +0,4,2,9,T +0,4,3,3,V +0,4,4,2,S +0,4,5,2,Q +0,4,6,2,M +0,4,7,2,E +0,4,8,2,D +0,4,9,1,P +0,4,10,1,F +0,5,0,614,T +0,5,1,104,S +0,5,2,29,M +0,5,3,7,A +0,5,4,6,I +0,5,5,2,P +0,5,6,2,H +0,5,7,1,R +0,5,8,1,N +0,5,9,1,L +0,5,10,1,K +0,5,11,1,F +0,5,12,1,C +0,6,0,744,D +0,6,1,8,G +0,6,2,4,T +0,6,3,3,N +0,6,4,3,I +0,6,5,2,Y +0,6,6,2,K +0,6,7,2,A +0,6,8,1,L +0,6,9,1,E +0,7,0,543,E +0,7,1,104,A +0,7,2,55,D +0,7,3,35,V +0,7,4,14,S +0,7,5,5,K +0,7,6,5,G +0,7,7,2,T +0,7,8,2,Q +0,7,9,2,N +0,7,10,1,P +0,7,11,1,L +0,7,12,1,C +0,8,0,252,A +0,8,1,222,S +0,8,2,171,T +0,8,3,62,P +0,8,4,19,N +0,8,5,10,D +0,8,6,9,G +0,8,7,9,E +0,8,8,7,I +0,8,9,4,V +0,8,10,2,L +0,8,11,2,K +0,8,12,1,Y +0,9,0,268,T +0,9,1,263,R +0,9,2,100,K +0,9,3,64,Q +0,9,4,52,D +0,9,5,4,I +0,9,6,3,N +0,9,7,3,E +0,9,8,2,S +0,9,9,2,P +0,9,10,2,M +0,9,11,2,L +0,9,12,2,G +0,9,13,2,A +0,9,14,1,F +0,10,0,580,L +0,10,1,138,V +0,10,2,35,M +0,10,3,5,R +0,10,4,3,P +0,10,5,2,S +0,10,6,2,Q +0,10,7,2,I +0,10,8,1,T +0,10,9,1,H +0,10,10,1,A +0,11,0,613,S +0,11,1,91,N +0,11,2,25,R +0,11,3,17,T +0,11,4,5,A +0,11,5,4,K +0,11,6,4,G +0,11,7,3,Q +0,11,8,3,L +0,11,9,1,V +0,11,10,1,I +0,11,11,1,H +0,11,12,1,D +0,11,13,1,C +0,12,0,319,N +0,12,1,303,S +0,12,2,88,T +0,12,3,22,D +0,12,4,14,R +0,12,5,5,G +0,12,6,4,I +0,12,7,3,Y +0,12,8,3,K +0,12,9,3,A +0,12,10,2,P +0,12,11,2,H +0,12,12,1,M +0,12,13,1,L +0,13,0,423,M +0,13,1,265,L +0,13,2,41,I +0,13,3,15,V +0,13,4,7,W +0,13,5,4,T +0,13,6,4,K +0,13,7,3,F +0,13,8,2,S +0,13,9,2,P +0,13,10,2,D +0,13,11,1,Q +0,13,12,1,N +0,14,0,429,Q +0,14,1,173,K +0,14,2,85,E +0,14,3,42,T +0,14,4,15,S +0,14,5,7,D +0,14,6,5,R +0,14,7,5,L +0,14,8,3,V +0,14,9,2,N +0,14,10,2,H +0,14,11,1,I +0,14,12,1,F +0,15,0,597,L +0,15,1,144,M +0,15,2,11,F +0,15,3,6,I +0,15,4,3,V +0,15,5,2,R +0,15,6,2,Q +0,15,7,2,N +0,15,8,1,T +0,15,9,1,K +0,15,10,1,H +0,16,0,457,Y +0,16,1,115,F +0,16,2,99,S +0,16,3,29,V +0,16,4,27,T +0,16,5,12,D +0,16,6,9,L +0,16,7,6,C +0,16,8,4,H +0,16,9,3,P +0,16,10,3,N +0,16,11,3,G +0,16,12,1,M +0,16,13,1,K +0,16,14,1,I +0,17,0,228,L +0,17,1,224,V +0,17,2,201,A +0,17,3,89,F +0,17,4,5,I +0,17,5,4,S +0,17,6,4,Q +0,17,7,3,Y +0,17,8,3,T +0,17,9,3,R +0,17,10,2,W +0,17,11,2,G +0,17,12,1,M +0,17,13,1,K +0,18,0,405,T +0,18,1,228,Q +0,18,2,59,S +0,18,3,26,I +0,18,4,22,M +0,18,5,6,N +0,18,6,6,L +0,18,7,4,R +0,18,8,4,K +0,18,9,3,V +0,18,10,3,H +0,18,11,2,F +0,18,12,1,P +0,18,13,1,A +0,19,0,416,N +0,19,1,323,S +0,19,2,13,T +0,19,3,8,D +0,19,4,3,K +0,19,5,2,Y +0,19,6,2,Q +0,19,7,2,A +0,19,8,1,G +0,20,0,454,K +0,20,1,119,S +0,20,2,48,Q +0,20,3,33,T +0,20,4,25,E +0,20,5,21,N +0,20,6,21,A +0,20,7,16,I +0,20,8,13,R +0,20,9,7,L +0,20,10,5,M +0,20,11,3,V +0,20,12,2,G +0,20,13,1,P +0,20,14,1,F +0,20,15,1,D +0,21,0,556,S +0,21,1,148,A +0,21,2,22,N +0,21,3,18,T +0,21,4,6,P +0,21,5,6,K +0,21,6,5,D +0,21,7,3,F +0,21,8,2,V +0,21,9,1,Y +0,21,10,1,R +0,21,11,1,L +0,21,12,1,G +0,22,0,313,T +0,22,1,268,N +0,22,2,87,K +0,22,3,68,D +0,22,4,6,M +0,22,5,5,S +0,22,6,4,R +0,22,7,4,I +0,22,8,3,Y +0,22,9,3,E +0,22,10,3,A +0,22,11,2,V +0,22,12,2,P +0,22,13,1,Q +0,22,14,1,G +0,23,0,671,D +0,23,1,44,E +0,23,2,31,N +0,23,3,9,S +0,23,4,3,T +0,23,5,3,K +0,23,6,3,G +0,23,7,2,C +0,23,8,1,W +0,23,9,1,V +0,23,10,1,R +0,23,11,1,Q +0,24,0,413,R +0,24,1,114,K +0,24,2,97,V +0,24,3,71,A +0,24,4,19,S +0,24,5,16,L +0,24,6,11,T +0,24,7,11,I +0,24,8,6,P +0,24,9,4,M +0,24,10,3,D +0,24,11,2,E +0,24,12,1,H +0,24,13,1,G +0,24,14,1,F +0,25,0,509,S +0,25,1,231,T +0,25,2,7,N +0,25,3,5,F +0,25,4,3,I +0,25,5,3,H +0,25,6,2,Y +0,25,7,2,R +0,25,8,2,P +0,25,9,2,C +0,25,10,1,W +0,25,11,1,Q +0,25,12,1,K +0,25,13,1,D +0,26,0,563,I +0,26,1,106,L +0,26,2,32,M +0,26,3,31,F +0,26,4,22,V +0,26,5,5,T +0,26,6,5,S +0,26,7,3,G +0,26,8,2,H +0,26,9,1,C +0,27,0,573,T +0,27,1,125,S +0,27,2,21,I +0,27,3,17,A +0,27,4,12,V +0,27,5,8,R +0,27,6,6,F +0,27,7,3,K +0,27,8,2,N +0,27,9,1,Y +0,27,10,1,G +0,27,11,1,D +0,28,0,322,F +0,28,1,140,L +0,28,2,121,A +0,28,3,105,V +0,28,4,31,S +0,28,5,26,I +0,28,6,10,T +0,28,7,8,G +0,28,8,3,R +0,28,9,2,Y +0,28,10,2,P +0,29,0,606,R +0,29,1,115,K +0,29,2,17,Q +0,29,3,6,G +0,29,4,5,N +0,29,5,4,P +0,29,6,4,L +0,29,7,4,H +0,29,8,2,T +0,29,9,2,A +0,29,10,1,Y +0,29,11,1,W +0,29,12,1,S +0,29,13,1,F +0,29,14,1,E +1,0,0,324,C +1,0,1,2,S +1,0,2,2,G +1,0,3,1,V +1,0,4,1,L +1,1,0,283,Y +1,1,1,30,F +1,1,2,8,H +1,1,3,3,S +1,1,4,3,C +1,1,5,1,T +1,1,6,1,L +1,1,7,1,D +1,2,0,325,Y +1,2,1,2,F +1,2,2,1,L +1,2,3,1,E +1,2,4,1,C +1,3,0,141,V +1,3,1,121,T +1,3,2,22,D +1,3,3,12,I +1,3,4,11,S +1,3,5,11,M +1,3,6,4,A +1,3,7,3,Y +1,3,8,2,L +1,3,9,1,N +1,3,10,1,H +1,3,11,1,E +1,4,0,208,A +1,4,1,113,G +1,4,2,3,V +1,4,3,2,T +1,4,4,2,R +1,4,5,2,E +1,5,0,94,A +1,5,1,82,V +1,5,2,68,F +1,5,3,44,L +1,5,4,18,I +1,5,5,14,T +1,5,6,4,M +1,5,7,2,G +1,5,8,2,E +1,5,9,1,P +1,5,10,1,D +1,6,0,325,D +1,6,1,2,N +1,6,2,1,V +1,6,3,1,S +1,6,4,1,G +1,7,0,277,E +1,7,1,44,D +1,7,2,3,Q +1,7,3,3,N +1,7,4,2,K +1,7,5,1,S +1,8,0,181,A +1,8,1,84,P +1,8,2,30,S +1,8,3,7,V +1,8,4,7,E +1,8,5,7,C +1,8,6,5,T +1,8,7,3,Q +1,8,8,2,Y +1,8,9,2,D +1,8,10,1,I +1,8,11,1,G +1,9,0,181,E +1,9,1,125,Q +1,9,2,13,K +1,9,3,3,H +1,9,4,2,L +1,9,5,2,G +1,9,6,2,A +1,9,7,1,V +1,9,8,1,T +1,10,0,148,V +1,10,1,144,L +1,10,2,28,M +1,10,3,3,I +1,10,4,2,P +1,10,5,2,G +1,10,6,2,F +1,10,7,1,T +1,11,0,160,S +1,11,1,87,R +1,11,2,26,G +1,11,3,24,N +1,11,4,9,P +1,11,5,7,T +1,11,6,7,K +1,11,7,5,C +1,11,8,3,Q +1,11,9,1,I +1,11,10,1,D +1,12,0,274,S +1,12,1,27,N +1,12,2,10,H +1,12,3,5,I +1,12,4,3,E +1,12,5,3,D +1,12,6,2,T +1,12,7,2,R +1,12,8,2,G +1,12,9,1,Y +1,12,10,1,C +1,13,0,327,I +1,13,1,2,V +1,13,2,1,D +1,14,0,211,T +1,14,1,69,K +1,14,2,22,R +1,14,3,11,S +1,14,4,6,N +1,14,5,4,I +1,14,6,3,E +1,14,7,2,A +1,14,8,1,Q +1,14,9,1,P +1,15,0,300,L +1,15,1,23,F +1,15,2,2,V +1,15,3,1,R +1,15,4,1,M +1,15,5,1,I +1,15,6,1,G +1,15,7,1,C +1,16,0,245,T +1,16,1,70,S +1,16,2,6,I +1,16,3,5,V +1,16,4,2,A +1,16,5,1,N +1,16,6,1,L +1,17,0,253,F +1,17,1,74,Y +1,17,2,1,T +1,17,3,1,H +1,17,4,1,G +1,18,0,250,D +1,18,1,34,S +1,18,2,19,E +1,18,3,16,Q +1,18,4,3,H +1,18,5,2,V +1,18,6,1,Y +1,18,7,1,N +1,18,8,1,K +1,18,9,1,G +1,18,10,1,F +1,18,11,1,A +1,19,0,288,T +1,19,1,19,S +1,19,2,7,A +1,19,3,4,R +1,19,4,4,K +1,19,5,2,Q +1,19,6,2,N +1,19,7,2,I +1,19,8,1,V +1,19,9,1,M +1,20,0,297,G +1,20,1,21,E +1,20,2,2,V +1,20,3,2,T +1,20,4,2,R +1,20,5,2,D +1,20,6,2,A +1,20,7,1,W +1,20,8,1,S +1,21,0,307,S +1,21,1,7,Y +1,21,2,6,A +1,21,3,4,F +1,21,4,2,P +1,21,5,2,L +1,21,6,1,T +1,21,7,1,H +1,22,0,300,G +1,22,1,18,R +1,22,2,7,Q +1,22,3,3,V +1,22,4,1,W +1,22,5,1,K +1,23,0,315,S +1,23,1,6,T +1,23,2,3,G +1,23,3,2,R +1,23,4,2,I +1,23,5,1,N +1,23,6,1,L +1,24,0,317,G +1,24,1,7,S +1,24,2,4,A +1,24,3,1,T +1,24,4,1,D +1,25,0,264,S +1,25,1,42,T +1,25,2,10,K +1,25,3,8,I +1,25,4,4,R +1,25,5,1,V +1,25,6,1,N +1,26,0,327,F +1,26,1,2,L +1,26,2,1,G +1,27,0,317,R +1,27,1,4,G +1,27,2,2,S +1,27,3,2,Q +1,27,4,1,W +1,27,5,1,P +1,27,6,1,K +1,27,7,1,D +1,27,8,1,C +1,28,0,133,D +1,28,1,125,S +1,28,2,47,A +1,28,3,6,E +1,28,4,4,C +1,28,5,3,V +1,28,6,3,K +1,28,7,2,T +1,28,8,2,H +1,28,9,2,G +1,28,10,1,P +1,28,11,1,N +1,28,12,1,L +1,29,0,302,P +1,29,1,25,S +1,29,2,3,L +2,0,0,324,C +2,0,1,10,E +2,0,2,3,Y +2,0,3,2,S +2,0,4,1,W +2,0,5,1,I +2,0,6,1,G +2,1,0,278,Y +2,1,1,39,F +2,1,2,10,H +2,1,3,10,A +2,1,4,3,I +2,1,5,1,S +2,1,6,1,D +2,2,0,328,Y +2,2,1,10,Q +2,2,2,2,D +2,2,3,1,H +2,2,4,1,C +2,3,0,294,D +2,3,1,10,L +2,3,2,10,G +2,3,3,10,E +2,3,4,6,I +2,3,5,4,N +2,3,6,3,M +2,3,7,2,Y +2,3,8,1,V +2,3,9,1,T +2,3,10,1,A +2,4,0,320,A +2,4,1,12,S +2,4,2,6,T +2,4,3,2,V +2,4,4,2,D +2,5,0,322,E +2,5,1,10,S +2,5,2,6,D +2,5,3,3,K +2,5,4,1,Q +2,6,0,320,D +2,6,1,10,I +2,6,2,9,E +2,6,3,2,V +2,6,4,1,N +2,7,0,307,E +2,7,1,10,G +2,7,2,9,T +2,7,3,5,K +2,7,4,5,D +2,7,5,2,N +2,7,6,1,Q +2,7,7,1,M +2,7,8,1,I +2,7,9,1,A +2,8,0,223,A +2,8,1,61,P +2,8,2,18,T +2,8,3,17,S +2,8,4,10,L +2,8,5,4,V +2,8,6,3,I +2,8,7,3,D +2,8,8,1,M +2,8,9,1,G +2,8,10,1,F +2,9,0,280,Q +2,9,1,20,R +2,9,2,13,L +2,9,3,10,T +2,9,4,7,E +2,9,5,5,K +2,9,6,3,H +2,9,7,2,W +2,9,8,2,P +2,10,0,206,L +2,10,1,92,A +2,10,2,28,V +2,10,3,6,I +2,10,4,4,T +2,10,5,3,P +2,10,6,3,F +2,11,0,226,G +2,11,1,75,S +2,11,2,11,R +2,11,3,10,T +2,11,4,10,N +2,11,5,7,E +2,11,6,1,W +2,11,7,1,V +2,11,8,1,L +2,12,0,217,S +2,12,1,85,T +2,12,2,18,A +2,12,3,16,N +2,12,4,3,R +2,12,5,1,P +2,12,6,1,L +2,12,7,1,H +2,13,0,322,I +2,13,1,10,G +2,13,2,3,V +2,13,3,3,T +2,13,4,3,L +2,13,5,1,R +2,14,0,274,T +2,14,1,29,L +2,14,2,22,S +2,14,3,9,A +2,14,4,5,I +2,14,5,2,G +2,14,6,1,R +2,15,0,321,L +2,15,1,9,M +2,15,2,8,R +2,15,3,2,S +2,15,4,2,K +2,16,0,202,T +2,16,1,61,S +2,16,2,28,A +2,16,3,23,L +2,16,4,8,V +2,16,5,7,I +2,16,6,6,Y +2,16,7,6,F +2,16,8,1,N +2,17,0,247,A +2,17,1,68,G +2,17,2,6,V +2,17,3,6,R +2,17,4,5,T +2,17,5,3,S +2,17,6,3,F +2,17,7,2,H +2,17,8,2,D +2,18,0,198,T +2,18,1,65,S +2,18,2,33,K +2,18,3,29,A +2,18,4,6,D +2,18,5,5,M +2,18,6,3,V +2,18,7,2,N +2,18,8,1,L +2,19,0,233,N +2,19,1,47,S +2,19,2,17,T +2,19,3,12,D +2,19,4,10,F +2,19,5,9,K +2,19,6,6,A +2,19,7,5,G +2,19,8,1,Y +2,19,9,1,Q +2,19,10,1,H +2,20,0,271,G +2,20,1,20,S +2,20,2,20,A +2,20,3,10,R +2,20,4,8,T +2,20,5,8,E +2,20,6,5,D +2,21,0,309,S +2,21,1,10,D +2,21,2,8,L +2,21,3,5,I +2,21,4,4,T +2,21,5,2,K +2,21,6,2,A +2,21,7,1,V +2,21,8,1,P +2,22,0,113,K +2,22,1,55,R +2,22,2,49,S +2,22,3,36,N +2,22,4,24,I +2,22,5,21,A +2,22,6,17,T +2,22,7,10,P +2,22,8,10,L +2,22,9,2,D +2,22,10,1,V +2,22,11,1,Q +2,22,12,1,M +2,22,13,1,F +2,22,14,1,C +2,23,0,249,S +2,23,1,47,D +2,23,2,15,T +2,23,3,11,A +2,23,4,10,V +2,23,5,3,F +2,23,6,2,Y +2,23,7,2,G +2,23,8,2,E +2,23,9,1,N +2,24,0,278,G +2,24,1,35,K +2,24,2,13,I +2,24,3,6,S +2,24,4,6,A +2,24,5,3,C +2,24,6,1,V +2,25,0,330,S +2,25,1,5,T +2,25,2,3,P +2,25,3,2,V +2,25,4,1,D +2,25,5,1,C +2,26,0,277,F +2,26,1,48,G +2,26,2,8,A +2,26,3,2,S +2,26,4,2,R +2,26,5,2,P +2,26,6,1,Y +2,26,7,1,L +2,26,8,1,D +2,27,0,263,R +2,27,1,49,S +2,27,2,12,W +2,27,3,7,Q +2,27,4,3,H +2,27,5,2,L +2,27,6,2,D +2,27,7,2,C +2,27,8,1,G +2,27,9,1,E +2,28,0,171,D +2,28,1,46,E +2,28,2,45,F +2,28,3,30,A +2,28,4,18,S +2,28,5,18,N +2,28,6,7,V +2,28,7,3,G +2,28,8,2,P +2,28,9,1,R +2,28,10,1,H +2,29,0,261,P +2,29,1,44,R +2,29,2,18,S +2,29,3,8,T +2,29,4,4,L +2,29,5,2,V +2,29,6,2,C +2,29,7,1,W +2,29,8,1,I +2,29,9,1,H +3,0,0,759,C +3,0,1,1,Y +3,0,2,1,W +3,0,3,1,V +3,0,4,1,K +3,0,5,1,G +3,1,0,396,F +3,1,1,169,Y +3,1,2,166,L +3,1,3,18,I +3,1,4,6,H +3,1,5,3,V +3,1,6,2,N +3,1,7,1,T +3,1,8,1,Q +3,1,9,1,D +3,1,10,1,C +3,2,0,752,Y +3,2,1,6,F +3,2,2,2,C +3,2,3,1,Q +3,2,4,1,L +3,2,5,1,E +3,2,6,1,D +3,3,0,297,T +3,3,1,266,V +3,3,2,55,L +3,3,3,39,K +3,3,4,32,I +3,3,5,29,M +3,3,6,18,S +3,3,7,17,E +3,3,8,3,R +3,3,9,3,F +3,3,10,2,Q +3,3,11,2,A +3,3,12,1,N +3,4,0,592,A +3,4,1,149,G +3,4,2,17,T +3,4,3,2,V +3,4,4,1,Y +3,4,5,1,S +3,4,6,1,I +3,4,7,1,H +3,5,0,561,S +3,5,1,128,A +3,5,2,59,T +3,5,3,7,V +3,5,4,4,L +3,5,5,2,F +3,5,6,1,W +3,5,7,1,P +3,5,8,1,K +3,6,0,741,D +3,6,1,9,L +3,6,2,6,H +3,6,3,3,Y +3,6,4,2,N +3,6,5,1,T +3,6,6,1,F +3,6,7,1,A +3,7,0,267,S +3,7,1,145,G +3,7,2,144,E +3,7,3,68,T +3,7,4,52,R +3,7,5,37,A +3,7,6,23,K +3,7,7,12,D +3,7,8,6,V +3,7,9,3,N +3,7,10,3,I +3,7,11,2,Q +3,7,12,1,Y +3,7,13,1,L +3,8,0,220,L +3,8,1,213,P +3,8,2,83,T +3,8,3,51,E +3,8,4,48,A +3,8,5,40,W +3,8,6,25,I +3,8,7,21,V +3,8,8,19,M +3,8,9,19,G +3,8,10,9,H +3,8,11,6,Q +3,8,12,5,C +3,8,13,3,D +3,8,14,1,S +3,8,15,1,R +3,9,0,543,Q +3,9,1,71,H +3,9,2,34,T +3,9,3,30,E +3,9,4,21,R +3,9,5,19,L +3,9,6,18,K +3,9,7,8,S +3,9,8,5,V +3,9,9,4,N +3,9,10,4,A +3,9,11,3,Y +3,9,12,3,I +3,9,13,1,F +3,10,0,315,S +3,10,1,182,V +3,10,2,125,A +3,10,3,75,T +3,10,4,40,L +3,10,5,17,P +3,10,6,5,I +3,10,7,2,M +3,10,8,2,G +3,10,9,1,R +3,11,0,264,A +3,11,1,226,S +3,11,2,121,D +3,11,3,39,Q +3,11,4,28,T +3,11,5,17,P +3,11,6,15,R +3,11,7,14,G +3,11,8,14,E +3,11,9,8,H +3,11,10,6,V +3,11,11,6,L +3,11,12,3,F +3,11,13,1,Y +3,11,14,1,W +3,11,15,1,K +3,12,0,200,S +3,12,1,166,T +3,12,2,128,A +3,12,3,77,P +3,12,4,76,R +3,12,5,27,K +3,12,6,15,L +3,12,7,14,G +3,12,8,12,Q +3,12,9,12,M +3,12,10,11,I +3,12,11,6,E +3,12,12,5,V +3,12,13,5,H +3,12,14,4,D +3,12,15,2,Y +3,12,16,2,W +3,12,17,2,F +3,13,0,446,I +3,13,1,203,K +3,13,2,91,L +3,13,3,19,V +3,13,4,1,T +3,13,5,1,Q +3,13,6,1,M +3,13,7,1,F +3,13,8,1,D +3,14,0,305,H +3,14,1,69,R +3,14,2,69,Q +3,14,3,59,V +3,14,4,51,K +3,14,5,41,Y +3,14,6,34,E +3,14,7,32,T +3,14,8,32,L +3,14,9,24,N +3,14,10,21,S +3,14,11,16,I +3,14,12,5,F +3,14,13,2,M +3,14,14,2,A +3,14,15,1,G +3,14,16,1,C +3,15,0,734,L +3,15,1,9,F +3,15,2,7,M +3,15,3,5,I +3,15,4,2,S +3,15,5,2,P +3,15,6,2,H +3,15,7,1,W +3,15,8,1,V +3,15,9,1,A +3,16,0,358,S +3,16,1,190,H +3,16,2,116,T +3,16,3,16,Y +3,16,4,16,N +3,16,5,14,F +3,16,6,12,L +3,16,7,9,P +3,16,8,9,A +3,16,9,8,Q +3,16,10,6,G +3,16,11,5,I +3,16,12,2,R +3,16,13,2,K +3,16,14,1,V +3,17,0,310,S +3,17,1,255,F +3,17,2,88,L +3,17,3,55,I +3,17,4,32,V +3,17,5,11,G +3,17,6,5,T +3,17,7,4,A +3,17,8,2,N +3,17,9,1,Q +3,17,10,1,K +3,18,0,324,S +3,18,1,121,H +3,18,2,85,R +3,18,3,77,Y +3,18,4,41,Q +3,18,5,20,F +3,18,6,18,K +3,18,7,17,N +3,18,8,14,D +3,18,9,12,G +3,18,10,10,T +3,18,11,8,L +3,18,12,8,A +3,18,13,4,I +3,18,14,3,E +3,18,15,2,C +3,19,0,308,K +3,19,1,126,R +3,19,2,100,S +3,19,3,81,T +3,19,4,48,Q +3,19,5,35,L +3,19,6,23,G +3,19,7,16,F +3,19,8,8,A +3,19,9,7,N +3,19,10,3,E +3,19,11,2,Y +3,19,12,2,M +3,19,13,2,I +3,19,14,2,H +3,19,15,1,C +3,20,0,198,E +3,20,1,100,A +3,20,2,98,R +3,20,3,95,S +3,20,4,84,D +3,20,5,53,K +3,20,6,45,T +3,20,7,37,N +3,20,8,16,Q +3,20,9,14,L +3,20,10,7,I +3,20,11,5,G +3,20,12,4,V +3,20,13,3,F +3,20,14,2,M +3,20,15,1,P +3,20,16,1,H +3,20,17,1,C +3,21,0,206,S +3,21,1,157,K +3,21,2,90,T +3,21,3,85,A +3,21,4,60,E +3,21,5,57,D +3,21,6,37,R +3,21,7,21,N +3,21,8,17,G +3,21,9,10,L +3,21,10,8,Q +3,21,11,8,P +3,21,12,3,V +3,21,13,3,H +3,21,14,1,M +3,21,15,1,F +3,22,0,375,K +3,22,1,93,S +3,22,2,62,T +3,22,3,47,E +3,22,4,43,R +3,22,5,40,P +3,22,6,23,A +3,22,7,17,L +3,22,8,15,I +3,22,9,13,N +3,22,10,9,Y +3,22,11,8,Q +3,22,12,5,G +3,22,13,5,D +3,22,14,3,V +3,22,15,3,F +3,22,16,2,M +3,22,17,1,H +3,23,0,258,N +3,23,1,104,D +3,23,2,83,Q +3,23,3,76,V +3,23,4,41,G +3,23,5,39,S +3,23,6,38,A +3,23,7,25,T +3,23,8,25,K +3,23,9,21,R +3,23,10,21,I +3,23,11,19,H +3,23,12,5,P +3,23,13,3,F +3,23,14,3,E +3,23,15,2,L +3,23,16,1,Y +3,24,0,254,L +3,24,1,222,F +3,24,2,61,I +3,24,3,53,T +3,24,4,48,Y +3,24,5,29,V +3,24,6,24,M +3,24,7,22,A +3,24,8,21,H +3,24,9,11,S +3,24,10,6,P +3,24,11,3,E +3,24,12,2,R +3,24,13,2,G +3,24,14,2,D +3,24,15,1,Q +3,24,16,1,N +3,24,17,1,K +3,24,18,1,C +3,25,0,279,T +3,25,1,81,N +3,25,2,73,E +3,25,3,69,F +3,25,4,60,L +3,25,5,44,S +3,25,6,31,Q +3,25,7,29,H +3,25,8,26,R +3,25,9,17,V +3,25,10,15,A +3,25,11,11,K +3,25,12,9,I +3,25,13,7,D +3,25,14,4,Y +3,25,15,4,W +3,25,16,3,G +3,25,17,2,M +3,26,0,323,A +3,26,1,163,V +3,26,2,96,L +3,26,3,72,S +3,26,4,33,I +3,26,5,31,G +3,26,6,11,F +3,26,7,10,Y +3,26,8,9,C +3,26,9,5,T +3,26,10,3,K +3,26,11,2,Q +3,26,12,2,E +3,26,13,1,W +3,26,14,1,P +3,26,15,1,M +3,26,16,1,H +3,27,0,225,T +3,27,1,173,S +3,27,2,137,E +3,27,3,53,R +3,27,4,43,N +3,27,5,42,K +3,27,6,25,Q +3,27,7,22,H +3,27,8,16,F +3,27,9,13,I +3,27,10,4,V +3,27,11,3,Y +3,27,12,3,A +3,27,13,2,M +3,27,14,1,W +3,27,15,1,G +3,27,16,1,D +3,28,0,311,F +3,28,1,229,L +3,28,2,84,Y +3,28,3,43,A +3,28,4,24,I +3,28,5,20,G +3,28,6,17,V +3,28,7,11,E +3,28,8,7,M +3,28,9,4,W +3,28,10,4,N +3,28,11,3,K +3,28,12,2,T +3,28,13,2,S +3,28,14,2,Q +3,28,15,1,C +3,29,0,418,R +3,29,1,209,G +3,29,2,40,K +3,29,3,33,M +3,29,4,16,Q +3,29,5,14,H +3,29,6,10,S +3,29,7,7,V +3,29,8,5,E +3,29,9,4,T +3,29,10,2,Y +3,29,11,2,L +3,29,12,1,W +3,29,13,1,N +3,29,14,1,I +3,29,15,1,D +4,0,0,374,C +4,0,1,2,Y +4,0,2,2,R +4,0,3,1,N +4,0,4,1,L +4,0,5,1,H +4,0,6,1,A +4,1,0,209,L +4,1,1,151,F +4,1,2,6,I +4,1,3,4,V +4,1,4,4,T +4,1,5,3,R +4,1,6,2,Y +4,1,7,2,S +4,1,8,1,H +4,2,0,361,Y +4,2,1,6,F +4,2,2,6,C +4,2,3,3,L +4,2,4,2,S +4,2,5,1,V +4,2,6,1,R +4,2,7,1,N +4,2,8,1,I +4,3,0,195,V +4,3,1,99,L +4,3,2,25,M +4,3,3,22,F +4,3,4,13,T +4,3,5,6,S +4,3,6,6,A +4,3,7,4,R +4,3,8,4,I +4,3,9,2,W +4,3,10,2,Q +4,3,11,1,Y +4,3,12,1,P +4,3,13,1,E +4,3,14,1,D +4,4,0,235,A +4,4,1,114,S +4,4,2,22,G +4,4,3,4,L +4,4,4,3,R +4,4,5,1,V +4,4,6,1,P +4,4,7,1,D +4,4,8,1,C +4,5,0,242,S +4,5,1,122,T +4,5,2,6,A +4,5,3,4,L +4,5,4,3,R +4,5,5,2,I +4,5,6,1,N +4,5,7,1,M +4,5,8,1,G +4,6,0,249,D +4,6,1,108,Q +4,6,2,6,R +4,6,3,6,N +4,6,4,5,H +4,6,5,4,P +4,6,6,2,Y +4,6,7,1,E +4,6,8,1,A +4,7,0,110,G +4,7,1,93,S +4,7,2,59,E +4,7,3,34,N +4,7,4,22,T +4,7,5,21,Q +4,7,6,16,R +4,7,7,8,A +4,7,8,6,K +4,7,9,6,D +4,7,10,4,M +4,7,11,1,V +4,7,12,1,I +4,7,13,1,F +4,8,0,140,P +4,8,1,124,L +4,8,2,28,Q +4,8,3,18,T +4,8,4,18,R +4,8,5,13,S +4,8,6,13,A +4,8,7,8,K +4,8,8,6,V +4,8,9,4,H +4,8,10,3,M +4,8,11,3,I +4,8,12,2,E +4,8,13,1,F +4,8,14,1,D +4,9,0,138,E +4,9,1,48,Q +4,9,2,40,S +4,9,3,24,K +4,9,4,23,A +4,9,5,18,T +4,9,6,17,V +4,9,7,16,L +4,9,8,14,N +4,9,9,12,H +4,9,10,12,D +4,9,11,10,G +4,9,12,4,I +4,9,13,3,R +4,9,14,2,P +4,9,15,1,Y +4,10,0,152,A +4,10,1,106,L +4,10,2,71,T +4,10,3,27,V +4,10,4,14,S +4,10,5,7,P +4,10,6,2,R +4,10,7,1,M +4,10,8,1,I +4,10,9,1,C +4,11,0,178,S +4,11,1,54,P +4,11,2,54,A +4,11,3,29,R +4,11,4,18,N +4,11,5,13,L +4,11,6,10,K +4,11,7,8,T +4,11,8,6,F +4,11,9,3,V +4,11,10,2,Q +4,11,11,2,H +4,11,12,2,C +4,11,13,1,Y +4,11,14,1,E +4,11,15,1,D +4,12,0,93,Q +4,12,1,74,E +4,12,2,50,S +4,12,3,36,T +4,12,4,26,K +4,12,5,20,R +4,12,6,18,N +4,12,7,14,L +4,12,8,13,D +4,12,9,12,A +4,12,10,10,H +4,12,11,6,P +4,12,12,4,G +4,12,13,3,V +4,12,14,1,Y +4,12,15,1,M +4,12,16,1,I +4,13,0,136,L +4,13,1,125,I +4,13,2,96,V +4,13,3,10,M +4,13,4,9,S +4,13,5,2,G +4,13,6,1,T +4,13,7,1,P +4,13,8,1,N +4,13,9,1,F +4,14,0,93,T +4,14,1,70,K +4,14,2,62,N +4,14,3,32,H +4,14,4,27,E +4,14,5,26,R +4,14,6,18,S +4,14,7,11,I +4,14,8,8,M +4,14,9,8,D +4,14,10,6,Q +4,14,11,6,G +4,14,12,4,Y +4,14,13,4,V +4,14,14,3,L +4,14,15,2,A +4,14,16,1,P +4,14,17,1,F +4,15,0,346,L +4,15,1,25,M +4,15,2,7,V +4,15,3,1,W +4,15,4,1,T +4,15,5,1,P +4,15,6,1,G +4,16,0,90,T +4,16,1,73,P +4,16,2,66,E +4,16,3,60,S +4,16,4,21,I +4,16,5,16,L +4,16,6,13,Y +4,16,7,9,N +4,16,8,8,H +4,16,9,7,Q +4,16,10,7,F +4,16,11,3,V +4,16,12,3,R +4,16,13,3,A +4,16,14,2,D +4,16,15,1,G +4,17,0,168,S +4,17,1,129,F +4,17,2,39,L +4,17,3,35,C +4,17,4,3,T +4,17,5,3,A +4,17,6,2,D +4,17,7,1,P +4,17,8,1,N +4,17,9,1,I +4,18,0,64,S +4,18,1,45,D +4,18,2,40,H +4,18,3,40,F +4,18,4,29,N +4,18,5,27,P +4,18,6,25,R +4,18,7,23,L +4,18,8,21,E +4,18,9,19,V +4,18,10,15,Y +4,18,11,10,Q +4,18,12,8,K +4,18,13,4,I +4,18,14,4,G +4,18,15,4,C +4,18,16,3,T +4,18,17,1,A +4,19,0,130,S +4,19,1,73,E +4,19,2,35,T +4,19,3,26,A +4,19,4,24,Y +4,19,5,14,G +4,19,6,14,F +4,19,7,10,V +4,19,8,9,R +4,19,9,9,L +4,19,10,9,D +4,19,11,8,P +4,19,12,5,K +4,19,13,4,Q +4,19,14,4,M +4,19,15,3,N +4,19,16,2,H +4,19,17,2,C +4,19,18,1,I +4,20,0,63,G +4,20,1,59,K +4,20,2,59,D +4,20,3,54,T +4,20,4,53,N +4,20,5,24,L +4,20,6,22,S +4,20,7,12,Q +4,20,8,9,E +4,20,9,9,A +4,20,10,6,R +4,20,11,5,V +4,20,12,3,I +4,20,13,2,Y +4,20,14,1,P +4,20,15,1,M +4,21,0,78,S +4,21,1,66,N +4,21,2,52,E +4,21,3,51,K +4,21,4,45,D +4,21,5,21,P +4,21,6,20,Q +4,21,7,15,G +4,21,8,14,T +4,21,9,12,R +4,21,10,4,A +4,21,11,3,H +4,21,12,1,L +4,22,0,164,P +4,22,1,67,F +4,22,2,45,S +4,22,3,25,L +4,22,4,20,T +4,22,5,17,E +4,22,6,14,K +4,22,7,5,I +4,22,8,5,A +4,22,9,4,V +4,22,10,4,Q +4,22,11,3,R +4,22,12,2,Y +4,22,13,2,G +4,22,14,2,D +4,22,15,1,N +4,22,16,1,H +4,22,17,1,C +4,23,0,207,R +4,23,1,69,Q +4,23,2,44,C +4,23,3,18,M +4,23,4,17,H +4,23,5,10,S +4,23,6,8,F +4,23,7,2,V +4,23,8,2,T +4,23,9,2,A +4,23,10,1,W +4,23,11,1,I +4,23,12,1,E +4,24,0,137,S +4,24,1,95,E +4,24,2,38,Q +4,24,3,30,K +4,24,4,20,H +4,24,5,13,T +4,24,6,13,R +4,24,7,11,N +4,24,8,6,V +4,24,9,4,L +4,24,10,4,G +4,24,11,3,F +4,24,12,3,D +4,24,13,3,A +4,24,14,2,I +4,25,0,160,A +4,25,1,109,V +4,25,2,37,G +4,25,3,31,P +4,25,4,24,I +4,25,5,8,S +4,25,6,4,T +4,25,7,3,Y +4,25,8,3,R +4,25,9,2,L +4,25,10,1,K +4,26,0,231,S +4,26,1,46,N +4,26,2,17,P +4,26,3,16,T +4,26,4,13,Q +4,26,5,11,L +4,26,6,10,R +4,26,7,8,K +4,26,8,7,F +4,26,9,6,D +4,26,10,4,V +4,26,11,3,H +4,26,12,3,G +4,26,13,3,A +4,26,14,2,E +4,26,15,1,W +4,26,16,1,I +4,27,0,241,F +4,27,1,112,Y +4,27,2,12,S +4,27,3,7,L +4,27,4,4,A +4,27,5,2,V +4,27,6,1,R +4,27,7,1,I +4,27,8,1,H +4,27,9,1,G +4,28,0,186,R +4,28,1,113,G +4,28,2,23,K +4,28,3,19,N +4,28,4,14,H +4,28,5,9,Q +4,28,6,6,E +4,28,7,4,D +4,28,8,2,V +4,28,9,2,F +4,28,10,1,Y +4,28,11,1,W +4,28,12,1,M +4,28,13,1,C +4,29,0,158,D +4,29,1,60,E +4,29,2,38,S +4,29,3,28,N +4,29,4,27,G +4,29,5,24,A +4,29,6,15,Q +4,29,7,13,K +4,29,8,6,P +4,29,9,4,R +4,29,10,3,Y +4,29,11,3,T +4,29,12,1,M +4,29,13,1,L +4,29,14,1,H diff --git a/lib/rust/enclone_stuff/src/lib.rs b/lib/rust/enclone_stuff/src/lib.rs new file mode 100644 index 0000000..387dda7 --- /dev/null +++ b/lib/rust/enclone_stuff/src/lib.rs @@ -0,0 +1,12 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +pub mod disintegrate; +pub mod doublets; +pub mod filter_umi; +pub mod flag_defective; +pub mod merge_onesies; +pub mod populate_features; +pub mod some_filters; +pub mod split_candidate_clonotypes; +pub mod start; +pub mod weak_chains; diff --git a/lib/rust/enclone_stuff/src/merge_onesies.rs b/lib/rust/enclone_stuff/src/merge_onesies.rs new file mode 100644 index 0000000..128d99b --- /dev/null +++ b/lib/rust/enclone_stuff/src/merge_onesies.rs @@ -0,0 +1,110 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Merge onesies where totally unambiguous. Possibly inefficient and should optimize. + +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype}; +use enclone_core::enclone_structs::CandidateClonotype; +use equiv::EquivRel; +use vector_utils::{lower_bound1_2, unique_sort, upper_bound1_2}; + +pub fn merge_onesies( + candidate_clonotypes: &mut Vec, + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + eq: &EquivRel, + disintegrated: &[bool], +) { + { + // ctl.join_alg_opt.merge_onesies is always true + let mut eqo = EquivRel::new(candidate_clonotypes.len() as u32); + let mut to_candidate_clonotype = vec![None; info.len()]; + for i in 0..candidate_clonotypes.len() { + for j in 0..candidate_clonotypes[i].len() { + to_candidate_clonotype[candidate_clonotypes[i][j] as usize] = Some(i); + } + } + let ncells_total = exact_clonotypes.iter().map(ExactClonotype::ncells).sum(); + let mut onesies = Vec::::new(); + for i in 0..info.len() { + if to_candidate_clonotype[i].is_some() + && info[i].tigs.len() == 1 + && !disintegrated[info[i].clonotype_index] + { + onesies.push(i); + } + } + let mut alltigs2 = Vec::<(Vec, usize)>::new(); + for i in 0..info.len() { + if to_candidate_clonotype[i].is_some() && info[i].tigs.len() >= 2 { + for j in 0..info[i].tigs.len() { + alltigs2.push((info[i].tigs[j].clone(), i)); + } + } + } + alltigs2.sort(); + for x in &onesies { + let low = lower_bound1_2(&alltigs2, &info[*x].tigs[0]); + let high = upper_bound1_2(&alltigs2, &info[*x].tigs[0]); + let mut ms = Vec::::new(); + for m in low..high { + if alltigs2[m as usize].0 == info[*x].tigs[0] { + ms.push(m as usize); + } + } + let mut ok = !ms.is_empty(); + let mut exacts = Vec::::new(); + for j in 0..ms.len() { + if eq.set_id(alltigs2[ms[j]].1) != eq.set_id(alltigs2[ms[0]].1) { + ok = false; + } + for z in eq.members_of_set_containing(alltigs2[ms[j]].1) { + exacts.push(info[z].clonotype_index); + } + } + unique_sort(&mut exacts); + + let ncells0 = exact_clonotypes[info[*x].clonotype_index].ncells(); + if ncells0 * 10000 < ncells_total { + ok = false; + } + + if ok { + let orb1 = to_candidate_clonotype[*x].unwrap(); + let orb2 = to_candidate_clonotype[alltigs2[ms[0]].1].unwrap(); + + // Test for donor mixing. + + if !ctl.cr_opt.mix_donors { + let mut donors = vec![Vec::>::new(); 2]; + let orbs = [&orb1, &orb2]; + for (pass, orb) in orbs.iter().enumerate() { + for id in &candidate_clonotypes[**orb] { + let ex = &exact_clonotypes[info[*id as usize].clonotype_index]; + for i in 0..ex.clones.len() { + donors[pass].push(ex.clones[i][0].donor_index); + } + } + unique_sort(&mut donors[pass]); + } + if donors[0] != donors[1] { + continue; + } + } + + // Make join. + + eqo.join(orb1, orb2); + } + } + let mut candidate_clonotypes2 = Vec::>::new(); + for cc_iter in eqo.all_sets() { + let mut cc = Vec::::new(); + for oj in cc_iter { + cc.extend(&candidate_clonotypes[oj]); + } + candidate_clonotypes2.push(cc); + } + *candidate_clonotypes = candidate_clonotypes2; + } +} diff --git a/lib/rust/enclone_stuff/src/populate_features.rs b/lib/rust/enclone_stuff/src/populate_features.rs new file mode 100644 index 0000000..e884869 --- /dev/null +++ b/lib/rust/enclone_stuff/src/populate_features.rs @@ -0,0 +1,65 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +// Populate features. + +use amino::nucleotide_to_aminoacid_sequence; +use vdj_ann::refx::RefData; +use vdj_ann::vdj_features::{cdr1_start, cdr2_start, fr1_start, fr2_start, fr3_start}; + +#[allow(clippy::too_many_arguments)] +pub fn populate_features( + refdata: &RefData, + fr1_starts: &mut Vec, + fr2_starts: &mut Vec>, + fr3_starts: &mut Vec>, + cdr1_starts: &mut Vec>, + cdr2_starts: &mut Vec>, +) { + *fr1_starts = vec![0; refdata.refs.len()]; + *fr2_starts = vec![None; refdata.refs.len()]; + *fr3_starts = vec![None; refdata.refs.len()]; + *cdr1_starts = vec![None; refdata.refs.len()]; + *cdr2_starts = vec![None; refdata.refs.len()]; + for i in 0..refdata.refs.len() { + if refdata.is_v(i) { + let aa = nucleotide_to_aminoacid_sequence(&refdata.refs[i].to_ascii_vec(), 0); + let rtype = refdata.rtype[i]; + let chain_type = if rtype == 0 { + "IGH" + } else if rtype == 1 { + "IGK" + } else if rtype == 2 { + "IGL" + } else if rtype == 3 { + "TRA" + } else if rtype == 4 { + "TRB" + } else { + continue; + }; + let Some(fs1) = fr1_start(&aa, chain_type) else { + continue; + }; + fr1_starts[i] = 3 * fs1; + let fs2 = fr2_start(&aa, chain_type, false); + if let Some(fs2) = fs2 { + fr2_starts[i] = Some(3 * fs2); + } + + let fs3 = fr3_start(&aa, chain_type, false); + if let Some(fs3) = fs3 { + fr3_starts[i] = Some(3 * fs3); + } + + let cs1 = cdr1_start(&aa, chain_type, false); + if let Some(cs1) = cs1 { + cdr1_starts[i] = Some(3 * cs1); + } + + let cs2 = cdr2_start(&aa, chain_type, false); + if let Some(cs2) = cs2 { + cdr2_starts[i] = Some(3 * cs2); + } + } + } +} diff --git a/lib/rust/enclone_stuff/src/some_filters.rs b/lib/rust/enclone_stuff/src/some_filters.rs new file mode 100644 index 0000000..26712fe --- /dev/null +++ b/lib/rust/enclone_stuff/src/some_filters.rs @@ -0,0 +1,319 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype}; +use enclone_core::enclone_structs::{BarcodeFates, CandidateClonotype}; +use enclone_process::define_column_info::define_column_info; +use enclone_process::define_mat::{define_mat, setup_define_mat}; +use qd::Double; +use rayon::prelude::*; +use std::cmp::max; +use std::collections::{HashMap, HashSet}; +use vdj_ann::refx::RefData; +use vector_utils::{erase_if, next_diff1_2, unique_sort}; + +/// Given a signature s having at least two chains, if the total cells in the two-chain +/// signatures that are different from it but share a chain with it is at least 20 times +/// greater, delete s. +#[allow(clippy::too_many_arguments)] +pub fn signature_filter( + candidate_clonotypes: &mut Vec, + to_bc: &HashMap<(usize, usize), Vec>, + sr: &[Vec], + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + raw_joins: &[Vec], + fate: &mut [BarcodeFates], + refdata: &RefData, +) { + // Note duplication of calls to define_mat with other code. This is expensive. + const SIG_MULT: usize = 20; + let mut results = Vec::<(usize, Vec<(usize, String, BarcodeFate)>, Vec)>::new(); + for i in 0..candidate_clonotypes.len() { + results.push((i, Vec::new(), Vec::new())); + } + results.par_iter_mut().for_each(|res| { + let i = res.0; + let cc = candidate_clonotypes[i].clone(); + let (od, exacts) = setup_define_mat(&cc, info); + let mat = define_mat( + to_bc, + sr, + ctl, + exact_clonotypes, + &exacts, + &od, + info, + raw_joins, + refdata, + ); + + // Find all the signatures and cell counts associated to each. + + let mut freq = Vec::<(usize, Vec)>::new(); + { + let mut types = Vec::<(Vec, usize)>::new(); + for (u, &e) in exacts.iter().enumerate() { + let mut t = Vec::::new(); + for (col, m) in mat.iter().enumerate() { + if m[u].is_some() { + t.push(col); + } + } + if t.len() >= 2 { + types.push((t, exact_clonotypes[e].ncells())); + } + } + types.sort(); + let mut i = 0; + while i < types.len() { + let j = next_diff1_2(&types, i); + let mut mult = 0; + for t in &types[i..j] { + mult += t.1; + } + freq.push((mult, types[i].0.clone())); + i = j; + } + } + /* + let mut msg = "\nfrequencies:\n".to_string(); // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + use itertools::Itertools; // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + for i in 0..freq.len() { // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + msg += &mut format!("{} ==> {}\n", freq[i].0, freq[i].1.iter().format(",")); // XXX + } // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + */ + + // Decide which signatures to delete. + + let mut dels = HashSet::>::new(); + for i in 0..freq.len() { + let mut n2 = 0; + for j in 0..freq.len() { + if j != i && freq[j].1.len() == 2 { + let mut share = false; + for x in &freq[j].1 { + if freq[i].1.contains(x) { + share = true; + } + } + if share { + n2 += freq[j].0; + } + } + } + if n2 > SIG_MULT * freq[i].0 { + dels.insert(freq[i].1.clone()); + /* + msg += &mut format!("delete {}\n", freq[i].1.iter().format(",")); // XXXXXXXXXX + */ + } + } + /* + if dels.len() > 0 { println!("{}", msg); } // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + */ + for u in 0..exacts.len() { + let mut t = Vec::::new(); + for (col, m) in mat.iter().enumerate() { + if m[u].is_some() { + t.push(col); + } + } + if dels.contains(&t) { + res.2.push(exacts[u]); + let ex = &exact_clonotypes[exacts[u]]; + for i in 0..ex.ncells() { + res.1.push(( + ex.clones[i][0].dataset_index, + ex.clones[i][0].barcode.clone(), + BarcodeFate::Signature, + )); + } + } + } + }); + let mut to_delete = vec![false; exact_clonotypes.len()]; + for i in 0..results.len() { + for j in 0..results[i].1.len() { + fate[results[i].1[j].0].insert(results[i].1[j].1.clone(), results[i].1[j].2); + } + for j in 0..results[i].2.len() { + to_delete[results[i].2[j]] = true; + } + } + let mut candidate_clonotypes2 = Vec::>::new(); + for cc in candidate_clonotypes.iter() { + let mut cc = cc.clone(); + let mut del = vec![false; cc.len()]; + for j in 0..cc.len() { + let id = info[cc[j] as usize].clonotype_index; + if to_delete[id] { + del[j] = true; + } + } + erase_if(&mut cc, &del); + candidate_clonotypes2.push(cc); + } + *candidate_clonotypes = candidate_clonotypes2; +} + +/// Find and mark for deletion exact subclonotypes having a variant base in V..J that, +/// accounting for all the cells in all the exact subclonotypes, never occurs as Q60 +/// doesn't occur as Q40 twice, and disagrees with the reference. +#[allow(clippy::too_many_arguments)] +pub fn qual_filter( + candidate_clonotypes: &mut [CandidateClonotype], + to_bc: &HashMap<(usize, usize), Vec>, + sr: &[Vec], + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + raw_joins: &[Vec], + fate: &mut [BarcodeFates], + refdata: &RefData, +) { + let mut results = Vec::<(usize, Vec<(usize, String, BarcodeFate)>, Vec)>::new(); + for i in 0..candidate_clonotypes.len() { + results.push((i, Vec::new(), Vec::new())); + } + results.par_iter_mut().for_each(|res| { + let i = res.0; + let cc = candidate_clonotypes[i].clone(); + let (od, exacts) = setup_define_mat(&cc, info); + let mat = define_mat( + to_bc, + sr, + ctl, + exact_clonotypes, + &exacts, + &od, + info, + raw_joins, + refdata, + ); + let rsi = define_column_info(&exacts, exact_clonotypes, mat); + + // Create vars, copied from vars_and_shares. + + let mut vars = Vec::>::new(); + for cx in 0..rsi.mat.len() { + let mut n = 0; + for z in 0..rsi.seqss[cx].len() { + n = max(n, rsi.seqss[cx][z].len()); + } + let mut v = Vec::::new(); + for p in 0..n { + let mut bases = Vec::::new(); + for s in 0..rsi.seqss[cx].len() { + if p >= rsi.seqss[cx][s].len() { + continue; + } + bases.push(rsi.seqss[cx][s][p]); + } + unique_sort(&mut bases); + if bases.len() > 1 { + v.push(p); + } + } + vars.push(v); + } + + // Proceed. + + // (column, pos, base, qual, row) + let mut vquals = Vec::<(usize, usize, u8, u8, usize)>::new(); + for u in 0..exacts.len() { + let clonotype_id = exacts[u]; + let ex = &exact_clonotypes[clonotype_id]; + #[allow(clippy::needless_range_loop)] + for col in 0..rsi.mat.len() { + if let Some(m) = rsi.mat[col][u] { + if ex.share[m].annv.len() > 1 { + continue; + } + let n = ex.share[m].seq_del.len(); + let vref = &exact_clonotypes[exacts[u]].share[m].vs.to_ascii_vec(); + let jref = &exact_clonotypes[exacts[u]].share[m].js.to_ascii_vec(); + for z in 0..vars[col].len() { + let p = vars[col][z]; + let b = ex.share[m].seq_del[p]; + let mut refdiff = false; + if p < vref.len() - ctl.heur.ref_v_trim && b != vref[p] { + refdiff = true; + } + if p >= n - (jref.len() - ctl.heur.ref_j_trim) + && b != jref[jref.len() - (n - p)] + { + refdiff = true; + } + if refdiff { + for j in 0..ex.clones.len() { + let qual = ex.clones[j][m].quals[p]; + vquals.push((col, p, b, qual, u)); + } + } + } + } + } + } + vquals.sort_unstable(); + let mut j = 0; + while j < vquals.len() { + let mut k = j + 1; + while k < vquals.len() { + if vquals[k].0 != vquals[j].0 + || vquals[k].1 != vquals[j].1 + || vquals[k].2 != vquals[j].2 + { + break; + } + k += 1; + } + let mut q60 = false; + let mut q40 = 0; + for v in &vquals[j..k] { + if v.3 >= 60 { + q60 = true; + } else if v.3 >= 40 { + q40 += 1; + } + } + if !q60 && q40 < 2 { + let u = vquals[j].4; + res.2.push(exacts[u]); + + let ex = &exact_clonotypes[exacts[u]]; + for i in 0..ex.ncells() { + res.1.push(( + ex.clones[i][0].dataset_index, + ex.clones[i][0].barcode.clone(), + BarcodeFate::Qual, + )); + } + } + j = k; + } + }); + let mut to_delete = vec![false; exact_clonotypes.len()]; + let mut dels = Vec::::new(); + for i in 0..results.len() { + for j in 0..results[i].1.len() { + fate[results[i].1[j].0].insert(results[i].1[j].1.clone(), results[i].1[j].2); + } + for x in &results[i].2 { + to_delete[*x] = true; + } + } + dels.sort_unstable(); + for cc in candidate_clonotypes.iter_mut() { + let mut del = vec![false; cc.len()]; + for (&oj, d) in cc.iter().zip(del.iter_mut()) { + let id = info[oj as usize].clonotype_index; + if to_delete[id] { + *d = true; + } + } + erase_if(cc, &del); + } +} diff --git a/lib/rust/enclone_stuff/src/split_candidate_clonotypes.rs b/lib/rust/enclone_stuff/src/split_candidate_clonotypes.rs new file mode 100644 index 0000000..17ecccf --- /dev/null +++ b/lib/rust/enclone_stuff/src/split_candidate_clonotypes.rs @@ -0,0 +1,182 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype}; +use enclone_core::enclone_structs::CandidateClonotype; +use enclone_process::define_mat::{define_mat, setup_define_mat}; +use equiv::EquivRel; +use qd::Double; +use std::collections::HashMap; +use vdj_ann::refx::RefData; +use vector_utils::{bin_position, unique_sort, VecUtils}; + +/// Check for disjoint candidate clonotypes. +#[allow(clippy::too_many_arguments)] +pub fn split_candidate_clonotypes( + candidate_clonotypes: &mut Vec, + to_bc: &HashMap<(usize, usize), Vec>, + sr: &[Vec], + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + raw_joins: &[Vec], + refdata: &RefData, +) { + let mut candidate_clonotypes2 = Vec::>::new(); + for cc in candidate_clonotypes.iter() { + let (od, exacts) = setup_define_mat(cc, info); + let mat = define_mat( + to_bc, + sr, + ctl, + exact_clonotypes, + &exacts, + &od, + info, + raw_joins, + refdata, + ); + let cols = mat.len(); + + // Define map of indices into exacts. + + let nexacts = exacts.len(); + let mut to_exacts = HashMap::::with_capacity(nexacts); + for (u, &e) in exacts.iter().enumerate() { + to_exacts.insert(e, u); + } + + // Get the info indices corresponding to this clonotype. + + let mut infos = Vec::::new(); + for &oi in cc { + infos.push(oi as usize); + } + + // Define map of exacts to infos. + + let mut to_infos = vec![Vec::::new(); nexacts]; + for (i, &infoi) in infos.iter().enumerate() { + let u = to_exacts[&info[infoi].clonotype_index]; + to_infos[u].push(i); + } + + // Determine which columns are "left", meaning IGH or TRB. + + let mut left = vec![false; cols]; + for m in 0..cols { + for u in 0..mat[0].len() { + if mat[m][u].is_some() { + let c = mat[m][u].unwrap(); + let ex = &exact_clonotypes[exacts[u]]; + if ex.share[c].left { + left[m] = true; + } + break; + } + } + } + + // Determine which pairs of configurations share both chain types, and if so, call + // them joined. + + let mut matu = Vec::>>::with_capacity(nexacts); + for u in 0..nexacts { + let mut m = Vec::>::with_capacity(cols); + for mm in mat.iter().take(cols) { + m.push(mm[u]); + } + matu.push(m); + } + unique_sort(&mut matu); + let mut eqm = vec![vec![false; matu.len()]; matu.len()]; + for (mj1, eqm) in matu.iter().zip(eqm.iter_mut()) { + for (mj2, eqm) in matu.iter().zip(eqm.iter_mut()) { + let (mut l, mut r) = (false, false); + for ((&mm1, &mm2), &ll) in mj1.iter().zip(mj2.iter()).zip(left.iter()).take(cols) { + if mm1.is_some() && mm2.is_some() { + if ll { + l = true; + } else { + r = true; + } + } + } + if l && r { + *eqm = true; + } + } + } + + // Propagate this to an equivalence relation on the candidate clonotype elements. + + let mut eqx = EquivRel::new(cc.len() as u32); + let mut lists = vec![Vec::::new(); matu.len()]; + for u in 0..nexacts { + let mut m = Vec::>::with_capacity(cols); + for mat in mat.iter().take(cols) { + m.push(mat[u]); + } + lists[bin_position(&matu, &m) as usize].push(u); + } + for (l1, eqm) in lists.iter().zip(eqm.into_iter()) { + for (l2, eqm) in lists.iter().zip(eqm.into_iter()) { + if eqm { + let u1 = l1[0]; + for &u2 in l2 { + for &i1 in &to_infos[u1] { + for &i2 in &to_infos[u2] { + eqx.join(i1, i2); + } + } + } + } + } + } + + // Join onesies where possible. This should probably be more efficient. + + for (&e1, info1) in exacts.iter().zip(to_infos.iter()).take(nexacts) { + let ex1 = &exact_clonotypes[e1]; + if ex1.share.solo() { + let mut is = Vec::::new(); + for (&e2, info2) in exacts.iter().take(nexacts).zip(to_infos.iter()) { + let ex2 = &exact_clonotypes[e2]; + if ex2.share.solo() { + if ex1.share[0].seq == ex2.share[0].seq { + eqx.join(info1[0], info2[0]); + } + } else { + for j in 0..ex2.share.len() { + if ex2.share[j].seq == ex1.share[0].seq { + is.push(info2[0]); + } + } + } + } + let mut rs = Vec::::new(); + for &ij in &is { + rs.push(eqx.set_id(ij)); + } + unique_sort(&mut rs); + if rs.solo() { + eqx.join(info1[0], is[0]); + } + } + } + + // Divide the candidate clonotype if needed. + + if eqx.n_sets() == 1 { + candidate_clonotypes2.push(cc.clone()); + } else { + for ox_iter in eqx.all_sets() { + let mut o2 = Vec::::new(); + for ko in ox_iter { + o2.push(cc[ko]); + } + candidate_clonotypes2.push(o2); + } + } + } + *candidate_clonotypes = candidate_clonotypes2; +} diff --git a/lib/rust/enclone_stuff/src/start.rs b/lib/rust/enclone_stuff/src/start.rs new file mode 100644 index 0000000..e3f0846 --- /dev/null +++ b/lib/rust/enclone_stuff/src/start.rs @@ -0,0 +1,611 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. +// +// See README for documentation. + +use crate::disintegrate::{disintegrate_onesies, DisintegrateOnesiesResult}; +use crate::doublets::delete_doublets; +use crate::filter_umi::filter_umi; +use crate::flag_defective::flag_defective; +use crate::merge_onesies::merge_onesies; +use crate::populate_features::populate_features; +use crate::some_filters::{qual_filter, signature_filter}; +use crate::split_candidate_clonotypes::split_candidate_clonotypes; +use crate::weak_chains::weak_chains; +use enclone::allele::{find_alleles, sub_alts}; +use enclone::graph_filter::GraphFilter; +use enclone::info::build_info; +use enclone::join::join_exacts; +use enclone::misc1::{ArtificialFoursieFilter, CrossFilter}; +use enclone::misc2::{check_for_barcode_reuse, find_exact_subclonotypes}; +use enclone::misc3::sort_tig_bc; +use enclone::BarcodeFilter; +use enclone_args::read_json::{parse_json_annotations_files, Annotations}; +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::{AltRef, CloneInfo, EncloneControl, OriginInfo}; +use enclone_core::enclone_structs::{BarcodeFates, CandidateClonotype, EncloneExacts}; +use enclone_core::hcomp::heavy_complexity; +use enclone_process::define_mat::{define_mat, setup_define_mat}; +use enclone_process::loupe::make_donor_refs; +use io_utils::fwriteln; +use itertools::Itertools; +use qd::dd; +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// This is a copy of stirling2_ratio_table from the stirling_numbers crate, that has been modified +// to use higher precision internal math. This has also been speeded up, and in the process +// made less readable. +use qd::Double; +use rayon::prelude::*; +use std::collections::HashMap; +use std::fs::File; +use std::io::{BufWriter, Write}; +use vdj_ann::refx::RefData; +use vector_utils::{bin_member, erase_if}; + +pub fn stirling2_ratio_table_double(n_max: usize) -> Vec> { + let mut s = Vec::>::new(); + let zero = dd![0.0]; + let one = dd![1.0]; + for n in 0..=n_max { + s.push(vec![zero; n + 1]); + } + s[0][0] = one; + let mut z = Vec::::new(); + let mut n2n1 = vec![dd![0.0]; n_max + 1]; + for (n, nn) in n2n1.iter_mut().enumerate().skip(2) { + *nn = Double::from((n - 2) as u32) / Double::from((n - 1) as u32); + } + let mut k1k = vec![dd![0.0]; n_max]; + for (k, kk) in k1k.iter_mut().enumerate().skip(1) { + *kk = Double::from((k - 1) as u32) / Double::from(k as u32); + } + let mut njn = Vec::<(usize, Double)>::new(); + for i in 0..n_max + 1 { + njn.push((i, dd![0.0])); + } + njn.par_iter_mut().for_each(|res| { + let n = res.0; + if n >= 1 { + let mut p = one; + for j in 1..=n { + p *= Double::from(j as u32) / Double::from(n as u32); + } + res.1 = p; + } + }); + + // This is the slow part of the function. + + for n in 1..=n_max { + s[n][0] = zero; + for k in 1..n - 1 { + z[k - 1] *= k1k[k]; + } + if n >= 2 { + z.push(n2n1[n].powi((n - 1) as i32)); + } + for k in 1..n { + let x = z[k - 1]; // = ((k-1)/k)^(n-1) + s[n][k] = s[n - 1][k] + s[n - 1][k - 1] * x; + } + s[n][n] = njn[n].1; + } + s +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn load_input_data(ctl: &EncloneControl, refdata: &RefData) -> anyhow::Result { + // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + + // Flag defective reference sequences. + + let mut log = Vec::::new(); + let mut broken = Vec::::new(); + flag_defective(ctl, refdata, &mut log, &mut broken); + + // Parse the json annotations file. + + let mut annotations = parse_json_annotations_files(ctl, refdata)?; + + // Populate features. + + let mut fr1_starts = Vec::::new(); + let mut fr2_starts = Vec::>::new(); + let mut fr3_starts = Vec::>::new(); + let mut cdr1_starts = Vec::>::new(); + let mut cdr2_starts = Vec::>::new(); + populate_features( + refdata, + &mut fr1_starts, + &mut fr2_starts, + &mut fr3_starts, + &mut cdr1_starts, + &mut cdr2_starts, + ); + for tigi in &mut annotations.tig_bc { + for x in tigi { + x.fr1_start = fr1_starts[x.v_ref_id]; + x.fr2_start = fr2_starts[x.v_ref_id]; + x.fr3_start = fr3_starts[x.v_ref_id]; + x.cdr1_start = cdr1_starts[x.v_ref_id]; + x.cdr2_start = cdr2_starts[x.v_ref_id]; + } + } + + // Test for no data. + + if ctl.origin_info.n() == 0 { + anyhow::bail!("\nNo TCR or BCR data have been specified.\n"); + } + + Ok(annotations) +} + +pub fn main_enclone_start( + ctl: &EncloneControl, + annotations: Annotations, + refdata: &RefData, + report_whitelist_contamination: bool, +) -> Result<(EncloneExacts, Vec), String> { + let Annotations { + mut tig_bc, + gex_cells, + gex_cells_specified, + mut fate, + } = annotations; + // Filter using light --> heavy graph. + if ctl.cr_opt.filter.graph { + GraphFilter::default().filter_items(&mut tig_bc, &mut fate); + } + + // Sort tig_bc. + sort_tig_bc(&mut tig_bc, refdata, ctl.cr_opt.mix_donors); + + // Cross filter. + if ctl.cr_opt.filter.cross_dataset { + CrossFilter { + origin_info: &ctl.origin_info, + } + .filter_items(&mut tig_bc, &mut fate); + } + + // Look for barcode reuse. + check_for_barcode_reuse(&ctl.origin_info, &tig_bc)?; + + // Find exact subclonotypes. + let mut exact_clonotypes = find_exact_subclonotypes(ctl, &tig_bc, refdata); + + if !ctl.gen_opt.trace_barcode.is_empty() { + for ex in &exact_clonotypes { + for clone in &ex.clones { + if clone[0].barcode == ctl.gen_opt.trace_barcode { + println!( + "\nfound {} in an initial exact subclonotype having {} cells", + ctl.gen_opt.trace_barcode, + ex.ncells(), + ); + } + } + } + } + + if ctl.cr_opt.filter.weak_foursies { + ArtificialFoursieFilter.filter_items(&mut exact_clonotypes, &mut fate); + } + + // Build info about clonotypes. Note that this edits the V reference sequence to perform + // an indel in some cases. + // This may filter a barcode if it is found to be "improper". + let mut info: Vec = build_info(refdata, &mut exact_clonotypes[..], &mut fate); + + // Derive consensus sequences for alternate alleles of V segments. Then create donor + // reference sequences for Loupe. + let alt_refs = if ctl.gen_opt.no_alt_alleles { + Vec::new() + } else { + find_alleles(refdata, ctl, &exact_clonotypes) + }; + + if !ctl.cr_opt.dref_file.is_empty() { + write_donor_ref_file(&ctl.origin_info, &alt_refs, refdata, &ctl.cr_opt.dref_file); + } + let drefs = make_donor_refs(&alt_refs, refdata); + + // Update reference sequences for V segments by substituting in alt alleles if better. + + sub_alts( + refdata, + ctl, + &alt_refs, + &mut info[..], + &mut exact_clonotypes[..], + ); + + // Compute to_bc, which maps (dataset_index, clonotype_id) to {barcodes}. + // This is intended as a replacement for some old code below. + + let mut to_bc = HashMap::<(usize, usize), Vec>::new(); + for (i, ex) in exact_clonotypes.iter().enumerate() { + for clone in &ex.clones { + let x = &clone[0]; + to_bc + .entry((x.dataset_index, i)) + .or_default() + .push(x.barcode.clone()); + } + } + + // Make stirling ratio table. Not sure that fixing the size of this is safe. + + let sr = stirling2_ratio_table_double(3000); + + // Compute complexity. + + if ctl.join_alg_opt.comp_filt < 1_000_000 { + let jun = heavy_complexity(refdata, &exact_clonotypes, ctl, &drefs); + for u in 0..exact_clonotypes.len() { + let ex = &mut exact_clonotypes[u]; + for m in 0..ex.share.len() { + if ex.share.len() == 2 && ex.share[m].left { + ex.share[m].jun = jun[u].clone(); + } + } + } + } + + // Form equivalence relation on exact subclonotypes. We also keep the raw joins, consisting + // of pairs of info indices, that were originally joined. + let (eq, raw_joins) = join_exacts( + &to_bc, + refdata, + ctl, + &exact_clonotypes, + &info, + &sr, + report_whitelist_contamination, + ); + + // Disintegrate certain onesie clonotypes into single cell + // clonotypes. This requires editing of exact_clonotypes, info, eq, join_info and raw_joins. + let DisintegrateOnesiesResult { + eq, + mut exact_clonotypes, + info, + mut raw_joins, + disintegrated, + } = disintegrate_onesies(eq, exact_clonotypes, info, raw_joins); + + // Lock info. + let info = &info; + + // Update to_bc. + + let mut to_bc = HashMap::<(usize, usize), Vec>::new(); + for (i, ex) in exact_clonotypes.iter().enumerate() { + for clone in &ex.clones { + let x = &clone[0]; + to_bc + .entry((x.dataset_index, i)) + .or_default() + .push(x.barcode.clone()); + } + } + + // Restructure raw joins. + + raw_joins.sort_unstable(); + let raw_joins = { + let mut raw_joins2 = vec![Vec::::new(); info.len()]; + for r in raw_joins { + raw_joins2[r.0 as usize].push(r.1 as usize); + raw_joins2[r.1 as usize].push(r.0 as usize); + } + raw_joins2 + }; + + if !ctl.gen_opt.trace_barcode.is_empty() { + for ex in &exact_clonotypes { + for clone in &ex.clones { + if clone[0].barcode == ctl.gen_opt.trace_barcode { + println!( + "\nfound {} in a pre-filter exact subclonotype having {} cells", + ctl.gen_opt.trace_barcode, + ex.ncells(), + ); + } + } + } + } + + // Create candidate clonotypes. + let mut candidate_clonotypes = eq.all_sets_iter_i32().collect(); + + // Filter B cells based on UMI counts. + if ctl.gen_opt.is_bcr() && (ctl.cr_opt.filter.umi_count || ctl.cr_opt.filter.umi_ratio) { + // Conditionals on UMI filtering are processed internally. + // We could lift them out if we delete the "clonotype marking" feature. + candidate_clonotypes = filter_umi( + ctl, + &mut exact_clonotypes, + info, + candidate_clonotypes, + &mut fate, + ); + } + + if !ctl.gen_opt.trace_barcode.is_empty() { + for ex in &exact_clonotypes { + for clone in &ex.clones { + if clone[0].barcode == ctl.gen_opt.trace_barcode { + println!( + "\nfound {} in an post-umi-filter exact subclonotype having {} cells", + ctl.gen_opt.trace_barcode, + ex.ncells(), + ); + } + } + } + } + + // Remove cells that are not called cells by GEX. + let candidate_clonotypes = { + let mut candidate_clonotypes2 = Vec::>::new(); + for mut cc in candidate_clonotypes { + let mut to_deletex = vec![false; cc.len()]; + for (&x, dx) in cc.iter().zip(to_deletex.iter_mut()) { + let x: &CloneInfo = &info[x as usize]; + let ex = &mut exact_clonotypes[x.clonotype_index]; + let mut to_delete = vec![false; ex.ncells()]; + for (clone, d) in ex.clones.iter().take(ex.ncells()).zip(to_delete.iter_mut()) { + let li = clone[0].dataset_index; + let bc = &clone[0].barcode; + if gex_cells_specified[li] && !bin_member(&gex_cells[li], bc) { + *d = true; + fate[li].insert(bc.clone(), BarcodeFate::NotGexCell); + } + } + erase_if(&mut ex.clones, &to_delete); + if ex.ncells() == 0 { + *dx = true; + } + } + erase_if(&mut cc, &to_deletex); + if !cc.is_empty() { + candidate_clonotypes2.push(cc); + } + } + candidate_clonotypes2 + }; + + // Break up clonotypes containing a large number of chains. These are + // very likely to be false merges + let mut candidate_clonotypes: Vec = candidate_clonotypes + .into_iter() + .flat_map(|candidate_clonotype| { + let (od, exacts) = setup_define_mat(&candidate_clonotype, info); + let mat = define_mat( + &to_bc, + &sr, + ctl, + &exact_clonotypes, + &exacts, + &od, + info, + &raw_joins, + refdata, + ); + let num_chains = mat.len(); + if num_chains < ctl.cr_opt.split_max_chains { + vec![candidate_clonotype] + } else { + let exacts_of_chains = mat + .iter() + .enumerate() + .flat_map(|(chain_num, chain_in_exact)| { + exacts + .iter() + .zip_eq(chain_in_exact.iter()) + .filter_map(move |(e, chain)| chain.map(|_| (e, chain_num))) + }) + .into_group_map() + .into_iter() + .map(|(k, v)| (v, *k)) + .into_group_map(); + + let mut group_of_exacts = HashMap::new(); + let mut group_num = 0; + for (chains, chain_exacts) in exacts_of_chains.into_iter().sorted() { + if chains.len() == 1 { + for e in chain_exacts { + group_of_exacts.insert(e, group_num); + group_num += 1; + } + } else { + for e in chain_exacts { + group_of_exacts.insert(e, group_num); + } + group_num += 1; + } + } + + let mut groups = vec![vec![]; group_num]; + + for (_, exact_clonotype_id, val) in &od { + groups[group_of_exacts[exact_clonotype_id]].push(*val); + } + + // To split every subclonotype + // od + // .into_iter() + // .group_by(|o| o.1) + // .into_iter() + // .map(|(_, vals)| vals.map(|v| v.2).collect()) + // .collect(); + groups + } + }) + .collect(); + + // Delete exact subclonotypes that appear to represent doublets. + if ctl.cr_opt.filter.doublet { + delete_doublets( + &mut candidate_clonotypes, + &to_bc, + &sr, + ctl, + &exact_clonotypes, + info, + &raw_joins, + refdata, + &mut fate, + ); + } + + if ctl.cr_opt.filter.signature { + signature_filter( + &mut candidate_clonotypes, + &to_bc, + &sr, + ctl, + &exact_clonotypes, + info, + &raw_joins, + &mut fate, + refdata, + ); + } + + // Merge onesies where totally unambiguous. + merge_onesies( + &mut candidate_clonotypes, + ctl, + &exact_clonotypes, + info, + &eq, + &disintegrated, + ); + + // Check for disjoint candidate clonotypes. + split_candidate_clonotypes( + &mut candidate_clonotypes, + &to_bc, + &sr, + ctl, + &exact_clonotypes, + info, + &raw_joins, + refdata, + ); + + // Test for weak chains. + if ctl.cr_opt.filter.weak_chains { + weak_chains( + &mut candidate_clonotypes, + &to_bc, + &sr, + ctl, + &exact_clonotypes, + info, + &raw_joins, + &mut fate, + refdata, + ); + } + + // Check for disjoint candidate clonotypes (again). + split_candidate_clonotypes( + &mut candidate_clonotypes, + &to_bc, + &sr, + ctl, + &exact_clonotypes, + info, + &raw_joins, + refdata, + ); + + if ctl.cr_opt.filter.qual { + qual_filter( + &mut candidate_clonotypes, + &to_bc, + &sr, + ctl, + &exact_clonotypes, + info, + &raw_joins, + &mut fate, + refdata, + ); + } + + // Check for disjoint candidate clonotypes (again again). + split_candidate_clonotypes( + &mut candidate_clonotypes, + &to_bc, + &sr, + ctl, + &exact_clonotypes, + info, + &raw_joins, + refdata, + ); + + if !ctl.gen_opt.trace_barcode.is_empty() { + for ex in &exact_clonotypes { + for clone in &ex.clones { + if clone[0].barcode == ctl.gen_opt.trace_barcode { + println!( + "\nfound {} in an intermediate exact subclonotype having {} cells", + ctl.gen_opt.trace_barcode, + ex.ncells(), + ); + } + } + } + } + Ok(( + EncloneExacts { + to_bc, + exact_clonotypes, + raw_joins, + info: info.clone(), + candidate_clonotypes, + drefs, + sr, + }, + fate, + )) +} + +fn write_donor_ref_file( + origin_info: &OriginInfo, + alt_refs: &[AltRef], + refdata: &RefData, + dref_file: &str, +) { + let f = File::create(dref_file); + if f.is_err() { + eprintln!("\nError trying to write ctl.cr_opt.dref_file = {dref_file}."); + } + let mut f = BufWriter::new(f.unwrap()); + let mut count = 0; + for i in 0..alt_refs.len() { + let donor = alt_refs[i].donor; + let ref_id = alt_refs[i].ref_id; + if i > 0 && (donor != alt_refs[i - 1].donor || ref_id != alt_refs[i - 1].ref_id) { + count = 0; + } + let alt_seq = &alt_refs[i].alt_seq; + fwriteln!( + f, + ">{}:{}:{}:{} (reference record id : donor name : allele number : gene name)\n{}", + refdata.id[ref_id], + origin_info.donor_id[donor], + count + 1, + refdata.name[ref_id], + alt_seq.to_string() + ); + count += 1; + } +} diff --git a/lib/rust/enclone_stuff/src/weak_chains.rs b/lib/rust/enclone_stuff/src/weak_chains.rs new file mode 100644 index 0000000..fde1781 --- /dev/null +++ b/lib/rust/enclone_stuff/src/weak_chains.rs @@ -0,0 +1,113 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// Based on the number of cells in each column, decide which exact subclonotypes +// look like junk. Preliminary heuristic. + +use enclone_core::barcode_fate::BarcodeFate; +use enclone_core::defs::{CloneInfo, EncloneControl, ExactClonotype}; +use enclone_core::enclone_structs::{BarcodeFates, CandidateClonotype}; +use enclone_process::define_mat::{define_mat, setup_define_mat}; +use qd::Double; +use rayon::prelude::*; +use std::collections::HashMap; +use vdj_ann::refx::RefData; +use vector_utils::erase_if; + +#[derive(Default)] +struct Result { + f1: Vec<(usize, String, BarcodeFate)>, + f2: Vec, +} + +#[allow(clippy::too_many_arguments)] +pub fn weak_chains( + candidate_clonotypes: &mut Vec, + to_bc: &HashMap<(usize, usize), Vec>, + sr: &[Vec], + ctl: &EncloneControl, + exact_clonotypes: &[ExactClonotype], + info: &[CloneInfo], + raw_joins: &[Vec], + fate: &mut [BarcodeFates], + refdata: &RefData, +) { + // Note mat calculation duplicated with print_clonotypes and also doublet detection. + let results: Vec<_> = candidate_clonotypes + .par_iter() + .map(|cc| { + let (od, exacts) = setup_define_mat(cc, info); + let mat = define_mat( + to_bc, + sr, + ctl, + exact_clonotypes, + &exacts, + &od, + info, + raw_joins, + refdata, + ); + let cols = mat.len(); + let mut res = Result::default(); + if cols > 2 { + let nexacts = exacts.len(); + let mut ncells = vec![0; cols]; + let mut col_entries = vec![Vec::::new(); cols]; + for (u, &clonotype_id) in exacts.iter().enumerate().take(nexacts) { + for ((nc, ce), m) in ncells + .iter_mut() + .zip(col_entries.iter_mut()) + .zip(mat.iter().take(cols)) + { + let mid = m[u]; + if mid.is_some() { + ce.push(u); + *nc += exact_clonotypes[clonotype_id].clones.len(); + } + } + } + let mut total_cells = 0; + for j in 0..exacts.len() { + total_cells += exact_clonotypes[exacts[j]].ncells(); + } + for j in 0..cols { + if ncells[j] <= 20 && 8 * ncells[j] < total_cells { + for d in &col_entries[j] { + res.f2.push(exacts[*d]); + let ex = &exact_clonotypes[exacts[*d]]; + for i in 0..ex.ncells() { + res.f1.push(( + ex.clones[i][0].dataset_index, + ex.clones[i][0].barcode.clone(), + BarcodeFate::WeakChains, + )); + } + } + } + } + } + res + }) + .collect(); + let mut to_delete = vec![false; exact_clonotypes.len()]; + let mut dels = Vec::::new(); + for i in 0..results.len() { + for j in 0..results[i].f1.len() { + fate[results[i].f1[j].0].insert(results[i].f1[j].1.clone(), results[i].f1[j].2); + } + for x in &results[i].f2 { + to_delete[*x] = true; + } + } + dels.sort_unstable(); + for cc in candidate_clonotypes.iter_mut() { + let del = cc + .iter() + .map(|&oj| { + let id = info[oj as usize].clonotype_index; + to_delete[id] + }) + .collect::>(); + erase_if(cc, &del); + } +} diff --git a/lib/rust/equiv/Cargo.toml b/lib/rust/equiv/Cargo.toml new file mode 100644 index 0000000..cf397ca --- /dev/null +++ b/lib/rust/equiv/Cargo.toml @@ -0,0 +1,11 @@ +[dependencies] + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'equiv' +publish = false +version = '0.1.0' diff --git a/lib/rust/equiv/src/lib.rs b/lib/rust/equiv/src/lib.rs new file mode 100644 index 0000000..c8f6766 --- /dev/null +++ b/lib/rust/equiv/src/lib.rs @@ -0,0 +1,368 @@ +// Copyright (c) 2024 10X Genomics, Inc. All rights reserved. + +//! This file contains an equivalence relation struct. There is a literature on +//! this and multiple rust implementations of sophisticated algorithms, see: +//! +//! 1. https://en.wikipedia.org/wiki/Disjoint-set_data_structure +//! 2. https://crates.io/crates/union-find +//! 3. https://crates.io/crates/disjoint-sets +//! 4. https://crates.io/crates/disjoint-set [seems defunct] +//! 5. https://crates.io/crates/fera-unionfind +//! +//! The code here is an optimized and rustified version of the code in the 10X +//! supernova codebase, which was adopted from the BroadCRD codebase. The code here +//! uses a very naive algorithm that should not be competitive with the sophisticated +//! algorithms, but for unknown reasons, it is. There are some comparisons to the +//! disjoint-sets crate at the end of this file. The implementations in other +//! crates were not tested. +//! +//! Computational performance of EquivRel: +//! - storage = 3N bytes, where N is the set size; storage is flat +//! - initialization time = O(N) +//! - time to make n joins = O( n * log(N) ) +//! - time to find all set reps = O(N) +//! - time to find a set = O(size of set) +//! - time to find the size of a set = O(1) +//! - time to find the set id of an element = O(1). + +/// The type used to represent an element in an EquivRel disjoint set. +/// 32 bits are plenty to enumerate the kinds of entities we deal with in +/// experimental data. If in the future we need more that 2^32 elements in +/// certain cases, we should parameterize the EquivRel type so that either +/// width can be used. +/// +/// We generally paper over this fact in the API by accepting and returning +/// usize, since these values are essentially always used to index into +/// collections. Using u32 internally keeps the memeory footprint down, though +/// this may not be of practical importance. +type ElementId = u32; + +/// The type used to enumerate the individual disjoint sets. +type SetId = u32; + +/// Represent the partition of N items into M distinct sets where M <= N. +/// +/// The elements of the overall collection are represented as numeric indices +/// spanning 0..N; the indices can be used to index into an external fixed +/// collection that actually contains the data for each element. +pub struct EquivRel { + /// The entry v at position i in this vector is the identity of the next + /// element in the set that currently contains the element i. + next_element: Vec, + /// For each element in the set i, the corresponding value in this vector + /// is the index of the set that the element is currently in. + set_id: Vec, + /// For each set s, the corresponding value in this vector is the current + /// number of elements contained in that set. + size: Vec, +} + +impl EquivRel { + /// Create disjoint sets of n elements. + /// The elements are initially contained in n sets of one element each. + pub fn new(n: u32) -> EquivRel { + EquivRel { + next_element: (0..n).collect(), + set_id: (0..n as SetId).collect(), + size: vec![1; n as usize], + } + } + + /// Join the sets which currently contain the two provided elements. + pub fn join(&mut self, a: usize, b: usize) { + // Always empty the smaller set. This is critical as otherwise + // complexity of join would be O( n * N ) and not O( n * log(N) ). + let (a, b) = if self.size_of_set_containing(a) < self.size_of_set_containing(b) { + (b, a) + } else { + (a, b) + }; + // The ID of the set that we are merging the smaller set into. + let joined_set_id = self.set_id(a); + // The ID of the set that will be empty after this join. + let emptied_set_id = self.set_id(b); + if joined_set_id == emptied_set_id { + return; + } + + // Now do the move. + + let new_size = self.size_of_set_containing(a) + self.size_of_set_containing(b); + self.next_element.swap(a, b); + let mut next = self.next_element(a); + loop { + if self.set_id(next) == joined_set_id { + break; + } + self.set_id[next] = joined_set_id as SetId; + next = self.next_element(next); + } + + // Update set sizes. + self.size[joined_set_id] = new_size as u32; + self.size[emptied_set_id] = 0; + } + + /// Return an iterator over a single arbitrary member from each set. + pub fn set_reps_iter(&self) -> impl Iterator + '_ { + // This implementation relies on several implementation details: + // - we only join sets, never split them + // - the ith set always starts out containing the element i + // This implies that the ith set will always contain the element i, so + // the ids of all the non-empty sets is equivalent to a collection of + // one element from every set. + self.size + .iter() + .enumerate() + .filter_map(|(set_id, size)| (*size > 0).then_some(set_id)) + } + + /// Return a vector containing a single arbitrary member from each set. + pub fn set_reps(&self) -> Vec { + self.set_reps_iter().collect() + } + + /// Return the number of non-empty sets. + pub fn n_sets(&self) -> usize { + self.size.iter().filter(|s| **s > 0).count() + } + + /// Return the size of the set containing the element a. + pub fn size_of_set_containing(&self, a: usize) -> usize { + self.size[self.set_id(a)] as usize + } + + /// Return an iterator over all members of the set that contains the element a. + pub fn members_of_set_containing(&self, a: usize) -> SetIterator<'_> { + SetIterator::new(self, a) + } + + /// Return the membership of every set, as a nested iterator performing no + /// allocations. + pub fn all_sets(&self) -> impl Iterator> { + self.set_reps_iter() + .map(move |r| self.members_of_set_containing(r)) + } + + /// Return the membership of every set, as an iterator over Vec. + /// A lot of the existing codebase expects the elements to be i32. + /// This is a convenience adapter. + pub fn all_sets_iter_i32(&self) -> impl Iterator> + '_ { + self.all_sets() + .map(|set| set.map(|e| e as i32)) + .map(Iterator::collect) + } + + /// Return the ID of the set that currently contains element a. + pub fn set_id(&self, a: usize) -> usize { + self.set_id[a] as usize + } + + fn next_element(&self, a: usize) -> usize { + self.next_element[a] as usize + } +} + +/// An iterator over the elements of the disjoint set containing starting_element. +/// +/// Since the iterator knows the starting element, it can return the number of +/// elements in the set. It can also produce a copy of the iterator that has +/// been rewound to the beginning of iteration. +pub struct SetIterator<'a> { + eq: &'a EquivRel, + starting_element: usize, + last_element: Option, + count: usize, +} + +impl<'a> SetIterator<'a> { + fn new(eq: &'a EquivRel, starting_element: usize) -> Self { + Self { + eq, + starting_element, + last_element: None, + count: 0, + } + } + + /// Return the number of elements in the set being iterated over. + pub fn size(&self) -> usize { + self.eq.size_of_set_containing(self.starting_element) + } + + /// Return a copy of this set iterator, rewound to the beginning. + pub fn duplicate(&self) -> Self { + Self::new(self.eq, self.starting_element) + } +} + +impl<'a> Iterator for SetIterator<'a> { + type Item = usize; + + fn size_hint(&self) -> (usize, Option) { + let remaining = self.eq.size_of_set_containing(self.starting_element) - self.count; + (remaining, Some(remaining)) + } + + fn next(&mut self) -> Option { + match self.last_element { + Some(last) => { + let next = self.eq.next_element(last); + if next == self.starting_element { + None + } else { + self.last_element = Some(next); + self.count += 1; + Some(next) + } + } + None => { + self.last_element = Some(self.starting_element); + self.count += 1; + Some(self.starting_element) + } + } + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// PERFORMANCE COMPARISONS +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Comparison to the disjoint-sets crate. Note that with disjoint sets, it is not +// clear how to find just one set, or the size of one set. Two comparisons +// were carried out. The first comparison follows. Briefly, it shows that +// disjoint-sets is faster for this use case, but uses more memory, and in short, +// the conclusion is a "toss-up". + +/* + + // Setup. + + const N : usize = 10_000_000; + const L : usize = 20_000_000; + let mut x : Vec = vec![ 0; L ]; + make_random_vec( &mut x, L ); + for i in 0..L { x[i] = x[i].abs() % (N as i64); } + let peak = peak_mem_usage_bytes(); + let t = Instant::now( ); + + // EquivRel version (use this or the following) + // there are 1618950 sets + // 2.6 seconds, delta peak mem = 137 Mb + + let mut e = EquivRel::new(N as i32); + for j in 0..L/2 { e.join( x[j] as i32, x[j+L/2] as i32 ); } + let mut reps = Vec::::new(); + e.orbit_reps( &mut reps ); + println!( "there are {} sets", reps.len() ); + let mut o = Vec::::new(); + for i in 0..reps.len() { e.orbit( reps[i] as i32, &mut o ); } + + // UnionFind version (use this or the previous); + // there are 1618950 orbits + // 1.5 seconds, delta peak mem = 258 Mb + // disjoint-sets = "0.4.2" + + use disjoint_sets::UnionFind; + let mut uf = UnionFind::::new(N as usize); + for j in 0..L/2 { uf.union( x[j] as u32, x[j+L/2] as u32 ); } + let reps = uf.to_vec(); + let mut repsx = Vec::<(u32,u32)>::new(); + for i in 0..reps.len() { repsx.push( (reps[i],i as u32) ); } + repsx.sort(); + let mut o = Vec::::new(); + let mut orbits = Vec::>::new(); + for i in 0..repsx.len() { + if i > 0 && repsx[i].0 != repsx[i-1].0 { + orbits.push( o.clone() ); + o.clear(); + } + o.push( repsx[i].1 ); + } + orbits.push( o.clone() ); + println!( "there are {} orbits", orbits.len() ); + + // Summarize. + + let delta_peak = peak_mem_usage_bytes() - peak; + println!( + "{} seconds used, delta peak mem = {} bytes", t.elapsed().as_secs_f64(), delta_peak ); + +*/ + +// The second comparison involves a change to the code in hyper.rs. Here is the +// relevant chunk of code, using EquivRel: + +/* + + // Find nodes in the transformed graph. They are orbits of edge ends under + // the natural equivalence relation. + + let mut eq : EquivRel = EquivRel::new( 2 * edges.len() as i32 ); + for i in 0..adj.len() { + let left = adj[i].0; + let right = adj[i].1; + eq.join( 2*left + 1, 2*right ); + } + let mut reps = Vec::::new(); + eq.orbit_reps( &mut reps ); + + // Now actually create the transformed graph. + + g_out.clear(); + g_out.reserve_exact_nodes( reps.len() ); + g_out.reserve_exact_edges( edges.len() ); + for i in 0..reps.len() { g_out.add_node(i as u32); } + for e in 0..edges.len() { + let v = bin_position( &reps, &eq.class_id((2*e) as i32) ); + let w = bin_position( &reps, &eq.class_id((2*e+1) as i32) ); + g_out.add_edge( NodeIndex::::new(v as usize), + NodeIndex::::new(w as usize), edges[e].2.clone() ); + } +} + +*/ + +// and here is the relevant chunk of code using disjoint-sets: + +/* + + use disjoint_sets::UnionFind; + + // Find nodes in the transformed graph. They are orbits of edge ends under + // the natural equivalence relation. + + let mut eq = UnionFind::::new( 2 * edges.len() ); + for i in 0..adj.len() { + let left = adj[i].0 as u32; + let right = adj[i].1 as u32; + eq.union( 2*left + 1, 2*right ); + } + let mut reps = eq.to_vec(); // list of orbit representatives + reps.sort(); + + // Now actually create the transformed graph. + + g_out.clear(); + g_out.reserve_exact_nodes( reps.len() ); + g_out.reserve_exact_edges( edges.len() ); + for i in 0..reps.len() { g_out.add_node(i as u32); } + for e in 0..edges.len() { + let v = bin_position( &reps, &eq.find( (2*e) as u32) ); + let w = bin_position( &reps, &eq.find( (2*e+1) as u32) ); + g_out.add_edge( NodeIndex::::new(v as usize), + NodeIndex::::new(w as usize), edges[e].2.clone() ); + +*/ + +// Performance comparison: the test consisted of running the assemblies for +// 14 VDJ samples. The actual test is not described here, but the results are +// as follows: +// +// version server seconds peak mem GB +// EquivRel 1366.10 7.65 +// disjoint-sets 1570.20 13.45 +// +// Of course one ought to be able to define a reproducible test that exhibits this +// performance difference. diff --git a/lib/rust/fast_utils/Cargo.toml b/lib/rust/fast_utils/Cargo.toml index dfc2f3f..396593a 100644 --- a/lib/rust/fast_utils/Cargo.toml +++ b/lib/rust/fast_utils/Cargo.toml @@ -1,13 +1,13 @@ [dependencies] -bincode = '1' -numpy = '0.19' - [dependencies.anyhow] workspace = true [dependencies.barcode] path = '../barcode' +[dependencies.bincode] +workspace = true + [dependencies.cr_h5] path = '../cr_h5' @@ -15,8 +15,7 @@ path = '../cr_h5' path = '../cr_types' [dependencies.diff-exp] -branch = 'main' -git = 'https://github.com/10XGenomics/scan-rs.git' +workspace = true [dependencies.itertools] workspace = true @@ -33,6 +32,9 @@ path = '../metric' [dependencies.ndarray] workspace = true +[dependencies.numpy] +workspace = true + [dependencies.pyanyhow] path = '../pyanyhow' @@ -46,13 +48,10 @@ workspace = true workspace = true [dependencies.sprs] -default-features = false -features = ['multi_thread'] -version = '0.11' +workspace = true [dependencies.sqz] -branch = 'main' -git = 'https://github.com/10XGenomics/scan-rs.git' +workspace = true [lib] crate-type = ['staticlib'] diff --git a/lib/rust/fast_utils/src/compute_extra_multiplexing_metrics.rs b/lib/rust/fast_utils/src/compute_extra_multiplexing_metrics.rs index cc9f970..33b534d 100644 --- a/lib/rust/fast_utils/src/compute_extra_multiplexing_metrics.rs +++ b/lib/rust/fast_utils/src/compute_extra_multiplexing_metrics.rs @@ -3,10 +3,10 @@ use cr_h5::molecule_info::{ BarcodeIdxType, FullUmiCount, GemGroupType, LibraryIdxType, MoleculeInfoIterator, MoleculeInfoReader, }; -use cr_types::reference::feature_reference::{FeatureDef, FeatureType}; +use cr_types::reference::feature_reference::{FeatureDef, FeatureType, HASHTAG}; use cr_types::rna_read::LibraryInfo; use cr_types::types::FeatureBarcodeType; -use cr_types::LibraryType; +use cr_types::{BarcodeMultiplexingType, CellLevel, LibraryType}; use itertools::Itertools; use itertools::__std_iter::Iterator; use pyo3::prelude::*; @@ -20,10 +20,8 @@ const MULTIPLET_JSON_KEY: &str = "Multiplet"; // A struct to accumulate data needed by the COMPUTE_EXTRA_MULTIPLEXING_METRICS stage struct TagReadCounts { - // first cmo feature index - idx_start: usize, - // last cmo feature index - idx_end: usize, + // Maps the feature index to the local index within the vectors defined below + feature_index_to_local_index: HashMap, // name of all cmos tag_names: Vec, // Vectors to count reads for various types of barcodes @@ -49,18 +47,14 @@ impl TagReadCounts { "No multiplexing tags were found in the FeatureRef." ); // Assuming all tags are in - let mut index = features[0].index; - for feature in &features[1..] { - index += 1; - assert!( - index == feature.index, - "The Multiplexing entries in the FeatureRef were not in serial order" - ); - } - let size = index - features[0].index + 1; + let feature_index_to_local_index = features + .iter() + .enumerate() + .map(|(i, feature_def)| (feature_def.index, i)) + .collect(); + let size = features.len(); TagReadCounts { - idx_start: features[0].index, - idx_end: index, + feature_index_to_local_index, singlet_counts: vec![0; size], multiplet_counts: vec![0; size], cell_associated_counts: vec![0; size], @@ -74,9 +68,8 @@ impl TagReadCounts { fn consume_umicount(&mut self, cnt: FullUmiCount) { let idx = cnt.umi_data.feature_idx as usize; - if idx >= self.idx_start && idx <= self.idx_end { + if let Some(&index) = self.feature_index_to_local_index.get(&idx) { let n_reads = cnt.umi_data.read_count as usize; - let index = idx - self.idx_start; self.total_counts[index] += n_reads; let bc_gg = (cnt.barcode_idx, cnt.gem_group); if self.singlets.contains(&bc_gg) { @@ -135,9 +128,10 @@ pub(crate) fn tag_read_counts( mol_info_path: String, singlets_path: String, non_singlets_path: String, + multiplexing_method: String, ) -> PyResult<(Vec, Vec, Vec, Vec, Vec)> { // Calculates metrics for the COMPUTE_EXTRA_MULTIPLEXING_METRICS stage - // Given a molecule info file, it will go through and for each tag count how many reads are + // Given a molecule info file, it will go through and for each tag CMO or Hashtag count how many reads are // 1 - In "singlet" barcodes // 2 - In "multiplet" barcodes // 3- In cell-associated barcodes @@ -153,6 +147,20 @@ pub(crate) fn tag_read_counts( &bc_to_ind, Some(MULTIPLET_JSON_KEY), ); + let (library_type, feature_type, feature_tag) = + match serde_json::from_str(&multiplexing_method).unwrap() { + BarcodeMultiplexingType::CellLevel(CellLevel::CMO) => ( + LibraryType::Cellplex, + FeatureType::Barcode(FeatureBarcodeType::Multiplexing), + None, + ), + BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag) => ( + LibraryType::Antibody, + FeatureType::Barcode(FeatureBarcodeType::Antibody), + Some(HASHTAG), + ), + _ => panic!("Unsupported multiplexing method!"), + }; // Load up cell associated barcodes for multiplexing libraries let library_info: Vec = MoleculeInfoReader::read_library_info(cur_path) @@ -165,7 +173,7 @@ pub(crate) fn tag_read_counts( let mut lib_to_gg: HashMap = HashMap::new(); library_info .into_iter() - .filter(|x| x.library_type == LibraryType::Cellplex) + .filter(|x| x.library_type == library_type) .for_each(|z| { lib_to_gg.insert(z.library_id, z.gem_group); }); @@ -187,7 +195,11 @@ pub(crate) fn tag_read_counts( .feature_ref .feature_defs .iter() - .filter(|&x| x.feature_type == FeatureType::Barcode(FeatureBarcodeType::Multiplexing)) + .filter(|&x| x.feature_type == feature_type) + .filter(|&x| match feature_tag { + Some(tag) => x.tags.contains_key(tag), + None => true, + }) .cloned() .collect(); diff --git a/lib/rust/fast_utils/src/diff_exp.rs b/lib/rust/fast_utils/src/diff_exp.rs index 3b796ef..b0159f5 100644 --- a/lib/rust/fast_utils/src/diff_exp.rs +++ b/lib/rust/fast_utils/src/diff_exp.rs @@ -1,77 +1,62 @@ -use anyhow::Result; +use anyhow::{bail, Context, Result}; use diff_exp::diff_exp::{DiffExpResult, SSeqParams}; use diff_exp::{compute_sseq_params, sseq_differential_expression}; -use numpy::{IntoPyArray, PyArray1}; +use numpy::{Element, IntoPyArray, PyArray1, PyReadonlyArray1}; use pyo3::prelude::*; use pyo3::types::{PyAny, PyBool, PyDict, PyList}; -//use scan_types::label_class::make_labelclass_from_feature_type_vector; -use sprs::CsMatI; +use sprs::CsMatBase; use sqz::mat::AdaptiveMatOwned; use sqz::matrix_map::MatrixIntoMap; -type MatrixType = CsMatI; - -// fn push_attr_to_list(list: &mut Vec, obj: &PyAny, attr: &str) { -// list.push(obj.getattr(attr).unwrap().extract().unwrap()); -// } -// Converts from a Python CountMatrix class to a Rust FeatureBarcodeMatrix struct -// fn convert_matrix( _py: Python<'_>, -// count_matrix: &PyAny) -> Result { -// let matrix = count_matrix.getattr("m").unwrap(); -// let indices: Vec = matrix.getattr("indices").unwrap().extract().unwrap(); -// let indptr: Vec = matrix.getattr("indptr").unwrap().extract().unwrap(); -// let data: Vec = matrix.getattr("data").unwrap().extract().unwrap(); -// let barcodes: Vec> = count_matrix.getattr("bcs").unwrap().extract().unwrap(); -// let barcodes : Vec = barcodes.iter().map(|x| {String::from_utf8(x.to_vec()).unwrap()}).collect(); -// let feature_defs: &PyList = count_matrix.getattr("feature_ref").unwrap().getattr("feature_defs").unwrap().extract().unwrap(); -// let n_feats = feature_defs.len(); -// let mut feature_ids = Vec::::with_capacity(n_feats); -// let mut feature_names = Vec::::with_capacity(n_feats); -// let mut feature_types = Vec::::with_capacity(n_feats); -// for feature_def in feature_defs { -// push_attr_to_list(&mut feature_ids, feature_def, "id"); -// push_attr_to_list(&mut feature_names, feature_def, "name"); -// push_attr_to_list(&mut feature_types, feature_defs, "feature_type"); -// } -// let feature_type_label = make_labelclass_from_feature_type_vector(&feature_types)?; -// let csc_mat = MatrixType::new_csc((feature_ids.len(), barcodes.len()), indptr, indices, data); -// let mat = AdaptiveMatOwned::from_csmat(&csc_mat); -// let final_matrix = AdaptiveFeatureBarcodeMatrix { -// name: "Dummy".to_string(), -// barcodes, -// feature_ids, -// feature_names, -// feature_types: feature_type_label, -// matrix: mat, -// }; -// Ok(final_matrix) -// } - -fn get_attr(matrix: &PyAny, attr: &str) -> Vec { - let pyvalues: &PyArray1 = matrix.getattr(attr).unwrap().extract().unwrap(); - pyvalues - .to_vec() +/// Extract a python array of a desired type. +fn extract_pyarray<'a, T: Element>( + py: &'a PyAny, + attr: &'static str, +) -> Result> { + py.getattr(attr) + .context(attr) .unwrap() - .into_iter() - .map(|x| x as u32) - .collect() + .extract() + .context(attr) + .map(|x: &PyArray1| x.readonly()) } -// Convert a scipy sparse matrix to a rust sparse matrix +/// Transmute a &[i32] to a &[u32] and validate that all elements are positive. +fn transmute_i32_to_u32(xs: &[i32]) -> &[u32] { + assert!(xs.iter().all(|&x| x >= 0)); + unsafe { std::slice::from_raw_parts(xs.as_ptr() as *const u32, xs.len()) } +} + +/// Convert a scipy sparse matrix to a rust sparse matrix. fn convert_matrix( _py: Python<'_>, matrix: &PyAny, ) -> Result>> { let shape: (usize, usize) = matrix.getattr("shape").unwrap().extract().unwrap(); - // Avoid a simple cast from PyAny to vec which iteratively grabs a python object for each array - // element - let indices: Vec = get_attr(matrix, "indices"); - let indptr: Vec = get_attr(matrix, "indptr"); - let data: Vec = get_attr(matrix, "data"); + let data_py = extract_pyarray(matrix, "data").unwrap(); + let data = transmute_i32_to_u32(data_py.as_slice().unwrap()); - let csc_mat = MatrixType::new_csc(shape, indptr, indices, data); - let final_matrix = AdaptiveMatOwned::from_csmat(&csc_mat); - Ok(final_matrix) + // indices and indptr may be either i32 or i64. They have the same type. + let csc_matrix = if let Ok(indptr) = extract_pyarray::(matrix, "indptr") { + let indices = extract_pyarray::(matrix, "indices").unwrap(); + AdaptiveMatOwned::from_csmat(&CsMatBase::new_csc( + shape, + indptr.as_slice().unwrap(), + indices.as_slice().unwrap(), + data, + )) + } else if let Ok(indptr) = extract_pyarray::(matrix, "indptr") { + let indices = extract_pyarray::(matrix, "indices").unwrap(); + AdaptiveMatOwned::from_csmat(&CsMatBase::new_csc( + shape, + indptr.as_slice().unwrap(), + indices.as_slice().unwrap(), + data, + )) + } else { + bail!("indptr is neither i32 nor i64") + }; + Ok(csc_matrix) } #[pyfunction] diff --git a/lib/rust/fast_utils/src/filtered_barcodes.rs b/lib/rust/fast_utils/src/filtered_barcodes.rs index f045f74..b950d66 100644 --- a/lib/rust/fast_utils/src/filtered_barcodes.rs +++ b/lib/rust/fast_utils/src/filtered_barcodes.rs @@ -33,6 +33,7 @@ pub struct FilteredBarcodes { enum GenomeChoice { All, One(usize), + Unobserved, } impl GenomeChoice { @@ -40,6 +41,7 @@ impl GenomeChoice { match self { GenomeChoice::All => true, GenomeChoice::One(genome_index) => *genome_index == index, + GenomeChoice::Unobserved => false, } } } @@ -132,6 +134,20 @@ impl FilteredBarcodes { .collect() } + pub fn sorted_barcodes(&self, py: Python<'_>) -> Vec> { + self.sorted_barcodes + .iter() + .map(|bc| PyBytes::new(py, bc.to_string().as_bytes()).into()) + .collect() + } + + pub fn sorted_barcodes_string(&self) -> Vec { + self.sorted_barcodes + .iter() + .map(ToString::to_string) + .collect() + } + /// Returns true if the barcode is in the list of filtered barcodes for the given genome. /// /// NOTE: In the python code genome = "" is used to refer to all genomes. @@ -168,7 +184,11 @@ impl FilteredBarcodes { fn genome_choice(&self, genome: Option<&GenomeNameStr>) -> GenomeChoice { match genome { - Some(genome) if !genome.is_empty() => GenomeChoice::One(self.index_of_genome(genome)), + Some(genome) if !genome.is_empty() => { + // In OCM barnyard, multiplexed samples can have cells called exclusively from one species + self.index_of_genome(genome) + .map_or(GenomeChoice::Unobserved, GenomeChoice::One) + } Some(_) | None => GenomeChoice::All, } } @@ -193,11 +213,8 @@ impl FilteredBarcodes { Err(anyhow::anyhow!("barcode must be bytes or str, got {barcode_str_or_bytes:?}").into()) } - fn index_of_genome(&self, genome: &GenomeNameStr) -> usize { - self.genomes - .iter() - .position(|g| g.as_str() == genome) - .unwrap_or_else(|| panic!("Could not find index for genome: {genome}")) + fn index_of_genome(&self, genome: &GenomeNameStr) -> Option { + self.genomes.iter().position(|g| g.as_str() == genome) } } diff --git a/lib/rust/fast_utils/src/gdna_analysis.rs b/lib/rust/fast_utils/src/gdna_analysis.rs index bff6b67..00edafb 100644 --- a/lib/rust/fast_utils/src/gdna_analysis.rs +++ b/lib/rust/fast_utils/src/gdna_analysis.rs @@ -15,7 +15,6 @@ pub(crate) fn count_umis_per_probe( _py: Python<'_>, mol_info_path: PathBuf, target_panel_summary_path: PathBuf, - reference_path: PathBuf, ) -> PyResult, Vec, Vec, Vec)>> { let tps: TargetPanelSummary = TargetPanelSummaryFormat::from(&target_panel_summary_path) .read() @@ -26,9 +25,8 @@ pub(crate) fn count_umis_per_probe( let mut valid_bc_filter = FilteredBarcodeFilter::new(&mol_info_path); - let psr: ProbeSetReference = - ProbeSetReference::from_path(&tps.target_panel_path, &reference_path, 1) - .expect("ProbeSetReference could not be made from path"); + let psr: ProbeSetReference = ProbeSetReference::from_path(&tps.target_panel_path, None, 1) + .expect("ProbeSetReference could not be made from path"); let probes: Vec<_> = psr.sorted_probes(); if probes.is_empty() | (probes[0].region.is_none()) { @@ -47,7 +45,7 @@ pub(crate) fn count_umis_per_probe( } } - let (probe_ids, gene_names, regions): (Vec, Vec, Vec) = probes + let (probe_ids, gene_ids, regions): (Vec, Vec, Vec) = probes .into_iter() .cloned() .map(|x| { @@ -58,5 +56,5 @@ pub(crate) fn count_umis_per_probe( ) }) .multiunzip(); - Ok(Some((probe_ids, gene_names, regions, result))) + Ok(Some((probe_ids, gene_ids, regions, result))) } diff --git a/lib/rust/fast_utils/src/multi_graph.rs b/lib/rust/fast_utils/src/multi_graph.rs index 9b152d6..269de9b 100644 --- a/lib/rust/fast_utils/src/multi_graph.rs +++ b/lib/rust/fast_utils/src/multi_graph.rs @@ -1,5 +1,5 @@ //! Wrapping the Rust handling of the multi config. -use cr_types::{CellMultiplexingType, CrMultiGraph, Fingerprint}; +use cr_types::{BarcodeMultiplexingType, CellLevel, CrMultiGraph, Fingerprint, ReadLevel}; use itertools::Itertools; use martian::MartianFileType; use martian_filetypes::json_file::JsonFile; @@ -81,17 +81,26 @@ impl MultiGraph { /// Return true if this data is using CMO multiplexing. pub fn is_cmo_multiplexed(&self) -> bool { - self.0.cell_multiplexing_type() == Some(CellMultiplexingType::CMO) + self.0.barcode_multiplexing_type() + == Some(BarcodeMultiplexingType::CellLevel(CellLevel::CMO)) + } + + /// Return true if this data is using HASHTAG multiplexing. + pub fn is_hashtag_multiplexed(&self) -> bool { + self.0.barcode_multiplexing_type() + == Some(BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag)) } /// Return true if this data is using RTL multiplexing. pub fn is_rtl_multiplexed(&self) -> bool { - self.0.cell_multiplexing_type() == Some(CellMultiplexingType::RTL) + self.0.barcode_multiplexing_type() + == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL)) } /// Return true if this data is using OH multiplexing. pub fn is_oh_multiplexed(&self) -> bool { - self.0.cell_multiplexing_type() == Some(CellMultiplexingType::OH) + self.0.barcode_multiplexing_type() + == Some(BarcodeMultiplexingType::ReadLevel(ReadLevel::OH)) } /// Return tuples of sample ID and finerprints. diff --git a/lib/rust/graph_simple/Cargo.toml b/lib/rust/graph_simple/Cargo.toml new file mode 100644 index 0000000..40388b4 --- /dev/null +++ b/lib/rust/graph_simple/Cargo.toml @@ -0,0 +1,16 @@ +[dependencies] +[dependencies.petgraph] +workspace = true + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'graph_simple' +publish = false +version = '0.1.0' diff --git a/lib/rust/graph_simple/src/lib.rs b/lib/rust/graph_simple/src/lib.rs new file mode 100644 index 0000000..65e2618 --- /dev/null +++ b/lib/rust/graph_simple/src/lib.rs @@ -0,0 +1,284 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// Define generic digraph functions. +// +// Some of the functions here are unnecessarily quadratic in the vertex degree for +// petgraph as a result of calling v_from and related functions below. The +// quadratic behavior might be avoided but might make the code a bit less readable. +// +// These functions seem unnecessarily specialized to u32. + +use petgraph::prelude::*; +use petgraph::EdgeType; +use std::collections::HashSet; +use vector_utils::meet; + +pub trait GraphSimple { + // ============================================================================= + // Return the object associated to an edge id. + // ============================================================================= + + fn edge_obj(&self, e: u32) -> &T; + + // ============================================================================= + // Return the source or target of an edge. + // ============================================================================= + + fn to_left(&self, e: u32) -> u32; + fn to_right(&self, e: u32) -> u32; + + // ============================================================================= + // Return the number of edges exiting or entering a given vertex. + // ============================================================================= + + fn n_from(&self, v: usize) -> usize; + fn n_to(&self, v: usize) -> usize; + + // ============================================================================= + // Return id of the nth vertex exiting or entering a given vertex id. + // Note that this is O(n). + // ============================================================================= + + fn v_from(&self, v: usize, n: usize) -> usize; + fn v_to(&self, v: usize, n: usize) -> usize; + + // ============================================================================= + // Return id of the nth edge exiting or entering a given vertex id. + // Note that this is O(n). + // ============================================================================= + + fn e_from(&self, v: usize, n: usize) -> usize; + fn e_to(&self, v: usize, n: usize) -> usize; + + // ============================================================================= + // Return the nth edge exiting or entering a given vertex id. + // Note that this is O(n). + // ============================================================================= + + fn o_from(&self, v: usize, n: usize) -> &T; + fn o_to(&self, v: usize, n: usize) -> &T; + + // ============================================================================= + // get_predecessors: find all vertices which have a directed path to a vertex + // in v. This includes the vertices in v by definition. Return a sorted list + // x. get_successors: go the other way. + // get_predecessors1 and get_successors1: start from one vertex + // ============================================================================= + + fn get_predecessors(&self, v: &[i32], x: &mut Vec); + fn get_predecessors1(&self, v: i32, x: &mut Vec); + fn get_successors(&self, v: &[i32], x: &mut Vec); + fn get_successors1(&self, v: i32, x: &mut Vec); + + // ============================================================================= + // Determine if there is a path from one vertex to another, allowing for the + // case of a zero length path, where the vertices are equal. + // ============================================================================= + + fn have_path(&self, v: i32, w: i32) -> bool; + + // ============================================================================= + // Find the connected components. Each component is a sorted list of vertices. + // ============================================================================= + + fn components(&self, comp: &mut Vec>); + + // ============================================================================= + // Find the connected components as lists of edges. Each component is an + // UNSORTED list of edges. + // ============================================================================= + + fn components_e(&self, comp: &mut Vec>); +} + +impl GraphSimple for Graph +where + U: EdgeType, + V: petgraph::csr::IndexType, +{ + fn edge_obj(&self, e: u32) -> &T { + &self[EdgeIndex::::new(e as usize)] + } + + fn to_left(&self, e: u32) -> u32 { + self.edge_endpoints(EdgeIndex::::new(e as usize)) + .unwrap() + .0 + .index() as u32 + } + + fn to_right(&self, e: u32) -> u32 { + self.edge_endpoints(EdgeIndex::::new(e as usize)) + .unwrap() + .1 + .index() as u32 + } + + fn n_from(&self, v: usize) -> usize { + self.neighbors(NodeIndex::::new(v)).count() + } + + fn n_to(&self, v: usize) -> usize { + self.neighbors_directed(NodeIndex::::new(v), Incoming) + .count() + } + + fn v_from(&self, v: usize, n: usize) -> usize { + self.edges_directed(NodeIndex::::new(v), Outgoing) + .nth(n) + .unwrap() + .target() + .index() + } + + fn v_to(&self, v: usize, n: usize) -> usize { + self.edges_directed(NodeIndex::::new(v), Incoming) + .nth(n) + .unwrap() + .source() + .index() + } + + fn e_from(&self, v: usize, n: usize) -> usize { + let mut e: EdgeIndex = self.first_edge(NodeIndex::::new(v), Outgoing).unwrap(); + for _j in 0..n { + let f = self.next_edge(e, Outgoing).unwrap(); + e = f; + } + e.index() + } + + fn e_to(&self, v: usize, n: usize) -> usize { + let mut e: EdgeIndex = self.first_edge(NodeIndex::::new(v), Incoming).unwrap(); + for _j in 0..n { + let f = self.next_edge(e, Incoming).unwrap(); + e = f; + } + e.index() + } + + fn o_from(&self, v: usize, n: usize) -> &T { + self.edge_obj(self.e_from(v, n) as u32) + } + + fn o_to(&self, v: usize, n: usize) -> &T { + self.edge_obj(self.e_to(v, n) as u32) + } + + fn get_predecessors(&self, v: &[i32], x: &mut Vec) { + let mut check: Vec = Vec::new(); + let mut tov: HashSet = HashSet::new(); + for v_i in v { + let s: u32 = *v_i as u32; + check.push(s); + tov.insert(s); + } + while let Some(x) = check.pop() { + let n = self.n_to(x as usize); + for i in 0..n { + let y = self.v_to(x as usize, i); + if tov.contains(&(y as u32)) { + continue; + } + check.push(y as u32); + tov.insert(y as u32); + } + } + x.clear(); + for v in tov { + x.push(v); + } + x.sort_unstable(); + } + + fn get_predecessors1(&self, v: i32, x: &mut Vec) { + let vs = vec![v]; + self.get_predecessors(&vs, x); + } + + fn get_successors(&self, v: &[i32], x: &mut Vec) { + let mut check: Vec = Vec::new(); + let mut fromv: HashSet = HashSet::new(); + for v_i in v { + let s: u32 = *v_i as u32; + check.push(s); + fromv.insert(s); + } + while let Some(x) = check.pop() { + let n = self.n_from(x as usize); + for i in 0..n { + let y = self.v_from(x as usize, i); + if fromv.contains(&(y as u32)) { + continue; + } + check.push(y as u32); + fromv.insert(y as u32); + } + } + x.clear(); + for v in fromv { + x.push(v); + } + x.sort_unstable(); + } + + fn get_successors1(&self, v: i32, x: &mut Vec) { + let vs = vec![v]; + self.get_successors(&vs, x); + } + + fn have_path(&self, v: i32, w: i32) -> bool { + let mut vsuc: Vec = Vec::new(); + self.get_successors1(v, &mut vsuc); + let mut wpre: Vec = Vec::new(); + self.get_predecessors1(w, &mut wpre); + meet(&vsuc, &wpre) + } + + fn components(&self, comp: &mut Vec>) { + comp.clear(); + let mut used: Vec = vec![false; self.node_count()]; + let mut c: Vec = Vec::new(); + let mut cnext: Vec = Vec::new(); + for v in 0..self.node_count() { + if used[v] { + continue; + } + c.clear(); + cnext.clear(); + cnext.push(v as u32); + while let Some(w) = cnext.pop() { + if used[w as usize] { + continue; + } + used[w as usize] = true; + c.push(w); + let n = self.n_from(w as usize); + for j in 0..n { + cnext.push(self.v_from(w as usize, j) as u32); + } + let n = self.n_to(w as usize); + for j in 0..n { + cnext.push(self.v_to(w as usize, j) as u32); + } + } + c.sort_unstable(); + comp.push(c.clone()); + } + } + + fn components_e(&self, comp: &mut Vec>) { + self.components(comp); + for comp_i in comp { + let mut c = Vec::::new(); + for comp_i_j in comp_i.iter() { + let v = *comp_i_j; + let n = self.n_from(v as usize); + for l in 0..n { + c.push(self.e_from(v as usize, l) as u32); + } + } + *comp_i = c; + } + } +} diff --git a/lib/rust/hyperbase/Cargo.toml b/lib/rust/hyperbase/Cargo.toml new file mode 100644 index 0000000..04ad7e4 --- /dev/null +++ b/lib/rust/hyperbase/Cargo.toml @@ -0,0 +1,28 @@ +[dependencies] +[dependencies.debruijn] +workspace = true + +[dependencies.equiv] +path = '../equiv' + +[dependencies.graph_simple] +path = '../graph_simple' + +[dependencies.kmer_lookup] +path = '../kmer_lookup' + +[dependencies.petgraph] +workspace = true + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'hyperbase' +publish = false +version = '0.1.0' diff --git a/lib/rust/hyperbase/src/lib.rs b/lib/rust/hyperbase/src/lib.rs new file mode 100644 index 0000000..ab68f3a --- /dev/null +++ b/lib/rust/hyperbase/src/lib.rs @@ -0,0 +1,941 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// This file defines a HyperBasevector structure, and a Hyper structure, which +// is a HyperBasevector plus an involution and read ids for each edge. + +use debruijn::compression::{compress_kmers, SimpleCompress}; +use debruijn::dna_string::DnaString; +use debruijn::graph::DebruijnGraph; +use debruijn::kmer::Kmer20; +use debruijn::{filter, kmer, Exts, Kmer, Mer, Vmer}; +use equiv::EquivRel; +use graph_simple::GraphSimple; +use kmer_lookup::make_kmer_lookup_20_single; +use petgraph::prelude::*; +use std::cmp::max; +use vector_utils::{ + bin_position, bin_position1_3, next_diff, next_diff1_3, reverse_sort, unique_sort, +}; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// CONVERT FROM DEBRUIJN GRAPH TO PET GRAPH +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn debruijn_to_petgraph_hyperbasevector( + g_in: &DebruijnGraph>, + g_out: &mut Graph, + inv: &mut Vec, +) { + // Find the edges in the transformed graph, and build inv. + + let num_nodes = g_in.len(); + inv.clear(); + inv.reserve(2 * num_nodes); + let mut edges: Vec<(i32, bool, DnaString)> = Vec::with_capacity(2 * num_nodes); + let mut edge_to_fw: Vec = Vec::with_capacity(num_nodes); + let mut edge_to_rc: Vec = Vec::with_capacity(num_nodes); + + // Dump the deBruijn graph. + + /* + for i in 0 .. num_nodes { + let node = g_in.get_node(i); + let seq = node.sequence(); + println!( "\n{} = {}", i, seq.to_string() ); + for j in 0..node.r_edges().len() { + let rnode = node.r_edges()[j]; + let e2 = rnode.0; + println!( "==> {}, {:?}, {}", e2, rnode.1, rnode.2 ); + } + } + */ + + // Proceed. + + let mut pal = Vec::::new(); + for i in 0..num_nodes { + let node = g_in.get_node(i); + let seq = node.sequence(); + + // Update involution. + + let palindrome = seq == seq.rc(); + if !palindrome { + inv.push((edges.len() + 1) as u32); + } + inv.push(edges.len() as u32); + + // Save edge. + + edge_to_fw.push(edges.len() as i32); + if palindrome { + edge_to_rc.push(edges.len() as i32); + } + edges.push((i as i32, true, seq.to_owned())); + pal.push(palindrome); + if !palindrome { + edge_to_rc.push(edges.len() as i32); + edges.push((i as i32, false, seq.rc().to_owned())); + pal.push(palindrome); + } + } + + // Find pairs of adjacent edges in the transformed graph. + + let mut adj = Vec::<(i32, i32)>::new(); + for x in 0..edges.len() { + if edges[x].1 { + let e1 = edges[x].0; + let node = g_in.get_node(e1 as usize); + for j in 0..node.r_edges().len() { + let rnode = node.r_edges()[j]; + let e2 = rnode.0; + if !rnode.2 { + adj.push((x as i32, edge_to_fw[e2])); + } else { + adj.push((x as i32, edge_to_rc[e2])); + } + } + } + if !edges[x].1 || pal[x] { + let e1 = edges[x].0; + let node = g_in.get_node(e1 as usize); + for j in 0..node.l_edges().len() { + let lnode = node.l_edges()[j]; + let e2 = lnode.0; + if !lnode.2 { + adj.push((x as i32, edge_to_rc[e2])); + } else { + adj.push((x as i32, edge_to_fw[e2])); + } + } + } + } + + // Find nodes in the transformed graph. They are sets of edge ends under + // the natural equivalence relation. + + let mut eq: EquivRel = EquivRel::new(2 * edges.len() as u32); + for (left, right) in adj { + eq.join((2 * left + 1) as usize, (2 * right) as usize); + } + let reps = eq.set_reps(); + + // Now actually create the transformed graph. + + g_out.clear(); + g_out.reserve_exact_nodes(reps.len()); + g_out.reserve_exact_edges(edges.len()); + for i in 0..reps.len() { + g_out.add_node(i as u32); + } + for (e, edge) in edges.into_iter().enumerate() { + let v = bin_position(&reps, &eq.set_id(2 * e)); + let w = bin_position(&reps, &eq.set_id(2 * e + 1)); + g_out.add_edge( + NodeIndex::::new(v as usize), + NodeIndex::::new(w as usize), + edge.2, + ); + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// HYPERBASEVECTOR DEFINITION +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// A HyperBasevector is a constant k and a digraph whose edges represent DNA +// sequences of length >= k, such that if two edges e1 and e2 abut at a vertex v, +// like so, u --e1--> v --e2--> w, then the last k-1 bases of e1 equal the first +// k-1 bases of e2. We implement a HyperBasevector here using the graph structure +// in the petgraph crate. + +pub struct HyperBasevector { + pub k: i32, + pub g: Graph, +} + +impl HyperBasevector { + pub fn new() -> HyperBasevector { + HyperBasevector { + k: 0, + g: Graph::new(), + } + } + + // Return the number of kmers in an edge. + + pub fn kmers(&self, e: u32) -> usize { + self.g[EdgeIndex::::new(e as usize)].len() - self.k as usize + 1 + } + + // Return the number of bases in an edge. + + pub fn bases(&self, e: u32) -> usize { + self.g[EdgeIndex::::new(e as usize)].len() + } + + // ============================================================================= + // Test for uniqueness of kmers. This tests to see if a kmer appears at most + // once in the graph. This is not a requirement for a HyperBasevector. + // ============================================================================= + + pub fn test_unique(&self) { + let mut edges = Vec::::new(); + for e in 0..self.g.edge_count() { + edges.push(self.g.edge_obj(e as u32).clone()); + } + let mut kmers_plus = Vec::<(Kmer20, i32, i32)>::new(); + make_kmer_lookup_20_single(&edges, &mut kmers_plus); + let mut i: i64 = 0; + let mut dups = 0; + while i < kmers_plus.len() as i64 { + let j = next_diff1_3(&kmers_plus, i as usize) as i64; + if j - i > 1 { + if dups == 0 { + println!("\ntest_unique failed"); + println!( + "the kmer {} appears in edges {} and {}", + kmers_plus[i as usize].0.to_string(), + kmers_plus[i as usize].1, + kmers_plus[i as usize + 1].1 + ); + } + dups += j - i - 1; + } + i = j; + } + if dups > 0 { + println!("of {} kmers, {} are duplicated", kmers_plus.len(), dups); + panic!("bailing because test failed"); + } + } +} + +impl Default for HyperBasevector { + fn default() -> Self { + Self::new() + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// HYPER DEFINITION +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// A "Hyper" is a HyperBasevector, together with an involution "inv", mapping edges +// of the graph to reverse complement edges, and an assignment of forward oriented +// reads to each edge, represented by their "ids". One can also keep track of +// actual paths for each read, but we do not do that here because tracking ids is +// sufficient for our purposes. + +pub struct Hyper { + pub h: HyperBasevector, + pub inv: Vec, + pub ids: Vec>, +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// MEMBER FUNCTIONS FOR HYPER +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +impl Hyper { + // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + // FUNCTIONS THAT DEPEND ONLY ON THE GRAPH + // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + + // ============================================================================= + // Return the sequence associated to a path. + // ============================================================================= + + pub fn cat(&self, p: &[i32]) -> DnaString { + let mut s = DnaString::new(); + if p.is_empty() { + return s; + } + s = self.h.g.edge_obj(p[0] as u32).clone(); + for j in 1..p.len() as i32 { + let b = &self.h.g.edge_obj(p[j as usize] as u32); + for i in self.h.k - 1..b.len() as i32 { + s.push(b.get(i as usize)); + } + } + s + } + + // ============================================================================= + // Print the graph, component by component. + // ============================================================================= + + pub fn print(&self) { + let mut comp = Vec::>::new(); + self.h.g.components_e(&mut comp); + for (j, comp_j) in comp.into_iter().enumerate() { + println!("\nCOMPONENT {}", j + 1); + for e in comp_j { + let v = self.h.g.to_left(e); + let w = self.h.g.to_right(e); + let b: DnaString = self.h.g[EdgeIndex::::new(e as usize)].clone(); + println!( + "\n{} ==(e={},len={},supp={})==> {}", + v, + e, + b.len() - self.h.k as usize + 1, + self.supp(e as usize), + w + ); + println!("{}", b.to_string()); + } + } + } + + // ============================================================================================ + // Print the graph, component by component, with edge annotations. + // + // require_ann: if true, only show components having annotations. + // hide_seq: if true, and there is an annotation on an edge, don't print the sequence + // ============================================================================================ + + pub fn print_with_annotations(&self, ann: &[String], require_ann: bool, hide_seq: bool) { + let mut comp = Vec::>::new(); + self.h.g.components_e(&mut comp); + let mut n = 0; + for comp_j in comp { + let mut have_ann = false; + for e in &comp_j { + if !ann[*e as usize].is_empty() { + have_ann = true; + } + } + if require_ann && !have_ann { + continue; + } + n += 1; + println!("\nCOMPONENT {n}"); + for e in comp_j { + let e = e as usize; + let v = self.h.g.to_left(e as u32); + let w = self.h.g.to_right(e as u32); + let b: DnaString = self.h.g[EdgeIndex::::new(e)].clone(); + println!( + "\n{} ==(e={},len={},supp={})==> {}\n", + v, + e, + b.len() - self.h.k as usize + 1, + self.supp(e), + w + ); + if !ann[e].is_empty() { + print!("{}", ann[e]); + if !hide_seq { + println!(); + } + } + if !hide_seq || ann[e].is_empty() { + println!("{}", b.to_string()); + } + } + } + } + + // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + // UTILITY FUNCTIONS + // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + + // ============================================================================= + // Create a new Hyper. + // ============================================================================= + + pub fn new() -> Hyper { + Hyper { + h: HyperBasevector::new(), + inv: Vec::new(), + ids: Vec::new(), + } + } + + // ============================================================================= + // Create a new Hyper from data. + // ============================================================================= + + pub fn build_from_reads(&mut self, k: i32, reads: &[DnaString]) { + // Only works if k = 20. + + assert_eq!(k, 20); + + // Build deBruijn graph. + + pub type Kmer1 = kmer::Kmer20; + let mut seqs = Vec::new(); + for r in reads { + seqs.push((r.clone(), Exts::empty(), 0)); + } + let summarizer = filter::CountFilterSet::new(1); + let mut valid_kmers: Vec<(Kmer1, (Exts, Vec))> = { + let (kmer_hashmap, _) = filter::filter_kmers::( + &seqs, + &Box::new(summarizer), + false, + false, + 4, + ); + drop(seqs); + kmer_hashmap + .iter() + .map(|(k, e, d)| (*k, (*e, d.clone()))) + .collect() + }; + // ◼ There are several instances of drop here and below. Why is it that + // ◼ rust doesn't drop objects at last usage? + valid_kmers.sort(); + let cmp = SimpleCompress::new(|mut a: Vec, b: &Vec| { + a.extend(b); + a.sort_unstable(); + a.dedup(); + a + }); + let graph = compress_kmers(false, &cmp, &valid_kmers).finish_serial(); + drop(valid_kmers); + + // Translate to graph in which edges are sequences. + + debruijn_to_petgraph_hyperbasevector(&graph, &mut self.h.g, &mut self.inv); + drop(graph); + self.h.k = k; + + // Build self.ids. + + let evec = Vec::::new(); + for _e in 0..self.h.g.edge_count() { + self.ids.push(evec.clone()); + } + let mut kmers_plus = Vec::<(Kmer20, i32, i32)>::new(); + let mut edges = Vec::::new(); + for e in 0..self.h.g.edge_count() { + edges.push(self.h.g.edge_obj(e as u32).clone()); + } + make_kmer_lookup_20_single(&edges, &mut kmers_plus); + drop(edges); + let mut maxread = 0; + for read in reads { + maxread = max(maxread, read.len()); + } + if maxread < k as usize { + return; + } + let mut next_rpos: Vec = vec![0; reads.len()]; + for pos in 0..maxread - (k as usize) + 1 { + for (id, read) in reads.iter().enumerate() { + if pos + k as usize > read.len() { + continue; + } + if pos < next_rpos[id] as usize { + continue; + } + let x: Kmer20 = read.get_kmer(pos); + let p = bin_position1_3(&kmers_plus, &x); + if p < 0 { + continue; + } + let mut q: Vec = vec![kmers_plus[p as usize].1]; + let mut rpos = pos + k as usize; + let mut e = kmers_plus[p as usize].1; + let mut epos = kmers_plus[p as usize].2 + k; + self.ids[e as usize].push(id as u32); + loop { + if rpos == read.len() { + break; + } + let mut next = false; + if epos == self.h.bases(e as u32) as i32 { + let v = self.h.g.to_right(e as u32); + for j in 0..self.h.g.n_from(v as usize) { + let f = self.h.g.e_from(v as usize, j); + if self.h.g.edge_obj(f as u32).get((k - 1) as usize) == read.get(rpos) { + e = f as i32; + self.ids[e as usize].push(id as u32); + epos = k - 1; + q.push(e); + next = true; + break; + } + } + if !next { + break; + } + } + if !next { + if read.get(rpos) != self.h.g.edge_obj(e as u32).get(epos as usize) { + break; + } + rpos += 1; + epos += 1; + } + } + next_rpos[id] = (rpos - k as usize + 1) as i32; + } + } + for e in 0..self.h.g.edge_count() { + unique_sort(&mut self.ids[e]); + } + // self.h.test_unique(); // turn on if you want sanity check + // self.test_involution(); // turn on if you want sanity check + // self.test_overlaps(); // turn on if you want sanity check + } + + // ============================================================================= + // Return the read support for an edge. + // ============================================================================= + + pub fn supp(&self, e: usize) -> usize { + self.ids[e].len() + self.ids[self.inv[e] as usize].len() + } + + // ============================================================================= + // Kill a list 'dels' of edges in a Hyper. This will kill both the edges and + // involuted edges, and updates inv and ids appropriately. The input list can + // have duplicates and does not have to be in order or contain the involuted + // edges. + // + // Normally you would want to call kill_edges instead. + // ============================================================================= + + pub fn kill_edges_raw(&mut self, dels: &[u32]) { + // Symmetrize and unique sort dels. + + let mut dels2 = dels.to_vec(); + for e in dels { + dels2.push(self.inv[*e as usize]); + } + unique_sort(&mut dels2); + + // Delete edges in dels, updating inv and ids accordingly. + + for j in (0..dels2.len() as i32).rev() { + let e = dels2[j as usize] as usize; + if e != self.h.g.edge_count() - 1 { + if self.h.g.edge_count() - 1 != self.inv[self.h.g.edge_count() - 1] as usize { + let last_index_inv = self.inv[self.h.g.edge_count() - 1]; + self.inv[e] = *self.inv.last().unwrap(); + self.inv[last_index_inv as usize] = e as u32; + } else { + self.inv[e] = e as u32; + } + } + self.inv.pop(); + if e != self.h.g.edge_count() - 1 { + let n = self.ids.len() - 1; + self.ids.swap(e, n); + } + self.ids.pop(); + self.h.g.remove_edge(EdgeIndex::::new(e)); + } + } + + // ============================================================================= + // Kill a list 'dels' of edges in a Hyper, and remove unneeded vertices. This + // will kill both the edges and involuted edges, and updates inv and ids + // appropriately. The input list can have duplicates and does not have to be + // in order or contain the involuted edges. + // + // The code is essentially from RemoveUnneededVertices2 in + // paths/long/large/GapToyTools.cc, in the supernova codebase, and that drives + // from the same function in the same place in the BroadCRD codebase. There is + // documentation in those files that describes some of the logic. + // ============================================================================= + + pub fn kill_edges(&mut self, dels: &[u32]) { + // Kill the edges. + + self.kill_edges_raw(dels); + + // Find max read id. + + let mut maxread: i32 = -1; + for e in 0..self.h.g.edge_count() { + for id in &self.ids[e] { + maxread = max(maxread, *id as i32); + } + } + + // Find pairs of edges v --> x --> w, where there is exactly one edge + // entering and exiting a vertex x, excluding the case v = w. + + let mut vertex_kill = vec![false; self.h.g.node_count()]; + let mut vertex_queue = Vec::>::new(); + for v in self.h.g.node_indices() { + if self.h.g.edges_directed(v, Outgoing).count() == 1 + && self.h.g.edges_directed(v, Incoming).count() == 1 + && self + .h + .g + .edges_directed(v, Outgoing) + .next() + .unwrap() + .target() + != self + .h + .g + .edges_directed(v, Incoming) + .next() + .unwrap() + .source() + { + vertex_kill[v.index()] = true; + vertex_queue.push(v); + } + } + + // Merge these edge pairs, with some exceptions, because of the involution. + // This is complicated. + + let mut bound = Vec::<(u32, u32)>::new(); + while let Some(v) = vertex_queue.pop() { + if !vertex_kill[v.index()] { + continue; + } + let mut vleft = v; + let mut eleft: usize; + loop { + vertex_kill[vleft.index()] = false; + eleft = self.h.g.first_edge(vleft, Incoming).unwrap().index(); + vleft = self + .h + .g + .edges_directed(vleft, Incoming) + .next() + .unwrap() + .source(); + if !vertex_kill[vleft.index()] { + break; + } + } + let mut eright: usize; + let mut vright = v; + loop { + vertex_kill[vright.index()] = false; + eright = self.h.g.first_edge(vright, Outgoing).unwrap().index(); + vright = self + .h + .g + .edges_directed(vright, Outgoing) + .next() + .unwrap() + .target(); + if !vertex_kill[vright.index()] { + break; + } + } + if eleft < self.inv[eright] as usize { + bound.push((eleft as u32, eright as u32)); + bound.push((self.inv[eright], self.inv[eleft])); + } + } + let mut new_edge_numbers = Vec::::new(); + let mut to_delete = Vec::::new(); + let mut have: Vec; + let mut havex: Vec = vec![false; (maxread + 1) as usize]; + self.ids.reserve(bound.len()); + while let Some(bounds) = bound.pop() { + let new_edge_no: usize = self.h.g.edge_count(); + let mut new_edge = self.h.g.edge_obj(bounds.0).clone(); + have = self.ids[bounds.0 as usize].clone(); + for j in 0..have.len() { + havex[have[j] as usize] = true; + } + to_delete.push(bounds.0); + let mut v = self + .h + .g + .edge_endpoints(EdgeIndex::::new(bounds.0 as usize)) + .unwrap() + .1; + loop { + if v == self + .h + .g + .edge_endpoints(EdgeIndex::::new(bounds.1 as usize)) + .unwrap() + .1 + { + break; + } + let edge_id = self.h.g.first_edge(v, Outgoing).unwrap(); + let edge = self.h.g[edge_id].clone(); + for j in 0..self.ids[edge_id.index()].len() { + let id = self.ids[edge_id.index()][j]; + if !havex[id as usize] { + have.push(id); + havex[id as usize] = true; + } + } + to_delete.push(edge_id.index() as u32); + for p in (self.h.k - 1)..(edge.len() as i32) { + new_edge.push(edge.get(p as usize)); + } + v = self + .h + .g + .edges_directed(v, Outgoing) + .next() + .unwrap() + .target(); + } + let v = self + .h + .g + .edge_endpoints(EdgeIndex::::new(bounds.0 as usize)) + .unwrap() + .0; + let w = self + .h + .g + .edge_endpoints(EdgeIndex::::new(bounds.1 as usize)) + .unwrap() + .1; + self.h.g.add_edge(v, w, new_edge); + have.sort_unstable(); + for j in 0..have.len() { + havex[have[j] as usize] = false; + } + self.ids.push(have.clone()); + new_edge_numbers.push(new_edge_no); + } + for i in 0..new_edge_numbers.len() { + if i % 2 == 1 { + continue; + } + self.inv.push(new_edge_numbers[i + 1] as u32); + self.inv.push(new_edge_numbers[i] as u32); + } + + // Now again delete edges, as at the beginning. + + self.kill_edges_raw(&to_delete); + + // Remove edgeless vertices. + + for v in (0..self.h.g.node_count()).rev() { + if self.h.g.n_to(v) == 0 && self.h.g.n_from(v) == 0 { + self.h.g.remove_node(NodeIndex::::new(v)); + } + } + } + + // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + // FUNCTIONS INTENDED MOSTLY FOR DEBUGGING + // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + + // ============================================================================= + // Test the involution to see if it is valid. + // ============================================================================= + + #[allow(dead_code)] + fn test_involution(&self) { + assert_eq!(self.h.g.edge_count(), self.inv.len()); + for e in 0..self.h.g.edge_count() { + if self.inv[e] >= self.h.g.edge_count() as u32 { + println!( + "inv[{}] = {}, but graph has only {} edges.", + e, + self.inv[e], + self.h.g.edge_count() + ); + panic!("Involution test failed."); + } + assert_eq!(self.inv[self.inv[e] as usize], e as u32); + let t = self.h.g[EdgeIndex::::new(e)].rc().to_string(); + assert_eq!( + self.h.g[EdgeIndex::::new(self.inv[e] as usize)].to_string(), + t + ); + } + let mut homomorphism_fails = Vec::<(usize, usize)>::new(); + let mut oks = 0; + for v in 0..self.h.g.node_count() { + for j1 in 0..self.h.g.n_to(v) { + let e1 = self.h.g.e_to(v, j1); + let re1 = self.inv[e1]; + for j2 in 0..self.h.g.n_from(v) { + let e2 = self.h.g.e_from(v, j2); + let re2 = self.inv[e2]; + if self.h.g.to_right(re2) != self.h.g.to_left(re1) { + homomorphism_fails.push((e1, e2)); + } else { + oks += 1; + } + } + } + } + if !homomorphism_fails.is_empty() { + println!("\ntest_involution failed at homomorphism condition"); + println!( + "there were {} fails and {} oks", + homomorphism_fails.len(), + oks + ); + let (e1, e2) = (homomorphism_fails[0].0, homomorphism_fails[0].1); + let (re1, re2) = (self.inv[e1], self.inv[e2]); + println!("first has e1 = {e1}, e2 = {e2}, re1 = {re1}, re2 = {re2}"); + panic!("bailing because of test_involution failure"); + } + } + + // ============================================================================= + // Test to see if overlap condition is satisfied. + // ============================================================================= + + #[allow(dead_code)] + fn test_overlaps(&self) { + for v in 0..self.h.g.node_count() { + for j1 in 0..self.h.g.n_to(v) { + let b1 = self.h.g.edge_obj(self.h.g.e_to(v, j1) as u32); + let n1 = b1.len(); + let k = self.h.k as usize; + for j2 in 0..self.h.g.n_from(v) { + let b2 = self.h.g.edge_obj(self.h.g.e_from(v, j2) as u32); + assert_eq!(b1.slice(n1 - (k - 1), n1), b2.slice(0, k - 1)); + } + } + } + } + + // ============================================================================= + // Compute a checksum. This will produce the same answers for two isomorphic + // graphs. Optionally, this captures the info in the supporting reads. This + // is a totally arbitrary checksum but it is effective in finding changes and + // can be easily implemented in another language. + // ============================================================================= + + pub fn checksum_main(&self, use_reads: bool) -> u64 { + let mut s: u64 = 0; + for v in 0..self.h.g.node_count() { + let n = self.h.g.n_to(v); + let mut r: u64 = 1; + for j in 0..n { + let e = self.h.g.e_to(v, j); + let b = &self.h.g[EdgeIndex::::new(e)].to_string(); + let mut k: u64 = 0; + for l in 0..b.len() { + let c = &b.chars().nth(l).unwrap(); + let mut i = 0; + if *c == 'C' { + i = 1; + } else if *c == 'G' { + i = 2; + } else if *c == 'T' { + i = 3; + } + k = k.wrapping_mul(3) + i; + } + if use_reads { + for i in 0..self.ids[e].len() { + let id = self.ids[e][i]; + k = k.wrapping_add(((i + 1) * id as usize * id as usize) as u64); + } + } + r = r.wrapping_mul(k); + } + s = s.wrapping_add(r); + let n = self.h.g.n_from(v); + let mut r: u64 = 1; + for j in 0..n { + let e = self.h.g.e_from(v, j); + let b = &self.h.g[EdgeIndex::::new(e)].to_string(); + let mut k: u64 = 0; + for l in 0..b.len() { + let c = &b.chars().nth(l).unwrap(); + let mut i = 0; + if *c == 'C' { + i = 1; + } else if *c == 'G' { + i = 2; + } else if *c == 'T' { + i = 3; + } + k = k.wrapping_mul(5) + i; + } + if use_reads { + for i in 0..self.ids[e].len() { + let id = self.ids[e][i]; + k = k.wrapping_add(((i + 1) * id as usize * id as usize) as u64); + } + } + r = r.wrapping_mul(k); + } + s = s.wrapping_add(r); + } + s + } + + pub fn checksum(&self) -> u64 { + self.checksum_main(true) + } + + pub fn checksum_hbv_only(&self) -> u64 { + self.checksum_main(false) + } + + // ============================================================================= + // Print component sizes, in an abbreviated form, where the size of each + // component is the number of edges in it. + // ============================================================================= + + #[allow(dead_code)] + fn print_comp_sizes(&mut self) { + let mut comp = Vec::>::new(); + self.h.g.components_e(&mut comp); + let mut sizes = Vec::::new(); + for c in comp { + sizes.push(c.len()); + } + reverse_sort(&mut sizes); + print!("component sizes = ["); + let mut j = 0; + loop { + if j == sizes.len() { + break; + } + let k = next_diff(&sizes, j); + if j > 0 { + print!(", "); + } + print!("{}^{}", sizes[j], k - j); + j = k; + } + println!("]"); + } + + // ============================================================================= + // Return total read support, intended as a sort of checksum. + // ============================================================================= + + #[allow(dead_code)] + fn total_supp(&mut self) -> usize { + let mut total = 0; + for e in 0..self.h.g.edge_count() { + total += self.ids[e].len(); + } + total + } + + // ============================================================================= + // Return number of zero-support edges. + // ============================================================================= + + #[allow(dead_code)] + fn zero_supp_edges(&mut self) -> usize { + let mut z = 0; + for e in 0..self.h.g.edge_count() { + if self.supp(e) == 0 { + z += 1; + } + } + z + } +} + +impl Default for Hyper { + fn default() -> Self { + Self::new() + } +} diff --git a/lib/rust/io_utils/Cargo.toml b/lib/rust/io_utils/Cargo.toml new file mode 100644 index 0000000..fe92faf --- /dev/null +++ b/lib/rust/io_utils/Cargo.toml @@ -0,0 +1,19 @@ +[dependencies] +[dependencies.bincode] +workspace = true + +[dependencies.lz4] +workspace = true + +[dependencies.serde] +workspace = true + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'io_utils' +publish = false +version = '0.1.0' diff --git a/lib/rust/io_utils/src/lib.rs b/lib/rust/io_utils/src/lib.rs new file mode 100644 index 0000000..128eb36 --- /dev/null +++ b/lib/rust/io_utils/src/lib.rs @@ -0,0 +1,187 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +// This file contains miscellaneous utilities for input and output. + +use bincode::{deserialize_from, serialize_into}; +use serde::de::DeserializeOwned; +use serde::Serialize; +use std::ffi::OsStr; +use std::fmt::Debug; +use std::fs; +use std::fs::File; +use std::io::prelude::*; +use std::path::Path; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// GET CONTENTS OF DIRECTORY +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn dir_list(d: &str) -> Vec { + let x = fs::read_dir(d).unwrap_or_else(|_| panic!("failed to read directory {d}")); + let mut y = Vec::::new(); + for f in x { + let s: String = f.unwrap().file_name().into_string().unwrap(); + y.push(s); + } + y.sort(); + y +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// TEST FOR EXISTENCE OF FILE +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn path_exists(p: impl AsRef) -> bool { + p.as_ref().exists() +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// WRITE STUFF +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// fwriteln! is just like writeln! except that it has an expect call tacked on. +// fwrite! similar. + +#[macro_export] +macro_rules! fwriteln { + ($f:expr, $u:expr) => { + writeln!( $f, $u ).expect("writeln! failed") + }; + ($f:expr, $u:expr, $($x:tt)*) => { + writeln!( $f, $u, $($x)* ) + .unwrap_or_else(|_| panic!( "writeln! failed while writing \"{}\"", $u ) ) + }; +} + +// fwrite! is just like write! except that it has an expect call tacked on. + +#[macro_export] +macro_rules! fwrite { + ($f:expr, $u:expr) => { + write!( $f, $u ).expect( "write! failed" ) + }; + ($f:expr, $u:expr, $($x:tt)*) => { + write!( $f, $u, $($x)* ) + .unwrap_or_else(|_| panic!( "write! failed while writing \"{}\"", $u ) ) + }; +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// OPEN FILES +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +#[macro_export] +macro_rules! open_for_read { + ($filename:expr) => { + ::std::io::BufReader::new( + ::std::fs::File::open(::core::convert::AsRef::<::std::path::Path>::as_ref( + $filename, + )) + .unwrap_or_else(|_| { + panic!( + "Could not open file \"{}\"", + ::core::convert::AsRef::<::std::path::Path>::as_ref($filename) + .to_string_lossy(), + ) + }), + ) + }; +} + +#[macro_export] +macro_rules! open_for_write_new { + ($filename:expr) => { + ::std::io::BufWriter::new( + ::std::fs::File::create(::core::convert::AsRef::<::std::path::Path>::as_ref( + $filename, + )) + .unwrap_or_else(|_| { + panic!( + "Could not create file \"{}\"", + ::core::convert::AsRef::<::std::path::Path>::as_ref($filename) + .to_string_lossy() + ) + }), + ) + }; +} + +pub fn open_lz4>(filename: P) -> lz4::Decoder { + let f = File::open(filename).expect("Failed to open file for reading"); + lz4::Decoder::new(f).expect("Failed to create lz4 decoder") +} + +// If you accidentally pass a gzipped file to this it will succeed in opening the file, +// but then when you try to run read_line, the read will return !is_ok(). This seems horrible. + +pub fn open_maybe_compressed>(filename: P) -> Box { + match filename.as_ref().extension().and_then(OsStr::to_str) { + Some("lz4") => Box::new(open_lz4(filename)) as Box, + _ => Box::new(File::open(filename).expect("Failed to open file for reading")) + as Box, + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// READ A FILE +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// CODE TO DO READS AND WRITES USING SERDE +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn write_obj + Debug>(g: &T, filename: P) { + let f = match std::fs::File::create(&filename) { + Err(err) => panic!("couldn't create file {filename:?}: {err}"), + Ok(f) => f, + }; + let mut writer = std::io::BufWriter::new(f); + serialize_into(&mut writer, &g) + .unwrap_or_else(|_| panic!("write_obj of file {filename:?} failed")); +} + +pub fn read_obj + Debug>(filename: P) -> T { + let f = match std::fs::File::open(&filename) { + Err(err) => panic!("couldn't open file {filename:?}: {err}"), + Ok(f) => f, + }; + let mut reader = std::io::BufReader::new(f); + deserialize_from(&mut reader).unwrap_or_else(|_| panic!("read_obj of file {filename:?} failed")) +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// PRINT MACRO +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Print a list of things, useful for debugging. +// Example: if x is 3 and y is y, then printme!(x,y) yields +// x = 3, y = 7, + +#[allow(unused_macros)] +#[macro_export] +macro_rules! printme { + ( $( $x:expr ),* ) => { + println!(concat!( $( stringify!($x), " = {}, ", )* ), $($x,)*) + } + } + +#[allow(unused_macros)] +#[macro_export] +macro_rules! eprintme { + ( $( $x:expr ),* ) => { + eprintln!(concat!( $( stringify!($x), " = {}, ", )* ), $($x,)*) + } + } + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// READ FILE TO STRING AND PRINT FILE NAME IF IT DOESN'T EXIST +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn read_to_string_safe>(path: P) -> String { + fs::read_to_string(&path).unwrap_or_else(|_| { + panic!( + "Could not open file \"{}\".", + path.as_ref().to_str().unwrap() + ) + }) +} diff --git a/lib/rust/jibes_o3/Cargo.toml b/lib/rust/jibes_o3/Cargo.toml index f598eaa..4ec6cda 100644 --- a/lib/rust/jibes_o3/Cargo.toml +++ b/lib/rust/jibes_o3/Cargo.toml @@ -1,10 +1,13 @@ [dependencies] -ndarray-stats = '0.5' -numpy = '0.19' - [dependencies.ndarray] workspace = true +[dependencies.ndarray-stats] +workspace = true + +[dependencies.numpy] +workspace = true + [dependencies.pyo3] workspace = true diff --git a/lib/rust/jibes_o3/src/lib.rs b/lib/rust/jibes_o3/src/lib.rs index 1382568..bbd44de 100644 --- a/lib/rust/jibes_o3/src/lib.rs +++ b/lib/rust/jibes_o3/src/lib.rs @@ -371,7 +371,7 @@ impl JibesEMO3 { counts: cnt_data, data: Some(data), model: model.clone(), - LL: std::f64::NEG_INFINITY, + LL: f64::NEG_INFINITY, converged: false, iterations: 0, posterior: Array::zeros((n, z)), @@ -442,7 +442,7 @@ impl JibesEMO3 { fn one_EM_step(&mut self) -> f64 { // Perform one step of the EM algorithm. // :returns The current LL of the model. - if self.LL == std::f64::NEG_INFINITY { + if self.LL == f64::NEG_INFINITY { // initialize self._calculate_posterior_by_state(); } @@ -479,7 +479,7 @@ impl JibesEMO3 { if rep > max_reps { break; } - if !(last_ll == std::f64::NEG_INFINITY) + if !(last_ll == f64::NEG_INFINITY) & ((abs_change < abs_tol) | (rel_change < rel_tol)) { println!("EM algorithm has converged."); @@ -668,7 +668,7 @@ mod tests { data: None, estimated_cells: -2.0, model, - LL: std::f64::NEG_INFINITY, + LL: f64::NEG_INFINITY, converged: false, iterations: 0, posterior, diff --git a/lib/rust/json_report_derive/Cargo.toml b/lib/rust/json_report_derive/Cargo.toml index 1825112..a9e0561 100644 --- a/lib/rust/json_report_derive/Cargo.toml +++ b/lib/rust/json_report_derive/Cargo.toml @@ -1,11 +1,16 @@ [dependencies] -proc-macro2 = '1' -quote = '1' -syn = '2' - [dependencies.itertools] workspace = true +[dependencies.proc-macro2] +workspace = true + +[dependencies.quote] +workspace = true + +[dependencies.syn] +workspace = true + [lib] proc-macro = true test = false diff --git a/lib/rust/json_report_derive/src/lib.rs b/lib/rust/json_report_derive/src/lib.rs index c675f38..74d964d 100644 --- a/lib/rust/json_report_derive/src/lib.rs +++ b/lib/rust/json_report_derive/src/lib.rs @@ -69,7 +69,7 @@ use syn::{Attribute, Data, DeriveInput, Fields, Ident}; /// /// # Returns /// * a `TokenStream`, which is the Rust code corresponding to the -/// implementation of the trait +/// implementation of the trait /// #[proc_macro_derive(JsonReport, attributes(json_report))] pub fn derive_json_report_trait(input: TokenStream) -> TokenStream { @@ -144,7 +144,7 @@ pub fn derive_json_report_trait(input: TokenStream) -> TokenStream { }; // Hand the output tokens back to the compiler. - proc_macro::TokenStream::from(expanded) + TokenStream::from(expanded) } struct FieldInfo { @@ -175,7 +175,7 @@ fn collect_struct_fields(data: &Data) -> Vec { .named .iter() .filter_map(|x| x.ident.as_ref()) - .map(std::string::ToString::to_string) + .map(ToString::to_string) .collect(); let field_attrs: Vec<(bool, bool, bool)> = fields diff --git a/lib/rust/kmer_lookup/Cargo.toml b/lib/rust/kmer_lookup/Cargo.toml new file mode 100644 index 0000000..88701cc --- /dev/null +++ b/lib/rust/kmer_lookup/Cargo.toml @@ -0,0 +1,16 @@ +[dependencies] +[dependencies.debruijn] +workspace = true + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'kmer_lookup' +publish = false +version = '0.1.0' diff --git a/lib/rust/kmer_lookup/src/lib.rs b/lib/rust/kmer_lookup/src/lib.rs new file mode 100644 index 0000000..4cd11e7 --- /dev/null +++ b/lib/rust/kmer_lookup/src/lib.rs @@ -0,0 +1,64 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// Kmer lookup. + +use debruijn::{ + dna_string::DnaString, + kmer::{Kmer12, Kmer20}, + Kmer, Mer, Vmer, +}; +use vector_utils::{lower_bound1_3, upper_bound1_3}; + +/// Given a vector of DnaStrings dv, create a sorted vector whose entries are +/// (kmer, e, estart), where the kmer starts at position estart on dv[e]. +pub fn make_kmer_lookup_single(dv: &[DnaString], x: &mut Vec<(K, i32, i32)>) { + let sz = dv + .iter() + .filter(|b| b.len() >= K::k()) + .map(|b| b.len() - K::k() + 1) + .sum(); + x.clear(); + x.reserve(sz); + + for (i, b) in dv.iter().enumerate() { + for (j, kmer) in b.iter_kmers().enumerate() { + x.push((kmer, i as i32, j as i32)); + } + } + + x.sort(); +} + +/// Included for backward compatibility. Use make_kmer_lookup_single +pub fn make_kmer_lookup_20_single(dv: &[DnaString], x: &mut Vec<(Kmer20, i32, i32)>) { + make_kmer_lookup_single(dv, x); +} + +/// Included for backward compatibility. Use make_kmer_lookup_single +pub fn make_kmer_lookup_12_single(dv: &[DnaString], x: &mut Vec<(Kmer12, i32, i32)>) { + make_kmer_lookup_single(dv, x); +} + +// Determine if a sequence perfectly matches in forward orientation. + +pub fn match_12(b: &DnaString, dv: &[DnaString], x: &[(Kmer12, i32, i32)]) -> bool { + let y: Kmer12 = b.get_kmer(0); + let low = lower_bound1_3(x, &y); + let high = upper_bound1_3(x, &y); + for m in low..high { + let mut l = 12; + let t = x[m as usize].1 as usize; + let mut p = x[m as usize].2 as usize + 12; + while l < b.len() && p < dv[t].len() { + if b.get(l) != dv[t].get(p) { + break; + } + l += 1; + p += 1; + } + if l == b.len() { + return true; + } + } + false +} diff --git a/lib/rust/metric/Cargo.toml b/lib/rust/metric/Cargo.toml index a91c0c9..74a2235 100644 --- a/lib/rust/metric/Cargo.toml +++ b/lib/rust/metric/Cargo.toml @@ -1,6 +1,4 @@ [dependencies] -bincode = '1' -num-traits = '0.2' serde_derive = '1' [dependencies.ahash] @@ -11,12 +9,18 @@ version = '0.8' [dependencies.anyhow] workspace = true +[dependencies.bincode] +workspace = true + [dependencies.itertools] workspace = true [dependencies.metric_derive] path = '../metric_derive' +[dependencies.num-traits] +workspace = true + [dependencies.serde] workspace = true diff --git a/lib/rust/metric/src/count_metric.rs b/lib/rust/metric/src/count_metric.rs index c04da9e..b9c99cf 100644 --- a/lib/rust/metric/src/count_metric.rs +++ b/lib/rust/metric/src/count_metric.rs @@ -104,7 +104,7 @@ impl JsonReport for CountMetric { /// ## Tests /// /// * prop_test_count_metric_add_and_addassign() - Make sure that the basic operation -/// is correct for assorted inputs +/// is correct for assorted inputs impl ::std::ops::Add for CountMetric { type Output = CountMetric; fn add(mut self, other: CountMetric) -> CountMetric { @@ -119,7 +119,7 @@ impl ::std::ops::Add for CountMetric { /// ## Tests /// /// * prop_test_count_metric_add_and_addassign() - Make sure that the basic operation -/// is correcto for assorted inputs +/// is correct for assorted inputs impl ::std::ops::AddAssign for CountMetric { fn add_assign(&mut self, other: CountMetric) { self.merge(other); @@ -152,7 +152,7 @@ mod tests { }); assert!(merged == CountMetric::from(45)); - let merged: CountMetric = (1..10).map(std::convert::Into::into).sum(); + let merged: CountMetric = (1..10).map(Into::into).sum(); assert!(merged == CountMetric::from(45)); } diff --git a/lib/rust/metric/src/histogram.rs b/lib/rust/metric/src/histogram.rs index efceb87..7b02a79 100644 --- a/lib/rust/metric/src/histogram.rs +++ b/lib/rust/metric/src/histogram.rs @@ -360,6 +360,7 @@ where /// Panics if: /// - start is not less than stop /// - step is equal to zero + /// /// TODO: May be create a `BinnedHistogram` class in the future? /// /// # Example diff --git a/lib/rust/metric/src/lib.rs b/lib/rust/metric/src/lib.rs index d092999..7e4c9df 100644 --- a/lib/rust/metric/src/lib.rs +++ b/lib/rust/metric/src/lib.rs @@ -40,7 +40,7 @@ use serde_json::Value; use std::borrow::Borrow; use std::collections::{hash_map, HashMap, HashSet}; use std::fs::File; -use std::hash::{BuildHasher, BuildHasherDefault, Hash, Hasher}; +use std::hash::{BuildHasher, Hash}; use std::io::{Read, Write}; use std::iter::FromIterator; use std::path::Path; @@ -57,58 +57,39 @@ pub mod collections; pub mod num; pub mod option; -/// A default Hasher for some faster hashing scheme (deterministic) -pub struct TxHasher(AHasher); +/// A deterministic and fast hasher. +#[derive(Clone, Copy, Default)] +pub struct TxHasher; -impl Hasher for TxHasher { - #[inline] - fn finish(&self) -> u64 { - self.0.finish() +impl TxHasher { + fn random_state() -> ahash::RandomState { + ahash::RandomState::with_seeds(0, 0, 0, 0) } - #[inline] - fn write(&mut self, bytes: &[u8]) { - self.0.write(bytes); + + /// Return a new hasher. + pub fn hasher() -> AHasher { + Self::random_state().build_hasher() } -} -impl Default for TxHasher { - fn default() -> Self { - /// From the ahash crate source. - const PI: [u64; 4] = [ - 0x243f_6a88_85a3_08d3, - 0x1319_8a2e_0370_7344, - 0xa409_3822_299f_31d0, - 0x082e_fa98_ec4e_6c89, - ]; - - /// From the ahash crate source. - const PI2: [u64; 4] = [ - 0x4528_21e6_38d0_1377, - 0xbe54_66cf_34e9_0c6c, - 0xc0ac_29b7_c97c_50dd, - 0x3f84_d5b5_b547_0917, - ]; - - /// Arbitrary seed values. - const SEED: [u64; 4] = [ - PI[0] ^ PI2[0] ^ 0x6c62_272e_07bb_0142, - PI[1] ^ PI2[1], - PI[2] ^ PI2[2] ^ 0x517c_c1b7_2722_0a95, - PI[3] ^ PI2[3], - ]; - - TxHasher(ahash::RandomState::with_seeds(SEED[0], SEED[1], SEED[2], SEED[3]).build_hasher()) + /// Calculate the hash of a single value. + pub fn hash(x: impl Hash) -> u64 { + Self::random_state().hash_one(x) } } -/// A default BuildHasher using some faster hashing scheme (faster than SipHash) -type TxBuildHasher = BuildHasherDefault; +impl BuildHasher for TxHasher { + type Hasher = AHasher; + + fn build_hasher(&self) -> Self::Hasher { + Self::hasher() + } +} /// A default HashMap using some faster hashing scheme -pub type TxHashMap = HashMap; +pub type TxHashMap = HashMap; /// A default HashSet using some faster hashing scheme -pub type TxHashSet = HashSet; +pub type TxHashSet = HashSet; /// Create a TxHashSet with the given elements. Similar to a `vec![]` #[macro_export] @@ -123,14 +104,6 @@ macro_rules! set { ( $( $x:expr, )* ) => {set!($( $x:expr ),*)}; } -/// A default hash function for when you need a quick hash -#[inline] -pub fn hash64(data: impl Hash) -> u64 { - let mut state = TxHasher::default(); - data.hash(&mut state); - state.finish() -} - /// The string used in a metric name. pub trait AsMetricPrefix { /// Return the metric prefix as a borrowed string, or None if it has none. @@ -204,9 +177,9 @@ pub trait Metric: Serialize + for<'de> Deserialize<'de> { /// # Arguments /// /// * `filename` - Output will be written to this file. It may be of any type - /// which can be interpreted as a `Path`, typically a `String` + /// which can be interpreted as a `Path`, typically a `String` /// * `serde_format` - Defines the format for serialization, typically - /// `SerdeFormat::Json` + /// `SerdeFormat::Json` /// /// # Example /// @@ -258,9 +231,9 @@ pub trait Metric: Serialize + for<'de> Deserialize<'de> { /// # Arguments /// /// * `filename` - Read from this file. It may be of any type - /// which can be interpreted as a `Path`, typically a `String` + /// which can be interpreted as a `Path`, typically a `String` /// * `serde_format` - Defines the format for deserialization, typically - /// `SerdeFormat::Json` + /// `SerdeFormat::Json` /// /// # Example /// @@ -288,9 +261,9 @@ pub trait Metric: Serialize + for<'de> Deserialize<'de> { /// # Arguments /// /// * `filenames` - Read from this set of file. It may be a slice/vector of any type - /// which can be interpreted as a `Path`, typically a `String` + /// which can be interpreted as a `Path`, typically a `String` /// * `serde_format` - Defines the format for deserialization, typically - /// `SerdeFormat::Json` or `SerdeFormat::Binary` + /// `SerdeFormat::Json` or `SerdeFormat::Binary` /// /// # Example /// ```rust @@ -341,7 +314,7 @@ pub trait Metric: Serialize + for<'de> Deserialize<'de> { } } - /// + /// Merge metrics from an iterator fn from_chunks(chunks: I) -> Self where I: IntoIterator, @@ -395,7 +368,7 @@ pub trait JsonReport { /// /// # Arguments /// * `filename` - Output will be written to this file. It may be of any type - /// which can be interpreted as a `Path`, typically a `String` + /// which can be interpreted as a `Path`, typically a `String` fn report(&self, filename: &dyn AsRef) -> Result<(), Error> { let reporter = self.to_json_reporter(); reporter.to_file(filename, SerdeFormat::Json) @@ -475,6 +448,15 @@ impl JsonReporter { self.hashmap.insert(key_str, value.into()); } + /// Insert a new (key, value) pair or update the value if the key already + /// exists in the `JsonReporter`. The key could be any type which can be + /// casted into a `String` and value can be any type which can be casted + /// into `serde_json::Value` + pub fn insert_or_update(&mut self, key: impl ToString, value: impl Into) { + let key_str = key.to_string(); + self.hashmap.insert(key_str, value.into()); + } + /// Removes any (key, value) pair from the `JsonReporter`. The value is /// returned as an `Option` if the key existed in the `JsonReporter`. pub fn remove(&mut self, key: &Q) -> Option @@ -642,16 +624,17 @@ impl ::std::fmt::Display for JsonReporter { #[cfg(test)] mod tests { use super::*; + use std::hash::Hasher; #[test] fn test_txhasher() { - assert_eq!(hash64(1234567890u64), 4951984608975211167); - assert_eq!(hash64(b"Hello, world!"), 14765448921690784915); - assert_eq!(hash64("Hello, world!"), 16441770738856054944); + assert_eq!(TxHasher::hash(1234567890u64), 11377898369596099812); + assert_eq!(TxHasher::hash(b"Hello, world!"), 909132802233200014); + assert_eq!(TxHasher::hash("Hello, world!"), 1677595690243835615); - let mut hasher = TxHasher::default(); + let mut hasher = TxHasher::hasher(); hasher.write(b"Hello, world!"); - assert_eq!(hasher.finish(), 16492252547799468407); + assert_eq!(hasher.finish(), 17599674632180055185); } #[derive(Default, Serialize, Deserialize, Metric)] diff --git a/lib/rust/metric/src/percent_metric.rs b/lib/rust/metric/src/percent_metric.rs index 9f17631..abbb35d 100644 --- a/lib/rust/metric/src/percent_metric.rs +++ b/lib/rust/metric/src/percent_metric.rs @@ -94,9 +94,9 @@ impl PercentMetric { /// from a boolean. /// /// * `True` will be converted to a `PercentMetric` with numerator and denominator -/// equal to one +/// equal to one /// * `False` will be converted to a `PercentMetric` with numerator equal to zero -/// and denominator equal to one +/// and denominator equal to one /// /// # Example /// diff --git a/lib/rust/metric_derive/Cargo.toml b/lib/rust/metric_derive/Cargo.toml index e3ff8e7..ea1650d 100644 --- a/lib/rust/metric_derive/Cargo.toml +++ b/lib/rust/metric_derive/Cargo.toml @@ -1,6 +1,9 @@ [dependencies] -quote = '1' -syn = '2' +[dependencies.quote] +workspace = true + +[dependencies.syn] +workspace = true [lib] proc-macro = true diff --git a/lib/rust/metric_derive/src/lib.rs b/lib/rust/metric_derive/src/lib.rs index 1ba9556..bd7f61a 100644 --- a/lib/rust/metric_derive/src/lib.rs +++ b/lib/rust/metric_derive/src/lib.rs @@ -70,7 +70,7 @@ use syn::{Data, DeriveInput, Fields, Index}; /// /// # Returns /// * a `TokenStream`, which is the Rust code corresponding to the -/// implementation of the metric trait +/// implementation of the metric trait /// #[proc_macro_derive(Metric)] pub fn derive_metric_trait(input: TokenStream) -> TokenStream { diff --git a/lib/rust/multi/Cargo.toml b/lib/rust/multi/Cargo.toml index c1133c1..1b1b07e 100644 --- a/lib/rust/multi/Cargo.toml +++ b/lib/rust/multi/Cargo.toml @@ -1,22 +1,28 @@ [dependencies] -csv = '1' -lazy_static = '1' - [dependencies.anyhow] workspace = true [dependencies.barcode] path = '../barcode' +[dependencies.cloud_utils] +path = '../cloud_utils' + [dependencies.cr_types] path = '../cr_types' +[dependencies.csv] +workspace = true + [dependencies.fastq_set] workspace = true [dependencies.itertools] workspace = true +[dependencies.lazy_static] +workspace = true + [dependencies.martian] workspace = true @@ -33,9 +39,7 @@ workspace = true workspace = true [dependencies.regex] -default-features = false -features = ['std', 'perf'] -version = '1' +workspace = true [dependencies.serde] workspace = true diff --git a/lib/rust/multi/src/barcode_sample_assignment.rs b/lib/rust/multi/src/barcode_sample_assignment.rs index 092f687..2277333 100644 --- a/lib/rust/multi/src/barcode_sample_assignment.rs +++ b/lib/rust/multi/src/barcode_sample_assignment.rs @@ -1,13 +1,14 @@ use crate::config::csv::CsvParser; use crate::config::parse::{Parse, ParseCtx}; use crate::config::scsv::{plain_csv, Section, Span, XtraData}; -use crate::config::{multiconst, Ident, MultiConfigCsv}; +use crate::config::{multiconst, samplesconst, Ident, MultiConfigCsv}; use anyhow::{anyhow, bail, Context, Result}; use itertools::FoldWhile::{Continue, Done}; use itertools::Itertools; use metric::{TxHashMap, TxHashSet}; use nom_locate::LocatedSpan; use std::convert::TryFrom; +use std::fmt::Display; use std::fs::File; use std::io::BufWriter; use std::path::Path; @@ -38,9 +39,9 @@ impl FromStr for Barcode { } } -impl ToString for Barcode { - fn to_string(&self) -> String { - format!("{}-{}", self.0 .0, self.0 .1) +impl Display for Barcode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}-{}", self.0 .0, self.0 .1) } } @@ -60,15 +61,15 @@ impl SampleAssignment { } } -impl ToString for SampleAssignment { - fn to_string(&self) -> String { +impl Display for SampleAssignment { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use SampleAssignment::{Blank, Multiplet, Sample, SampleTag, Unassigned}; match self { - Sample(sample_id) => sample_id.clone(), - SampleTag(sample_id, _) => sample_id.clone(), - Blank => "Blank".to_string(), - Multiplet => "Multiplet".to_string(), - Unassigned => "Unassigned".to_string(), + Sample(sample_id) => f.write_str(sample_id), + SampleTag(sample_id, _) => f.write_str(sample_id), + Blank => f.write_str("Blank"), + Multiplet => f.write_str("Multiplet"), + Unassigned => f.write_str("Unassigned"), } } } @@ -244,21 +245,30 @@ impl<'a> TryFrom<(&Section<'a, String>, &MultiConfigCsv)> for SampleAssignmentCs fn try_from((sec, cfg): (&Section<'a, String>, &MultiConfigCsv)) -> Result { use hdrs::{ASSIGNMENT, BARCODE, OPT_HDRS, REQ_HDRS, SAMPLE_ID}; - let cmo_sample_map = cfg - .samples - .as_ref() - .ok_or_else( - #[cold] - || { - anyhow!( - "[{}] barcode-sample-assignment provided but no samples defined in [{}]", - multiconst::GENE_EXPRESSION, - multiconst::SAMPLES, - ) - }, - )? - .get_cmo_sample_map(); - let samples: TxHashSet<_> = cmo_sample_map.values().cloned().collect(); + + let samples = cfg.samples.as_ref().ok_or_else( + #[cold] + || { + anyhow!( + "[{}] barcode-sample-assignment provided but no samples defined in [{}]", + multiconst::GENE_EXPRESSION, + multiconst::SAMPLES, + ) + }, + )?; + let (sample_map, sample_barcode_id) = + match (samples.has_cmo_ids(), samples.has_hashtag_ids()) { + (true, false) => (samples.get_cmo_sample_map(), samplesconst::CMO_IDS), + (false, true) => (samples.get_hashtag_sample_map(), samplesconst::HASHTAG_IDS), + (_, _) => bail!( + "[{}] barcode-sample-assignment requires samples definition in [{}] to use the mutually exclusive {} or {}", + multiconst::GENE_EXPRESSION, + multiconst::SAMPLES, + samplesconst::CMO_IDS, + samplesconst::HASHTAG_IDS + ), + }; + let samples: TxHashSet<_> = sample_map.values().cloned().collect(); let parser = CsvParser::new(sec.clone(), REQ_HDRS, OPT_HDRS)?; let mut rows = vec![]; let hdr = &sec.name; @@ -313,17 +323,18 @@ impl<'a> TryFrom<(&Section<'a, String>, &MultiConfigCsv)> for SampleAssignmentCs "multiplet" => SampleAssignment::Multiplet, "unassigned" => SampleAssignment::Unassigned, _ => { - let sample_id = cmo_sample_map + let sample_id = sample_map .get(&assignment) .ok_or_else( #[cold] || { anyhow!( - "invalid {} on row {}, cmo_id {} not found in [samples]", - ASSIGNMENT, - row + 1, - assignment - ) + "invalid {} on row {}, {} {} not found in [samples]", + ASSIGNMENT, + row + 1, + sample_barcode_id, + assignment + ) }, )? .clone(); @@ -361,7 +372,7 @@ impl<'a> TryFrom<(&Section<'a, String>, &MultiConfigCsv)> for SampleAssignmentCs Ok(SampleAssignmentCsv { rows, samples, - cmo_sample_map, + cmo_sample_map: sample_map, }) } } diff --git a/lib/rust/multi/src/config/mod.rs b/lib/rust/multi/src/config/mod.rs index 41e8285..33f912a 100644 --- a/lib/rust/multi/src/config/mod.rs +++ b/lib/rust/multi/src/config/mod.rs @@ -18,6 +18,8 @@ use crate::config::samplesconst::GLOBAL_MINIMUM_UMIS; use anyhow::{anyhow, bail, ensure, Context, Result}; use barcode::whitelist::BarcodeId; use barcode::WhitelistSource; +use cloud_utils; +use cr_types::cell_annotation::CellAnnotationModel; use cr_types::chemistry::{ AutoChemistryName, AutoOrRefinedChemistry, ChemistryName, ChemistrySpecs, }; @@ -25,13 +27,16 @@ use cr_types::constants::DEFAULT_MIN_CRISPR_UMI_THRESHOLD; use cr_types::reference::feature_reference::{ BeamMode, FeatureConfig, SpecificityControls, MHC_ALLELE, NO_ALLELE, }; +use cr_types::reference::probe_set_reference::TargetSetFile; use cr_types::sample_def::{FastqMode, SampleDef}; -use cr_types::types::{CellMultiplexingType, CrMultiGraph}; +use cr_types::types::{BarcodeMultiplexingType, CellLevel, CrMultiGraph, ReadLevel}; use cr_types::{AlignerParam, FeatureBarcodeType, LibraryType, TargetingMethod, VdjChainType}; use fastq_set::filenames::FastqDef; use itertools::{process_results, Itertools}; +use martian::{AsMartianPrimaryType, MartianPrimaryType}; use martian_derive::martian_filetype; use metric::{TxHashMap, TxHashSet}; +use regex::Regex; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::convert::{AsRef, TryFrom}; @@ -46,7 +51,7 @@ use strum_macros::{Display as EnumDisplay, EnumString}; const MIN_FORCE_CELLS: usize = 10; -const ERROR_INCLUDE_INTRONS_WITH_RTL: &str = "The [gene-expression] section specifies the parameter include-introns, which is not valid for Fixed RNA Profiling chemistries."; +const ERROR_INCLUDE_INTRONS_WITH_RTL: &str = "The [gene-expression] section specifies the parameter include-introns, which is not valid for Flex chemistries."; const DEFAULT_OVERHANG_WL: &str = "overhang"; @@ -223,7 +228,9 @@ impl FromStr for Percent { /// A named collection of chemistries, zero or one per library type. /// This concept doesn't escape the configuration parsing stage, thus why it is /// declared here instead of with the rest of the chemistries. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, EnumDisplay, EnumString)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, EnumDisplay, EnumString, +)] #[strum(ascii_case_insensitive)] pub enum ChemistrySet { #[serde(rename = "MFRP")] @@ -232,6 +239,18 @@ pub enum ChemistrySet { #[serde(rename = "MFRP-R1")] #[strum(to_string = "MFRP-R1")] MfrpR1, + #[serde(rename = "SC3Pv3")] + #[strum(to_string = "SC3Pv3")] + ThreePrimeV3, + #[serde(rename = "SC3Pv3HT")] + #[strum(to_string = "SC3Pv3HT")] + ThreePrimeV3HT, + #[serde(rename = "SC3Pv4")] + #[strum(to_string = "SC3Pv4")] + ThreePrimeV4, + #[serde(rename = "SC3Pv4OCM")] + #[strum(to_string = "SC3Pv4OCM")] + ThreePrimeV4OCM, } impl ChemistrySet { @@ -241,43 +260,88 @@ impl ChemistrySet { fn is_rtl(&self) -> Option { match self { Self::Mfrp | Self::MfrpR1 => Some(true), + Self::ThreePrimeV3 + | Self::ThreePrimeV3HT + | Self::ThreePrimeV4 + | Self::ThreePrimeV4OCM => Some(false), } } fn is_mfrp(&self) -> bool { match self { Self::Mfrp | Self::MfrpR1 => true, + Self::ThreePrimeV3 + | Self::ThreePrimeV3HT + | Self::ThreePrimeV4 + | Self::ThreePrimeV4OCM => false, } } /// Return the specific chemistry for the provided library type. - fn chemistry_for_library_type(&self, library_type: LibraryType) -> Result { + pub fn chemistry_for_library_type(&self, library_type: LibraryType) -> Result { match self { Self::Mfrp => match library_type { LibraryType::Gex => Some(ChemistryName::MFRP_RNA), LibraryType::Antibody => Some(ChemistryName::MFRP_Ab), LibraryType::Crispr => Some(ChemistryName::MFRP_CRISPR), - _ => None + _ => None, }, Self::MfrpR1 => match library_type { LibraryType::Gex => Some(ChemistryName::MFRP_RNA_R1), LibraryType::Antibody => Some(ChemistryName::MFRP_Ab_R1), - _ => None - } - }.ok_or_else(|| anyhow!("the chemistry set {self} does not include a chemistry for library type {library_type}")) + _ => None, + }, + Self::ThreePrimeV3 => match library_type { + LibraryType::Gex => Some(ChemistryName::ThreePrimeV3PolyA), + LibraryType::Antibody + | LibraryType::Crispr + | LibraryType::Cellplex + | LibraryType::Custom => Some(ChemistryName::ThreePrimeV3CS1), + _ => None, + }, + Self::ThreePrimeV3HT => match library_type { + LibraryType::Gex => Some(ChemistryName::ThreePrimeV3HTPolyA), + LibraryType::Antibody + | LibraryType::Crispr + | LibraryType::Custom + | LibraryType::Cellplex => Some(ChemistryName::ThreePrimeV3HTCS1), + _ => None, + }, + Self::ThreePrimeV4 => match library_type { + LibraryType::Gex => Some(ChemistryName::ThreePrimeV4PolyA), + LibraryType::Antibody | LibraryType::Custom => Some(ChemistryName::ThreePrimeV4CS1), + _ => None, + }, + Self::ThreePrimeV4OCM => match library_type { + LibraryType::Gex => Some(ChemistryName::ThreePrimeV4PolyAOCM), + LibraryType::Antibody | LibraryType::Custom => { + Some(ChemistryName::ThreePrimeV4CS1OCM) + } + _ => None, + }, + } + .ok_or_else(|| { + anyhow!("The chemistry set {self} does not support the library type {library_type}.") + }) } } /// Specify a chemistry. /// Can be an auto detection mode, a specific manual chemistry, or a /// chemistry set to be unpacked later. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(untagged)] pub enum ChemistryParam { AutoOrRefined(AutoOrRefinedChemistry), Set(ChemistrySet), } +impl AsMartianPrimaryType for ChemistryParam { + fn as_martian_primary_type() -> MartianPrimaryType { + MartianPrimaryType::Str + } +} + impl ChemistryParam { #[allow(non_upper_case_globals)] /// Alias for custom chemistry. @@ -337,26 +401,36 @@ impl FromStr for ParseAutoOrRefinedChemistry { // of the chemistries here, but the aliases and case-insensitive // behavior are specific to this parsing and it should remain // confined to this module. + + // NOTE: if you add or modify options here, you must update the + // equivalent matcher in the telemetry configuration. "auto" => Auto(Count), "custom" => Refined(Custom), "threeprime" => Auto(ThreePrime), "fiveprime" => Auto(FivePrime), "sc3pv1" => Refined(ThreePrimeV1), "sc3pv2" => Refined(ThreePrimeV2), - "sc3pv3" => Refined(ThreePrimeV3), - "sc3pv4" => Refined(ThreePrimeV4), + "sc3pv3-polya" => Refined(ThreePrimeV3PolyA), + "sc3pv3-cs1" => Refined(ThreePrimeV3CS1), + "sc3pv4-polya" => Refined(ThreePrimeV4PolyA), + "sc3pv4-cs1" => Refined(ThreePrimeV4CS1), + "sc3pv4-polya-ocm" => Refined(ThreePrimeV4PolyAOCM), + "sc3pv4-cs1-ocm" => Refined(ThreePrimeV4CS1OCM), // Removed from CS - once disabled for PD, remove this as a valid // parse option and move the preflight check here. "sc3pv3lt" => Refined(ThreePrimeV3LT), - "sc3pv3ht" => Refined(ThreePrimeV3HT), + "sc3pv3ht-polya" => Refined(ThreePrimeV3HTPolyA), + "sc3pv3ht-cs1" => Refined(ThreePrimeV3HTCS1), "sc5p-pe" | "sc5ppe" => Refined(FivePrimePE), "sc5p-pe-v3" | "sc5ppev3" => Refined(FivePrimePEV3), + "sc5p-pe-ocm-v3" | "sc5ppeocmv3" => Refined(FivePrimePEOCMV3), "sc5p-r2" | "sc5pr2" => Refined(FivePrimeR2), "sc5p-r2-v3" | "sc5pr2v3" => Refined(FivePrimeR2V3), - "sc5p-r2-oh-v3" | "sc5pr2ohv3" => Refined(FivePrimeR2OHV3), + "sc5p-r2-ocm-v3" | "sc5pr2ocmv3" => Refined(FivePrimeR2OCMV3), "sc5pht" => Refined(FivePrimeHT), "sc-fb" | "scfb" => Refined(FeatureBarcodingOnly), "sfrp" => Refined(SFRP), + "sfrp-no-trim-r2" => Refined(SfrpNoTrimR2), "mfrp-rna" => Refined(MFRP_RNA), "mfrp-ab" => Refined(MFRP_Ab), "mfrp-crispr" => Refined(MFRP_CRISPR), @@ -366,6 +440,7 @@ impl FromStr for ParseAutoOrRefinedChemistry { "mfrp-ab-r1" => Refined(MFRP_Ab_R1), "mfrp-ab-r2pos50" => Refined(MFRP_Ab_R2pos50), "mfrp-r1-48-uncollapsed" => Refined(MFRP_R1_48_uncollapsed), + "mfrp-r1-no-trim-r2" => Refined(MfrpR1NoTrimR2), "arc-v1" => Refined(ArcV1), _ => bail!("unknown chemistry: {chemistry}"), })) @@ -375,8 +450,8 @@ impl FromStr for ParseAutoOrRefinedChemistry { /// The gene-expression parameters in the experiment CSV #[derive(Debug, Default, Serialize)] pub struct GeneExpressionParams { - pub reference_path: PathBuf, - pub probe_set: Option, + pub reference_path: Option, + pub probe_set: Vec, pub emptydrops_minimum_umis: Option, pub global_minimum_umis: Option, pub max_mito_percent: Option, @@ -395,20 +470,25 @@ pub struct GeneExpressionParams { pub cmo_set: Option, pub min_assignment_confidence: Option, pub barcode_sample_assignment: Option, - /// Select which model is used by the cell annotation service. The default string is "default" but will be validated by CAS - pub cas_model: Option, + /// Select which model is used by the cell annotation service. The default string is "default" but will be validated + pub cell_annotation_model: Option, + pub skip_cell_annotation: bool, + pub tenx_cloud_token_path: Option, } impl GeneExpressionParams { /// Return the probe set. - pub fn probe_set(&self) -> Option<&Path> { - self.probe_set.as_deref() + pub fn probe_set(&self) -> &[TargetSetFile] { + &self.probe_set + } + + pub fn has_probe_set(&self) -> bool { + !self.probe_set.is_empty() } /// Return the targeting_method. pub fn targeting_method(&self) -> Option { - self.probe_set - .is_some() + self.has_probe_set() .then_some(TargetingMethod::TemplatedLigation) } @@ -429,7 +509,7 @@ impl GeneExpressionParams { } pub fn invalid_parameter_with_antigen_capture(&self) -> Option { - if self.probe_set.is_some() { + if self.has_probe_set() { Some("probe-set".to_owned()) } else if self.cmo_set.is_some() { Some("cmo-set".to_owned()) @@ -447,6 +527,18 @@ impl GeneExpressionParams { self.targeting_method() == Some(TargetingMethod::TemplatedLigation) || self.chemistry.as_ref().and_then(ChemistryParam::is_rtl) == Some(true) } + + /// Return either the specified token path or the default one + pub fn get_tenx_cloud_token_path(&self) -> Option { + if self.tenx_cloud_token_path.is_none() { + if let Ok(default_token_path) = cloud_utils::default_token_path() { + return Some(default_token_path); + } + eprintln!("{}", cloud_utils::CELL_ANNOTATION_HOMEDIR_MSG); + return None; + } + self.tenx_cloud_token_path.clone() + } } /// A combinator to turn Some("") into None, useful for parsing logic @@ -463,8 +555,8 @@ impl<'a> TryFrom<&Section<'a>> for GeneExpressionParams { fn try_from(sec: &Section<'a>) -> Result { let ctx = ParseCtx::Hdr(sec.name); - let mut reference_path = PathBuf::new(); - let mut probe_set: Option = None; + let mut reference_path: Option = None; + let mut probe_set: Vec = Vec::new(); let mut filter_probes: Option = None; let mut emptydrops_minimum_umis = None; let mut global_minimum_umis = None; @@ -482,7 +574,9 @@ impl<'a> TryFrom<&Section<'a>> for GeneExpressionParams { let mut cmo_set: Option = None; let mut min_assignment_confidence: Option = None; let mut barcode_sample_assignment: Option = None; - let mut cas_model: Option = None; + let mut cell_annotation_model: Option = None; + let mut skip_cell_annotation: bool = false; + let mut tenx_cloud_token_path: Option = None; let mut filter_high_occupancy_gems = true; for row in &sec.rows { if row.is_empty() { @@ -492,16 +586,13 @@ impl<'a> TryFrom<&Section<'a>> for GeneExpressionParams { let ctx = ctx.with_col(param.as_str()); match param.as_str() { "ref" | "reference" | "reference-path" => { - reference_path = row - .get(1) - .ok_or_else(|| { - anyhow!("{ctx} no value provided for '{}'", row[0].fragment()) - })? - .parse::(ctx)?; + if let Some(path) = row.get(1).and_then(empty_is_none) { + reference_path = Some(path.parse::(ctx)?); + } } "probe-set" => { if let Some(path) = row.get(1).and_then(empty_is_none) { - probe_set = Some(path.parse::(ctx)?); + probe_set.push(TargetSetFile::from(path.parse::(ctx)?)); } } "filter-probes" => { @@ -598,9 +689,19 @@ impl<'a> TryFrom<&Section<'a>> for GeneExpressionParams { barcode_sample_assignment = Some(val.parse::(ctx)?); } } - "cas-model" => { + "cell-annotation-model" => { + if let Some(val) = row.get(1).and_then(empty_is_none) { + cell_annotation_model = Some(val.parse::(ctx)?); + } + } + "skip-cell-annotation" => { if let Some(val) = row.get(1).and_then(empty_is_none) { - cas_model = Some(val.parse::(ctx)?); + skip_cell_annotation = val.parse::(ctx)?.into(); + } + } + "tenx-cloud-token-path" => { + if let Some(val) = row.get(1).and_then(empty_is_none) { + tenx_cloud_token_path = Some(val.parse::(ctx)?); } } "filter-high-occupancy-gems" => { @@ -620,10 +721,6 @@ impl<'a> TryFrom<&Section<'a>> for GeneExpressionParams { } } - ensure!( - !reference_path.as_os_str().is_empty(), - "{ctx} reference is missing" - ); ensure!( !(expect_cells.is_some() && force_cells.is_some()), "{ctx} only one of force-cells or expect-cells is allowed.", @@ -631,12 +728,12 @@ impl<'a> TryFrom<&Section<'a>> for GeneExpressionParams { if filter_probes.is_some() { ensure!( - probe_set.is_some(), + !probe_set.is_empty(), "{ctx} filter-probes requires a probe-set.", ); } - if probe_set.is_some() { + if !probe_set.is_empty() { ensure!( cmo_set.is_none(), "{ctx} When probe-set is specified, cmo-set is an invalid parameter.", @@ -659,7 +756,7 @@ impl<'a> TryFrom<&Section<'a>> for GeneExpressionParams { } // Filter probes by default. - if probe_set.is_some() && filter_probes.is_none() { + if !probe_set.is_empty() && filter_probes.is_none() { filter_probes = Some(true); } @@ -687,7 +784,9 @@ impl<'a> TryFrom<&Section<'a>> for GeneExpressionParams { cmo_set, min_assignment_confidence, barcode_sample_assignment, - cas_model, + cell_annotation_model, + skip_cell_annotation, + tenx_cloud_token_path, filter_high_occupancy_gems, }) } @@ -1121,11 +1220,11 @@ impl Library { } } - pub fn to_fastq_def(&self, config: &MultiConfigCsv) -> Result { - self.to_sample_def(config)?.get_fastq_def() + pub fn to_fastq_def(&self) -> Result { + self.to_sample_def()?.get_fastq_def() } - pub fn to_sample_def(&self, config: &MultiConfigCsv) -> Result { + pub fn to_sample_def(&self) -> Result { let lanes = self.lanes().clone().into(); let library_type = Some({ // CELLRANGER-7889: this was previously an domain boundary where all @@ -1139,18 +1238,6 @@ impl Library { library_type } }); - let target_set = if library_type == Some(LibraryType::Gex) { - config - .gene_expression - .as_ref() - .and_then(GeneExpressionParams::probe_set) - .map(PathBuf::from) - } else { - None - }; - let target_set_name = target_set - .as_ref() - .map(|x| x.file_stem().unwrap().to_string_lossy().into_owned()); match self { Self::Bcl2Fastq { fastqs, @@ -1175,8 +1262,6 @@ impl Library { sample_indices: None, sample_names: Some(vec![sample_name]), subsample_rate: *subsample_rate, - target_set, - target_set_name, fastq_id: Some(fastq_id.clone()), }) } @@ -1186,21 +1271,30 @@ impl Library { gem_well, subsample_rate, .. - } => Ok(SampleDef { - fastq_mode: FastqMode::BCL_PROCESSOR, - gem_group: Some(gem_well.0), - lanes, - library_type, - r1_length: None, - r2_length: None, - read_path: fastq_path.clone(), - sample_indices: Some(sample_indices.clone()), - sample_names: None, - subsample_rate: *subsample_rate, - target_set, - target_set_name, - fastq_id: None, - }), + } => { + // Heuristic to use the flowcell id as the fastq_id based on how internal fastqs + // are along paths like: + // /somepath/pipestances/HKWWVDSXC/BCL_PROCESSOR_PD/... + let pattern = r"([^/]+)/BCL_PROCESSOR_PD"; + let re = Regex::new(pattern).unwrap(); + + let flow_cell_id = re + .captures(fastq_path.to_str().unwrap()) + .and_then(|caps| caps.get(1).map(|m| String::from(m.as_str()))); + Ok(SampleDef { + fastq_mode: FastqMode::BCL_PROCESSOR, + gem_group: Some(gem_well.0), + lanes, + library_type, + r1_length: None, + r2_length: None, + read_path: fastq_path.clone(), + sample_indices: Some(sample_indices.clone()), + sample_names: None, + subsample_rate: *subsample_rate, + fastq_id: flow_cell_id, + }) + } } } } @@ -1542,6 +1636,7 @@ pub const PROBE_BARCODE_ID_GROUPING: &str = "+"; pub struct SampleRow { pub sample_id: String, cmo_ids: Option>, + hashtag_ids: Option>, /// NOTE: these may be +-concatenated groupings. Access via the /// sample_barcode_ids method to control how they are unpacked. probe_barcode_ids: Option>, @@ -1582,14 +1677,17 @@ impl SampleRow { ) -> Option>> { match ( self.cmo_ids.as_ref(), + self.hashtag_ids.as_ref(), self.probe_barcode_ids.as_ref(), self.overhang_ids.as_ref(), ) { - (Some(x), None, None) | (None, None, Some(x)) => { - // cmo_ids or overhang_ids + (Some(x), None, None, None) + | (None, Some(x), None, None) + | (None, None, None, Some(x)) => { + // cmo_ids or hashtag_ids or overhang_ids Some(x.iter().map(|v| vec![v.as_str()]).collect()) } - (None, Some(x), None) => { + (None, None, Some(x), None) => { // probe_barcode_ids Some( x.iter() @@ -1606,31 +1704,34 @@ impl SampleRow { .collect(), ) } - (None, None, None) => None, + (None, None, None, None) => None, _ => panic!("found more than one source of sample barcode IDs"), } } /// Return the type of cell multiplexing. - pub fn cell_multiplexing_type(&self) -> CellMultiplexingType { + pub fn barcode_multiplexing_type(&self) -> BarcodeMultiplexingType { match ( self.cmo_ids.is_some(), + self.hashtag_ids.is_some(), self.probe_barcode_ids.is_some(), self.overhang_ids.is_some(), ) { - (true, false, false) => CellMultiplexingType::CMO, - (false, true, false) => CellMultiplexingType::RTL, - (false, false, true) => CellMultiplexingType::OH, + (true, false, false, false) => BarcodeMultiplexingType::CellLevel(CellLevel::CMO), + (false, true, false, false) => BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag), + (false, false, true, false) => BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL), + (false, false, false, true) => BarcodeMultiplexingType::ReadLevel(ReadLevel::OH), _ => unreachable!(), } } - /// Return the appropriate column name, either cmo_ids or probe_barcode_ids. + /// Return the appropriate column name. pub fn sample_barcode_ids_column_name(&self) -> &str { - match self.cell_multiplexing_type() { - CellMultiplexingType::CMO => samplesconst::CMO_IDS, - CellMultiplexingType::RTL => samplesconst::PROBE_BARCODE_IDS, - CellMultiplexingType::OH => samplesconst::OH_IDS, + match self.barcode_multiplexing_type() { + BarcodeMultiplexingType::CellLevel(CellLevel::CMO) => samplesconst::CMO_IDS, + BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag) => samplesconst::HASHTAG_IDS, + BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL) => samplesconst::PROBE_BARCODE_IDS, + BarcodeMultiplexingType::ReadLevel(ReadLevel::OH) => samplesconst::OH_IDS, } } } @@ -1650,6 +1751,14 @@ impl SamplesCsv { self.0.iter().any(|sample| sample.overhang_ids.is_some()) } + pub fn has_hashtag_ids(&self) -> bool { + self.0.iter().any(|sample| sample.hashtag_ids.is_some()) + } + + pub fn has_cmo_ids(&self) -> bool { + self.0.iter().any(|sample| sample.cmo_ids.is_some()) + } + fn has_force_cells(&self) -> bool { self.0.iter().any(|sample| sample.force_cells.is_some()) } @@ -1730,9 +1839,9 @@ impl SamplesCsv { } pub fn is_rtl_multiplexed(&self) -> bool { - self.0 - .iter() - .all(|sample| sample.cell_multiplexing_type() == CellMultiplexingType::RTL) + self.0.iter().all(|sample| { + sample.barcode_multiplexing_type() == BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL) + }) } pub fn get_cmo_sample_map(&self) -> TxHashMap { @@ -1750,6 +1859,22 @@ impl SamplesCsv { res } + pub fn get_hashtag_sample_map(&self) -> TxHashMap { + let mut res = TxHashMap::default(); + for row in &self.0 { + if let Some(ref hashtag_ids) = row.hashtag_ids { + for hashtag_id in hashtag_ids { + assert!( + res.insert(hashtag_id.clone(), row.sample_id.clone()) + .is_none(), + "hashtag_id {hashtag_id} used for multiple samples" + ); + } + } + } + res + } + /// Return a mapping from source to translated probe barcode. /// This method handles interpreting probe barcodes concatenated with a + /// which indicate to the pipeline that all of the IDs following the first @@ -1792,11 +1917,12 @@ pub enum ProbeBarcodeIterationMode { Mapped, } -mod samplesconst { +pub mod samplesconst { pub const SAMPLE_ID: &str = "sample_id"; pub const CMO_IDS: &str = "cmo_ids"; + pub const HASHTAG_IDS: &str = "hashtag_ids"; pub const PROBE_BARCODE_IDS: &str = "probe_barcode_ids"; - pub const OH_IDS: &str = "overhang_ids"; + pub const OH_IDS: &str = "ocm_barcode_ids"; pub const _GEM_WELLS: &str = "gem_wells"; pub const DESCRIPTION: &str = "description"; pub const EXPECT_CELLS: &str = "expect_cells"; @@ -1808,6 +1934,7 @@ mod samplesconst { #[cfg(not(test))] pub const SAMP_OPT_HDRS: &[&str] = &[ CMO_IDS, + HASHTAG_IDS, OH_IDS, PROBE_BARCODE_IDS, DESCRIPTION, @@ -1820,6 +1947,7 @@ mod samplesconst { #[cfg(test)] pub const SAMP_OPT_HDRS: &[&str] = &[ CMO_IDS, + HASHTAG_IDS, PROBE_BARCODE_IDS, OH_IDS, _GEM_WELLS, @@ -1837,7 +1965,7 @@ impl<'a> TryFrom<(&TxHashSet, &Section<'a>)> for SamplesCsv { fn try_from((valid_gws, sec): (&TxHashSet, &Section<'a>)) -> Result { use samplesconst::{ - CMO_IDS, DESCRIPTION, EMPTYDROPS_MINIMUM_UMIS, EXPECT_CELLS, FORCE_CELLS, + CMO_IDS, DESCRIPTION, EMPTYDROPS_MINIMUM_UMIS, EXPECT_CELLS, FORCE_CELLS, HASHTAG_IDS, MAX_MITO_FRAC, OH_IDS, PROBE_BARCODE_IDS, SAMPLE_ID, SAMP_OPT_HDRS, SAMP_REQ_HDRS, _GEM_WELLS, }; @@ -1852,27 +1980,36 @@ impl<'a> TryFrom<(&TxHashSet, &Section<'a>)> for SamplesCsv { .into(); let cmo_ids = parser.find_opt(row, CMO_IDS)?; + let hashtag_ids = parser.find_opt(row, HASHTAG_IDS)?; let probe_barcode_ids = parser.find_opt(row, PROBE_BARCODE_IDS)?; let overhang_ids = parser.find_opt(row, OH_IDS)?; - let sample_barcode_ids = cmo_ids.or(probe_barcode_ids).or(overhang_ids); - let cell_multiplexing_type = match (cmo_ids, probe_barcode_ids, overhang_ids) { - (Some(_), None, None) => CellMultiplexingType::CMO, - (None, Some(_), None) => CellMultiplexingType::RTL, - (None, None, Some(_)) => CellMultiplexingType::OH, - (None, None, None) => { + let sample_barcode_ids = cmo_ids + .or(hashtag_ids) + .or(probe_barcode_ids) + .or(overhang_ids); + let barcode_multiplexing_type = match ( + cmo_ids, + hashtag_ids, + probe_barcode_ids, + overhang_ids, + ) { + (Some(_), None, None, None) => BarcodeMultiplexingType::CellLevel(CellLevel::CMO), + (None, Some(_), None, None) => { + BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag) + } + (None, None, Some(_), None) => BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL), + (None, None, None, Some(_)) => BarcodeMultiplexingType::ReadLevel(ReadLevel::OH), + (None, None, None, None) => { bail!( - "{ctx} requires either {CMO_IDS} or {PROBE_BARCODE_IDS} or {OH_IDS} column \ + "{ctx} requires either {CMO_IDS} or {HASHTAG_IDS} or {PROBE_BARCODE_IDS} or {OH_IDS} column \ to be specified" ) } - (Some(_), Some(_), _) => { - bail!("{ctx} has mutually exclusive columns {CMO_IDS} and {PROBE_BARCODE_IDS}") - } - (None, Some(_), Some(_)) => { - bail!("{ctx} has mutually exclusive columns {PROBE_BARCODE_IDS} and {OH_IDS}") - } - (Some(_), None, Some(_)) => { - bail!("{ctx} has mutually exclusive columns {CMO_IDS} and {OH_IDS}") + (_, _, _, _) => { + bail!( + "{ctx} has more than one of the following mutually exclusive columns: \ + {CMO_IDS}, {HASHTAG_IDS}, {PROBE_BARCODE_IDS} and/or {OH_IDS}" + ) } }; let expect_cells = parser.find_opt(row, EXPECT_CELLS)?; @@ -1892,55 +2029,62 @@ impl<'a> TryFrom<(&TxHashSet, &Section<'a>)> for SamplesCsv { without the required {PROBE_BARCODE_IDS} column", ); }; - let sample_barcode_column_name = match cell_multiplexing_type { - CellMultiplexingType::CMO => CMO_IDS, - CellMultiplexingType::RTL => PROBE_BARCODE_IDS, - CellMultiplexingType::OH => OH_IDS, + let sample_barcode_column_name = match barcode_multiplexing_type { + BarcodeMultiplexingType::CellLevel(CellLevel::CMO) => CMO_IDS, + BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag) => HASHTAG_IDS, + BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL) => PROBE_BARCODE_IDS, + BarcodeMultiplexingType::ReadLevel(ReadLevel::OH) => OH_IDS, }; - let sample_barcode_ids: Option> = if let Some(sample_barcode_ids) = - sample_barcode_ids.and_then(empty_is_none) - { - let Ok(sample_barcode_ids_in) = parse_vec(sample_barcode_ids.clone()) else { - bail!( - "{ctx} has invalid {} '{}' at line: {}, col: {}", - sample_barcode_column_name, - sample_barcode_ids.fragment(), - sample_barcode_ids.location_line(), - sample_barcode_ids.get_utf8_column(), - ) - }; + let sample_barcode_ids: Option> = + if let Some(sample_barcode_ids) = sample_barcode_ids.and_then(empty_is_none) { + let Ok(sample_barcode_ids_in) = parse_vec(sample_barcode_ids.clone()) else { + bail!( + "{ctx} has invalid {} '{}' at line: {}, col: {}", + sample_barcode_column_name, + sample_barcode_ids.fragment(), + sample_barcode_ids.location_line(), + sample_barcode_ids.get_utf8_column(), + ) + }; - let sample_barcode_ids_iter = sample_barcode_ids_in - .into_iter() - .map(parse_prefixed_range) - .flatten_ok() - .map(|multiplexing_id| { - let multiplexing_id = multiplexing_id?; - match cell_multiplexing_type { - CellMultiplexingType::RTL => validate_probe_barcode_id(multiplexing_id), - CellMultiplexingType::CMO => { - multiplexing_id.parse::().map(|_| multiplexing_id) + let sample_barcode_ids_iter = sample_barcode_ids_in + .into_iter() + .map(parse_prefixed_range) + .flatten_ok() + .map(|multiplexing_id| { + let multiplexing_id = multiplexing_id?; + match barcode_multiplexing_type { + BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL) => { + validate_probe_barcode_id(multiplexing_id) + } + BarcodeMultiplexingType::CellLevel(CellLevel::CMO) => { + multiplexing_id.parse::().map(|_| multiplexing_id) + } + BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag) => { + multiplexing_id.parse::().map(|_| multiplexing_id) + } + BarcodeMultiplexingType::ReadLevel(ReadLevel::OH) => { + Ok(multiplexing_id) + } } - CellMultiplexingType::OH => Ok(multiplexing_id), - } - .with_context(|| { - format!( - "{ctx} has invalid {} '{}' at line: {}, col: {}", - sample_barcode_column_name, - sample_barcode_ids.fragment(), - sample_barcode_ids.location_line(), - sample_barcode_ids.get_utf8_column(), - ) - }) - }); - - Some(process_results(sample_barcode_ids_iter, |iter| { - iter.sorted().dedup().collect() - })?) - } else { - None - }; + .with_context(|| { + format!( + "{ctx} has invalid {} '{}' at line: {}, col: {}", + sample_barcode_column_name, + sample_barcode_ids.fragment(), + sample_barcode_ids.location_line(), + sample_barcode_ids.get_utf8_column(), + ) + }) + }); + + Some(process_results(sample_barcode_ids_iter, |iter| { + iter.sorted().dedup().collect() + })?) + } else { + None + }; let gem_wells_frag = None; let gem_wells = gem_wells_frag @@ -2020,10 +2164,24 @@ impl<'a> TryFrom<(&TxHashSet, &Section<'a>)> for SamplesCsv { All entries must be non-empty.", ); - data.push(match cell_multiplexing_type { - CellMultiplexingType::CMO => SampleRow { + data.push(match barcode_multiplexing_type { + BarcodeMultiplexingType::CellLevel(CellLevel::CMO) => SampleRow { sample_id, cmo_ids: sample_barcode_ids, + hashtag_ids: None, + probe_barcode_ids: None, + overhang_ids: None, + description, + force_cells: None, + expect_cells: None, + emptydrops_minimum_umis, + global_minimum_umis, + max_mito_percent, + }, + BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag) => SampleRow { + sample_id, + cmo_ids: None, + hashtag_ids: sample_barcode_ids, probe_barcode_ids: None, overhang_ids: None, description, @@ -2033,9 +2191,10 @@ impl<'a> TryFrom<(&TxHashSet, &Section<'a>)> for SamplesCsv { global_minimum_umis, max_mito_percent, }, - CellMultiplexingType::RTL => SampleRow { + BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL) => SampleRow { sample_id, cmo_ids: None, + hashtag_ids: None, probe_barcode_ids: sample_barcode_ids, overhang_ids: None, description, @@ -2045,9 +2204,10 @@ impl<'a> TryFrom<(&TxHashSet, &Section<'a>)> for SamplesCsv { global_minimum_umis, max_mito_percent, }, - CellMultiplexingType::OH => SampleRow { + BarcodeMultiplexingType::ReadLevel(ReadLevel::OH) => SampleRow { sample_id, cmo_ids: None, + hashtag_ids: None, probe_barcode_ids: None, overhang_ids: sample_barcode_ids, description, @@ -2243,6 +2403,7 @@ pub fn create_feature_config( antigen_specificity_csv: Option<&AntigenSpecificityCsv>, functional_map_csv: Option<&FunctionalMapCsv>, beam_mode: Option, + samples_csv: Option<&SamplesCsv>, ) -> Option { let specificity_controls = create_specificity_controls(antigen_specificity_csv); @@ -2267,11 +2428,28 @@ pub fn create_feature_config( None }; - if specificity_controls.is_some() || functional_map_csv.is_some() { + let hashtag_ids: Option> = samples_csv.and_then(|samples| { + if samples.has_hashtag_ids() { + Some( + samples + .0 + .iter() + .filter_map(|s| s.sample_barcode_ids(ProbeBarcodeIterationMode::All)) + .flatten() + .map(std::string::ToString::to_string) + .collect(), + ) + } else { + None + } + }); + + if specificity_controls.is_some() || functional_map_csv.is_some() || hashtag_ids.is_some() { Some(FeatureConfig { specificity_controls, beam_mode, functional_map, + hashtag_ids, }) } else { None @@ -2373,12 +2551,12 @@ pub struct MultiConfigCsv { /// A representation of a `cellranger multi` configuration impl MultiConfigCsv { /// Load a MultiConfigCsv from a path - fn from_csv>(path: P) -> Result { - let f = File::open(path.as_ref())?; - let reader = BufReader::new(f); - let xtra = XtraData::new(path); - let config = MultiConfigCsv::from_reader(reader, xtra)?; - Ok(config) + fn from_csv(path: impl AsRef) -> Result { + let path = path.as_ref(); + MultiConfigCsv::from_reader( + BufReader::new(File::open(path).with_context(|| path.display().to_string())?), + XtraData::new(path), + ) } /// Load an MultiConfigCsv from any `impl Read` along with parsing `XtraData` @@ -2443,7 +2621,7 @@ impl MultiConfigCsv { let mut builder = CrMultiGraphBuilder::new(); for lib in &self.libraries.0 { let physical_library_id = lib.physical_library_id().to_string(); - let fastq = lib.to_fastq_def(self)?; + let fastq = lib.to_fastq_def()?; let gem_well = lib.gem_well().0.into(); builder.push_library(physical_library_id, fastq, lib.library_type(), gem_well)?; } @@ -2482,7 +2660,7 @@ impl MultiConfigCsv { .get(sample_barcode_id) .map(|bcs| bcs.iter().map(ToString::to_string).collect()) .unwrap_or_default(), - sample.cell_multiplexing_type(), + sample.barcode_multiplexing_type(), ), )?; } @@ -2753,6 +2931,17 @@ impl MultiConfigCsvBuilder { ); } + let has_hashtag_ids = samples.is_some_and(SamplesCsv::has_hashtag_ids); + if has_hashtag_ids { + ensure!( + libraries.has_gene_expression() && libraries.has_antibody_capture(), + "failed to parse CSV: [{}] section specified {} parameter \ + which require both Gene Expression and Antibody Capture libraries.", + multiconst::SAMPLES, + samplesconst::HASHTAG_IDS, + ); + } + if antigen_specificity.is_some() { ensure!( libraries.has_antigen_capture(), @@ -2812,7 +3001,7 @@ impl MultiConfigCsvBuilder { ensure!( !gene_expression.is_some_and(GeneExpressionParams::has_expect_or_force_cells), "failed to parse CSV: specified `{}` as the `chemistry` and \ - cell calling parameters in {} section. For multiplex Fixed RNA Profiling libraries \ + cell calling parameters in {} section. For multiplex Flex libraries \ `expect-cells` or `force-cells' parameter is valid only in [{}] section.", mfrp_chem, multiconst::GENE_EXPRESSION, @@ -2823,9 +3012,9 @@ impl MultiConfigCsvBuilder { if is_rtl { if libraries.has_gene_expression() { ensure!( - gene_expression.is_some_and(|gex| gex.probe_set.is_some()), + gene_expression.is_some_and(GeneExpressionParams::has_probe_set), "failed to parse CSV: [{}] section is missing `probe-set` a required \ - parameter for Fixed RNA Profiling", + parameter for Flex", multiconst::GENE_EXPRESSION, ); } @@ -2845,8 +3034,8 @@ impl MultiConfigCsvBuilder { .iter() .all(|chem| chem.is_rtl() != Some(false)), "failed to parse CSV: [{}] section manually specifies a \ - non-Fixed RNA Profiling chemistry but [{}] section has a {} column. \ - The {} column may only be specified with Fixed RNA Profiling chemistries", + non-Flex chemistry but [{}] section has a {} column. \ + The {} column may only be specified with Flex chemistries", multiconst::GENE_EXPRESSION, multiconst::SAMPLES, samplesconst::PROBE_BARCODE_IDS, @@ -2858,10 +3047,9 @@ impl MultiConfigCsvBuilder { !(gene_expression.is_some_and(GeneExpressionParams::has_expect_or_force_cells) && has_probe_barcode_ids), "failed to parse CSV: [{}] section has a {} column indicating multiplex \ - Fixed RNA Profiling chemistry, however a cell calling parameter is specified \ + Flex chemistry, however a cell calling parameter is specified \ in [{}] section. The parameters `expect-cells` or `force-cells' are valid \ - in [{}] section for singleplex Fixed RNA Profiling and in [{}] section \ - for multiplex Fixed RNA Profiling.", + in [{}] section for singleplex Flex and in [{}] section for multiplex Flex.", multiconst::SAMPLES, samplesconst::PROBE_BARCODE_IDS, multiconst::GENE_EXPRESSION, @@ -2908,11 +3096,13 @@ mod tests { use anyhow::Result; use barcode::whitelist::BarcodeId; use cr_types::chemistry::{AutoOrRefinedChemistry, ChemistryName}; - use cr_types::LibraryType; + use cr_types::reference::probe_set_reference::TargetSetFile; + use cr_types::{BarcodeMultiplexingType, CellLevel, Fingerprint, GemWell, LibraryType}; + use insta::{assert_debug_snapshot, assert_json_snapshot, assert_snapshot}; use itertools::Itertools; use metric::TxHashMap; use std::collections::HashMap; - use std::path::Path; + use std::path::{Path, PathBuf}; // initialize insta test harness #[ctor::ctor] @@ -3131,7 +3321,7 @@ IAmABad*SampleId,CMO1,1,some cells "#; let xtra = XtraData::new("tests::invalid_sample_id_chars"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); } #[test] @@ -3152,7 +3342,7 @@ IAmABad#SampleId,CMO1,1,some cells "#; let xtra = XtraData::new("tests::invalid_sample_id_chars_2"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); } #[test] @@ -3173,7 +3363,7 @@ IAmToooooooooooooooooooooooooooooooooooooooooooooooooooooooooLong,CMO1,1,some ce "#; let xtra = XtraData::new("tests::too_long_sample_id"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); } #[test] @@ -3361,7 +3551,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, "#; let xtra = XtraData::new("test::test_autogen_phys_lib_id_two_vdj_libs"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); } /// Ensure that antigen capture is accompanied with a VDJ library @@ -3383,7 +3573,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::antigen_required_vdj"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); Ok(()) } @@ -3408,7 +3598,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::antigen_specificity_requires_ag"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); Ok(()) } @@ -3434,7 +3624,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::antigen_specificity_multiple_control_ids"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); Ok(()) } @@ -3460,7 +3650,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::antigen_specificity_missing_allele"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); Ok(()) } @@ -3490,7 +3680,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::invalid_mhc_allele_character"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); Ok(()) } @@ -3513,7 +3703,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::test_functional_map_requires_feature"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); Ok(()) } @@ -3545,7 +3735,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::test_invalid_functional_map_value"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); // Duplicate functional name let csv = r#" @@ -3573,7 +3763,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::test_invalid_functional_map_value"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); Ok(()) } @@ -3607,10 +3797,59 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, .gene_expression .expect("gene expression section not present"); assert_eq!( - gex.probe_set.as_deref(), - Some(Path::new("/path/to/probe_set")) + gex.probe_set, + vec![TargetSetFile::from("/path/to/probe_set")] + ); + assert_eq!(gex.reference_path, Some(PathBuf::from("mm10-2020-A-chr19"))); + + let lib_count = res.libraries.0.len(); + assert_eq!(lib_count, 2, "expected 2 libraries, found {lib_count}"); + + let sample_count = res.samples.expect("samples section not present").0.len(); + assert_eq!(sample_count, 2); + + Ok(()) + } + + #[test] + fn test_multiple_probe_sets() -> Result<()> { + let csv = r#" + [gene-expression] + ref,mm10-2020-A-chr19 + create-bam,true + probe-set,/path/to/probe_set1 + probe-set,/path/to/probe_set2 + + [libraries] + fastq_id,fastqs,lanes,physical_library_id,feature_types,subsample_rate + mygex,/path/to/fastqs,any,gex,gene expression,0.5 + + mycmo,/path/to/fastqs,any,cmo,Multiplexing Capture, + + [samples] + sample_id,cmo_ids + sample1,1 + + sample2,2 + "#; + + let xtra = XtraData::new("test::blank_lines"); + let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra)?; + + let gex = res + .gene_expression + .expect("gene expression section not present"); + assert_eq!( + gex.probe_set, + vec![ + TargetSetFile::from("/path/to/probe_set1"), + TargetSetFile::from("/path/to/probe_set2"), + ] + ); + assert_eq!( + gex.reference_path.as_deref(), + Some(Path::new("mm10-2020-A-chr19")) ); - assert_eq!(&gex.reference_path, Path::new("mm10-2020-A-chr19")); let lib_count = res.libraries.0.len(); assert_eq!(lib_count, 2, "expected 2 libraries, found {lib_count}"); @@ -3743,7 +3982,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, ); // Test that we generate a multi graph with expected content. - insta::assert_json_snapshot!( + assert_json_snapshot!( "expected_probe_barcode_pairing_graph", res.to_multi_graph("test", "test description", None)? ); @@ -3751,7 +3990,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, // Test that we ignore a detected probe barcode pairing if we have an // explicit one. let different_pairing = create_bc_pairing(&[("BC1", "BC10"), ("BC2", "BC7")]); - insta::assert_json_snapshot!( + assert_json_snapshot!( "expected_probe_barcode_pairing_graph", res.to_multi_graph("test", "test description", Some(&different_pairing))? ); @@ -3807,7 +4046,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, let xtra = XtraData::new("test::"); let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra)?; let detected_pairing = create_bc_pairing(&[("BC1", "AB1"), ("BC3", "AB3")]); - insta::assert_json_snapshot!(res.to_multi_graph( + assert_json_snapshot!(res.to_multi_graph( "test", "test description", Some(&detected_pairing) @@ -3902,48 +4141,45 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, #[test] fn test_duplicate_sample_ids() { let res = MultiConfigCsv::from_csv("test/invalid_csvs/duplicate_sample_ids.csv"); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); } #[test] fn test_mismatched_lib_feature_types() { let res = MultiConfigCsv::from_csv("test/invalid_csvs/mismatched_lib_feature_types.csv"); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); } #[test] fn test_redefined_physical_library_id() { let res = MultiConfigCsv::from_csv("test/invalid_csvs/redefined_physical_library_id.csv"); - insta::assert_display_snapshot!(res.unwrap_err()); + assert_snapshot!(res.unwrap_err()); } #[test] fn test_force_cells_too_low() { - insta::assert_display_snapshot!(MultiConfigCsv::from_csv( - "test/invalid_csvs/force_cells_too_low.csv" - ) - .unwrap_err()); + assert_snapshot!( + MultiConfigCsv::from_csv("test/invalid_csvs/force_cells_too_low.csv").unwrap_err() + ); } #[test] fn test_duplicate_libraries() { - insta::assert_display_snapshot!(MultiConfigCsv::from_csv( - "test/invalid_csvs/duplicate_libraries.csv" - ) - .unwrap_err()); + assert_snapshot!( + MultiConfigCsv::from_csv("test/invalid_csvs/duplicate_libraries.csv").unwrap_err() + ); } #[test] fn test_multiplexing_no_samples() { - insta::assert_display_snapshot!(MultiConfigCsv::from_csv( - "test/invalid_csvs/multiplexing_no_samples.csv" - ) - .unwrap_err()); + assert_snapshot!( + MultiConfigCsv::from_csv("test/invalid_csvs/multiplexing_no_samples.csv").unwrap_err() + ); } #[test] fn test_multiple_vdjt_libraries() { - insta::assert_debug_snapshot!(MultiConfigCsv::from_csv("test/multiple_vdj_t.csv")); + assert_debug_snapshot!(MultiConfigCsv::from_csv("test/multiple_vdj_t.csv")); } #[test] @@ -3953,7 +4189,7 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, #[test] fn test_expect_cells_and_force_cells_samples() { - insta::assert_display_snapshot!(MultiConfigCsv::from_csv( + assert_snapshot!(MultiConfigCsv::from_csv( "test/invalid_csvs/expect_cells_and_force_cells_samples.csv" ) .unwrap_err()); @@ -3961,23 +4197,21 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, #[test] fn test_frp_chemistry_with_samples() { - insta::assert_display_snapshot!(MultiConfigCsv::from_csv( - "test/invalid_csvs/frp_chem_with_samples.csv" - ) - .unwrap_err()); + assert_snapshot!( + MultiConfigCsv::from_csv("test/invalid_csvs/frp_chem_with_samples.csv").unwrap_err() + ); } #[test] fn test_mfrp_chemistry_without_samples() { - insta::assert_display_snapshot!(MultiConfigCsv::from_csv( - "test/invalid_csvs/mfrp_chem_no_samples.csv" - ) - .unwrap_err()); + assert_snapshot!( + MultiConfigCsv::from_csv("test/invalid_csvs/mfrp_chem_no_samples.csv").unwrap_err() + ); } #[test] fn test_mfrp_chemistry_with_missing_probe_barcode_entry() { - insta::assert_display_snapshot!(MultiConfigCsv::from_csv( + assert_snapshot!(MultiConfigCsv::from_csv( "test/invalid_csvs/mfrp_chemistry_with_missing_probe_barcode_entry.csv" ) .unwrap_err()); @@ -4029,4 +4263,77 @@ vdj_ig,fastqs/cellranger/multi/vdj_ig_tiny,any,,vdj, Ok(()) } + + #[test] + fn test_hashtag_id_missing_gex_lib() { + let csv = r#" + [gene-expression] + ref,GRCh38-2020 + create-bam,true + + [feature] + ref,path/to/feature_ref.csv + + [libraries] + fastq_id,fastqs,physical_library_id,feature_types + myab,/path/to/fastqs,ab,antibody capture + + [samples] + sample_id, hashtag_ids, description + 1,CD4|CD8a,t_cells + 2,CD19, b_cells + "#; + + assert_snapshot!( + MultiConfigCsv::from_reader(csv.as_bytes(), XtraData::new("test::")).unwrap_err() + ); + } + + #[test] + fn test_multi_graph_hashtag_fingerprint() -> Result<()> { + let csv = r#" + [gene-expression] + ref,GRCh38-2020 + create-bam,true + + [feature] + ref,path/to/feature_ref.csv + + [libraries] + fastq_id,fastqs,physical_library_id,feature_types + myab,/path/to/fastqs,ab,antibody capture + myab,/path/to/other/fastqs,gex,gene expression + + [samples] + sample_id, hashtag_ids, description + 1,CD4|CD8a,t_cells + 2,CD19, b_cells + "#; + + let xtra = XtraData::new("test::"); + let res = MultiConfigCsv::from_reader(csv.as_bytes(), xtra)?; + let sample1_fprint = vec![ + Fingerprint::Tagged { + gem_well: GemWell(1), + tag_name: "CD4".to_owned(), + barcode_multiplexing_type: BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag), + translated_tag_names: vec![], + }, + Fingerprint::Tagged { + gem_well: GemWell(1), + tag_name: "CD8a".to_owned(), + barcode_multiplexing_type: BarcodeMultiplexingType::CellLevel(CellLevel::Hashtag), + translated_tag_names: vec![], + }, + ]; + let mgraph_fprint = res + .to_multi_graph("sample_id", "sample_desc", None)? + .samples + .first() + .unwrap() + .fingerprints + .clone(); + assert_eq!(sample1_fprint, mgraph_fprint); + Ok(()) + } } diff --git a/lib/rust/multi/src/config/preflight.rs b/lib/rust/multi/src/config/preflight.rs index 2054b70..78205f6 100644 --- a/lib/rust/multi/src/config/preflight.rs +++ b/lib/rust/multi/src/config/preflight.rs @@ -7,11 +7,12 @@ use super::{ use crate::cmo_set::load_default_cmo_set; use crate::config::{get_default_overhang_set, libsconst, ChemistrySet, PROBE_BARCODE_ID_GROUPING}; use anyhow::{bail, ensure, Context, Result}; -use barcode::whitelist::{categorize_multiplexing_barcode_id, MultiplexingBarcodeType}; +use barcode::whitelist::{categorize_rtl_multiplexing_barcode_id, RTLMultiplexingBarcodeType}; use cr_types::chemistry::{AutoOrRefinedChemistry, ChemistryDef, ChemistryName, ChemistrySpecs}; use cr_types::reference::feature_extraction::FeatureExtractor; -use cr_types::reference::feature_reference::{BeamMode, FeatureConfig, FeatureReference}; -use cr_types::reference::reference_info::ReferenceInfo; +use cr_types::reference::feature_reference::{ + BeamMode, FeatureConfig, FeatureReference, FeatureType, +}; use cr_types::{FeatureBarcodeType, LibraryType, VdjChainType}; use fastq_set::WhichRead; use itertools::Itertools; @@ -174,22 +175,20 @@ pub fn check_libraries( ); // Make sure out reference actually contains this feature barcode type. - if let Some(ftype) = lib.library_type().feature_barcode_type() { + if let Some(feature_type) = lib.library_type().feature_barcode_type() { if let Some(fref) = &fref { - if !fref.feature_maps.contains_key( - &cr_types::reference::feature_reference::FeatureType::Barcode(ftype), - ) { - bail!( - "You declared a library with feature_type = '{}', but there are no features with that feature_type in the feature reference.", - ftype, - ); - } + ensure!( + fref.feature_maps + .contains_key(&FeatureType::Barcode(feature_type)), + "You declared a library with feature_type = '{feature_type}', but \ + there are no features with that feature_type in the feature reference.", + ); } } // traditionally, no error is thrown if feature reference is not provided - match lib.to_sample_def(cfg) { + match lib.to_sample_def() { Err(_) => bail!("{}", MULTI_HELP), Ok(sdef) => sdef.check_fastqs(MULTI_HELP)?, } @@ -237,6 +236,12 @@ pub fn check_libraries( if cfg.is_rtl() && !is_pd { check_libraries_rtl(cfg)?; } + if cfg.libraries.has_multiplexing() && cfg.libraries.has_vdj() { + ensure!( + is_pd, + "The combination of VDJ libraries and Multiplexing Capture libraries is not supported." + ); + } Ok(()) } @@ -265,7 +270,9 @@ pub fn check_samples( ); // Validate CMO IDs - let multiplexing_ids = fref.map_or_else(TxHashSet::default, |x| x.multiplexing_ids()); + let multiplexing_ids = fref + .as_ref() + .map_or_else(TxHashSet::default, |x| x.multiplexing_ids()); let invalid_multiplexing_ids = test_reserved_words(&multiplexing_ids); ensure!( @@ -289,6 +296,38 @@ pub fn check_samples( ); } + // Validate HASHTAG IDs + if samples.has_hashtag_ids() { + let hashtag_ids: TxHashSet = samples + .0 + .iter() + .filter_map(|s| s.sample_barcode_ids(ProbeBarcodeIterationMode::All)) + .flatten() + .map(std::string::ToString::to_string) + .collect(); + let invalid_hashtag_ids = test_reserved_words(&hashtag_ids); + ensure!( + invalid_hashtag_ids.is_empty(), + "Invalid hashtag_ids ('{}') provided, please ensure you are not using the reserved words \ + 'blank', 'multiplet', or 'unassigned'.", + invalid_hashtag_ids.join("', '") + ); + let antibody_ids = fref.map_or_else(TxHashSet::default, |x| x.antibody_ids()); + for sample in &samples.0 { + let invalid_entries = get_invalid_id_entries( + &antibody_ids, + sample.hashtag_ids.iter().flatten().map(String::as_str), + ); + ensure!( + invalid_entries.is_empty(), + "Unknown hashtag_ids ('{}') provided for sample '{}', please ensure that you are using \ + IDs that correspond to a valid Antibody Capture feature.", + invalid_entries.join("', '"), + sample.sample_id + ); + } + } + // Validate probe barcode IDs if samples.has_probe_barcode_ids() && !is_pd { let chemistry_specs: ChemistrySpecs = cfg.chemistry_specs()?; @@ -306,7 +345,7 @@ pub fn check_samples( })) .barcode_whitelist() .probe() - .as_source(true)? + .as_source()? .get_ids() }) .flatten_ok() @@ -386,16 +425,16 @@ fn check_probe_barcode_id_grouping( has_ab_lib: bool, has_cr_lib: bool, ) -> Result<()> { - use MultiplexingBarcodeType::{Antibody, Crispr, RTL}; + use RTLMultiplexingBarcodeType::{Antibody, Crispr, Gene}; let barcode_types: Vec<_> = barcode_ids .iter() .copied() - .map(categorize_multiplexing_barcode_id) + .filter_map(categorize_rtl_multiplexing_barcode_id) .collect(); match (has_gex_lib, has_ab_lib, has_cr_lib) { (false, false, false) => Ok(()), - (true, false, false) => match_one(&barcode_types, RTL), + (true, false, false) => match_one(&barcode_types, Gene), (false, true, false) => match_one(&barcode_types, Antibody), (true, true, false) => match_two(&barcode_types, Antibody), (true, false, true) => match_two(&barcode_types, Crispr), @@ -403,12 +442,12 @@ fn check_probe_barcode_id_grouping( // Can match one, two, or three. // Order should always be RTL+AB+CR [] => bail!("no barcode ID provided"), - [RTL] | [RTL, Antibody] | [RTL, Crispr] | [RTL, Antibody, Crispr] => Ok(()), - [other_type] => bail!("expected a {RTL} barcode ID, not {other_type}"), + [Gene] | [Gene, Antibody] | [Gene, Crispr] | [Gene, Antibody, Crispr] => Ok(()), + [other_type] => bail!("expected a {Gene} barcode ID, not {other_type}"), anything_else => bail!( - "expected either a single {RTL} barcode ID, \ - or a pair of {RTL} + {Antibody} or {RTL} + {Crispr} barcode IDs, \ - or a triple of {RTL} + {Antibody} + {Crispr} barcode IDs, not {}", + "expected either a single {Gene} barcode ID, \ + or a pair of {Gene} + {Antibody} or {Gene} + {Crispr} barcode IDs, \ + or a triple of {Gene} + {Antibody} + {Crispr} barcode IDs, not {}", anything_else.iter().join(" + "), ), }, @@ -419,8 +458,8 @@ fn check_probe_barcode_id_grouping( /// Match a single barcode of the provided type. fn match_one( - barcode_types: &[MultiplexingBarcodeType], - expected: MultiplexingBarcodeType, + barcode_types: &[RTLMultiplexingBarcodeType], + expected: RTLMultiplexingBarcodeType, ) -> Result<()> { match barcode_types { [] => bail!("no barcode ID provided"), @@ -435,23 +474,23 @@ fn match_one( /// Match one or two barcodes; one must be RTL. fn match_two( - barcode_types: &[MultiplexingBarcodeType], - expected: MultiplexingBarcodeType, + barcode_types: &[RTLMultiplexingBarcodeType], + expected: RTLMultiplexingBarcodeType, ) -> Result<()> { - use MultiplexingBarcodeType::RTL; + use RTLMultiplexingBarcodeType::Gene; match barcode_types { [] => bail!("no barcode ID provided"), - [RTL] => Ok(()), - [other_type] => bail!("expected a {RTL} barcode ID, not {other_type}"), - [RTL, other] if *other == expected => Ok(()), + [Gene] => Ok(()), + [other_type] => bail!("expected a {Gene} barcode ID, not {other_type}"), + [Gene, other] if *other == expected => Ok(()), - [other, RTL] if *other == expected => bail!( - "when pairing {RTL} and {expected} barcode IDs, \ - provide the {RTL} barcode ID first" + [other, Gene] if *other == expected => bail!( + "when pairing {Gene} and {expected} barcode IDs, \ + provide the {Gene} barcode ID first" ), anything_else => bail!( - "expected either a {RTL} barcode ID or a pair of \ - {RTL} + {expected} barcode IDs, not {}", + "expected either a {Gene} barcode ID or a pair of \ + {Gene} + {expected} barcode IDs, not {}", anything_else.iter().join(" + "), ), } @@ -638,15 +677,7 @@ pub fn check_feature_reference( ); } let rdr = BufReader::new(File::open(ref_path)?); - let fref = FeatureReference::new( - &ReferenceInfo::default(), - &Transcriptome::dummy(), - Some(rdr), - None, - None, - None, - feature_config, - )?; + let fref = FeatureReference::new(&[], None, Some(rdr), None, None, None, None, feature_config)?; let fref = Arc::new(fref); let _ = FeatureExtractor::new(fref.clone(), None, None)?; Ok(fref) @@ -678,6 +709,7 @@ pub fn build_feature_reference_with_cmos( cfg.antigen_specificity.as_ref(), cfg.functional_map.as_ref(), cfg.libraries.beam_mode(), + cfg.samples.as_ref(), ) .as_ref(), ) @@ -766,12 +798,6 @@ pub fn check_library_combinations(libraries: &[Library]) -> Result<()> { uniq_vdj_features.insert(vdj_chain_type); } } - if has_multiplexing && has_vdj { - bail!( - "[{}] The combination of VDJ libraries and Multiplexing Capture libraries is not supported.", - multiconst::LIBRARIES - ); - } if has_antigen && !(has_gex & has_vdj) { bail!( "[{}] Antigen Capture library requires paired VDJ and Gene Expression libraries.", diff --git a/lib/rust/multiconfig_converter/Cargo.toml b/lib/rust/multiconfig_converter/Cargo.toml new file mode 100644 index 0000000..aed3e40 --- /dev/null +++ b/lib/rust/multiconfig_converter/Cargo.toml @@ -0,0 +1,21 @@ +[dependencies] +[dependencies.anyhow] +workspace = true + +[dependencies.multi] +path = '../multi' + +[dependencies.serde_json] +workspace = true + +[lib] +crate-type = ['staticlib'] +name = 'multiconfig_converter' +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'multiconfig_converter' +publish = false +version = '0.1.0' diff --git a/lib/rust/multiconfig_converter/src/lib.rs b/lib/rust/multiconfig_converter/src/lib.rs new file mode 100644 index 0000000..0bd1e86 --- /dev/null +++ b/lib/rust/multiconfig_converter/src/lib.rs @@ -0,0 +1,67 @@ +use anyhow::Result; +use multi::config::MultiConfigCsv; +use serde_json::to_vec; +use std::slice::{from_raw_parts, from_raw_parts_mut}; + +fn safe_convert_multi_csv(input: &[u8]) -> Result> { + let config = MultiConfigCsv::from_reader(input, "api")?; + Ok(to_vec(&config)?) +} + +/// convert_multi_config is a C-ABI function for converting a multi CSV to json. +/// +/// # Arguments +/// +/// * `buffer`: a destination buffer to write the resulting content to. +/// * `buf_len`: the size of the buffer. Content will only be written to the +/// buffer if this is greater than or equal to the return value. +/// * `input`: The input data to process. +/// * `input_len`: The number of bytes in `input`. +/// +/// # Returns +/// +/// The return value is the number of bytes in the result json. +/// If (and only if) this value is less than or equal to the `buf_len` argument, +/// the content will have been written back to `buffer`. +/// Otherwise, `buffer` will not be touched, so it's ok to call this function +/// once with NULL buffer to get the appropriate length and then make a second +/// call with the appropriately-allocated buffer. +/// +/// A negative return value indicates an error. In that case, the buffer is +/// populated with the (possibly truncated) error message. +/// +/// # Safety +/// +/// `buffer` must point to an allocation with space for at least `buf_len` +/// bytes, unless `buf_len` is zero. +/// +/// The `input` array must contain at least `input_len` bytes. +#[no_mangle] +pub unsafe extern "C" fn convert_multi_config( + buffer: *mut u8, + buf_len: usize, + input: *const u8, + input_len: usize, +) -> i64 { + match safe_convert_multi_csv(unsafe { from_raw_parts(input, input_len) }) { + Ok(v) => { + if v.len() <= buf_len && buf_len > 0 { + unsafe { from_raw_parts_mut(buffer, v.len()) }.copy_from_slice(&v); + } + v.len().try_into().unwrap_or(i64::MAX) + } + Err(e) => { + let e_str = format!("{e}"); + let e_bytes = e_str.as_bytes(); + if buf_len > 0 { + if e_bytes.len() <= buf_len { + unsafe { from_raw_parts_mut(buffer, e_bytes.len()) }.copy_from_slice(e_bytes); + } else { + unsafe { from_raw_parts_mut(buffer, buf_len) } + .copy_from_slice(&e_bytes[..buf_len]); + } + } + -i64::try_from(e_bytes.len()).unwrap_or(i64::MAX) + } + } +} diff --git a/lib/rust/par_proc/src/par_proc.rs b/lib/rust/par_proc/src/par_proc.rs index 80e89dd..349496a 100644 --- a/lib/rust/par_proc/src/par_proc.rs +++ b/lib/rust/par_proc/src/par_proc.rs @@ -166,6 +166,7 @@ where /// Note: this duplicates the logic in `group_by_processor` above with two differences: /// - there is no SpillVec and all objects are in memory /// - if a groupby key has a very long list of items to process that list is capped at `max_items`. +/// /// The remaining items are processed in a separate group with the same key. /// /// Iterate over `iterable` of type `Result` returning if any errors are encounterd. diff --git a/lib/rust/parameters_toml/Cargo.toml b/lib/rust/parameters_toml/Cargo.toml index d517de4..af7f573 100644 --- a/lib/rust/parameters_toml/Cargo.toml +++ b/lib/rust/parameters_toml/Cargo.toml @@ -1,12 +1,13 @@ [dependencies] -log = '0.4' - [dependencies.anyhow] workspace = true [dependencies.bazel_utils] path = '../bazel_utils' +[dependencies.log] +workspace = true + [dependencies.serde] workspace = true diff --git a/lib/rust/slide_design/Cargo.toml b/lib/rust/slide_design/Cargo.toml index b0891c7..cbe8acd 100644 --- a/lib/rust/slide_design/Cargo.toml +++ b/lib/rust/slide_design/Cargo.toml @@ -1,5 +1,5 @@ [dependencies] -numpy = '0.19' +md5 = '0.7' [dependencies.anyhow] workspace = true @@ -31,13 +31,16 @@ path = '../metric' [dependencies.ndarray] workspace = true +[dependencies.numpy] +workspace = true + [dependencies.prost] optional = true -version = '0.11' +workspace = true [dependencies.prost-build] optional = true -version = '0.11' +workspace = true [dependencies.pyanyhow] path = '../pyanyhow' @@ -45,6 +48,9 @@ path = '../pyanyhow' [dependencies.pyo3] workspace = true +[dependencies.regex] +workspace = true + [dependencies.serde] workspace = true diff --git a/lib/rust/slide_design/src/stubs/mod.rs b/lib/rust/slide_design/src/stubs/mod.rs index c346089..7c68294 100644 --- a/lib/rust/slide_design/src/stubs/mod.rs +++ b/lib/rust/slide_design/src/stubs/mod.rs @@ -21,3 +21,6 @@ pub fn load_oligos(_: &Path, _: OligoPart) -> Result> { pub fn spot_pitch(_: &Path) -> Result { unimplemented!() } +pub fn validate_slide_id_name(slide_id: &str) -> Result { + unimplemented!() +} diff --git a/lib/rust/stats/Cargo.toml b/lib/rust/stats/Cargo.toml index 87bf62e..e7e10ae 100644 --- a/lib/rust/stats/Cargo.toml +++ b/lib/rust/stats/Cargo.toml @@ -1,7 +1,9 @@ [dependencies] -num-traits = '0.2' rand_xoshiro = '0.6' +[dependencies.num-traits] +workspace = true + [dependencies.rand] workspace = true diff --git a/lib/rust/stats/src/nx.rs b/lib/rust/stats/src/nx.rs index 504f46b..14b9c84 100644 --- a/lib/rust/stats/src/nx.rs +++ b/lib/rust/stats/src/nx.rs @@ -50,12 +50,12 @@ where /// /// # Panics /// - If any of the numbers is <=0. This likely points to a bug in the caller code, -/// since one should not be attempting to compute N50 of a list of non-positive -/// numbers. Hence decided on a panic over returning a Result. +/// since one should not be attempting to compute N50 of a list of non-positive +/// numbers. Hence decided on a panic over returning a Result. /// /// # Warning /// - It is implicitly assumed that the sum of all the elements will -/// fit within an f64. +/// fit within an f64. /// /// # Example /// ```rust @@ -86,12 +86,12 @@ where /// /// # Panics /// - If any of the numbers is <=0. This likely points to a bug in the caller code, -/// since one should not be attempting to compute N90 of a list of non-positive -/// numbers. Hence decided on a panic over returning a Result. +/// since one should not be attempting to compute N90 of a list of non-positive +/// numbers. Hence decided on a panic over returning a Result. /// /// # Warning /// - It is implicitly assumed that the sum of all the elements will -/// fit within an f64. +/// fit within an f64. /// /// # Example /// ```rust diff --git a/lib/rust/stats_utils/Cargo.toml b/lib/rust/stats_utils/Cargo.toml new file mode 100644 index 0000000..8a057de --- /dev/null +++ b/lib/rust/stats_utils/Cargo.toml @@ -0,0 +1,11 @@ +[dependencies] + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'stats_utils' +publish = false +version = '0.1.0' diff --git a/lib/rust/stats_utils/src/lib.rs b/lib/rust/stats_utils/src/lib.rs new file mode 100644 index 0000000..f2f3028 --- /dev/null +++ b/lib/rust/stats_utils/src/lib.rs @@ -0,0 +1,129 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// Compute some stats. +// ◼ Presumably much of this is available elsewhere. + +use std::f64; + +// Compute N50 of some numbers. + +pub fn n50(v: &[i32]) -> i32 { + if v.is_empty() { + return 0; + } + for n in v { + assert!(*n > 0); + } + let mut sum: i64 = 0; + let mut half: i64 = 0; + for n in v { + sum += i64::from(*n); + } + let mut vs = v.to_owned(); + vs.sort_unstable(); + for i in 0..vs.len() { + half += i64::from(vs[i]); + if 2 * half == sum && i < vs.len() - 1 { + return (vs[i] + vs[i + 1]) / 2; + } + if 2 * half >= sum { + return vs[i]; + } + } + 0 // never executed +} + +pub fn n90(v: &[i32]) -> i32 { + if v.is_empty() { + return 0; + } + for n in v { + assert!(*n > 0); + } + let mut sum: i64 = 0; + let mut part: i64 = 0; + for n in v { + sum += i64::from(*n); + } + let mut vs = v.to_owned(); + vs.sort_unstable(); + for i in 0..vs.len() { + part += i64::from(vs[i]); + if 10 * part == 9 * sum && i < vs.len() - 1 { + return (vs[i] + vs[i + 1]) / 2; + } + if part as f64 / sum as f64 >= 0.9_f64 { + return vs[i]; + } + } + 0 // never executed +} + +// Compute mean of some numbers, returning zero on empty vector. + +pub fn mean(v: &[i32]) -> f64 { + let sum1 = v.len() as f64; + let mut sum2 = 0_f64; + for x in v { + sum2 += f64::from(*x); + } + if sum1 == 0_f64 { + return 0_f64; + } + sum2 / sum1 +} + +// Compute "length-weighted" mean of some numbers. Normally this would be applied +// to positive numbers. Returns 0 if the sum of the numbers is zero. +// ◼ Not sure what the right term for this is. The word "length" is confusing. + +pub fn len_weighted_mean(v: &[i32]) -> f64 { + let mut sum1 = 0_f64; + let mut sum2 = 0_f64; + for x in v { + sum1 += f64::from(*x); + sum2 += f64::from(*x) * f64::from(*x); + } + if sum1 == 0_f64 { + return 0_f64; + } + sum2 / sum1 +} + +// Compute absolute value of difference between two numbers. + +pub fn abs_diff(a: usize, b: usize) -> usize { + if a <= b { + return b - a; + } + a - b +} + +// Compute percent ratio. + +pub fn percent_ratio(a: usize, b: usize) -> f64 { + 100_f64 * a as f64 / b as f64 +} + +// binomial_sum( n, k, p ): return sum_{i=0..k} choose(n,i) * p^i * (1-p)^(n-i) +// +// No attempt has been made to make this efficient or to pay attention to +// accuracy or overflow problems. + +pub fn binomial_sum(n: usize, k: usize, p: f64) -> f64 { + assert!(n >= 1); + assert!(k <= n); + let mut sum = 0.0; + let mut choose = 1.0; + for _ in 0..n { + choose *= 1.0 - p; + } + let q = p / (1.0 - p); + for i in 0..=k { + sum += choose; + choose *= (n - i) as f64; + choose /= (i + 1) as f64; + choose *= q; + } + sum +} diff --git a/lib/rust/string_utils/Cargo.toml b/lib/rust/string_utils/Cargo.toml new file mode 100644 index 0000000..3a91bbd --- /dev/null +++ b/lib/rust/string_utils/Cargo.toml @@ -0,0 +1,13 @@ +[dependencies] +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'string_utils' +publish = false +version = '0.1.0' diff --git a/lib/rust/string_utils/src/lib.rs b/lib/rust/string_utils/src/lib.rs new file mode 100644 index 0000000..0e29dad --- /dev/null +++ b/lib/rust/string_utils/src/lib.rs @@ -0,0 +1,275 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// This file contains some miscellaneous string utilities. + +use std::fmt::Write; +use vector_utils::next_diff; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// THINGS USED A LOT: SHORTHAND EXPRESSIONS FOR COMMON FUNCTIONALITY +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Make a &[u8] into an &str or an string. + +pub fn strme(s: &[u8]) -> &str { + std::str::from_utf8(s).unwrap() +} + +pub fn stringme(s: &[u8]) -> String { + String::from_utf8(s.to_vec()).unwrap() +} + +pub trait TextUtils<'a> { + fn force_usize(&self) -> usize; + fn force_i32(&self) -> i32; + fn force_i64(&self) -> i64; + fn force_u64(&self) -> u64; + fn force_f64(&self) -> f64; + + // s.before(t): return the part of s before the first instance of t + // (or panic if t is not contained in s) + + fn before(&'a self, u: &str) -> &'a str; + + // s.after(t): return the part of s after the first instance of t + // (or panic if t is not contained in s) + + fn after(&'a self, t: &str) -> &'a str; + + // s.between(t,u): return the part of s after the first instance of t and + // before the first instance of u after that + + fn between(&'a self, t: &str, u: &str) -> &'a str; + + // s.between2(t,u): return the part of s after the first instance of t and + // before the last instance of u after that + + fn between2(&'a self, t: &str, u: &str) -> &'a str; + + // s.rev_before(t): start from the end s, find the first instance of t, and + // return what's before that + + fn rev_before(&'a self, t: &str) -> &'a str; + + // s.rev_after(t): start from the end s, find the first instance of t, and + // return what's after that + + fn rev_after(&'a self, t: &str) -> &'a str; +} + +impl<'a> TextUtils<'a> for str { + fn force_usize(&self) -> usize { + self.parse::() + .unwrap_or_else(|_| panic!("could not convert \"{self}\" to usize")) + } + fn force_i32(&self) -> i32 { + self.parse::() + .unwrap_or_else(|_| panic!("could not convert \"{self}\" to i32")) + } + fn force_i64(&self) -> i64 { + self.parse::() + .unwrap_or_else(|_| panic!("could not convert \"{self}\" to i64")) + } + fn force_u64(&self) -> u64 { + self.parse::() + .unwrap_or_else(|_| panic!("could not convert \"{self}\" to u64")) + } + fn force_f64(&self) -> f64 { + self.parse::() + .unwrap_or_else(|_| panic!("could not convert \"{self}\" to f64")) + } + + fn before(&'a self, u: &str) -> &'a str { + let r = self + .find(u) + .unwrap_or_else(|| panic!("failed to find \"{u}\" in \"{self}\"")); + &self[0..r] + } + + fn after(&'a self, t: &str) -> &'a str { + let l = self + .find(t) + .unwrap_or_else(|| panic!("after failed to find \"{t}\" in \"{self}\"")) + + t.len(); + &self[l..self.len()] + } + + fn between(&'a self, t: &str, u: &str) -> &'a str { + let a = self.after(t); + let r = a.find(u).unwrap_or_else(|| { + panic!("between( \"{self}\", \"{t}\", \"{u}\" ) failed at second part") + }); + &a[0..r] + } + + fn between2(&'a self, t: &str, u: &str) -> &'a str { + let a = self.after(t); + let r = a.rfind(u).unwrap_or_else(|| { + panic!("between2( \"{self}\", \"{t}\", \"{u}\" ) failed at second part") + }); + &a[0..r] + } + + fn rev_before(&'a self, t: &str) -> &'a str { + let l = 0; + let r = self.rfind(t).unwrap(); + &self[l..r] + } + + fn rev_after(&'a self, t: &str) -> &'a str { + let l = self.rfind(t).unwrap(); + &self[l + t.len()..self.len()] + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// THINGS USED OCCASIONALLY +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Parse a line, breaking at commas, but not if they're in quotes. And strip the quotes. + +pub fn parse_csv(x: &str) -> Vec { + let mut y = Vec::::new(); + let mut w = Vec::::new(); + for c in x.chars() { + w.push(c); + } + let (mut quotes, mut i) = (0, 0); + while i < w.len() { + let mut j = i; + while j < w.len() { + if quotes % 2 == 0 && w[j] == ',' { + break; + } + if w[j] == '"' { + quotes += 1; + } + j += 1; + } + let (mut start, mut stop) = (i, j); + if stop - start >= 2 && w[start] == '"' && w[stop - 1] == '"' { + start += 1; + stop -= 1; + } + let mut s = String::new(); + for &ch in &w[start..stop] { + s.push(ch); + } + y.push(s); + i = j + 1; + } + if !w.is_empty() && *w.last().unwrap() == ',' { + y.push(String::new()); + } + y +} + +// Quote a bunch of strings. + +pub fn quote_vec(x: &[&str]) -> Vec { + let mut y = vec![String::new(); x.len()]; + for i in 0..x.len() { + y[i] = format!("\"{}\"", x[i]); + } + y +} + +// Convert a sorted list into a an abbreviated string. + +pub fn abbrev_list(x: &[T]) -> String { + let mut s = String::new(); + let mut i = 0; + while i < x.len() { + if i > 0 { + s.push_str(", "); + } + let j = next_diff(x, i); + if j - i == 1 { + write!(s, "{}", x[i]).unwrap(); + } else { + write!(s, "{}^{}", x[i], j - i).unwrap(); + } + i = j; + } + s +} + +// capitalize first letter + +pub fn cap1(s: &str) -> String { + let mut x = s.as_bytes().to_vec(); + let c = x[0].to_ascii_uppercase(); + x[0] = c; + String::from_utf8(x.clone()).unwrap() +} + +// decimal_diffs: given two strings, determine if they are identical except for +// numerical differences, as e.g. +// woof_1.2x_3 +// woof_10.3x_7 +// would be (two differences). And return the positions of the differing strings +// and their float vallues, as +// diffs = {(start1,stop1,start2,start2,stop2,x1,x2)}. If the two strings are +// identical or do not satisfy the requirements, an empty vector of diffs is +// returned. + +pub fn decimal_diffs( + s1: &[u8], + s2: &[u8], + diffs: &mut Vec<(usize, usize, usize, usize, f64, f64)>, +) { + let (n1, n2) = (s1.len(), s2.len()); + diffs.clear(); + let (mut i1, mut i2) = (0, 0); + loop { + if i1 == n1 && i2 == n2 { + return; + } + if i1 == n1 || i2 == n2 { + diffs.clear(); + return; + } + let d1 = (s1[i1] >= b'0' && s1[i1] <= b'9') || s1[i1] == b'.'; + let d2 = (s2[i2] >= b'0' && s2[i2] <= b'9') || s2[i2] == b'.'; + if d1 != d2 || (!d1 && s1[i1] != s2[i2]) { + diffs.clear(); + return; + } + if !d1 { + i1 += 1; + i2 += 1; + continue; + } + let (mut j1, mut j2) = (i1 + 1, i2 + 1); + let (mut dots1, mut dots2) = (0, 0); + while j1 < n1 { + if s1[j1] == b'.' { + if dots1 == 1 { + break; + } + dots1 += 1; + } else if !(s1[j1] >= b'0' && s1[j1] <= b'9') { + break; + } + j1 += 1; + } + while j2 < n2 { + if s2[j2] == b'.' { + if dots2 == 1 { + break; + } + dots2 += 1; + } else if !(s2[j2] >= b'0' && s2[j2] <= b'9') { + break; + } + j2 += 1; + } + if s1[i1..j1] != s2[i2..j2] { + let x1 = strme(&s1[i1..j1]).force_f64(); + let x2 = strme(&s2[i2..j2]).force_f64(); + diffs.push((i1, j1, i2, j2, x1, x2)); + } + i1 = j1; + i2 = j2; + } +} diff --git a/lib/rust/tenkit2/Cargo.toml b/lib/rust/tenkit2/Cargo.toml index 2145d9d..3dc8349 100644 --- a/lib/rust/tenkit2/Cargo.toml +++ b/lib/rust/tenkit2/Cargo.toml @@ -1,17 +1,18 @@ [dependencies] -debruijn = '0.3' +[dependencies.debruijn] +workspace = true [dependencies.io_utils] -workspace = true +path = '../io_utils' [dependencies.itertools] workspace = true [dependencies.string_utils] -workspace = true +path = '../string_utils' [dependencies.vector_utils] -workspace = true +path = '../vector_utils' [lib] test = false diff --git a/lib/rust/transcriptome/Cargo.toml b/lib/rust/transcriptome/Cargo.toml index 36493b4..ede6630 100644 --- a/lib/rust/transcriptome/Cargo.toml +++ b/lib/rust/transcriptome/Cargo.toml @@ -3,14 +3,17 @@ name = 'gtf_to_gene_index' test = false [dependencies] -bio = '1' -bio-types = '1' smallvec = '1' -tempfile = '3' [dependencies.anyhow] workspace = true +[dependencies.bio] +workspace = true + +[dependencies.bio-types] +workspace = true + [dependencies.flate2] workspace = true @@ -24,8 +27,7 @@ workspace = true workspace = true [dependencies.ordered-float] -features = ['serde'] -version = '3' +workspace = true [dependencies.serde] workspace = true @@ -36,6 +38,9 @@ workspace = true [dependencies.statrs] workspace = true +[dependencies.tempfile] +workspace = true + [lib] test = false diff --git a/lib/rust/transcriptome/src/transcriptome.rs b/lib/rust/transcriptome/src/transcriptome.rs index e86fcea..9d1a49b 100644 --- a/lib/rust/transcriptome/src/transcriptome.rs +++ b/lib/rust/transcriptome/src/transcriptome.rs @@ -1,6 +1,6 @@ use crate::parse_gtf::{parse_gtf_line, validate_gtf_line}; use crate::Gene; -use anyhow::{anyhow, bail, Context, Result}; +use anyhow::{anyhow, bail, ensure, Context, Result}; use bio::io::fasta::IndexedReader; use bio_types::strand::ReqStrand; use flate2::read::MultiGzDecoder; @@ -127,16 +127,6 @@ impl Transcriptome { Transcriptome::from_gtf_path(&path.join("genes/genes.gtf")) } - pub fn dummy() -> Transcriptome { - Transcriptome { - genes: Vec::new(), - gene_id_to_idx: HashMap::new(), - transcripts: Vec::new(), - transcript_id_to_idx: HashMap::new(), - gene_to_transcripts: BTreeMap::new(), - } - } - /// Check if there are any transcripts with no exons and return Err() if we find any. pub fn check_for_transcripts_with_no_exons(&self) -> Result<()> { let empty_transcripts: String = self @@ -185,7 +175,7 @@ fn load_from_gtf_reader(in_gtf: &mut dyn BufRead) -> Result { let mut transcripts: Vec = Vec::new(); let mut transcript_id_to_idx: HashMap = HashMap::new(); - let mut genes = Vec::new(); + let mut genes: Vec = Vec::new(); let mut gene_id_to_idx: HashMap = HashMap::new(); // To keep track of genes that are added by parsing exons/transcripts but @@ -231,28 +221,35 @@ fn load_from_gtf_reader(in_gtf: &mut dyn BufRead) -> Result { if rec.feature_type == b"gene" { let id = rec.get_attr("gene_id")?; let name = rec.get_attr("gene_name").unwrap_or_else(|_| id.clone()); - let idx = GeneIdx(genes.len() as u32); - let gene = TranscriptomeGene { - idx, - id: id.clone(), - name, - properties: rec.all_attributes(), - }; // Make sure we don't let duplicates through - match gene_id_to_idx.entry(id) { + match gene_id_to_idx.entry(id.clone()) { Entry::Occupied(entry) => { - if !genes_not_from_file.remove(entry.key()) { - bail!("Duplicate Gene ID found in GTF: {}", entry.key()); - } - // If a `transcript` appears before a `gene`, we generate an entry for that gene - // but we should override that with the actual gene once we observe it. - let idx_int = entry.get().0 as usize; - genes[idx_int] = gene; + // When a `transcript` or `exon` appears before a `gene`, we generate an entry + // for that gene, but overwrite it with the actual gene if it's seen later. + ensure!( + genes_not_from_file.remove(&id), + "Duplicate Gene ID found in GTF: {id}", + ); + let idx = *entry.get(); + let gene = &mut genes[idx.0 as usize]; + assert_eq!(&id, &gene.id); + *gene = TranscriptomeGene { + idx, + id, + name, + properties: rec.all_attributes(), + }; } Entry::Vacant(entry) => { + let idx = GeneIdx(genes.len() as u32); entry.insert(idx); - genes.push(gene); + genes.push(TranscriptomeGene { + idx, + id, + name, + properties: rec.all_attributes(), + }); } } } else if rec.feature_type == b"transcript" { @@ -325,51 +322,50 @@ fn load_from_gtf_reader(in_gtf: &mut dyn BufRead) -> Result { let exon = Exon { start, end }; let transcript_id = rec.get_attr("transcript_id")?; - // the transcript hasn't been declared -- make a dummy - if transcript_id_to_idx.get(&transcript_id).is_none() { - let gene_id = rec.get_attr("gene_id")?; - let idx = TranscriptIdx(transcripts.len() as u32); - - // handle a missing gene for this tx - if gene_id_to_idx.get(&gene_id).is_none() { - let gene_name = rec - .get_attr("gene_name") - .unwrap_or_else(|_| gene_id.clone()); - let new_gene_idx = GeneIdx(genes.len() as u32); - - let gene = TranscriptomeGene { - idx: new_gene_idx, - id: gene_id.clone(), - name: gene_name, - properties: vec![], - }; - genes_not_from_file.insert(gene_id.clone()); - gene_id_to_idx.insert(gene_id.clone(), new_gene_idx); - genes.push(gene); - } - - let gene_idx = *gene_id_to_idx.get(&gene_id).expect("missing gene"); + let tx_idx = match transcript_id_to_idx.get(&transcript_id) { + None => { + // the transcript hasn't been declared -- make a dummy + let gene_id = rec.get_attr("gene_id")?; + let idx = TranscriptIdx(transcripts.len() as u32); - let transcript = Transcript { - idx, - id: transcript_id.clone(), - gene_idx, - chrom: chrom.to_string(), - strand, - exons: vec![], - properties: vec![], - }; + let gene_idx = match gene_id_to_idx.get(&gene_id) { + None => { + // handle a missing gene for this tx + let gene_name = rec + .get_attr("gene_name") + .unwrap_or_else(|_| gene_id.clone()); + let new_gene_idx = GeneIdx(genes.len() as u32); + + let gene = TranscriptomeGene { + idx: new_gene_idx, + id: gene_id.clone(), + name: gene_name, + properties: vec![], + }; + genes_not_from_file.insert(gene_id.clone()); + gene_id_to_idx.insert(gene_id, new_gene_idx); + genes.push(gene); + new_gene_idx + } + Some(idx) => *idx, + }; - transcript_id_to_idx.insert(transcript_id.clone(), idx); - transcripts.push(transcript); - } + let transcript = Transcript { + idx, + id: transcript_id.clone(), + gene_idx, + chrom: chrom.to_string(), + strand, + exons: vec![], + properties: vec![], + }; - let tx_idx = transcript_id_to_idx.get(&transcript_id).ok_or_else(|| { - make_err(&format!( - "this row references transcript_id={transcript_id} but this \ - transcript has no preceding 'transcript' row in the GTF" - )) - })?; + transcript_id_to_idx.insert(transcript_id, idx); + transcripts.push(transcript); + idx + } + Some(idx) => *idx, + }; transcripts[tx_idx.0 as usize].exons.push(exon); } @@ -386,7 +382,7 @@ fn load_from_gtf_reader(in_gtf: &mut dyn BufRead) -> Result { // Tabulate the set of transcripts for each gene gene_to_transcripts .get_mut(&tx.gene_idx) - .with_context(|| format!("transcript {} is missing", tx.id))? + .unwrap() .push(tx.idx); } @@ -442,15 +438,12 @@ NC_000087.8 BestRefSeq gene 90762409 90766319 . - . gene_id \"G530011O06Rik\"; " } #[test] - fn test_missing_transcript() { + fn test_exon_before_gene() -> Result<()> { let gtf = b"\ -NC_000087.8 BestRefSeq exon 90765690 90766319 . - . gene_id \"G530011O06Rik\"; transcript_id \"NR_137283.1\"; -NC_000086.8 BestRefSeq gene 168758039 168761913 . - . gene_id \"G530011O06Rik\";"; - let txome = Transcriptome::from_reader(BufReader::new(gtf.as_slice())); - assert!(txome.is_err()); - if let Err(err) = txome { - assert_eq!(err.to_string(), "transcript NR_137283.1 is missing"); - } +NC_000086.8 RefSeq exon 168758039 168761913 . - . gene_id \"G530011O06Rik\"; transcript_id \"NR_137283.1\"; +NC_000086.8 RefSeq gene 168758039 168761913 . - . gene_id \"G530011O06Rik\";"; + Transcriptome::from_reader(BufReader::new(gtf.as_slice()))?; + Ok(()) } #[test] diff --git a/lib/rust/tx_annotation/Cargo.toml b/lib/rust/tx_annotation/Cargo.toml index 0e7086e..dedff67 100644 --- a/lib/rust/tx_annotation/Cargo.toml +++ b/lib/rust/tx_annotation/Cargo.toml @@ -1,6 +1,4 @@ [dependencies] -rand_chacha = '0.3' - [dependencies.anyhow] workspace = true @@ -31,6 +29,9 @@ path = '../metric' [dependencies.rand] workspace = true +[dependencies.rand_chacha] +workspace = true + [dependencies.rust-htslib] workspace = true diff --git a/lib/rust/tx_annotation/src/read.rs b/lib/rust/tx_annotation/src/read.rs index 05fe714..29ed247 100644 --- a/lib/rust/tx_annotation/src/read.rs +++ b/lib/rust/tx_annotation/src/read.rs @@ -5,14 +5,14 @@ use crate::transcript::{ use anyhow::Result; use cr_bam::bam_tags::{ ExtraFlags, ANTISENSE_TAG, EXTRA_FLAGS_TAG, FEATURE_IDS_TAG, FEATURE_QUAL_TAG, FEATURE_RAW_TAG, - FEATURE_SEQ_TAG, GENE_ID_TAG, GENE_NAME_TAG, MULTIMAPPER_TAG, PROBE_TAG, PROC_BC_SEQ_TAG, - PROC_UMI_SEQ_TAG, RAW_BARCODE_QUAL_TAG, RAW_BARCODE_SEQ_TAG, RAW_GEL_BEAD_BARCODE_QUAL_TAG, - RAW_GEL_BEAD_BARCODE_SEQ_TAG, RAW_UMI_QUAL_TAG, RAW_UMI_SEQ_TAG, READ_GROUP_TAG, REGION_TAG, - REST_R1_QUAL_TAG, REST_R1_SEQ_TAG, REST_R2_QUAL_TAG, REST_R2_SEQ_TAG, TRANSCRIPT_TAG, - UNPAIRED_GENE_ID_TAG, UNPAIRED_GENE_NAME_TAG, + FEATURE_SEQ_TAG, GAP_COORDINATES_TAG, GENE_ID_TAG, GENE_NAME_TAG, MULTIMAPPER_TAG, PROBE_TAG, + PROC_BC_SEQ_TAG, PROC_UMI_SEQ_TAG, RAW_BARCODE_QUAL_TAG, RAW_BARCODE_SEQ_TAG, + RAW_GEL_BEAD_BARCODE_QUAL_TAG, RAW_GEL_BEAD_BARCODE_SEQ_TAG, RAW_UMI_QUAL_TAG, RAW_UMI_SEQ_TAG, + READ_GROUP_TAG, REGION_TAG, REST_R1_QUAL_TAG, REST_R1_SEQ_TAG, REST_R2_QUAL_TAG, + REST_R2_SEQ_TAG, TRANSCRIPT_TAG, UNPAIRED_GENE_ID_TAG, UNPAIRED_GENE_NAME_TAG, }; use cr_types::chemistry::ChemistryDef; -use cr_types::probe_set::MappedProbe; +use cr_types::probe_set::{GapInfo, MappedProbe}; use cr_types::reference::feature_extraction::FeatureData; use cr_types::reference::feature_reference::FeatureReference; use cr_types::rna_read::{RnaChunk, RnaRead, UmiPart, HIGH_CONF_MAPQ}; @@ -23,7 +23,7 @@ use itertools::Itertools; use martian_derive::{martian_filetype, MartianStruct}; use martian_filetypes::bin_file::BinaryFormat; use martian_filetypes::lz4_file::Lz4; -use rust_htslib::bam::record::{Aux, Record}; +use rust_htslib::bam::record::{Aux, AuxArray, Record}; use serde::{Deserialize, Serialize}; use std::cmp::min; use std::collections::HashSet; @@ -435,8 +435,11 @@ impl ReadAnnotations { Aux::String(std::str::from_utf8(self.read.raw_illumina_read1_qual()).unwrap()), )?; - // Attach the rest of R2, which follows the probe. - assert_eq!(self.read.r1_range().read(), fastq_set::WhichRead::R2); + // Attach the rest of R2, which follows the probe if the chemistry has an R2. + if self.read.r1_range().read() != fastq_set::WhichRead::R2 { + println!("Not attaching HD tags as the chemistry is R1 only!"); + return Ok(()); + } assert_eq!(self.read.r1_range().offset(), 0); if let Some(len) = self.read.r1_range().len() { let read2_end = self.read.r1_range().offset() + len; @@ -518,7 +521,7 @@ impl ReadAnnotations { .unwrap(); }); - if self.read.barcode().is_valid() { + if self.read.barcode_is_valid() { let bc_vec = self.read.barcode().to_string(); self.primary .for_each_rec(|rec| rec.push_aux(PROC_BC_SEQ_TAG, Aux::String(&bc_vec)).unwrap()); @@ -574,7 +577,7 @@ impl ReadAnnotations { }; let is_valid_umi = self.umi_info.is_valid; - let is_valid_bc = self.read.barcode().is_valid(); + let is_valid_bc = self.read.barcode_is_valid(); let read_group = &self.read.read_chunk(read_chunks).read_group; self.for_each_rec(|ann| { ann.attach_tags( @@ -1329,6 +1332,17 @@ impl RecordAnnotation { let probes = data.probes().join(";"); rec.push_aux(PROBE_TAG, Aux::String(&probes)).unwrap(); + + if let Some(GapInfo { + lhs_end, rhs_start, .. + }) = data.gap_info() + { + rec.push_aux( + GAP_COORDINATES_TAG, + Aux::ArrayU8(AuxArray::from(&vec![lhs_end as u8, rhs_start as u8])), + ) + .unwrap(); + } } } RecordAnnotation::FeatureExtracted(ref mut rec1, ref data, ref mut rec2) => { diff --git a/lib/rust/tx_annotation/src/transcript.rs b/lib/rust/tx_annotation/src/transcript.rs index e55e764..5f9a8a5 100644 --- a/lib/rust/tx_annotation/src/transcript.rs +++ b/lib/rust/tx_annotation/src/transcript.rs @@ -1095,6 +1095,7 @@ mod tests { ]); let seq = "AAAAAAAAA".as_bytes(); let qual = "IIIIIIIII".as_bytes(); + read.unset_flags(); read.set_mapq(255); read.set_tid(0); read.set(qname, Some(&cigar), seq, qual); @@ -1191,6 +1192,7 @@ mod tests { ]); let seq = "AAAAAAAAAAAA".as_bytes(); let qual = "IIIIIIIIIIII".as_bytes(); + read.unset_flags(); read.set_mapq(255); read.set_tid(0); read.set(qname, Some(&cigar), seq, qual); @@ -1242,6 +1244,7 @@ mod tests { ]); let seq = "AAAAAAAAAAAA".as_bytes(); let qual = "IIIIIIIIIIII".as_bytes(); + read.unset_flags(); read.set_mapq(255); read.set_tid(0); read.set(qname, Some(&cigar), seq, qual); @@ -1270,6 +1273,7 @@ mod tests { let cigar = CigarString(vec![Cigar::Match(5), Cigar::RefSkip(25), Cigar::Match(7)]); let seq = "AAAAAAAAAAAA".as_bytes(); let qual = "IIIIIIIIIIII".as_bytes(); + read.unset_flags(); read.set_mapq(255); read.set_tid(0); read.set(qname, Some(&cigar), seq, qual); diff --git a/lib/rust/tx_annotation/src/visitor.rs b/lib/rust/tx_annotation/src/visitor.rs index bc6509a..f1bf156 100644 --- a/lib/rust/tx_annotation/src/visitor.rs +++ b/lib/rust/tx_annotation/src/visitor.rs @@ -56,18 +56,18 @@ //! ### Graph operations //! There are two types of operations the are defined on the graph //! 1. **Visit** a node: Every method in the `AnnotatedReadVisitor` trait is a -//! visit to one of the nodes in the graph (`visit_*`). Each function is a hook to potentially -//! overridde what happens when you visit that node. Each function's default implementation -//! recursively visits the children via the corresponding `walk_` method. e.g., the -//! `visit_barcode_read_annotations` method by default calls `walk_barcode_read_annotations`. -//! Each overridden visit method has full control over what happens with its node, it can do -//! its own traversal of the node's children, call `walk_*` to apply the default traversal -//! algorithm, or prevent deeper traversal by doing nothing. +//! visit to one of the nodes in the graph (`visit_*`). Each function is a hook to potentially +//! override what happens when you visit that node. Each function's default implementation +//! recursively visits the children via the corresponding `walk_` method. e.g., the +//! `visit_barcode_read_annotations` method by default calls `walk_barcode_read_annotations`. +//! Each overridden visit method has full control over what happens with its node, it can do +//! its own traversal of the node's children, call `walk_*` to apply the default traversal +//! algorithm, or prevent deeper traversal by doing nothing. //! 2. **Walk** from a node: This corresponds to a traversal of the node's children. For the -//! graph described above there are walks described at two levels: the barcode level and the -//! read level. The `walk_` function at the barcode level visits each of the read nodes (by -//! calling various `visit_*` functions) and the `walk_` function at the read level visits -//! various annotation properties of the read. +//! graph described above there are walks described at two levels: the barcode level and the +//! read level. The `walk_` function at the barcode level visits each of the read nodes (by +//! calling various `visit_*` functions) and the `walk_` function at the read level visits +//! various annotation properties of the read. use crate::mark_dups::DupInfo; use crate::read::{AnnotationInfo, ReadAnnotations}; diff --git a/lib/rust/umi/Cargo.toml b/lib/rust/umi/Cargo.toml index 4cefae2..b803456 100644 --- a/lib/rust/umi/Cargo.toml +++ b/lib/rust/umi/Cargo.toml @@ -1,6 +1,4 @@ [dependencies] -triple_accel = '0.4' - [dependencies.arrayvec] workspace = true @@ -13,6 +11,9 @@ workspace = true [dependencies.serde] workspace = true +[dependencies.triple_accel] +workspace = true + [lib] test = false diff --git a/lib/rust/vdj_ann/Cargo.toml b/lib/rust/vdj_ann/Cargo.toml new file mode 100644 index 0000000..ba95516 --- /dev/null +++ b/lib/rust/vdj_ann/Cargo.toml @@ -0,0 +1,49 @@ +[dependencies] +[dependencies.amino] +path = '../amino' + +[dependencies.bio_edit] +path = '../bio_edit' + +[dependencies.debruijn] +workspace = true + +[dependencies.hyperbase] +path = '../hyperbase' + +[dependencies.io_utils] +path = '../io_utils' + +[dependencies.itertools] +workspace = true + +[dependencies.kmer_lookup] +path = '../kmer_lookup' + +[dependencies.serde] +workspace = true + +[dependencies.serde_json] +workspace = true + +[dependencies.stats_utils] +path = '../stats_utils' + +[dependencies.string_utils] +path = '../string_utils' + +[dependencies.vdj_types] +path = '../vdj_types' + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'vdj_ann' +publish = false +version = '0.1.0' diff --git a/lib/rust/vdj_ann/src/align.rs b/lib/rust/vdj_ann/src/align.rs new file mode 100644 index 0000000..c4b19c1 --- /dev/null +++ b/lib/rust/vdj_ann/src/align.rs @@ -0,0 +1,11 @@ +use bio_edit::alignment::pairwise::Aligner; +use bio_edit::alignment::Alignment; +use debruijn::dna_string::DnaString; + +/// Return a "standard" affine alignment of x to y. This is intended to be +/// applied to the case where x is to be fully aligned to part of y. +pub fn affine_align(x: &DnaString, y: &DnaString) -> Alignment { + let score = |a: u8, b: u8| if a == b { 1i32 } else { -1i32 }; + let mut aligner = Aligner::new(-6, -1, &score); + aligner.semiglobal(&x.to_ascii_vec(), &y.to_ascii_vec()) +} diff --git a/lib/rust/vdj_ann/src/annotate.rs b/lib/rust/vdj_ann/src/annotate.rs new file mode 100644 index 0000000..ac6e2c9 --- /dev/null +++ b/lib/rust/vdj_ann/src/annotate.rs @@ -0,0 +1,3671 @@ +// Copyright (c) 2021 10X Genomics, Inc. All rights reserved. + +// This file contains code to annotate a contig, in the sense of finding alignments +// to VDJ reference contigs. Also to find CDR3 sequences. And some related things. + +use crate::align::affine_align; +use crate::refx::RefData; +use crate::transcript::{is_productive_contig, ContigStatus}; +use amino::{have_start, nucleotide_to_aminoacid_sequence}; +use bio_edit::alignment::AlignmentOperation::{Del, Ins, Match, Subst, Xclip, Yclip}; +use debruijn::dna_string::{DnaString, DnaStringSlice}; +use debruijn::kmer::{Kmer12, Kmer20}; +use debruijn::{Mer, Vmer}; +use io_utils::{fwrite, fwriteln}; +use itertools::Itertools; +use serde::{Deserialize, Serialize}; +use stats_utils::percent_ratio; +use std::cmp::{max, min}; +use std::fmt::Write as _; +use std::fs::File; +use std::io::{BufWriter, Write}; +use string_utils::{stringme, strme, TextUtils}; +use vdj_types::{VdjChain, VdjRegion}; +use vector_utils::{ + bin_member, erase_if, lower_bound1_3, next_diff1_2, next_diff1_3, next_diff_any, reverse_sort, + unique_sort, VecUtils, +}; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// START CODONS +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn print_start_codon_positions(tig: &DnaString, log: &mut Vec) { + let mut starts = Vec::::new(); + if tig.len() < 3 { + return; + } + for i in 0..tig.len() - 3 { + if have_start(tig, i) { + starts.push(i); + } + } + fwriteln!(log, "start codons at {}", starts.iter().format(", ")); +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ASSIGN CHAIN TYPE +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Assign a chain type to a given DNA sequence b. +// +// The chain type is either -1, meaning unassigned, or an index into the vector +// "IGH","IGK","IGL","TRA","TRB","TRD","TRG" +// representing a forward alignment to the chain type, or 7 + such an index, +// representing a reverse alignment. +// +// This takes as input the sequence b, plus the following auxiliary data +// structures: +// * a 20-mer kmer lookup table for the VDJ reference sequences, +// both TCR and BCR; +// * a classification vector that assigns each reference sequence to either a +// chain type index or -1. +// +// ◼ Ns are incorrectly handled. See lena 100349 for lots of examples. + +pub fn chain_type(b: &DnaString, rkmers_plus_full_20: &[(Kmer20, i32, i32)], rtype: &[i32]) -> i8 { + const N: usize = 7; + let k = 20; + if b.len() < k { + return -1_i8; + } + let mut count_this = [0; 2 * N]; + let brc = b.rc(); + for l in 0..b.len() - k + 1 { + let mut is_type = [false; 2 * N]; + for pass in 0..2 { + let z = if pass == 1 { N } else { 0 }; + let x = if pass == 0 { + b.get_kmer(l) + } else { + brc.get_kmer(l) + }; + let low = lower_bound1_3(rkmers_plus_full_20, &x) as usize; + for kmer in &rkmers_plus_full_20[low..] { + if kmer.0 != x { + break; + } + let t = kmer.1 as usize; + if rtype[t] >= 0 { + is_type[z + rtype[t] as usize] = true; + } + } + } + let nt = (is_type[0..2 * N]).iter().filter(|t| **t).count(); + if nt == 1 { + for l in 0..2 * N { + if is_type[l] { + count_this[l] += 1; + } + } + } + } + let m = *count_this.iter().max().unwrap(); + let best = count_this + .iter() + .enumerate() + .rfind(|&v| *v.1 == m) + .unwrap() + .0; + reverse_sort(&mut count_this); + if count_this[0] > count_this[1] { + best as i8 + } else { + -1_i8 + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ANNOTATE SEQUENCES +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Given a DnaString, enumerate matches to reference sequences. Matches are +// defined to be gap-free alignments seeded on 12-mer matches, with mismatches +// allowed in the following cases: +// +// 1. Given two successive maximal perfect matches of length >= 12 having the same +// offset, mismatches are allowed between them, so long as the error rate for +// the extended match is at most 10%. +// +// 2. We always allow extension over a single mismatch so long as 5 perfectly +// matching bases follow. +// +// However, we require a 20-mer match except for J regions. +// (see below for details) +// +// The structure of the output is: +// { ( start on sequence, match length, ref tig, start on ref tig, mismatches on sequence ) }. + +/// Annotation object denotes matches of a DnaString sequence to a reference sequence +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)] +pub struct Annotation { + /// Start position on sequence (contig) + pub tig_start: i32, + /// Match length + pub match_len: i32, + /// Reference id (that this contig matches) + pub ref_id: i32, + /// Start position on reference + pub ref_start: i32, + /// Number of mismatches on the sequence (contig) + pub mismatches: i32, +} + +impl From for Annotation { + fn from(a: Alignment) -> Self { + Self { + tig_start: a.tig_start, + match_len: a.len, + ref_id: a.ref_id, + ref_start: a.ref_start, + mismatches: a.mismatches.len() as i32, + } + } +} + +/// Represents an alignment between the a reference and the contig. +#[derive(PartialEq, Eq)] +struct Alignment { + /// Start position on sequence (contig) + tig_start: i32, + /// Match length + len: i32, + /// Reference id (that this contig matches) + ref_id: i32, + /// Start position on reference + ref_start: i32, + /// Vector mismatches on the sequence (contig) + mismatches: Vec, +} + +impl Alignment { + /// Get the offset between the position on the contig and the position on the ref. + fn offset(&self) -> i32 { + self.ref_start - self.tig_start + } + + /// Sort alignments by (tig_start, len, ref_id, ref_start, mismatches). + fn cmp_by_tig_start_len(a: &Self, b: &Self) -> std::cmp::Ordering { + let key: for<'a> fn(&'a Self) -> (_, _, _, _, &'a Vec<_>) = + |x: &Self| (x.tig_start, x.len, x.ref_id, x.ref_start, &x.mismatches); + key(a).cmp(&key(b)) + } + + /// Sort alignments by (ref_id, offset, tig_start, len, mismatches). + fn cmp_by_ref_id_offset(a: &Self, b: &Self) -> std::cmp::Ordering { + let key: for<'a> fn(&'a Self) -> (_, _, _, _, &'a Vec<_>) = + |x: &Self| (x.ref_id, x.offset(), x.tig_start, x.len, &x.mismatches); + key(a).cmp(&key(b)) + } + + /// Sort alignments by (ref_id, ref_start, tig_start, len, mismatches). + fn cmp_by_ref_id_ref_start(a: &Self, b: &Self) -> std::cmp::Ordering { + let key: for<'a> fn(&'a Self) -> (_, _, _, _, &'a Vec<_>) = + |x: &Self| (x.ref_id, x.ref_start, x.tig_start, x.len, &x.mismatches); + key(a).cmp(&key(b)) + } +} + +pub fn annotate_seq( + b: &DnaString, + refdata: &RefData, + allow_weak: bool, + allow_improper: bool, + abut: bool, +) -> Vec { + let mut log = Vec::::new(); + annotate_seq_core( + b, + refdata, + allow_weak, + allow_improper, + abut, + &mut log, + false, + ) +} + +fn print_alignx(log: &mut Vec, a: &Alignment, refdata: &RefData) { + let t = a.ref_id as usize; + let l = a.tig_start; + let len = a.len; + let p = a.ref_start; + let mis = a.mismatches.len(); + fwriteln!( + log, + "{}-{} ==> {}-{} on {} (mis={})", + l, + l + len, + p, + p + len, + refdata.rheaders[t], + mis + ); +} + +fn report_semis( + verbose: bool, + title: &str, + semi: &[Alignment], + b_seq: &[u8], + refs: &[DnaString], + log: &mut Vec, +) { + if verbose { + fwriteln!(log, "\n{}\n", title); + for s in semi { + fwrite!( + log, + "t = {}, offset = {}, tig start = {}, ref start = {}, len = {}, mis = {}", + s.ref_id, + s.offset(), + s.tig_start, + s.ref_start, + s.len, + s.mismatches.len(), + ); + let mut new_mis = Vec::::new(); + for j in 0..s.len { + if b_seq[(s.tig_start + j) as usize] + != refs[s.ref_id as usize].get((s.ref_start + j) as usize) + { + new_mis.push(s.tig_start + j); + } + } + if new_mis != s.mismatches { + fwriteln!(log, " [INVALID]"); + fwriteln!(log, "computed = {}", s.mismatches.iter().format(",")); + fwriteln!(log, "correct = {}", new_mis.iter().format(",")); + } else { + fwriteln!(log, ""); + } + } + } +} + +/// Minimum length of sequence we'll try to annotate. +const K: usize = 12; + +// Heuristic constants. +const MAX_RATE: f64 = 0.15; +const MIN_PERF_EXT: usize = 5; + +pub fn annotate_seq_core( + b: &DnaString, + refdata: &RefData, + allow_weak: bool, + allow_improper: bool, + abut: bool, + log: &mut Vec, + verbose: bool, +) -> Vec { + // The DNA string representation is inefficient because it stores bases as packed k-mers + // which requires a lot of array bounds checks when unpacking which was a hot path + // we found when profiling the CI job. To avoid those in the inner + // loop, we unpack it once here: + let b_seq = b.to_bytes(); + + if b.len() < K { + return Vec::new(); + } + let mut perf = find_perfect_matches_initial(b, refdata, &b_seq, allow_weak); + if verbose { + fwriteln!(log, "\nINITIAL PERF ALIGNMENTS\n"); + for s in &perf { + fwriteln!( + log, + "t = {}, offset = {}, tig start = {}, ref start = {}, len = {}", + s.ref_id, + s.offset(), + s.tig_start, + s.ref_start, + s.len, + ); + } + } + let new_matches = find_additional_perfect_matches(&b_seq, &refdata.refs, &perf); + perf.extend(new_matches); + + // Sort perfect matches. + perf.sort_unstable_by(Alignment::cmp_by_ref_id_offset); + if verbose { + fwriteln!(log, "\nPERF ALIGNMENTS\n"); + for s in &perf { + fwriteln!( + log, + "t = {}, offset = {}, tig start = {}, ref start = {}, len = {}", + s.ref_id, + s.offset(), + s.tig_start, + s.ref_start, + s.len, + ); + } + } + + let mut semi = merge_perfect_matches(&b_seq, &refdata.refs, perf); + report_semis( + verbose, + "INITIAL SEMI ALIGNMENTS", + &semi, + &b_seq, + &refdata.refs, + log, + ); + + extend_matches(&b_seq, &refdata.refs, &mut semi); + + annotate_40mers_for_mouse_a20(&b_seq, &refdata.refs, &mut semi); + + if allow_weak { + extend_matches_to_end_of_reference(&b_seq, &refdata.refs, &mut semi); + } + report_semis( + verbose, + "SEMI ALIGNMENTS", + &semi, + &b_seq, + &refdata.refs, + log, + ); + + extend_between_match_blocks(&b_seq, &refdata.refs, &mut semi); + report_semis( + verbose, + "SEMI ALIGNMENTS AFTER EXTENSION", + &semi, + &b_seq, + &refdata.refs, + log, + ); + + merge_overlapping_alignments(&mut semi); + report_semis( + verbose, + "SEMI ALIGNMENTS AFTER MERGER", + &semi, + &b_seq, + &refdata.refs, + log, + ); + + extend_long_v_gene_alignments(&b_seq, refdata, &mut semi); + report_semis( + verbose, + "SEMI ALIGNMENTS AFTER SECOND EXTENSION", + &semi, + &b_seq, + &refdata.refs, + log, + ); + + remove_subsumed_matches(&mut semi); + report_semis( + verbose, + "SEMI ALIGNMENTS AFTER SUBSUMPTION", + &semi, + &b_seq, + &refdata.refs, + log, + ); + + let mut annx = semi; + annx.sort_by(Alignment::cmp_by_tig_start_len); + annx.dedup(); + + if !allow_improper { + delete_improper_matches(&mut annx); + } + if verbose { + fwriteln!(log, "\nINITIAL ALIGNMENTS\n"); + for annxi in &annx { + print_alignx(log, annxi, refdata); + } + } + + retain_head_v_segments_with_start_codon(&b_seq, refdata, &mut annx); + if verbose { + fwriteln!(log, "\nALIGNMENTS ONE\n"); + for a in &annx { + print_alignx(log, a, refdata); + } + } + + remove_inferior_matches(&refdata.rheaders, verbose, log, &mut annx); + if verbose { + fwriteln!(log, "\nALIGNMENTS TWO\n"); + for a in &annx { + print_alignx(log, a, refdata); + } + } + + if abut { + find_indels_in_v_or_utr(&b_seq, b, refdata, verbose, log, &mut annx); + } + if verbose { + fwriteln!(log, "\nALIGNMENTS THREE\n"); + for a in &annx { + print_alignx(log, a, refdata); + } + } + + retain_best_alignment(&b_seq, refdata, verbose, log, &mut annx); + + remove_subsumed_alignments(&mut annx); + + extend_alignments(&b_seq, &refdata.refs, &mut annx); + if verbose { + fwriteln!(log, "\nALIGNMENTS FOUR\n"); + for a in &annx { + print_alignx(log, a, refdata); + } + } + + retain_longer_v_alignments(refdata, verbose, log, &mut annx); + + annotate_j_for_ig_with_c_and_v(&b_seq, refdata, &mut annx); + + delete_d_if_chain_doesnt_match_v(refdata, &mut annx); + + annotate_d_between_v_j(&b_seq, b, refdata, &mut annx); + if verbose { + fwriteln!(log, "\nALIGNMENTS FIVE\n"); + for a in &annx { + print_alignx(log, a, refdata); + } + } + + retain_longer_j_segment(&b_seq, refdata, &mut annx); + + retain_better_c_segment(&b_seq, b, refdata, &mut annx); + + retain_better_v_segment(&b_seq, b, refdata, &mut annx); + + remove_utr_without_matching_v(&refdata.rheaders, &mut annx); + if verbose { + fwriteln!(log, "\nALIGNMENTS SIX\n"); + for a in &annx { + print_alignx(log, a, refdata); + } + } + + retain_much_better_aligned_v_segment(&refdata.rheaders, &mut annx); + + remove_subsumed_alignments_2(&mut annx); + + downselect_equally_performant_j_and_c(refdata, &mut annx); + + downselect_to_best_c(&refdata.rheaders, &mut annx); + + remove_utr_without_matching_v(&refdata.rheaders, &mut annx); + + remove_subsumed_extended_alignments(&refdata.rheaders, &mut annx); + + annx.into_iter().map(Into::into).collect() +} + +/// Find maximal perfect matches of length >= 20, or 12 for J regions, so long +/// as we have extension to a 20-mer with only one mismatch. +fn find_perfect_matches_initial( + b: &DnaString, + refdata: &RefData, + b_seq: &[u8], + allow_weak: bool, +) -> Vec { + let mut perf = Vec::::new(); + for l in 0..(b.len() - K + 1) { + let x: Kmer12 = b.get_kmer(l); + let low = lower_bound1_3(&refdata.rkmers_plus, &x) as usize; + for kmer in &refdata.rkmers_plus[low..] { + if kmer.0 != x { + break; + } + let t = kmer.1 as usize; + let p = kmer.2 as usize; + if l > 0 && p > 0 && b_seq[l - 1] == refdata.refs[t].get(p - 1) { + continue; + } + let mut len = K; + while l + len < b.len() && p + len < refdata.refs[t].len() { + if b_seq[l + len] != refdata.refs[t].get(p + len) { + break; + } + len += 1; + } + let mut ok = len >= 20; + if !ok && allow_weak { + let mut ext1 = len + 1; + let mut lx = l as i32 - 2; + let mut px = p as i32 - 2; + while lx >= 0 && px >= 0 { + if b_seq[lx as usize] != refdata.refs[t].get(px as usize) { + break; + } + ext1 += 1; + lx -= 1; + px -= 1; + } + let mut ext2 = len + 1; + let mut lx = l + len + 1; + let mut px = p + len + 1; + while lx < b.len() && px < refdata.refs[t].len() { + if b_seq[lx] != refdata.refs[t].get(px) { + break; + } + ext2 += 1; + lx += 1; + px += 1; + } + if ext1 >= 20 || ext2 >= 20 { + ok = true; + } + } + if ok { + perf.push(Alignment { + ref_id: t as i32, + ref_start: p as i32, + tig_start: l as i32, + len: len as i32, + mismatches: Vec::new(), + }); + } + } + } + perf +} + +/// Find maximal perfect matches of length >= 10 that have the same offset as a perfect match +/// already found and are not equal to one of them. But only do this if we already have at +/// least 150 bases aligned. +fn find_additional_perfect_matches( + b_seq: &[u8], + refs: &[DnaString], + perf: &[Alignment], +) -> Vec { + #[derive(PartialEq, Eq, PartialOrd, Ord)] + struct Offset { + pub ref_id: i32, + pub offset: i32, + } + + let mut offsets = Vec::::new(); + for p in perf { + offsets.push(Offset { + ref_id: p.ref_id, + offset: p.offset(), + }); + } + unique_sort(&mut offsets); + const MM_START: i32 = 150; + const MM: i32 = 10; + let mut new_matches = Vec::new(); + for Offset { + ref_id: t, + offset: off, + } in offsets + { + let mut tig_starts = Vec::::new(); + let mut total = 0; + for pi in perf { + if pi.ref_id == t && pi.offset() == off { + tig_starts.push(pi.tig_start); + total += pi.len; + } + } + if total < MM_START { + continue; + } + let r = refs[t as usize].to_bytes(); + let (mut l, mut p) = (0, off); + while l <= b_seq.len() as i32 - MM { + if p + MM > r.len() as i32 { + break; + } + if p < 0 || b_seq[l as usize] != r[p as usize] { + l += 1; + p += 1; + } else { + let (mut lx, mut px) = (l + 1, p + 1); + loop { + if lx >= b_seq.len() as i32 || px >= r.len() as i32 { + break; + } + if b_seq[lx as usize] != r[px as usize] { + break; + } + lx += 1; + px += 1; + } + let len = lx - l; + if (MM..20).contains(&len) { + let mut known = false; + for tig_start in &tig_starts { + if l == *tig_start { + known = true; + break; + } + } + if !known { + new_matches.push(Alignment { + ref_id: t, + ref_start: p, + tig_start: l, + len, + mismatches: Vec::new(), + }); + } + } + l = lx; + p = px; + } + } + } + new_matches +} + +/// Merge perfect matches. We track the positions on b of mismatches. +fn merge_perfect_matches(b_seq: &[u8], refs: &[DnaString], perf: Vec) -> Vec { + let mut semi = Vec::::new(); + let mut i = 0; + while i < perf.len() { + assert!(perf[i].mismatches.is_empty()); + let j = next_diff_any(&perf, i, |a, b| { + a.ref_id == b.ref_id && a.offset() == b.offset() + }); + let (t, off) = (perf[i].ref_id, perf[i].offset()); + let mut join = vec![false; j - i]; + let mut mis = vec![Vec::::new(); j - i]; + for k in i..j - 1 { + let (l1, len1) = (perf[k].tig_start, perf[k].len); + let (l2, len2) = (perf[k + 1].tig_start, perf[k + 1].len); + for z in l1 + len1..l2 { + if b_seq[z as usize] != refs[t as usize].get((z + off) as usize) { + mis[k - i].push(z); + } + } + + // XXX: + // println!( "\ntrying merge" ); + // printme!( t, l1, l2, len1, len2, mis[k-i].len() ); + + if mis[k - i].len() as f64 / (l2 + len2 - l1) as f64 <= MAX_RATE { + join[k - i] = true; + } + } + let mut k1 = i; + while k1 < j { + // let mut k2 = k1 + 1; + let mut k2 = k1; + let mut m = Vec::::new(); + // m.append( &mut mis[k1-i].clone() ); + while k2 < j { + // if !join[k2-i-1] { break; } + if !join[k2 - i] { + break; + } + m.append(&mut mis[k2 - i].clone()); + k2 += 1; + } + semi.push(Alignment { + ref_id: t, + ref_start: perf[k1].ref_start, + tig_start: perf[k1].tig_start, + len: perf[k2].tig_start + perf[k2].len - perf[k1].tig_start, + mismatches: m, + }); + k1 = k2 + 1; + } + i = j; + } + semi +} + +/// Extend matches backwards and then forwards. +fn extend_matches(b_seq: &[u8], refs: &[DnaString], semi: &mut [Alignment]) { + for s in &mut *semi { + let t = s.ref_id; + let off = s.offset(); + let mut l = s.tig_start; + let mut len = s.len; + let mut mis = s.mismatches.clone(); + while l > MIN_PERF_EXT as i32 && l + off > MIN_PERF_EXT as i32 { + let mut ok = true; + for j in 0..MIN_PERF_EXT { + if b_seq[(l - j as i32 - 2) as usize] + != refs[t as usize].get((l + off - j as i32 - 2) as usize) + { + ok = false; + } + } + if !ok { + break; + } + mis.push(l - 1); + l -= MIN_PERF_EXT as i32 + 1; + len += MIN_PERF_EXT as i32 + 1; + while l > 0 && l + off > 0 { + if b_seq[l as usize - 1] != refs[t as usize].get((l + off - 1) as usize) { + break; + } + l -= 1; + len += 1; + } + } + while l + len < (b_seq.len() - MIN_PERF_EXT) as i32 + && l + len + off < (refs[t as usize].len() - MIN_PERF_EXT) as i32 + { + let mut ok = true; + for j in 0..MIN_PERF_EXT { + if b_seq[(l + len + j as i32 + 1) as usize] + != refs[t as usize].get((l + off + len + j as i32 + 1) as usize) + { + ok = false; + } + } + if !ok { + break; + } + mis.push(l + len); + len += MIN_PERF_EXT as i32 + 1; + while l + len < b_seq.len() as i32 && l + off + len < refs[t as usize].len() as i32 { + if b_seq[(l + len) as usize] != refs[t as usize].get((l + off + len) as usize) { + break; + } + len += 1; + } + } + s.ref_start = l + off; + s.tig_start = l; + s.len = len; + s.mismatches = mis; + } + for s in semi { + s.mismatches.sort_unstable(); + } +} + +/// Add some 40-mers with the same offset having <= 6 mismatches. +/// semi = {(t, off, pos on b, len, positions on b of mismatches)} +/// where off = pos on ref - pos on b +/// +/// Note that implementation is asymmetric: we don't look to the right of p2, not for +/// any particularly good reason. +/// +/// This was added to get the heavy chain V segment of the mouse A20 cell line to be annotated. +/// This is dubious because the cell line is ~30 years old and of uncertain ancestry. Thus +/// we're not sure if it arose from supported mouse strains or if the V segment might have +/// been corrupted during the growth of the cell line. The A20 heavy chain V differs by 20% +/// from the reference. +fn annotate_40mers_for_mouse_a20(b_seq: &[u8], refs: &[DnaString], semi: &mut Vec) { + let mut i = 0; + while i < semi.len() { + let mut j = i + 1; + let t = semi[i].ref_id; + let off = semi[i].offset(); + while j < semi.len() { + if semi[j].ref_id != t || semi[j].offset() != off { + break; + } + j += 1; + } + const L: i32 = 40; + const MAX_DIFFS: usize = 6; + let p1 = off + semi[i].tig_start; + // let p2 = off + semi[j-1].2 + semi[j-1].3; + if -off >= 0 && p1 - off <= b_seq.len() as i32 { + for p in 0..p1 - L { + let l = p - off; + let mut diffs = 0; + for m in 0..L { + if b_seq[(l + m) as usize] != refs[t as usize].get((p + m) as usize) { + diffs += 1; + if diffs > MAX_DIFFS { + break; + } + } + } + if diffs <= MAX_DIFFS { + let mut x = Vec::::new(); + for m in 0..L { + if b_seq[(l + m) as usize] != refs[t as usize].get((p + m) as usize) { + x.push(l + m); + } + } + semi.push(Alignment { + ref_id: t, + ref_start: p, + tig_start: p - off, + len: L, + mismatches: x, + }); + break; + } + } + } + i = j; + } + semi.sort_by(Alignment::cmp_by_ref_id_offset); +} + +/// Allow extension over some mismatches on right if it gets us to the end on +/// the reference. Ditto for left. +/// ◼ Not documented in main function docstring. +fn extend_matches_to_end_of_reference(b_seq: &[u8], refs: &[DnaString], semi: &mut [Alignment]) { + let max_mis = 5; + for s in &mut *semi { + let t = s.ref_id; + let off = s.offset(); + let l = s.tig_start; + let mut len = s.len; + let mut mis = s.mismatches.clone(); + let mut mis_count = 0; + while l + len < b_seq.len() as i32 && l + len + off < refs[t as usize].len() as i32 { + if b_seq[(l + len) as usize] != refs[t as usize].get((l + off + len) as usize) { + mis.push(l + len); + mis_count += 1; + } + len += 1; + } + if mis_count <= max_mis && l + len + off == refs[t as usize].len() as i32 { + s.len = len; + s.mismatches = mis; + } + } + for s in &mut *semi { + let t = s.ref_id; + let off = s.offset(); + let mut l = s.tig_start; + let mut len = s.len; + let mut mis = s.mismatches.clone(); + let mut mis_count = 0; + while l > 0 && l + off > 0 { + if b_seq[(l - 1_i32) as usize] != refs[t as usize].get((l + off - 1_i32) as usize) { + mis.push(l - 1); + mis_count += 1; + } + l -= 1; + len += 1; + } + if mis_count <= max_mis && l + off == 0 { + s.ref_start = l + off; + s.tig_start = l; + s.len = len; + s.mismatches = mis; + } + } + for s in semi { + s.mismatches.sort_unstable(); + } +} + +/// Extend between match blocks. +/// +/// This needs to be improved. What we should do instead is arrange the initial +/// extension between match blocks so it can be iterated. +fn extend_between_match_blocks(b_seq: &[u8], refs: &[DnaString], semi: &mut Vec) { + let mut to_delete = vec![false; semi.len()]; + for i1 in 0..semi.len() { + let t1 = semi[i1].ref_id; + if t1 < 0 { + continue; + } + let off1 = semi[i1].offset(); + let (l1, len1) = (semi[i1].tig_start, semi[i1].len); + let mis1 = semi[i1].mismatches.clone(); + for i2 in 0..semi.len() { + let t2 = semi[i2].ref_id; + let off2 = semi[i2].offset(); + if t2 != t1 || off2 != off1 { + continue; + } + let (l2, len2) = (semi[i2].tig_start, semi[i2].len); + if l1 + len1 >= l2 { + continue; + } + let mis2 = semi[i2].mismatches.clone(); + let mut mis3 = Vec::::new(); + for l in l1 + len1..l2 { + if b_seq[l as usize] != refs[t1 as usize].get((l + off1) as usize) { + mis3.push(l); + } + } + let nmis = mis1.len() + mis2.len() + mis3.len(); + if nmis as f64 / ((l2 + len2) - l1) as f64 > MAX_RATE { + continue; + } + semi[i1].len = (l2 + len2) - l1; + semi[i1].mismatches.append(&mut mis3); + semi[i1].mismatches.append(&mut mis2.clone()); + unique_sort(&mut semi[i1].mismatches); + semi[i2].ref_id = -1_i32; + to_delete[i2] = true; + } + } + erase_if(semi, &to_delete); +} + +/// Merge overlapping alignments. +fn merge_overlapping_alignments(semi: &mut Vec) { + let mut to_delete = vec![false; semi.len()]; + let mut i = 0; + while i < semi.len() { + let mut j = i + 1; + while j < semi.len() { + if semi[j].ref_id != semi[i].ref_id || semi[j].offset() != semi[i].offset() { + break; + } + j += 1; + } + for k1 in i..j { + for k2 in k1 + 1..j { + if to_delete[k1] || to_delete[k2] { + continue; + } + let offset = semi[k1].offset(); + let start1 = semi[k1].tig_start; + let start2 = semi[k2].tig_start; + let len1 = semi[k1].len; + let len2 = semi[k2].len; + let stop1 = start1 + len1; + let stop2 = start2 + len2; + let start = min(start1, start2); + let stop = max(stop1, stop2); + if stop - start <= len1 + len2 { + semi[k1].ref_start = start + offset; + semi[k1].tig_start = start; + semi[k1].len = stop - start; + let mut m2 = semi[k2].mismatches.clone(); + semi[k1].mismatches.append(&mut m2); + unique_sort(&mut semi[k1].mismatches); + to_delete[k2] = true; + } + } + } + i = j; + } + erase_if(semi, &to_delete); +} + +/// If a V gene aligns starting at 0, and goes at least 60% of the way to the end, and there +/// is only one alignment of the V gene, extend it to the end. +/// (Only one requirement ameliorated.) +fn extend_long_v_gene_alignments(b_seq: &[u8], refdata: &RefData, semi: &mut [Alignment]) { + let mut i = 0; + while i < semi.len() { + let mut j = i + 1; + while j < semi.len() { + if semi[j].ref_id != semi[i].ref_id { + break; + } + j += 1; + } + let mut k = i; + let mut ok = false; + if j - i == 1 { + ok = true; + } else if j - i == 2 { + ok = true; + if semi[i].tig_start < semi[i + 1].tig_start { + k = i + 1; + } + } + if ok { + let offset = semi[k].offset(); + let ref_start = semi[k].offset() + semi[k].tig_start; + let tig_start = semi[k].tig_start; + let t = semi[k].ref_id as usize; + if !refdata.rheaders[t].contains("segment") && refdata.is_v(t) { + let r = &refdata.refs[t]; + let len = semi[k].len; + if ref_start + len < r.len() as i32 + && (ref_start + len) as f64 / r.len() as f64 >= 0.60 + && len + tig_start < b_seq.len() as i32 + { + let start = ref_start + len; + let stop = min(r.len() as i32, b_seq.len() as i32 + offset); + for m in start..stop { + if b_seq[(m - offset) as usize] != r.get(m as usize) { + semi[k].mismatches.push(m - offset); + } + } + semi[k].len += stop - start; + } + } + } + i = j; + } + for s in semi { + unique_sort(&mut s.mismatches); + } +} + +/// Delete some subsumed matches. +// FIXME: collapse this and remove_subsumed_alignments below once the match +// types are collapsed. They have slightly different behavior. +fn remove_subsumed_matches(semi: &mut Vec) { + let mut to_delete = vec![false; semi.len()]; + let mut i = 0; + while i < semi.len() { + let mut j = i + 1; + while j < semi.len() { + if semi[j].ref_id != semi[i].ref_id || semi[j].offset() != semi[i].offset() { + break; + } + j += 1; + } + for k1 in i..j { + for k2 in i..j { + if semi[k1].offset() + semi[k1].tig_start + semi[k1].len + == semi[k2].offset() + semi[k2].tig_start + semi[k2].len + && semi[k1].len > semi[k2].len + { + to_delete[k2] = true; + } + } + } + i = j; + } + erase_if(semi, &to_delete); +} + +/// Delete matches that are 'too improper'. +fn delete_improper_matches(annx: &mut Vec) { + let mut to_delete: Vec = vec![false; annx.len()]; + // Re-sort the annotations by ref_id + annx.sort_by(Alignment::cmp_by_ref_id_ref_start); + let mut i1 = 0; + loop { + if i1 == annx.len() { + break; + } + let j1 = next_diff_any(annx, i1, |a, b| a.ref_id == b.ref_id); + let mut min_imp = i32::MAX; + for a in &annx[i1..j1] { + let imp = min(a.ref_start, a.tig_start); + min_imp = min(imp, min_imp); + } + const MAX_IMP: i32 = 60; + if min_imp > MAX_IMP { + for d in &mut to_delete[i1..j1] { + *d = true; + } + } + i1 = j1; + } + erase_if(annx, &to_delete); + // Re-sort using standard sort order. + annx.sort_by(Alignment::cmp_by_tig_start_len); +} + +/// Amongst V segments starting at zero on the V segment, if some start with +/// a start codon, delete the others. +fn retain_head_v_segments_with_start_codon( + b_seq: &[u8], + refdata: &RefData, + annx: &mut Vec, +) { + let mut have_starter = false; + for annxi in annx.iter() { + let t = annxi.ref_id as usize; + if !refdata.rheaders[t].contains("segment") && refdata.is_v(t) && annxi.ref_start == 0 { + let p = annxi.tig_start as usize; + if b_seq[p] == 0 // A + && b_seq[p+1] == 3 // T + && b_seq[p+2] == 2 + { + // G + have_starter = true; + break; + } + } + } + if have_starter { + let to_delete: Vec = annx + .iter() + .map(|annxi| { + let t = annxi.ref_id as usize; + if !refdata.rheaders[t].contains("segment") + && refdata.is_v(t) + && annxi.ref_start == 0 + { + let p = annxi.tig_start as usize; + if !(b_seq[p] == 0 && b_seq[p + 1] == 3 && b_seq[p + 2] == 2) { + return true; + } + } + false + }) + .collect(); + erase_if(annx, &to_delete); + } +} + +/// Remove inferior matches of the edge. Two alignments are compared if the +/// length of their overlap on the contig is at least 85% of one of the alignment +/// lengths len1 and len2. We compute the mismatch rates r1 and r2 between the +/// overlap interval and the respective references. The first alignment wins if +/// at least one of the following happens: +/// 1. len1 > len2 and r1 <= r2 +/// 2. len1 >= len2 and r2 < r2 +/// 3. len1 >= 1.5 * len2. +/// +/// Modified: multiple aligns of the same V segment are now group together in +/// the calculation. And add indel penalty. +/// +/// For efficiency, inner loop should check to see if already deleted. +fn remove_inferior_matches( + rheaders: &[String], + verbose: bool, + log: &mut Vec, + annx: &mut Vec, +) { + let mut to_delete: Vec = vec![false; annx.len()]; + let mut ts: Vec<(usize, usize)> = annx + .iter() + .enumerate() + .map(|(i, annxi)| (annxi.ref_id as usize, i)) + .collect(); // { ( contig index, annx index ) } + ts.sort_unstable(); + let mut i1 = 0; + while i1 < ts.len() { + let j1 = next_diff1_2(&ts, i1); + let mut tlen1 = 0; + for k in i1..j1 { + tlen1 += annx[ts[k].1].len; + } + let mut i2 = 0; + while i2 < ts.len() { + let j2 = next_diff1_2(&ts, i2); + let mut tlen2 = 0; + for k in i2..j2 { + tlen2 += annx[ts[k].1].len; + } + let (mut m1, mut m2) = (0, 0); + let mut over = 0_i64; + let mut offsets1 = Vec::::new(); + let mut offsets2 = Vec::::new(); + for t in &ts[i1..j1] { + let u1 = t.1; + offsets1.push(annx[u1].tig_start - annx[u1].ref_start); + } + for t in &ts[i2..j2] { + let u2 = t.1; + offsets2.push(annx[u2].tig_start - annx[u2].ref_start); + } + offsets1.sort_unstable(); + offsets2.sort_unstable(); + m1 += offsets1[offsets1.len() - 1] - offsets1[0]; + m2 += offsets2[offsets2.len() - 1] - offsets2[0]; + for k1 in i1..j1 { + let u1 = ts[k1].1; + let l1 = annx[u1].tig_start; + let len1 = annx[u1].len; + for t in &ts[i2..j2] { + let u2 = t.1; + let l2 = annx[u2].tig_start; + let len2 = annx[u2].len; + let start = max(l1, l2); + let stop = min(l1 + len1, l2 + len2); + if start >= stop { + continue; + } + over += stop as i64; + over -= start as i64; + for x in &annx[u1].mismatches { + if *x >= start && *x < stop { + m1 += 1; + } + } + for x in &annx[u2].mismatches { + if *x >= start && *x < stop { + m2 += 1; + } + } + } + } + + // Get mismatch rates. + + let (r1, r2) = (m1 as f64 / tlen1 as f64, m2 as f64 / tlen2 as f64); + + // Require that one of the intervals is at least 85% overlapped. + + const MIN_OVERLAP_FRAC: f64 = 0.85; + if over as f64 / (min(tlen1, tlen2) as f64) >= MIN_OVERLAP_FRAC { + // Decide if the second match is inferior. + + if (tlen1 > tlen2 && r1 <= r2) + || (tlen1 >= tlen2 && r1 < r2) + || tlen1 as f64 >= 1.5 * tlen2 as f64 + { + if verbose { + fwriteln!( + log, + "\nsee tlen1 = {}, tlen2 = {}, m1 = {}, m2 = {}, \ + r1 = {:.3}, r2 = {:.3}\nthis alignment", + tlen1, + tlen2, + m1, + m2, + r1, + r2 + ); + for item in &ts[i1..j1] { + let t = item.0; + let u = item.1; + let l = annx[u].tig_start; + let len = annx[u].len; + let p = annx[u].ref_start; + let mis = annx[u].mismatches.len(); + fwriteln!( + log, + "{}-{} ==> {}-{} on {}(mis={})", + l, + l + len, + p, + p + len, + rheaders[t], + mis + ); + } + fwriteln!(log, "beats this alignment"); + for item in &ts[i2..j2] { + let t = item.0; + let u = item.1; + let l = annx[u].tig_start; + let len = annx[u].len; + let p = annx[u].ref_start; + let mis = annx[u].mismatches.len(); + fwriteln!( + log, + "{}-{} ==> {}-{} on {}(mis={})", + l, + l + len, + p, + p + len, + rheaders[t], + mis + ); + } + } + for k in i2..j2 { + to_delete[ts[k].1] = true; + } + } + } + i2 = j2; + } + i1 = j1; + } + erase_if(annx, &to_delete); +} + +/// If there are two alignments to a particular V region, or a UTR, try to edit +/// them so that their start/stop position abut perfect on one side (either the +/// contig or the reference), and do not overlap on the other side, thus +/// exhibiting an indel. +/// +/// The approach to answering this seems very inefficient. +/// When this was moved here, some UTR alignments disappeared. +fn find_indels_in_v_or_utr( + b_seq: &[u8], + b: &DnaString, + refdata: &RefData, + verbose: bool, + log: &mut Vec, + annx: &mut Vec, +) { + let mut to_delete: Vec = vec![false; annx.len()]; + let mut aligns = vec![0; refdata.refs.len()]; + for i in 0..annx.len() { + aligns[annx[i].ref_id as usize] += 1; + } + for i1 in 0..annx.len() { + let t = annx[i1].ref_id as usize; + if refdata.rheaders[t].contains("segment") { + continue; + } + if !refdata.rheaders[t].contains("segment") && !refdata.is_u(t) && !refdata.is_v(t) { + continue; + } + let off1 = annx[i1].ref_start - annx[i1].tig_start; + for i2 in 0..annx.len() { + if to_delete[i1] || to_delete[i2] { + continue; + } + if i2 == i1 || annx[i2].ref_id as usize != t { + continue; + } + let (l1, mut l2) = (annx[i1].tig_start as usize, annx[i2].tig_start as usize); + if l1 >= l2 { + continue; + } + let (mut len1, mut len2) = (annx[i1].len as usize, annx[i2].len as usize); + if l1 + len1 > l2 + len2 { + continue; + } + let (p1, p2) = (annx[i1].ref_start, annx[i2].ref_start); + let (start1, stop1) = (l1, (l2 + len2)); // extent on contig + let (start2, stop2) = (p1 as usize, (p2 as usize + len2)); // extent on ref + if !(start1 < stop1 && start2 < stop2) { + continue; + } + let tot1 = stop1 - start1; + let tot2 = stop2 - start2; + let off2 = annx[i2].ref_start - annx[i2].tig_start; + + // Case where there is no indel. + + if tot1 == tot2 && aligns[t] == 2 { + let mut mis = annx[i1].mismatches.clone(); + #[allow(clippy::needless_range_loop)] + for p in l1 + len1..l2 { + if b_seq[p] != refdata.refs[t].get((p as i32 + off1) as usize) { + mis.push(p as i32); + } + } + mis.append(&mut annx[i2].mismatches.clone()); + annx[i1].len = tot1 as i32; + annx[i1].mismatches = mis; + to_delete[i2] = true; + continue; + } + + // Case of insertion. + + if tot1 > tot2 && aligns[t] == 2 { + let start1 = start1 as i32; + let stop1 = stop1 as i32; + let ins = (tot1 - tot2) as i32; + let mut best_ipos = 0; + let mut best_mis = 1000000; + let mut best_mis1 = Vec::::new(); + let mut best_mis2 = Vec::::new(); + for ipos in start1..=stop1 - ins { + let mut mis1 = Vec::::new(); + let mut mis2 = Vec::::new(); + for p in start1..ipos { + if b_seq[p as usize] != refdata.refs[t].get((p + off1) as usize) { + mis1.push(p); + } + } + for p in ipos + ins..stop1 { + if b_seq[p as usize] != refdata.refs[t].get((p + off2) as usize) { + mis2.push(p); + } + } + let mis = (mis1.len() + mis2.len()) as i32; + if mis < best_mis { + best_mis = mis; + best_mis1 = mis1; + best_mis2 = mis2; + best_ipos = ipos; + } + } + annx[i1].len = best_ipos - start1; + annx[i1].mismatches = best_mis1; + annx[i2].len = stop1 - best_ipos - ins; + annx[i2].tig_start = best_ipos + ins; + annx[i2].ref_start = best_ipos + ins + off2; + annx[i2].mismatches = best_mis2; + continue; + } + + // Case of deletion. + + if tot1 < tot2 && aligns[t] == 2 { + let start2 = start2 as i32; + let stop2 = stop2 as i32; + let del = (tot2 - tot1) as i32; + let mut best_dpos = 0; + let mut best_mis = 1000000; + let mut best_mis1 = Vec::::new(); + let mut best_mis2 = Vec::::new(); + for dpos in start2..=stop2 - del { + let mut mis1 = Vec::::new(); + let mut mis2 = Vec::::new(); + for q in start2..dpos { + let p = q - off1; + if b_seq[p as usize] != refdata.refs[t].get(q as usize) { + mis1.push(p); + } + } + for q in dpos + del..stop2 { + let p = q - off2; + if b_seq[p as usize] != refdata.refs[t].get(q as usize) { + mis2.push(p); + } + } + let mis = (mis1.len() + mis2.len()) as i32; + if mis < best_mis { + best_mis = mis; + best_mis1 = mis1; + best_mis2 = mis2; + best_dpos = dpos; + } + } + annx[i1].len = best_dpos - start2; + annx[i1].mismatches = best_mis1; + annx[i2].tig_start = best_dpos + del - off2; + annx[i2].len = stop2 - best_dpos - del; + annx[i2].ref_start = best_dpos + del; + annx[i2].mismatches = best_mis2; + continue; + } + + // It's not clear why the rest of this code helps, but it does. + + let p1 = p1 as usize; + let mut p2 = p2 as usize; + + let b1 = b.slice(start1, stop1).to_owned(); + let b2 = refdata.refs[t].slice(start2, stop2).to_owned(); + + let a = affine_align(&b1, &b2); + let mut del = Vec::<(usize, usize, usize)>::new(); + let mut ins = Vec::<(usize, usize, usize)>::new(); + let ops = &a.operations; + let mut i = 0; + let (mut z1, mut z2) = (l1 + a.xstart, p1 + a.ystart); + if a.ystart > 0 { + continue; + } + let mut matches = 0; + while i < ops.len() { + let mut opcount = 1; + while i + opcount < ops.len() + && (ops[i] == Del || ops[i] == Ins) + && ops[i] == ops[i + opcount] + { + opcount += 1; + } + match ops[i] { + Match => { + matches += 1; + z1 += 1; + z2 += 1; + } + Subst => { + z1 += 1; + z2 += 1; + } + Del => { + del.push((z1, z2, opcount)); + if verbose { + fwriteln!(log, "\nsee del[{}]", opcount); + } + z2 += opcount; + } + Ins => { + ins.push((z1, z2, opcount)); + if verbose { + fwriteln!(log, "\nsee ins[{}]", opcount); + } + z1 += opcount; + } + Xclip(d) => { + z1 += d; + } + Yclip(d) => { + z2 += d; + } + } + i += opcount; + } + if verbose { + fwriteln!( + log, + "\ntrying to merge\n{}\n{}", + refdata.rheaders[t], + refdata.rheaders[t] + ); + fwriteln!(log, "|del| = {}, |ins| = {}", del.len(), ins.len()); + } + if del.solo() && ins.is_empty() { + let (l, p, n) = (del[0].0, del[0].1, del[0].2); + if n != (p2 + len2 - p1) - (l2 + len2 - l1) { + continue; + } + len1 = l - l1; + if len1 >= matches { + continue; + } + len2 = l2 + len2 - l1 - len1; + l2 = l; + p2 = p + n; + } + if del.is_empty() && ins.solo() { + let (l, p, n) = (ins[0].0, ins[0].1, ins[0].2); + // ◼ This is buggy. It fails if overflow detection is on. + if n + l1 + p2 != l2 + p1 { + continue; + } + len1 = l - l1; + if len1 >= matches { + continue; + } + len2 = p2 + len2 - p1 - len1; + l2 = l + n; + p2 = p; + } + if del.len() + ins.len() == 0 { + to_delete[i2] = true; + len1 = (annx[i2].tig_start + annx[i2].len - annx[i1].tig_start) as usize; + annx[i1].len = len1 as i32; + annx[i1].mismatches.truncate(0); + for j in 0..len1 { + if b_seq[l1 + j] != refdata.refs[t].get(p1 + j) { + annx[i1].mismatches.push((l1 + j) as i32); + } + } + } + if del.len() + ins.len() == 1 { + annx[i2].tig_start = l2 as i32; + annx[i1].len = len1 as i32; + annx[i2].len = len2 as i32; + annx[i2].ref_start = p2 as i32; + annx[i1].mismatches.truncate(0); + annx[i2].mismatches.truncate(0); + for j in 0..len1 { + if b_seq[l1 + j] != refdata.refs[t].get(p1 + j) { + annx[i1].mismatches.push((l1 + j) as i32); + } + } + for j in 0..len2 { + if b_seq[l2 + j] != refdata.refs[t].get(p2 + j) { + annx[i2].mismatches.push((l2 + j) as i32); + } + } + } + } + } + erase_if(annx, &to_delete); +} + +/// Choose between segments if one clearly wins. For this calculation, we +/// put UTR and V segments together. The way the choice is made could be refined. +/// +/// At least in some cases, a better way of comparing errors would be to first +/// extend the alignments so that their endpoints on the contigs agree, to the +/// extent that this is possible. +/// +/// This code has not really been adequately tested to see if the right +/// choices are being made. +/// +/// Note danger with nonstandard references. +/// +/// Really should have ho_interval here. +fn retain_best_alignment( + b_seq: &[u8], + refdata: &RefData, + verbose: bool, + log: &mut Vec, + annx: &mut Vec, +) { + let mut combo = Vec::<(String, i32, usize)>::new(); + for (i, a) in annx.iter().enumerate() { + let t = a.ref_id as usize; + if !refdata.rheaders[t].contains("segment") { + combo.push(( + refdata.name[t].clone() + "." + &refdata.transcript[t], + refdata.id[t], + i, + )); + } + } + combo.sort(); + // cov mis locs rstarts mis_nutr + let mut data = Vec::<(Vec<(usize, usize)>, usize, Vec, Vec, usize)>::new(); + + let mut i = 0; + while i < combo.len() { + let j = next_diff1_3(&combo, i); + let mut cov = Vec::<(usize, usize)>::new(); + let mut mis = 0; + let mut mis_nutr = 0; + let mut locs = Vec::::new(); + let mut rstarts = Vec::::new(); + for k in i..j { + locs.push(combo[k].2); + let a = &annx[combo[k].2]; + rstarts.push(a.ref_start as usize); + cov.push((a.tig_start as usize, (a.tig_start + a.len) as usize)); + mis += a.mismatches.len(); + if !refdata.is_u(a.ref_id as usize) { + mis_nutr += a.mismatches.len(); + } + } + data.push((cov, mis, locs, rstarts, mis_nutr)); + i = j; + } + + let mut to_delete = vec![false; annx.len()]; + let mut deleted = vec![false; data.len()]; + for i1 in 0..data.len() { + if deleted[i1] { + continue; + } + for i2 in 0..data.len() { + if i2 == i1 { + continue; + } + let t1 = annx[data[i1].2[0]].ref_id as usize; + let t2 = annx[data[i2].2[0]].ref_id as usize; + + let same_class = (refdata.segtype[t1] == refdata.segtype[t2]) + || (refdata.is_v(t1) && refdata.is_u(t2)) + || (refdata.is_u(t1) && refdata.is_v(t2)); + if !same_class { + continue; + } + + // At this point we have two alignments, for which the reference sequence names + // are the same, and for which either they both have the same segment type + // (U, V, J, C), or else one is U and one is V. Next we compare them, first + // gathering information about UTRs. + + let name1 = &refdata.name[t1]; + let name2 = &refdata.name[t2]; + let (mut utr1, mut utr2) = (false, false); + if refdata.is_v(t1) || refdata.is_u(t1) { + utr1 = refdata.has_utr[name1]; + utr2 = refdata.has_utr[name2]; + } + let (mut have_utr_align1, mut have_utr_align2) = (false, false); + for j in &data[i1].2 { + if refdata.is_u(annx[*j].ref_id as usize) { + have_utr_align1 = true; + } + } + for j in &data[i2].2 { + if refdata.is_u(annx[*j].ref_id as usize) { + have_utr_align2 = true; + } + } + + // Now find their mismatch positions. + + let n = b_seq.len(); + let (mut mis1, mut mis2) = (vec![false; n], vec![false; n]); + for j in &data[i1].2 { + for p in &annx[*j].mismatches { + mis1[*p as usize] = true; + } + } + for j in &data[i2].2 { + for p in &annx[*j].mismatches { + mis2[*p as usize] = true; + } + } + + // Compute the fraction of i2 coverage that's outside i1 coverage. + // ◼ This is horrendously inefficient. Use ho intervals. + + let (mut cov1, mut cov2) = (vec![false; n], vec![false; n]); + for j in 0..data[i1].0.len() { + let t = annx[data[i1].2[j]].ref_id; + if utr2 || !refdata.is_u(t as usize) { + let x = &data[i1].0[j]; + for c in &mut cov1[x.0..x.1] { + *c = true; + } + } + } + for j in 0..data[i2].0.len() { + let t = annx[data[i2].2[j]].ref_id; + if utr1 || !refdata.is_u(t as usize) { + let x = &data[i2].0[j]; + for c in &mut cov2[x.0..x.1] { + *c = true; + } + } + } + let count_true = |bools: &[bool]| bools.iter().filter(|c| **c).count(); + + let total1 = count_true(&cov1[0..n]); + let total2 = count_true(&cov2[0..n]); + + // Same as above but always exclude UTRs. + + let (mut cov1_nu, mut cov2_nu) = (vec![false; n], vec![false; n]); + for j in 0..data[i1].0.len() { + let t = annx[data[i1].2[j]].ref_id; + if !refdata.is_u(t as usize) { + let x = &data[i1].0[j]; + for c in &mut cov1_nu[x.0..x.1] { + *c = true; + } + } + } + for j in 0..data[i2].0.len() { + let t = annx[data[i2].2[j]].ref_id; + if !refdata.is_u(t as usize) { + let x = &data[i2].0[j]; + for c in &mut cov2_nu[x.0..x.1] { + *c = true; + } + } + } + + let total1_nu = count_true(&cov1_nu[0..n]); + let total2_nu = count_true(&cov2_nu[0..n]); + + // Compute amount shared. + + let mut share = 0; + for l in 0..n { + if cov1[l] && cov2[l] { + share += 1; + } + } + let outside1 = percent_ratio(total1 - share, total1); + let outside2 = percent_ratio(total2 - share, total2); + + // Find the number of mismatches in the overlap region. + + let (mut m1, mut m2) = (0, 0); + for l in 0..n { + if cov1[l] && cov2[l] { + if mis1[l] { + m1 += 1; + } + if mis2[l] { + m2 += 1; + } + } + } + + // Compute error rates. + // ◼ This is incorrect in the case where the UTR has been excluded. + // Added separate estimates with UTRs excluded. + + let err1 = percent_ratio(data[i1].1, total1); + let err2 = percent_ratio(data[i2].1, total2); + let err1_nu = percent_ratio(data[i1].4, total1_nu); + let err2_nu = percent_ratio(data[i2].4, total2_nu); + + // Compute zstops. + + let (mut zstop1, mut zstop2) = (0, 0); + for l in 0..data[i1].2.len() { + let t = annx[data[i1].2[l]].ref_id as usize; + if refdata.is_v(t) && (data[i1].3[l] == 0 || data[i1].0[l].0 == 0) { + zstop1 = max(zstop1, data[i1].0[l].1); + } + } + for l in 0..data[i2].2.len() { + let t = annx[data[i2].2[l]].ref_id as usize; + if refdata.is_v(t) && (data[i2].3[l] == 0 || data[i2].0[l].0 == 0) { + zstop2 = max(zstop2, data[i2].0[l].1); + } + } + + // Decide if the first wins. And symmetrize to prevent double + // deletion. Be very careful to respect this if editing! + + let (mut win1, mut win2) = (false, false); + let c1 = m1 == m2 && !have_utr_align2 && err1_nu == err2_nu && outside1 > outside2; + let c2 = m2 == m1 && !have_utr_align1 && err2_nu == err1_nu && outside2 > outside1; + if (zstop1 > zstop2 + 20 && (outside2 <= 10.0 || total2 - share <= 10)) + || (outside1 >= 10.0 && outside2 <= 1.0 && err1 - err2 <= 2.5) + { + win1 = true; + } else if zstop1 == 0 && zstop2 > 0 { + } else if (outside2 <= 10.0 || total2 - share <= 10) + && (m1 < m2 + || (m1 == m2 && err1 < err2 && !c2) + || (m1 == m2 && err1 == err2 && outside1 > outside2) + || (m1 == m2 && err1 == err2 && outside1 == outside2 && t1 < t2) + || c1) + { + win1 = true; + } + + // Symmetrization. + + if (zstop2 > zstop1 + 20 && (outside1 <= 10.0 || total1 - share <= 10)) + || (outside2 >= 10.0 && outside1 <= 1.0 && err2 - err1 <= 2.5) + { + win2 = true; + } else if zstop2 == 0 && zstop1 > 0 { + } else if (outside1 <= 10.0 || total1 - share <= 10) + && (m2 < m1 + || (m2 == m1 && err2 < err1 && !c1) + || (m2 == m1 && err2 == err1 && outside2 > outside1) + || (m2 == m1 && err2 == err1 && outside2 == outside1 && t2 < t1) + || c2) + { + win2 = true; + } + if win2 { + win1 = false; + } + + // Verbose logging. + + if verbose { + fwriteln!(log, "\nCOMPARING"); + for l in 0..data[i1].2.len() { + let t = annx[data[i1].2[l]].ref_id as usize; + let cov = &data[i1].0[l]; + let mis = data[i1].1; + fwriteln!( + log, + "{}, cov = {}-{}, mis = {}", + refdata.rheaders[t], + cov.0, + cov.1, + mis + ); + } + fwriteln!(log, "TO"); + for l in 0..data[i2].2.len() { + let t = annx[data[i2].2[l]].ref_id as usize; + let cov = &data[i2].0[l]; + let mis = data[i2].1; + fwriteln!( + log, + "{}, cov = {}-{}, mis = {}", + refdata.rheaders[t], + cov.0, + cov.1, + mis + ); + } + fwriteln!(log, "zstop1 = {}, zstop2 = {}", zstop1, zstop2); + fwriteln!(log, "m1 = {}, m2 = {}", m1, m2); + fwriteln!(log, "err1 = {}, err2 = {}", err1, err2); + fwriteln!(log, "err1_nu = {}, err2_nu = {}", err1_nu, err2_nu); + fwriteln!(log, "utr1 = {}, utr2 = {}", utr1, utr2); + fwriteln!( + log, + "have_utr_align1 = {}, have_utr_align2 = {}", + have_utr_align1, + have_utr_align2 + ); + fwriteln!( + log, + "total1 = {}, total2 = {}, share = {}", + total1, + total2, + share + ); + fwriteln!( + log, + "outside1 = {:.1}%, outside2 = {:.1}%, \ + total2 - share = {}, err1 = {:.1}%, err2 = {:.1}%", + outside1, + outside2, + total2 - share, + err1, + err2 + ); + fwriteln!(log, "win1 = {}, win2 = {}", win1, win2); + } + + // Pick "randomly" in case of tie. Unless we're comparing TRBC1 to TRBC2, and in + // that case, do nothing. This is needed because of the handling below of these + // segments. + + if outside1 == 0.0 + && outside2 == 0.0 + && zstop1 == zstop2 + && m1 == m2 + && err1 == err2 + && t1 < t2 + { + if refdata.name[t1] == *"TRBC1" && refdata.name[t2] == *"TRBC2" { + continue; + } + if refdata.name[t2] == *"TRBC1" && refdata.name[t1] == *"TRBC2" { + continue; + } + win1 = true; + } + + // Make decision. + + if win1 { + for l in &data[i2].2 { + to_delete[*l] = true; + } + deleted[i2] = true; + } + } + } + erase_if(annx, &to_delete); +} + +/// Delete some subsumed alignments. +// FIXME: collapse this and remove_subsumed_matches once the match types are +// collapsed. They have slightly different behavior. +fn remove_subsumed_alignments(annx: &mut Vec) { + let mut to_delete = vec![false; annx.len()]; + let mut i = 0; + while i < annx.len() { + let mut j = i + 1; + while j < annx.len() { + if annx[j].tig_start != annx[i].tig_start { + break; + } + j += 1; + } + for k1 in i..j { + for k2 in i..j { + if annx[k1].ref_id == annx[k2].ref_id + && annx[k1].ref_start == annx[k2].ref_start + && annx[k1].len > annx[k2].len + { + to_delete[k2] = true; + } + } + } + i = j; + } + + erase_if(annx, &to_delete); +} + +/// Extend some alignments. +fn extend_alignments(b_seq: &[u8], refs: &[DnaString], annx: &mut [Alignment]) { + let mut aligns = vec![0; refs.len()]; + for a in annx.iter() { + aligns[a.ref_id as usize] += 1; + } + for a in annx { + let t = a.ref_id as usize; + let len = a.len as usize; + if aligns[t] == 1 + && a.ref_start == 0 + && len < refs[t].len() + && len as f64 / refs[t].len() as f64 >= 0.75 + && (refs[t].len() as i32 + a.tig_start - a.ref_start) as usize <= b_seq.len() + { + for p in len..refs[t].len() { + let q = p as i32 + a.tig_start - a.ref_start; + if b_seq[q as usize] != refs[t].get(p) { + a.mismatches.push(q); + } + } + a.len = refs[t].len() as i32; + } + } +} + +/// If two V segments are aligned starting at 0 on the reference and one +/// is aligned a lot further, it wins. +fn retain_longer_v_alignments( + refdata: &RefData, + verbose: bool, + log: &mut Vec, + annx: &mut Vec, +) { + let mut lens = vec![0; refdata.refs.len()]; + for a in annx.iter() { + let t = a.ref_id as usize; + lens[t] += a.ref_start + a.len; + } + let mut to_delete: Vec = vec![false; annx.len()]; + for i1 in 0..annx.len() { + for i2 in 0..annx.len() { + let (t1, t2) = (annx[i1].ref_id as usize, annx[i2].ref_id as usize); + if refdata.rheaders[t1].contains("segment") || refdata.rheaders[t2].contains("segment") + { + continue; + } + if !refdata.is_v(t1) || !refdata.is_v(t2) { + continue; + } + if t1 == t2 { + continue; + } + let (p1, p2) = (annx[i1].ref_start, annx[i2].ref_start); + if p1 > 0 { + continue; + } + const MIN_EXT: i32 = 50; + if (p2 > 0 && lens[t1] >= lens[t2]) || (p2 == 0 && lens[t1] >= lens[t2] + MIN_EXT) { + if verbose { + fwriteln!(log, ""); + print_alignx(log, &annx[i1], refdata); + fwriteln!(log, "beats"); + print_alignx(log, &annx[i2], refdata); + } + to_delete[i2] = true; + } + } + } + erase_if(annx, &to_delete); +} + +/// For IG, if we have a C segment that aligns starting at zero, and a V segment +/// that aligns, but no J segment, try to find a J segment alignment. For now we +/// assume that the J aligns up to exactly the point where the C starts, or to +/// one base after. We require that the last 20 bases of the J match with at +/// most 5 mismatches. +fn annotate_j_for_ig_with_c_and_v(b_seq: &[u8], refdata: &RefData, annx: &mut Vec) { + let (mut igv, mut igj) = (false, false); + let mut igc = -1_i32; + const J_TOT: i32 = 20; + const J_MIS: i32 = 5; + for a in annx.iter() { + let t = a.ref_id as usize; + if refdata.rheaders[t].contains("segment") { + continue; + } + let rt = refdata.rtype[t]; + if (0..3).contains(&rt) { + if refdata.segtype[t] == "V" { + igv = true; + } else if refdata.segtype[t] == "J" { + igj = true; + } else if refdata.segtype[t] == "C" + && a.ref_start == 0 + && a.tig_start >= J_TOT + && refdata.refs[t].len() >= J_TOT as usize + { + igc = a.tig_start; + } + } + } + if igc >= 0 && igv && !igj { + let mut best_t = -1_i32; + let mut best_mis = 1000000; + let mut best_z = -1_i32; + for z in 0..2 { + for l in 0..refdata.igjs.len() { + let t = refdata.igjs[l]; + let n = refdata.refs[t].len(); + if n > igc as usize + z { + continue; + } + let i = igc as usize + z - n; // start of J on contig + let (mut total, mut mis) = (0, 0); + for j in (0..n).rev() { + total += 1; + if b_seq[i + j] != refdata.refs[t].get(j) { + mis += 1; + if total <= J_TOT && mis > J_MIS { + break; + } + } + } + if total == n as i32 && mis < best_mis { + best_t = t as i32; + best_mis = mis; + best_z = z as i32; + } + } + } + if best_t >= 0 { + let t = best_t as usize; + let n = refdata.refs[t].len() as i32; + let i = igc + best_z - n; + let mut mis = Vec::::new(); + for j in 0..n { + if b_seq[(i + j) as usize] != refdata.refs[t].get(j as usize) { + mis.push(i + j); + } + } + annx.push(Alignment { + tig_start: i, + len: n, + ref_id: best_t, + ref_start: 0, + mismatches: mis, + }); + annx.sort_by(Alignment::cmp_by_tig_start_len); + } + } +} + +/// If there is a D gene alignment that is from a different chain type than the V gene +/// alignment, delete it. +fn delete_d_if_chain_doesnt_match_v(refdata: &RefData, annx: &mut Vec) { + let mut to_delete: Vec = vec![false; annx.len()]; + for i1 in 0..annx.len() { + let t1 = annx[i1].ref_id as usize; + if !refdata.rheaders[t1].contains("segment") && refdata.segtype[t1] == "D" { + let mut have_v = false; + for a in annx.iter() { + let t2 = a.ref_id as usize; + if !refdata.rheaders[t2].contains("segment") + && refdata.segtype[t2] == "V" + && refdata.rtype[t1] == refdata.rtype[t2] + { + have_v = true; + } + } + if !have_v { + to_delete[i1] = true; + } + } + } + erase_if(annx, &to_delete); +} + +/// For IGH and TRB (and TRD in Gamma/delta mode), if there is a V and J, but no D, look for a D that matches nearly perfectly +/// between them. We consider only alignments having no indels. The following conditions +/// are required: +/// 1. At most three mismatches. +/// 2. Excluding genes having the same name: +/// (a) all others have more mismatches +/// (b) all others have no more matches. +fn annotate_d_between_v_j( + b_seq: &[u8], + b: &DnaString, + refdata: &RefData, + annx: &mut Vec, +) { + let (mut v, mut d, mut j) = (false, false, false); + let (mut vstop, mut jstart) = (0, 0); + const VJTRIM: i32 = 10; + let mut v_rtype = -2_i32; + for ann in annx.iter() { + let t = ann.ref_id as usize; + if !refdata.rheaders[t].contains("segment") { + let rt = refdata.rtype[t]; + // IGH or TRB (or TRD in Gamma/delta mode) + if rt == 0 || rt == 4 || rt == 5 { + if refdata.segtype[t] == "V" { + v = true; + vstop = ann.tig_start + ann.len; + v_rtype = rt; + } else if refdata.segtype[t] == "D" { + d = true; + } else if refdata.segtype[t] == "J" { + j = true; + jstart = ann.tig_start; + } + } + } + } + if v && !d && j { + let mut results = Vec::<(usize, usize, usize, String, usize, Vec)>::new(); + let start = max(0, vstop - VJTRIM); + let stop = min(b.len() as i32, jstart + VJTRIM); + const MAX_MISMATCHES: usize = 3; + for t in &refdata.ds { + if refdata.rtype[*t] == v_rtype { + let r = &refdata.refs[*t]; + for m in start..=stop - (r.len() as i32) { + let mut mismatches = Vec::::new(); + for x in 0..r.len() { + if r.get(x) != b_seq[(m + x as i32) as usize] { + mismatches.push(x as i32); + } + } + let matches = r.len() - mismatches.len(); + let mut gene = refdata.name[*t].clone(); + if gene.contains('*') { + gene = gene.before("*").to_string(); + } + results.push((mismatches.len(), matches, *t, gene, m as usize, mismatches)); + } + } + } + results.sort(); + if !results.is_empty() && results[0].0 <= MAX_MISMATCHES { + let mut to_delete = vec![false; results.len()]; + for i in 1..results.len() { + if results[i].3 == results[0].3 { + to_delete[i] = true; + } + } + erase_if(&mut results, &to_delete); + if results.solo() || results[0].0 < results[1].0 { + let mut best_matches = 0; + for result in &results { + best_matches = max(best_matches, result.1); + } + if results[0].1 == best_matches { + annx.push(Alignment { + tig_start: results[0].4 as i32, + len: (results[0].0 + results[0].1) as i32, + ref_id: results[0].2 as i32, + ref_start: 0, + mismatches: results[0].5.clone(), + }); + annx.sort_by(Alignment::cmp_by_tig_start_len); + } + } + } + } +} + +/// A J segment that goes up to its end beats any J segment that doesn't. +/// If they both go up to the end, choose. +fn retain_longer_j_segment(b_seq: &[u8], refdata: &RefData, annx: &mut Vec) { + let mut to_delete: Vec = vec![false; annx.len()]; + for i1 in 0..annx.len() { + for i2 in 0..annx.len() { + let (t1, t2) = (annx[i1].ref_id as usize, annx[i2].ref_id as usize); + if refdata.rheaders[t1].contains("segment") || refdata.rheaders[t2].contains("segment") + { + continue; + } + if !refdata.is_j(t1) || !refdata.is_j(t2) { + continue; + } + let (len1, len2) = (annx[i1].len, annx[i2].len); + let (l1, l2) = (annx[i1].tig_start, annx[i2].tig_start); + let (p1, p2) = (annx[i1].ref_start, annx[i2].ref_start); + if len1 + p1 == refdata.refs[t1].len() as i32 + && len2 + p2 < refdata.refs[t2].len() as i32 + { + to_delete[i2] = true; + } + if len1 + p1 == refdata.refs[t1].len() as i32 + && len2 + p2 == refdata.refs[t2].len() as i32 + { + let (mut mis1, mut mis2) = (0, 0); + let mut y1 = refdata.refs[t1].len() as i32 - 1; + let mut y2 = refdata.refs[t2].len() as i32 - 1; + let (mut x1, mut x2) = (y1 + l1 - p1, y2 + l2 - p2); + loop { + if b_seq[x1 as usize] != refdata.refs[t1].get(y1 as usize) { + mis1 += 1; + } + if b_seq[x2 as usize] != refdata.refs[t2].get(y2 as usize) { + mis2 += 1; + } + if x1 == 0 || y1 == 0 || x2 == 0 || y2 == 0 { + break; + } + x1 -= 1; + y1 -= 1; + x2 -= 1; + y2 -= 1; + } + if mis1 < mis2 || (mis1 == mis2 && t1 < t2) { + to_delete[i2] = true; + } + } + } + } + erase_if(annx, &to_delete); +} + +/// Pick between C segments starting at zero. And favor zero. +fn retain_better_c_segment( + b_seq: &[u8], + b: &DnaString, + refdata: &RefData, + annx: &mut Vec, +) { + let mut to_delete: Vec = vec![false; annx.len()]; + for i1 in 0..annx.len() { + for i2 in 0..annx.len() { + if i2 == i1 { + continue; + } + let (t1, t2) = (annx[i1].ref_id as usize, annx[i2].ref_id as usize); + if refdata.rheaders[t1].contains("segment") || refdata.rheaders[t2].contains("segment") + { + continue; + } + if !refdata.is_c(t1) || !refdata.is_c(t2) { + continue; + } + let (l1, l2) = (annx[i1].tig_start, annx[i2].tig_start); + let (p1, p2) = (annx[i1].ref_start, annx[i2].ref_start); + if p1 > 0 { + continue; + } + if p1 == 0 && p2 > 0 { + to_delete[i2] = true; + } + let (mut mis1, mut mis2) = (0, 0); + let (mut y1, mut y2) = (p1, p2); + let (mut x1, mut x2) = (l1, l2); + loop { + if b_seq[x1 as usize] != refdata.refs[t1].get(y1 as usize) { + mis1 += 1; + } + if b_seq[x2 as usize] != refdata.refs[t2].get(y2 as usize) { + mis2 += 1; + } + x1 += 1; + y1 += 1; + x2 += 1; + y2 += 1; + if x1 == b.len() as i32 || y1 == refdata.refs[t1].len() as i32 { + break; + } + if x2 == b.len() as i32 || y2 == refdata.refs[t2].len() as i32 { + break; + } + } + + if mis1 == mis2 { + if refdata.name[t1] == *"TRBC1" && refdata.name[t2] == *"TRBC2" { + continue; + } + if refdata.name[t2] == *"TRBC1" && refdata.name[t1] == *"TRBC2" { + continue; + } + } + if mis1 < mis2 || (mis1 == mis2 && t1 < t2) { + to_delete[i2] = true; + } + } + } + erase_if(annx, &to_delete); +} + +/// Pick between V segments starting at zero. And favor zero. +fn retain_better_v_segment( + b_seq: &[u8], + b: &DnaString, + refdata: &RefData, + annx: &mut Vec, +) { + let mut nv = 0; + for a in annx.iter() { + let t = a.ref_id as usize; + if refdata.rheaders[t].contains("segment") { + continue; + } + if refdata.is_v(t) { + nv += 1; + } + } + if nv == 2 { + let mut to_delete: Vec = vec![false; annx.len()]; + for i1 in 0..annx.len() { + for i2 in 0..annx.len() { + let (t1, t2) = (annx[i1].ref_id as usize, annx[i2].ref_id as usize); + if t2 == t1 { + continue; + } + if refdata.rheaders[t1].contains("segment") + || refdata.rheaders[t2].contains("segment") + { + continue; + } + if !refdata.is_v(t1) || !refdata.is_v(t2) { + continue; + } + let (l1, l2) = (annx[i1].tig_start, annx[i2].tig_start); + let (p1, p2) = (annx[i1].ref_start, annx[i2].ref_start); + if p1 > 0 { + continue; + } + if p2 > 0 { + to_delete[i2] = true; + } + let (mut mis1, mut mis2) = (0, 0); + let (mut y1, mut y2) = (p1, p2); + let (mut x1, mut x2) = (l1, l2); + loop { + if b_seq[x1 as usize] != refdata.refs[t1].get(y1 as usize) { + mis1 += 1; + } + if b_seq[x2 as usize] != refdata.refs[t2].get(y2 as usize) { + mis2 += 1; + } + x1 += 1; + y1 += 1; + x2 += 1; + y2 += 1; + if x1 == b.len() as i32 || y1 == refdata.refs[t1].len() as i32 { + break; + } + if x2 == b.len() as i32 || y2 == refdata.refs[t2].len() as i32 { + break; + } + } + if mis1 < mis2 { + to_delete[i2] = true; + } + } + } + erase_if(annx, &to_delete); + } +} + +// Remove UTR annotations that have no matching V annotation. +fn remove_utr_without_matching_v(rheaders: &[String], annx: &mut Vec) { + let mut to_delete: Vec = vec![false; annx.len()]; + let (mut u, mut v) = (Vec::::new(), Vec::::new()); + for a in annx.iter() { + let t = a.ref_id as usize; + if !rheaders[t].contains("segment") { + let name = rheaders[t].after("|").between("|", "|"); + if rheaders[t].contains("UTR") { + u.push(name.to_string()); + } + if rheaders[t].contains("V-REGION") { + v.push(name.to_string()); + } + } + } + v.sort(); + for item in &u { + if !bin_member(&v, item) { + for j in 0..annx.len() { + let t = annx[j].ref_id as usize; + if !rheaders[t].contains("segment") { + let name = rheaders[t].after("|").between("|", "|"); + if rheaders[t].contains("UTR") && item == name { + to_delete[j] = true; + } + } + } + } + } + erase_if(annx, &to_delete); +} + +/// In light of the previous calculation, see if one V is aligned much better +/// than another V. This is done by looking for simple indel events. +/// Probably will have to be generalized. +fn retain_much_better_aligned_v_segment(rheaders: &[String], annx: &mut Vec) { + let mut to_delete: Vec = vec![false; annx.len()]; + let mut vs = Vec::<(usize, usize)>::new(); + for (i, a) in annx.iter().enumerate() { + let t = a.ref_id as usize; + if !rheaders[t].contains("V-REGION") { + continue; + } + vs.push((t, i)); + } + vs.sort_unstable(); + // len parts errs index + let mut score = Vec::<(i32, usize, usize, usize)>::new(); + let mut j = 0; + let mut nonsimple = false; + let mut have_split = false; + let max_indel = 27; + let min_len_gain = 100; + while j < vs.len() { + let k = next_diff1_2(&vs, j); + if k - j == 1 { + score.push((annx[j].len, k - j, annx[j].mismatches.len(), vs[j].1)); + } else if k - j == 2 { + let (i1, i2) = (vs[j].1, vs[j + 1].1); + let (a1, a2) = (&annx[i1], &annx[i2]); + let mut simple = false; + let (l1, p1, len1) = (a1.tig_start, a1.ref_start, a1.len); + let (l2, p2, len2) = (a2.tig_start, a2.ref_start, a2.len); + if l1 + len1 == l2 + && p1 + len1 < p2 + && (p2 - p1 - len1) % 3 == 0 + && p2 - p1 - len1 <= max_indel + { + simple = true; + } + if l1 + len1 < l2 + && p1 + len1 == p2 + && (l2 - l1 - len1) % 3 == 0 + && l2 - l1 - len1 <= max_indel + { + simple = true; + } + if simple { + have_split = true; + score.push(( + len1 + len2, + k - j, + a1.mismatches.len() + a2.mismatches.len(), + vs[j].1, + )); + } else { + nonsimple = true; + } + } else { + nonsimple = true; + } + j = k; + } + if !nonsimple && score.duo() && have_split { + reverse_sort(&mut score); + if score[0].0 >= score[1].0 + min_len_gain && score[1].1 == 1 { + to_delete[score[1].3] = true; + } + } + erase_if(annx, &to_delete); +} + +/// Remove certain subsumed alignments. +// FIXME: collapse this and the other remove subsumed alignments functions. +fn remove_subsumed_alignments_2(annx: &mut Vec) { + let mut to_delete: Vec = vec![false; annx.len()]; + for i1 in 0..annx.len() { + for i2 in 0..annx.len() { + if i2 == i1 || annx[i1].ref_id != annx[i2].ref_id { + continue; + } + let (l1, l2) = (annx[i1].tig_start, annx[i2].tig_start); + let (len1, len2) = (annx[i1].len, annx[i2].len); + let (p1, p2) = (annx[i1].ref_start, annx[i2].ref_start); + if l1 != l2 || p1 != p2 { + continue; + } + if len1 > len2 { + to_delete[i2] = true; + } + } + } + erase_if(annx, &to_delete); +} + +/// Pick between equally performant Js and likewise for Cs. +fn downselect_equally_performant_j_and_c(refdata: &RefData, annx: &mut Vec) { + let mut to_delete = vec![false; annx.len()]; + for pass in 0..2 { + for i1 in 0..annx.len() { + let t1 = annx[i1].ref_id; + if pass == 1 { + if !refdata.rheaders[t1 as usize].contains("J-REGION") { + continue; + } + } else if !refdata.rheaders[t1 as usize].contains("C-REGION") { + continue; + } + for i2 in 0..annx.len() { + let t2 = annx[i2].ref_id; + if pass == 1 { + if !refdata.rheaders[t2 as usize].contains("J-REGION") { + continue; + } + } else if !refdata.rheaders[t2 as usize].contains("C-REGION") { + continue; + } + let (l1, l2) = (annx[i1].tig_start, annx[i2].tig_start); + let (len1, len2) = (annx[i1].len, annx[i2].len); + if l1 != l2 || len1 != len2 { + continue; + } + let (p1, p2) = (annx[i1].ref_start, annx[i2].ref_start); + if pass == 1 { + if p1 + len1 != refdata.refs[t1 as usize].len() as i32 { + continue; + } + if p2 + len2 != refdata.refs[t2 as usize].len() as i32 { + continue; + } + } else if p1 != p2 { + continue; + } + if annx[i1].mismatches.len() != annx[i2].mismatches.len() { + continue; + } + if t1 < t2 { + to_delete[i2] = true; + } + } + } + } + erase_if(annx, &to_delete); +} + +/// Pick between Cs. +fn downselect_to_best_c(rheaders: &[String], annx: &mut Vec) { + let mut to_delete = vec![false; annx.len()]; + for i1 in 0..annx.len() { + let t1 = annx[i1].ref_id; + if !rheaders[t1 as usize].contains("C-REGION") { + continue; + } + for i2 in 0..annx.len() { + let t2 = annx[i2].ref_id; + if !rheaders[t2 as usize].contains("C-REGION") { + continue; + } + let (l1, l2) = (annx[i1].tig_start as usize, annx[i2].tig_start as usize); + let (len1, len2) = (annx[i1].len as usize, annx[i2].len as usize); + // let (p1,p2) = (annx[i1].3,annx[i2].3); + if l1 + len1 != l2 + len2 { + continue; + } + if l1 + annx[i1].mismatches.len() >= l2 + annx[i2].mismatches.len() { + continue; + } + to_delete[i2] = true; + } + } + erase_if(annx, &to_delete); +} + +/// Remove some subsumed extended annotations. +// FIXME: collapse this and the other remove subsumed alignments functions. +fn remove_subsumed_extended_alignments(rheaders: &[String], annx: &mut Vec) { + let mut to_delete: Vec = vec![false; annx.len()]; + for i1 in 0..annx.len() { + let l1 = annx[i1].tig_start as usize; + let len1 = annx[i1].len as usize; + for i2 in 0..annx.len() { + let t2 = annx[i2].ref_id as usize; + let l2 = annx[i2].tig_start as usize; + let len2 = annx[i2].len as usize; + if len2 >= len1 { + continue; + } + if !rheaders[t2].contains("before") && !rheaders[t2].contains("after") { + continue; + } + if l1 <= l2 && l1 + len1 >= l2 + len2 { + to_delete[i2] = true; + } + } + } + erase_if(annx, &to_delete); +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// PRINT ANNOTATIONS +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Print annotations, marking any V annotations that are out of frame. + +pub fn print_some_annotations( + refdata: &RefData, + ann: &[Annotation], + log: &mut Vec, + verbose: bool, +) { + let refs = &refdata.refs; + let rheaders = &refdata.rheaders; + if verbose { + fwriteln!(log, ""); + } + let mut vstart = Vec::::new(); + for a in ann { + let estart = a.tig_start; + let t = a.ref_id as usize; + let tstart = a.ref_start; + if tstart == 0 && (rheaders[t].contains("V-REGION") || rheaders[t].contains("L+V")) { + vstart.push(estart); + } + } + for a in ann { + let (estart, len) = (a.tig_start, a.match_len); + let t = a.ref_id as usize; + let tstart = a.ref_start; + let mis = a.mismatches; + fwrite!( + log, + "{}-{} ==> {}-{} on {} [len={}] (mis={})", + estart, + estart + len, + tstart, + tstart + len, + rheaders[t], + refs[t].len(), + mis + ); + if vstart.solo() + && (rheaders[t].contains("V-REGION") || rheaders[t].contains("L+V")) + && (estart - vstart[0] - tstart) % 3 != 0 + { + fwrite!(log, " [SHIFT!]"); + } + fwriteln!(log, ""); + } +} + +pub fn print_annotations( + b: &DnaString, + refdata: &RefData, + log: &mut Vec, + allow_improper: bool, + abut: bool, + verbose: bool, +) { + let ann = annotate_seq_core(b, refdata, true, allow_improper, abut, log, verbose); + print_some_annotations(refdata, &ann, log, verbose); +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// CDR3 +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Given a DNA sequence, return a CDR3 sequence in it (if found), its start +// position on the DNA sequence, and left and right scores (see below). The CDR3 +// sequence is an amino acid sequence having length at least 5, starting with +// a C, and not containing a stop codon. +// +// NOTE THAT THE RIGHT MOTIF OVERLAPS THE CDR3 BY THREE AMINO ACIDS! +// +// In addition, we score the CDR3 and flanking sequences versus left and right +// motifs, and require a minimum score to pass. These motifs were derived by +// appropriately stacking up V and J segments and looking for high multiplicity +// amino acids at given positions (see jcon.rs). +// +// If more than one CDR3 sequence is found, we first reduce to those having the +// highest score. Then we choose the ones having the greatest start position. +// Finally we pick the longest motif. +// +// ◼ The interpretation of the tig slice is ugly. See comments at +// ◼ get_cdr3_using_ann. + +pub fn cdr3_motif_left() -> Vec> { + vec![ + b"LQPEDSAVYY".to_vec(), + b"VEASQTGTYF".to_vec(), + b"ATSGQASLYL".to_vec(), + ] +} +pub fn cdr3_motif_right() -> Vec> { + vec![b"LTFG.GTRVTV".to_vec(), b"LIWG.GSKLSI".to_vec()] +} + +const CDR3_MIN_LEN: usize = 5; +const LEFT_FLANK_MIN_SCORE: usize = 3; +const RIGHT_FLANK_MIN_SCORE: usize = 4; + +pub struct CDR3Annotation { + pub start_position_on_contig: usize, + pub aa_seq: Vec, + left_flank_score: usize, + right_flank_score: usize, +} + +pub fn get_cdr3(contig: &DnaStringSlice<'_>) -> Vec { + const MIN_TOTAL_CDR3_SCORE: usize = 10; // about as high as one can go + + let left_motifs = cdr3_motif_left(); + let right_motifs = cdr3_motif_right(); + + let contig_seq = contig.to_owned().to_ascii_vec(); + + let mut found_cdr3s: Vec = Vec::new(); + for frame_idx in 0..3 { + // Go through three frames. + + // Convert the DNA sequence + frame to an amino acid sequence. + let amino_acid_seq = nucleotide_to_aminoacid_sequence(&contig_seq, frame_idx); + if amino_acid_seq.len() < 4 { + continue; + } + + // Check each position in the AA seq to see if we find a CDR3 there. + for cdr3_start_pos in + 0..amino_acid_seq.len() - min(amino_acid_seq.len(), (CDR3_MIN_LEN + 3) + 1) + { + // The CDR3 has to start with a Cysteine. + if amino_acid_seq[cdr3_start_pos] == b'C' { + // Search for the right flank set up start and end positions for the search. + let first_f = cdr3_start_pos + (CDR3_MIN_LEN - 3); + let last_f = amino_acid_seq.len() - RIGHT_FLANK_MIN_SCORE; + for right_motif_start_pos in first_f..last_f { + // Don't look further if the remaining part of the amino_acid_seq is to short to find the full right flank motif. + if right_motif_start_pos + right_motifs[0].len() > amino_acid_seq.len() { + break; + } + + // Match the right flank and calculate the score. + let mut right_flank_score = 0; + for right_motif_col in 0..right_motifs[0].len() { + let mut hit = false; + for right_motif_row in &right_motifs { + if amino_acid_seq[right_motif_start_pos + right_motif_col] + == right_motif_row[right_motif_col] + { + hit = true; + } + } + if hit { + right_flank_score += 1; + } + } + + // If right flank score is larger than RIGHT_FLANK_MIN_SCORE, continue and attempt to match left flank, + // otherwise continue with next possible CDR3 start position. + if right_flank_score >= RIGHT_FLANK_MIN_SCORE { + // Check if there is a stop codon in the CDR3. + let stop_codon = (amino_acid_seq + [cdr3_start_pos + 1..right_motif_start_pos + 2 + 1]) + .iter() + .any(|aa| *aa == b'*'); + + // If there is no stop codon and there is room for the full left motif in the AA seq, match left flank. + let ll = left_motifs[0].len(); + if !stop_codon && cdr3_start_pos >= ll { + let mut left_flank_score = 0; + for left_motif_col in 0..ll { + let hit = left_motifs.iter().any(|left_motif_row| { + amino_acid_seq[cdr3_start_pos - ll + left_motif_col] + == left_motif_row[left_motif_col] + }); + if hit { + left_flank_score += 1; + } + } + + // If the left flank score and total score is above cutoff push the CDR3 to the vec. + // ◼ It's possible that the left_flank_score + right_flank_score + // ◼ bound should be increased. + if left_flank_score >= LEFT_FLANK_MIN_SCORE + && left_flank_score + right_flank_score >= MIN_TOTAL_CDR3_SCORE + { + found_cdr3s.push(CDR3Annotation { + start_position_on_contig: contig.start + + frame_idx + + 3 * cdr3_start_pos, + aa_seq: amino_acid_seq + [cdr3_start_pos..right_motif_start_pos + 2 + 1] + .to_vec(), + left_flank_score, + right_flank_score, + }); + } + } + } + } + } + } + } + + // Only return cdr3s having the maximum score. + let max_score = found_cdr3s + .iter() + .map(|cdr3| cdr3.left_flank_score + cdr3.right_flank_score) + .max() + .unwrap_or(0); + let to_delete = found_cdr3s + .iter() + .map(|cdr3| cdr3.left_flank_score + cdr3.right_flank_score < max_score) + .collect::>(); + erase_if(&mut found_cdr3s, &to_delete); + found_cdr3s.sort_by_key(|cdr3| cdr3.start_position_on_contig); + + // Prefer later start and prefer longer CDR3. + if found_cdr3s.len() > 1 { + // ◼ This is awkward. + let n = found_cdr3s.len(); + found_cdr3s.swap(0, n - 1); + found_cdr3s.truncate(1); + }; + + found_cdr3s +} + +pub fn print_cdr3(tig: &DnaStringSlice<'_>, log: &mut Vec) { + let cdr3_anns = get_cdr3(tig); + for cdr3 in cdr3_anns { + fwriteln!( + log, + "cdr3 = {} at {}, score = {} + {}", + strme(&cdr3.aa_seq), + cdr3.start_position_on_contig, + cdr3.left_flank_score, + cdr3.right_flank_score + ); + } +} + +// Given annotations of a DNA sequence, return a slice showing where the CDR3 +// sequence should live, or a null slice. This uses some empirically determined +// bounds. +// +// ◼ This seems very unlikely to be optimal. The value of LOW_RELV_CDR3 was +// ◼ lowered to make BCR work, which suggests that measuring relative to the end +// ◼ of the V segment is not right. + +pub fn cdr3_loc<'a>( + contig: &'a DnaString, + refdata: &RefData, + ann: &[Annotation], +) -> DnaStringSlice<'a> { + // Given the design of this function, the following bound appears to be optimal + // except possibly for changes less than ten. + const LOW_RELV_CDR3: isize = -40; + if ann.is_empty() { + return contig.slice(0, 0); + } + let mut i = ann.len() - 1; + loop { + let t = ann[i].ref_id as usize; + if !refdata.rheaders[t].contains("segment") && refdata.is_v(t) { + let (l, p) = (ann[i].tig_start as isize, ann[i].ref_start as isize); + let vstop_on_contig = l + refdata.refs[t].len() as isize - p; + let mut start = vstop_on_contig + LOW_RELV_CDR3; + if start < 0 { + start = 0; + } + if start > contig.len() as isize { + start = contig.len() as isize; + } + return contig.slice(start as usize, contig.len()); + } + if i == 0 { + return contig.slice(0, 0); + } + i -= 1; + } +} + +// Given a DNA sequence and annotations of it, as defined by annotate_seq, find +// CDR3 positions on it, constrained by the annotation. This uses empirically +// determined bounds relative to that annotation. + +pub fn get_cdr3_using_ann( + tig: &DnaString, + refdata: &RefData, + ann: &[Annotation], +) -> Vec { + let window = cdr3_loc(tig, refdata, ann); + + // Enlarge the window because get_cdr3 looks for motifs to the left and right + // of the actual CDR3. + // ◼ Pretty ugly. This should really be inside get_cdr3. + + let start = max(0, window.start as isize - cdr3_motif_left()[0].ilen() * 3); + let mut stop = start + window.length as isize + cdr3_motif_right()[0].ilen() * 3; + if stop > tig.len() as isize { + stop = tig.len() as isize; + } + if stop < start { + stop = start; + } + let window2 = tig.slice(start as usize, stop as usize); + + let annotation_units = make_annotation_units(tig, refdata, ann); + + // If the contig has a V annotation, ensure that the CDR3 starts after the start of the V segment. + let v_start = annotation_units + .iter() + .filter_map(|unit| { + ((unit.feature.region_type == VdjRegion::V) && (unit.annotation_match_start == 0)) + .then_some(unit.contig_match_start) + }) + .min() + .unwrap_or(0); + + // If the contig has a J annotation, ensure that the CDR3 ends before the end of the J segment. + let j_end = annotation_units + .iter() + .filter_map(|unit| { + ((unit.feature.region_type == VdjRegion::J) + && (unit.annotation_match_end == unit.annotation_length)) + .then_some(unit.contig_match_end) + }) + .max() + .unwrap_or(tig.len()); + + get_cdr3(&window2) + .into_iter() + .filter(|cdr3| { + let cdr3_start = cdr3.start_position_on_contig; + let cdr3_end = cdr3_start + cdr3.aa_seq.len() * 3; + cdr3_start >= v_start && cdr3_end <= j_end + }) + .collect() +} + +pub fn print_cdr3_using_ann( + tig: &DnaString, + refdata: &RefData, + ann: &[Annotation], + log: &mut Vec, +) { + let found_cdr3s = get_cdr3_using_ann(tig, refdata, ann); + for cdr3 in found_cdr3s { + fwriteln!( + log, + "cdr3 = {} at {}, score = {} + {}", + strme(&cdr3.aa_seq), + cdr3.start_position_on_contig, + cdr3.left_flank_score, + cdr3.right_flank_score + ); + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ANNOTATION STRUCTURE +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Here we have code that presents annotations.json. + +// Coordinates in an AnnotationUnit are zero-based. The alignment score is computed +// using the following penalties: +// MATCH_SCORE = 2 +// MISMATCH_PENALTY = 3 +// GAP_OPEN_PENALTY = 5 +// EXTEND_PENALTY = 1 +// which are copied from cellranger/lib/python/cellranger/vdj/constants.py. + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct AnnotationFeature { + pub chain: VdjChain, // chain type of the reference record, e.g. TRA + pub display_name: String, // same as gene_name + pub feature_id: usize, // id of reference record + pub gene_name: String, // name of reference record e.g. TRAV14-1 + pub region_type: VdjRegion, // region type e.g. L-REGION+V-REGION +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct AnnotationUnit { + pub contig_match_start: usize, // start on contig + pub contig_match_end: usize, // stop on contig + pub annotation_match_start: usize, // start on reference record + pub annotation_match_end: usize, // stop on reference record + pub annotation_length: usize, // length of reference record + pub cigar: String, // cigar of the alignment + pub score: i32, // score of the alignment + pub feature: AnnotationFeature, // feature type +} + +impl AnnotationUnit { + // Given one or two alignment entities as produced by annotate_seq, of the same + // contig to the same reference sequence, produce an AnnotationUnit. + + pub fn from_annotate_seq( + b: &DnaString, + refdata: &RefData, + ann: &[Annotation], + ) -> AnnotationUnit { + // Sanity check the inputs. Obviously these conditions should be checked + // before calling, so that they can never fail. + + let na = ann.len(); + assert!(na == 1 || na == 2); + if ann.len() == 2 { + assert!(ann[0].ref_id == ann[1].ref_id); + assert!( + (ann[0].tig_start + ann[0].match_len == ann[1].tig_start + && ann[0].ref_start + ann[0].match_len < ann[1].ref_start) + || (ann[0].tig_start + ann[0].match_len < ann[1].tig_start + && ann[0].ref_start + ann[0].match_len == ann[1].ref_start) + ); + } + + // Build a cigar string for a single alignment, having an indel in the case + // where there are two alignment entities. This does not show mismatches. + + let mut cig = String::new(); + let left1 = ann[0].tig_start as usize; + let len1 = ann[0].match_len as usize; + let right1 = b.len() - left1 - len1; + if left1 > 0 { + write!(cig, "{left1}S").unwrap(); + } + write!(cig, "{len1}M").unwrap(); + if na == 1 && right1 > 0 { + write!(cig, "{right1}S").unwrap(); + } + if na == 2 { + let n1 = ann[1].tig_start - ann[0].tig_start - ann[0].match_len; + let n2 = ann[1].ref_start - ann[0].ref_start - ann[0].match_len; + if n1 == 0 { + write!(cig, "{n2}D").unwrap(); + } + if n2 == 0 { + write!(cig, "{n1}I").unwrap(); + } + let left2 = ann[1].tig_start as usize; + let len2 = ann[1].match_len as usize; + let right2 = b.len() - left2 - len2; + write!(cig, "{len2}M").unwrap(); + if right2 > 0 { + write!(cig, "{right2}S").unwrap(); + } + } + + // Test for internal soft clipping, which would be a bug. + // ◼ This is horrible. We should have a function validate_cigar_string + // ◼ that validates a cigar string in its entirety, not just test for one + // ◼ type of anomaly. + + let mut s_pos = Vec::new(); + let mut char_pos = 0; + for c in cig.chars() { + if c.is_ascii_alphabetic() { + if c == 'S' { + s_pos.push(char_pos); + } + char_pos += 1; + } + } + for p in &s_pos { + assert!( + !(*p != 0 && *p != char_pos - 1), + "Illegal internal soft clipping in cigar {cig}" + ); + } + + // Compute alignment score. + + let mut s = 0_i32; + let t = ann[0].ref_id as usize; + let r = &refdata.refs[t]; + for a in &ann[0..na] { + for i in 0..a.match_len { + if b.get((a.tig_start + i) as usize) == r.get((a.ref_start + i) as usize) { + s += 2; + } else { + s -= 3; + } + } + } + if na == 2 { + let n1 = ann[1].tig_start - ann[0].tig_start - ann[0].match_len; + let n2 = ann[1].ref_start - ann[0].ref_start - ann[0].match_len; + let n = max(n1, n2); + s += 4 + n; + } + + // Build the rest. + + let types = ["IGH", "IGK", "IGL", "TRA", "TRB", "TRD", "TRG"]; + let mut chain_type = String::new(); + for type_ in types { + if refdata.rheaders[t].contains(type_) { + chain_type = type_.to_string(); + break; + } + } + let v: Vec<&str> = refdata.rheaders[t].split_terminator('|').collect(); + AnnotationUnit { + contig_match_start: ann[0].tig_start as usize, + contig_match_end: (ann[na - 1].tig_start + ann[na - 1].match_len) as usize, + annotation_match_start: ann[0].ref_start as usize, + annotation_match_end: (ann[na - 1].ref_start + ann[na - 1].match_len) as usize, + annotation_length: refdata.refs[t].len(), + cigar: cig, + score: s, + feature: AnnotationFeature { + chain: chain_type.parse().unwrap(), + display_name: refdata.name[t].clone(), + feature_id: v[1].force_usize(), + gene_name: refdata.name[t].clone(), + region_type: v[3].parse().unwrap(), + }, + } + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq)] +pub struct ClonotypeInfo { + #[serde(default)] + pub raw_clonotype_id: Option, + #[serde(default)] + pub raw_consensus_id: Option, + #[serde(default)] + pub exact_subclonotype_id: Option, +} + +impl ClonotypeInfo { + pub fn empty() -> Self { + ClonotypeInfo::default() + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct Region { + pub start: usize, + pub stop: usize, + pub nt_seq: String, + pub aa_seq: String, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct JunctionSupport { + pub reads: i32, + pub umis: i32, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] +pub struct ContigAnnotation { + // raw data for the contig + pub barcode: String, // the barcode + pub contig_name: String, // name of the contig + pub sequence: String, // nucleotide sequence for contig + pub quals: String, // contig quality scores + pub fraction_of_reads_for_this_barcode_provided_as_input_to_assembly: Option, + + // contig support + pub read_count: usize, // number of reads assigned to contig + pub umi_count: usize, // number of UMIs assigned to the contig + + // amino acid sequence + // + // The start position of the amino acid sequence on the contig is unspecified. + // ◼ This seems like a flaw. + pub start_codon_pos: Option, // start pos on contig of start codon + pub stop_codon_pos: Option, // start pos on contig of stop codon + pub aa_sequence: Option, // amino acid sequence + pub frame: Option, // null and never changed (unused field) + + // CDR3 + pub cdr3: Option, // amino acid sequence for CDR3, or null + pub cdr3_seq: Option, // nucleotide sequence for CDR3, or null + pub cdr3_start: Option, // start position in bases on contig of CDR3 + pub cdr3_stop: Option, // stop position in bases on contig of CDR3 + + // CDR* and FWR* regions. There are not filled in here + // CDR3 follows a different convention here to ensure backwards compatibility + pub fwr1: Option, + pub cdr1: Option, + pub fwr2: Option, + pub cdr2: Option, + pub fwr3: Option, + pub fwr4: Option, + + // annotations + #[serde(default)] + pub annotations: Vec, // the annotations + pub clonotype: Option, // null, filled in later + #[serde(default)] + pub info: ClonotypeInfo, // Empty initially, may be filled in later + + // state of the contig + pub high_confidence: bool, // declared high confidence? + pub validated_umis: Option>, // validated UMIs + pub non_validated_umis: Option>, // non-validated UMIs + pub invalidated_umis: Option>, // invalidated UMIs + pub is_cell: bool, // was the barcode declared a cell? + pub productive: Option, // productive? (null means not full length) + #[serde(default = "set_true")] + pub filtered: bool, // true and never changed (unused field) + /// criteria used to asess productive status + pub productive_criteria: Option, + + pub is_gex_cell: Option, // Was the barcode declared a cell by Gene expression data, if available + pub is_asm_cell: Option, // Was the barcode declared a cell by the VDJ assembler + + pub full_length: Option, // New field added in CR 4.1. None if the field is not set + + pub junction_support: Option, // New field added in CR 7.2. Coverage of junction region for a good contig + pub sample: Option, +} + +fn set_true() -> bool { + true +} + +impl ContigAnnotation { + // Given the alignment entities produced by annotate_seq, produce a + // ContigAnnotation. This is done so as to produce at most one V, D, J and C, + // each. Pairs of alignment entities that are separated by an indel get + // collapsed in this process. + #[allow(clippy::too_many_arguments)] + pub fn from_annotate_seq( + b: &DnaString, // the contig + q: &[u8], // qual scores for the contig + tigname: &str, // name of the contig + refdata: &RefData, // reference data + ann: &[Annotation], // output of annotate_seq + nreads: usize, // number of reads assigned to contig + numis: usize, // number of umis assigned to contig + high_confidencex: bool, // declared high confidence? + validated_umis: Option>, // validated UMIs + non_validated_umis: Option>, // non-validated UMIs + invalidated_umis: Option>, // invalidated UMIs + is_cellx: bool, // was the barcode declared a cell? + productivex: bool, // productive? + productive_criteria: ContigStatus, // criteria used to asess productive status + jsupp: Option, // num reads, umis supporting junction + ) -> ContigAnnotation { + let mut vstart = -1_i32; + for a in ann { + let t = a.ref_id as usize; + if refdata.is_v(t) && a.ref_start == 0 { + vstart = a.tig_start; + } + } + let mut aa = String::new(); + let mut stop = -1_i32; + let x = b.to_owned().to_ascii_vec(); + if vstart >= 0 { + let y = nucleotide_to_aminoacid_sequence(&x, vstart as usize); + aa = stringme(&y); + for (i, y_i) in y.iter().enumerate() { + if *y_i == b'*' { + stop = vstart + 3 * (i as i32); + break; + } + } + } + let (mut cdr3x, mut cdr3x_dna) = (String::new(), String::new()); + let (mut cdr3x_start, mut cdr3x_stop) = (-1_i32, -1_i32); + let found_cdr3s = if !refdata.refs.is_empty() { + get_cdr3_using_ann(b, refdata, ann) + } else { + get_cdr3(&b.slice(0, b.len())) + }; + if !found_cdr3s.is_empty() { + let cdr3 = found_cdr3s.first().unwrap(); + cdr3x = stringme(&cdr3.aa_seq); + let start = cdr3.start_position_on_contig; + for x_i in &x[start..start + 3 * cdr3x.len()] { + cdr3x_dna.push(*x_i as char); + } + cdr3x_start = start as i32; + cdr3x_stop = (start + 3 * cdr3x.len()) as i32; + } + let mut qp = q.to_vec(); + for item in &mut qp[0..q.len()] { + *item += 33; + } + let mut ann = ContigAnnotation { + barcode: tigname.before("_").to_string(), + contig_name: tigname.to_string(), + sequence: b.to_string(), + quals: stringme(&qp), + fraction_of_reads_for_this_barcode_provided_as_input_to_assembly: None, + read_count: nreads, + umi_count: numis, + start_codon_pos: match vstart { + -1 => None, + _ => Some(vstart as usize), + }, + stop_codon_pos: match stop { + -1 => None, + _ => Some(stop as usize), + }, + aa_sequence: match vstart { + -1 => None, + _ => Some(aa), + }, + frame: None, + cdr3: match cdr3x.is_empty() { + true => None, + _ => Some(cdr3x.clone()), + }, + cdr3_seq: match cdr3x.is_empty() { + true => None, + _ => Some(cdr3x_dna), + }, + cdr3_start: match cdr3x.is_empty() { + true => None, + _ => Some(cdr3x_start as usize), + }, + cdr3_stop: match cdr3x.is_empty() { + true => None, + _ => Some(cdr3x_stop as usize), + }, + annotations: make_annotation_units(b, refdata, ann), + clonotype: None, + info: ClonotypeInfo::empty(), + high_confidence: high_confidencex, + validated_umis, + non_validated_umis, + invalidated_umis, + is_cell: is_cellx, + productive: Some(productivex), + productive_criteria: Some(productive_criteria), + filtered: true, + junction_support: jsupp, + // These need to be populated by the assembler explicitly as needed + is_gex_cell: None, + is_asm_cell: None, + full_length: None, + + fwr1: None, + cdr1: None, + fwr2: None, + cdr2: None, + fwr3: None, + fwr4: None, + + sample: None, + }; + ann.full_length = Some(ann.is_full_length()); + ann + } + + // Produce a ContigAnnotation from a sequence. + #[allow(clippy::too_many_arguments)] + pub fn from_seq( + b: &DnaString, // the contig + q: &[u8], // qual scores for the contig + tigname: &str, // name of the contig + refdata: &RefData, // reference data + nreads: usize, // number of reads assigned to contig + numis: usize, // number of umis assigned to contig + high_confidence: bool, // declared high confidence? + validated_umis: Option>, // validated UMIs + non_validated_umis: Option>, // non-validated UMIs + invalidated_umis: Option>, // invalidated UMIs + is_cell: bool, // was the barcode declared a cell? + jsupp: Option, // num reads, umis supporting junction + ) -> ContigAnnotation { + let ann = annotate_seq(b, refdata, true, false, true); + let (is_productive, productive_criteria) = is_productive_contig(b, refdata, &ann); + ContigAnnotation::from_annotate_seq( + b, + q, + tigname, + refdata, + &ann, + nreads, + numis, + high_confidence, + validated_umis, + non_validated_umis, + invalidated_umis, + is_cell, + is_productive, + productive_criteria, + jsupp, + ) + } + + // Output with four space indentation. Ends with comma and newline. + + pub fn write(&self, out: &mut BufWriter) { + let buf = Vec::new(); + let formatter = serde_json::ser::PrettyFormatter::with_indent(b" "); + let mut ser = serde_json::Serializer::with_formatter(buf, formatter); + self.serialize(&mut ser).unwrap(); + fwriteln!(out, "{},", String::from_utf8(ser.into_inner()).unwrap()); + } + + // Print. + + pub fn print(&self, log: &mut Vec) { + log.append(&mut serde_json::to_vec_pretty(&self).unwrap()); + } + + /// Find annotation unit corresponding to the given region + pub fn get_region(&self, region: VdjRegion) -> Option<&AnnotationUnit> { + self.annotations + .iter() + .find(|ann_unit| ann_unit.feature.region_type == region) + } + + /// Find gene name corresponding to the given region if it exists + pub fn get_gene_name(&self, region: VdjRegion) -> Option<&String> { + self.get_region(region).map(|unit| &unit.feature.gene_name) + } + + pub fn is_productive(&self) -> bool { + self.productive.unwrap_or(false) + } + + pub fn is_full_length(&self) -> bool { + self.full_length.unwrap_or_else(|| { + check_full_length(self.get_region(VdjRegion::V), self.get_region(VdjRegion::J)) + }) + } + + /// The chain corresponding to this contig is defined as the chain type of the V-region + /// if it exists. This is consistent with the defn used in enclone + pub fn chain_type(&self) -> Option { + self.get_region(VdjRegion::V).map(|unit| unit.feature.chain) + } +} + +fn check_full_length(v_ann: Option<&AnnotationUnit>, j_ann: Option<&AnnotationUnit>) -> bool { + match (v_ann, j_ann) { + (Some(v_region), Some(j_region)) => { + v_region.annotation_match_start == 0 + && j_region.annotation_match_end == j_region.annotation_length + } + _ => false, + } +} + +// Given the alignment entities produced by annotate_seq, produce an AnnotationUnit. +// This is done so as to produce at most one V, D, J and C, each. Pairs of +// alignment entities that are separated by an indel get collapsed in this process. + +pub fn make_annotation_units( + b: &DnaString, + refdata: &RefData, + ann: &[Annotation], +) -> Vec { + let mut x = Vec::::new(); + let rtype = &["U", "V", "D", "J", "C"]; + for &rt in rtype { + let mut locs = Vec::<(usize, usize, usize)>::new(); + let mut j = 0; + while j < ann.len() { + let t = ann[j].ref_id as usize; + if refdata.segtype[t] != rt { + j += 1; + continue; + } + let mut entries = 1; + let mut len = ann[j].match_len; + if j < ann.len() - 1 + && ann[j + 1].ref_id as usize == t + && ((ann[j].tig_start + ann[j].match_len == ann[j + 1].tig_start + && ann[j].ref_start + ann[j].match_len < ann[j + 1].ref_start) + || (ann[j].tig_start + ann[j].match_len < ann[j + 1].tig_start + && ann[j].ref_start + ann[j].match_len == ann[j + 1].ref_start)) + { + entries = 2; + len += ann[j + 1].match_len; + } + let mut score = len as usize; + if refdata.segtype[t] == "V" && ann[j].ref_start == 0 { + score += 1_000_000; + } + if refdata.segtype[t] == "J" + && (ann[j].ref_start + ann[j].match_len) as usize == refdata.refs[t].len() + { + score += 1_000_000; + } + locs.push((score, j, entries)); + j += entries; + } + reverse_sort(&mut locs); + if !locs.is_empty() { + let (j, entries) = (locs[0].1, locs[0].2); + let mut annx = Vec::::new(); + annx.extend_from_slice(&ann[j..j + entries]); + x.push(AnnotationUnit::from_annotate_seq(b, refdata, &annx)); + } + } + x +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::refx; + + #[test] + fn test_no_internal_soft_clipping() { + use refx::RefData; + + let refdata = RefData::from_fasta(String::from( + "test/inputs/test_no_internal_soft_clipping_ref.fa", + )); + // println!("Loaded reference with {} entries", refdata.id.len()); + + let contig_seq = DnaString::from_acgt_bytes("AGGAACTGCTCAGTTAGGACCCAGACGGAACCATGGAAGCCCCAGCGCAGCT\ + TCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCC\ + ACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTG\ + CATCCACCAGGGCCACTGGTATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCAGCCTGCAGTCTGAAGATTT\ + TGCAGTTTATTACTGTCAGCAGTATAATAACTGGCTCATGTACACTTTTGGCCAGGGGACCAAGCTGGAGATCAAACGAACTGTGGCTGCACCATCT\ + GTCTTCATCTTCCCGCCATCTGATGAGCAGTTGAAATCTGGAACTGCCTCTGTTGTGTGCCTGCTGAATAACTTCTATCCCAGAGAGGCCAAAGTAC\ + AGTGGAAGGTGGATAACGC".as_bytes()); + + // Phred quality passed in, convert to raw quality, the ContigAnnotation add the + // offset back when writing! + let contig_qual: Vec = "III]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\ + ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\ + ]]]]]]]]]]]]]]]]IIII!!!IIIIIIIIIIII]]]]]]]]]X]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\ + ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\ + ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\ + ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\ + ]]".as_bytes().iter().map(|x| x-33).collect(); + let annotation = ContigAnnotation::from_seq( + &contig_seq, + &contig_qual, + "clonotype125_consensus_1", + &refdata, + 120, + 2, + true, // high_confidence + None, + None, + None, + false, // is_cell, should be changed to None + None, + ); + + // println!("{:#?}", annotation); + for ann in &annotation.annotations { + let mut s_pos = Vec::new(); + let mut char_pos = 0; + for c in ann.cigar.chars() { + if c.is_ascii_alphabetic() { + if c == 'S' { + s_pos.push(char_pos); + } + char_pos += 1; + } + } + if !s_pos.is_empty() { + println!("Cigar : {:?}", ann.cigar); + println!("Soft clipping at : {s_pos:?}"); + for p in &s_pos { + assert!(*p == 0 || *p == (char_pos - 1)); + } + } + } + } + + #[test] + fn test_stopcodon_in_cdr3() { + let contig = DnaString::from_dna_string( + // nucleotide seq should result in a CDR3 with a '*' as its last amino acid and the + // get_cd3 function should return no valid CDR3Annotations i.e. emtpy vec + "ACCCAACCTGAAGACTCGGCTGTCTACTTCTGTGCAGCAAGTCTGTAAGGGGGAAATGAGAAATTAACCTTTGGGACTGG", + ); + let cdr3s = get_cdr3(&contig.slice(0, contig.len())); + assert!(cdr3s.is_empty()); + } + + #[test] + fn test_cdr3_outside_vj() { + // CELLRANGER-6602 + const CONTIG_SEQ: &str = "CGAGCCCAGCACTGGAAGTCGCCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACCATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGATATGTTATGCACTGGGTCCGCCAGGCTCCAGGCAGGGGGCTGGAGTGGGTGGCACTTATCTCATCTGATGGAACTAATAAATACTACGCTGACTCCGTGAGGGGCCGGTTCACCATCTCCAGAGACAATTCCAAAGCCACGCTGTTTCTCCAAATGAACAGCCTGAGAGCCGAAGACACGGCCCTATATTACTCTGCGAAAGAAGTGAGGCATGAGTACGGTGAATACCGCGATGCATTTGATATCTGGGGCCAAGGGACAATGGTCACCGTGTCTTCAGCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGA"; + + let refdata = refx::RefData::from_fasta(String::from("test/inputs/tiny_ref.fa")); + + let contig_seq = DnaString::from_acgt_bytes(CONTIG_SEQ.as_bytes()); + + // Simple search gives a CDR3, but it is outside the V-J region, likely a false positive. + // With VJ annotations, we should not return this CDR3 + let cdr3s = get_cdr3(&contig_seq.slice(0, contig_seq.len())); + assert!(!cdr3s.is_empty()); + + let contig_qual: Vec = (0..CONTIG_SEQ.len()).map(|_| 30).collect(); + let annotation = ContigAnnotation::from_seq( + &contig_seq, + &contig_qual, + "GGGTCTGCAGACAGGT-1_contig_2", + &refdata, + 100, + 10, + true, + None, + None, + None, + true, + None, + ); + println!("V-REGION: {:?}", annotation.get_region(VdjRegion::V)); + println!("J-REGION: {:?}", annotation.get_region(VdjRegion::J)); + assert!(annotation.cdr3.is_none()); + assert!(!annotation.is_productive()); + } +} diff --git a/lib/rust/vdj_ann/src/lib.rs b/lib/rust/vdj_ann/src/lib.rs new file mode 100644 index 0000000..8e0e8af --- /dev/null +++ b/lib/rust/vdj_ann/src/lib.rs @@ -0,0 +1,9 @@ +// Copyright (c) 2019 10x Genomics, Inc. All rights reserved. + +// Modules introducing macros need to come before the modules that use them. + +pub mod align; +pub mod annotate; +pub mod refx; +pub mod transcript; +pub mod vdj_features; diff --git a/lib/rust/vdj_ann/src/refx.rs b/lib/rust/vdj_ann/src/refx.rs new file mode 100644 index 0000000..d03f8ea --- /dev/null +++ b/lib/rust/vdj_ann/src/refx.rs @@ -0,0 +1,291 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// This file contains code to make reference data. +// +// ◼ Experiment with building a reference from scratch. This would be a better +// ◼ solution than ad hoc editing of a flawed reference. +// +// ◼ Document reference sequence requirements so that a customer who wishes to +// ◼ create a reference for a new species will know the conventions used by the +// ◼ code. + +use debruijn::dna_string::DnaString; +use debruijn::kmer::Kmer12; +use io_utils::read_to_string_safe; +use kmer_lookup::make_kmer_lookup_12_single; +use std::collections::{HashMap, HashSet}; +use std::path::Path; +use string_utils::TextUtils; +use vector_utils::erase_if; + +// RefData: this is a packaging of reference data appropriate for VDJ analysis. + +#[derive(Default)] +pub struct RefData { + pub refs: Vec, + pub rheaders: Vec, + pub rheaders_orig: Vec, + pub rkmers_plus: Vec<(Kmer12, i32, i32)>, + // which V segments have matched UTRs in the reference: + pub has_utr: HashMap, + pub name: Vec, + pub segtype: Vec<&'static str>, // U, V, D, J or C + pub rtype: Vec, // index in "IGH","IGK","IGL","TRA","TRB","TRD","TRG" or -1 + pub igjs: Vec, // index of all IGJ segments + pub cs: Vec, // index of all C segments + pub ds: Vec, // index of all D segments + pub id: Vec, // the number after ">" on the header line + pub transcript: Vec, // transcript name from header line +} + +impl RefData { + pub fn new() -> RefData { + RefData { + refs: Vec::::new(), + rheaders: Vec::::new(), + rheaders_orig: Vec::::new(), + rkmers_plus: Vec::<(Kmer12, i32, i32)>::new(), + has_utr: HashMap::::new(), + name: Vec::::new(), + segtype: Vec::<&'static str>::new(), + rtype: Vec::::new(), + igjs: Vec::::new(), + cs: Vec::::new(), + ds: Vec::::new(), + id: Vec::::new(), + transcript: Vec::::new(), + } + } + pub fn is_u(&self, i: usize) -> bool { + self.segtype[i] == "U" + } + pub fn is_v(&self, i: usize) -> bool { + self.segtype[i] == "V" + } + pub fn is_d(&self, i: usize) -> bool { + self.segtype[i] == "D" + } + pub fn is_j(&self, i: usize) -> bool { + self.segtype[i] == "J" + } + pub fn is_c(&self, i: usize) -> bool { + self.segtype[i] == "C" + } + + pub fn from_fasta(path: impl AsRef) -> Self { + let path = path.as_ref(); + let mut refdata = RefData::new(); + let path_contents = read_to_string_safe(path); + assert!( + !path_contents.is_empty(), + "Reference file at {} has zero length.", + path.to_string_lossy() + ); + make_vdj_ref_data_core( + &mut refdata, + &path_contents, + "", + true, // is_tcr + true, // is_bcr + None, + ); + refdata + } + + pub fn from_fasta_with_filter(path: impl AsRef, ids_to_use: &HashSet) -> Self { + let mut refdata = RefData::new(); + let path = path.as_ref(); + let path_contents = read_to_string_safe(path); + assert!( + !path_contents.is_empty(), + "Reference file at {} has zero length.", + path.to_string_lossy() + ); + make_vdj_ref_data_core( + &mut refdata, + &path_contents, + "", + true, // is_tcr + true, // is_bcr + Some(ids_to_use), + ); + refdata + } +} + +// ids_to_use_opt: Optional hashSet of ids. If specified only reference +// entries with id in the HashSet is used to construct RefData + +pub fn make_vdj_ref_data_core( + refdata: &mut RefData, + ref_fasta: &str, + extended_ref_fasta: &str, + is_tcr: bool, + is_bcr: bool, + ids_to_use_opt: Option<&HashSet>, +) { + // Define convenient abbreviations. + + let refs = &mut refdata.refs; + let rheaders = &mut refdata.rheaders; + let rkmers_plus = &mut refdata.rkmers_plus; + + // Parse the fasta file. + + refs.clear(); + rheaders.clear(); + read_fasta_contents_into_vec_dna_string_plus_headers(ref_fasta, refs, rheaders); + + // Filter by ids if requested. + + if let Some(ids_to_use) = ids_to_use_opt { + let mut to_delete = vec![false; refs.len()]; + for i in 0..refs.len() { + let id = rheaders[i].before("|").force_i32(); + to_delete[i] = !ids_to_use.contains(&id); + } + erase_if(refs, &to_delete); + erase_if(rheaders, &to_delete); + } + refdata.rheaders_orig.clone_from(rheaders); + + // Now build stuff. + + let mut rheaders2 = Vec::::new(); + let types = vdj_types::VDJ_CHAINS; + refdata.rtype = vec![-1_i32; refs.len()]; + for i in 0..rheaders.len() { + let v: Vec<&str> = rheaders[i].split_terminator('|').collect(); + refdata.name.push(v[2].to_string()); + rheaders2.push(format!("|{}|{}|{}|", v[0], v[2], v[3])); + match v[3] { + "5'UTR" => { + refdata.segtype.push("U"); + } + "L-REGION+V-REGION" => { + refdata.segtype.push("V"); + } + "D-REGION" => { + refdata.segtype.push("D"); + } + "J-REGION" => { + refdata.segtype.push("J"); + } + "C-REGION" => { + refdata.segtype.push("C"); + } + _ => { + refdata.segtype.push("?"); + } + } + for (j, type_) in types.iter().enumerate() { + if rheaders2[i].contains(type_) { + refdata.rtype[i] = j as i32; + } + } + refdata.transcript.push(v[1].after(" ").to_string()); + } + *rheaders = rheaders2; + + // Filter by TCR/BCR. + + if !is_tcr || !is_bcr { + let mut to_delete = vec![false; refs.len()]; + for i in 0..refs.len() { + if !is_tcr && (rheaders[i].contains("|TR") || rheaders[i].starts_with("TR")) { + to_delete[i] = true; + } + if !is_bcr && (rheaders[i].contains("|IG") || rheaders[i].starts_with("IG")) { + to_delete[i] = true; + } + } + erase_if(refs, &to_delete); + erase_if(rheaders, &to_delete); + erase_if(&mut refdata.name, &to_delete); + erase_if(&mut refdata.segtype, &to_delete); + erase_if(&mut refdata.transcript, &to_delete); + erase_if(&mut refdata.rtype, &to_delete); + erase_if(&mut refdata.rheaders_orig, &to_delete); + } + + // Fill in igjs and cs and ds. + + for i in 0..rheaders.len() { + if refdata.segtype[i] == "J" && refdata.rtype[i] >= 0 && refdata.rtype[i] < 3 { + refdata.igjs.push(i); + } + if refdata.segtype[i] == "C" { + refdata.cs.push(i); + } + if refdata.segtype[i] == "D" { + refdata.ds.push(i); + } + } + + // Fill in id. + + for header in rheaders.iter() { + refdata.id.push(header.between("|", "|").force_i32()); + } + + // Extend the reference. + + if !extended_ref_fasta.is_empty() { + let mut refs2 = Vec::::new(); + let mut rheaders2 = Vec::::new(); + read_fasta_contents_into_vec_dna_string_plus_headers( + extended_ref_fasta, + &mut refs2, + &mut rheaders2, + ); + refs.append(&mut refs2); + rheaders.append(&mut rheaders2); + // ◼ Note not appending to refdata.name. This may be a bug. + } + + // Make lookup table for reference. + + make_kmer_lookup_12_single(refs, rkmers_plus); + + // Determine which V segments have matching UTRs in the reference. + + for header in rheaders.iter() { + if !header.contains("segment") { + let name = header.after("|").between("|", "|"); + if header.contains("UTR") { + refdata.has_utr.insert(name.to_string(), true); + } + } + } + for header in rheaders.iter() { + if !header.contains("segment") { + let name = header.after("|").between("|", "|"); + if header.contains("V-REGION") { + refdata.has_utr.entry(name.to_string()).or_insert(false); + } + } + } +} + +pub fn read_fasta_contents_into_vec_dna_string_plus_headers( + f: &str, + dv: &mut Vec, + headers: &mut Vec, +) { + let mut last: String = String::new(); + let mut first = true; + for s in f.split('\n') { + if first { + assert!(s.starts_with('>'), "fasta format failure reading {f}"); + first = false; + headers.push(s.get(1..).unwrap().to_string()); + } else if s.starts_with('>') { + dv.push(DnaString::from_dna_string(&last)); + last.clear(); + headers.push(s.get(1..).unwrap().to_string()); + } else { + last += s; + } + } + dv.push(DnaString::from_dna_string(&last)); +} diff --git a/lib/rust/vdj_ann/src/transcript.rs b/lib/rust/vdj_ann/src/transcript.rs new file mode 100644 index 0000000..565abbb --- /dev/null +++ b/lib/rust/vdj_ann/src/transcript.rs @@ -0,0 +1,361 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// Code that analyzes transcripts. + +use crate::annotate::{get_cdr3_using_ann, Annotation}; +use crate::refx::RefData; +use amino::{have_start, have_stop}; +use debruijn::{dna_string::DnaString, kmer::Kmer20, Mer, Vmer}; +use hyperbase::Hyper; +use itertools::iproduct; +use kmer_lookup::make_kmer_lookup_20_single; +use serde::{Deserialize, Serialize}; +use std::cmp::max; +use std::str::FromStr; +use vdj_types::{VdjChain, VDJ_CHAINS}; +use vector_utils::{lower_bound1_3, unique_sort}; + +const MIN_DELTA: i32 = -25; +const MIN_DELTA_IGH: i32 = -55; +const MAX_DELTA: i32 = 35; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// TEST FOR VALID VDJ SEQUENCE +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)] +pub struct ContigStatus { + pub full_length: Option, + pub has_v_start: Option, + pub in_frame: Option, + pub no_premature_stop: Option, + pub has_cdr3: Option, + pub has_expected_size: Option, + pub correct_ann_order: Option, +} + +impl ContigStatus { + fn is_productive(&self) -> bool { + match ( + self.full_length, + self.has_v_start, + self.in_frame, + self.no_premature_stop, + self.has_cdr3, + self.has_expected_size, + self.correct_ann_order, + ) { + ( + Some(true), + Some(true), + Some(true), + Some(true), + Some(true), + Some(true), + Some(true), + ) => true, + (_, _, _, _, _, _, _) => false, + } + } + + fn order_by(&self) -> u16 { + match ( + self.full_length, + self.has_v_start, + self.in_frame, + self.no_premature_stop, + self.has_cdr3, + self.has_expected_size, + self.correct_ann_order, + ) { + ( + Some(true), + Some(true), + Some(true), + Some(true), + Some(true), + Some(true), + Some(true), + ) => 0, + (Some(_), Some(_), Some(_), Some(_), Some(_), Some(_), Some(_)) => 1, + (Some(_), Some(_), Some(_), Some(_), Some(_), Some(_), _) => 2, + (Some(_), Some(_), Some(_), Some(_), Some(_), _, _) => 3, + (Some(_), Some(_), Some(_), Some(_), _, _, _) => 4, + (Some(_), Some(_), Some(_), _, _, _, _) => 5, + (Some(_), Some(_), _, _, _, _, _) => 6, + (Some(_), _, _, _, _, _, _) => 7, + _ => 8, + } + } +} + +#[derive(Clone, Copy)] +pub struct Vstart { + ref_id: usize, + tig_start: usize, +} + +#[derive(Clone, Copy)] +pub struct Jstop { + ref_id: usize, + tig_stop: usize, +} + +fn find_inframe_vdj_pair(vstarts: Vec, jstops: Vec) -> Option<(Vstart, Jstop)> { + let mut vj_combinations: Vec<(Vstart, Jstop, i32)> = iproduct!(vstarts, jstops) + .map(|(v, j)| (v, j, j.tig_stop as i32 - v.tig_start as i32)) + .filter(|(_, _, n)| n > &0) + .filter(|(_, _, n)| n % 3 == 1) + .collect(); + vj_combinations.sort_by_key(|x| x.2); + let inframe_pair = vj_combinations.last().map(|(v, j, _)| (*v, *j)); + inframe_pair +} + +fn evaluate_contig_status( + vdj_chain: VdjChain, + ann: &[Annotation], + reference: &RefData, + contig: &DnaString, +) -> Option { + let valid_v_type = format!("{vdj_chain}V"); + let valid_j_type = format!("{vdj_chain}J"); + let rheaders = &reference.rheaders; + let refs = &reference.refs; + let mut vstarts: Vec = ann + .iter() + .filter(|a| reference.is_v(a.ref_id as usize)) + .filter(|a| rheaders[a.ref_id as usize].contains(&valid_v_type)) + .filter(|a| a.ref_start == 0) + .map(|a| Vstart { + ref_id: a.ref_id as usize, + tig_start: a.tig_start as usize, + }) + .collect(); + let jstops: Vec = ann + .iter() + .filter(|a| reference.is_j(a.ref_id as usize)) + .filter(|a| rheaders[a.ref_id as usize].contains(&valid_j_type)) + .filter(|a| a.ref_start + a.match_len == refs[a.ref_id as usize].len() as i32) + .map(|a| Jstop { + ref_id: a.ref_id as usize, + tig_stop: a.tig_start as usize + a.match_len as usize, + }) + .collect(); + + if vstarts.is_empty() & jstops.is_empty() { + return None; + } + + let mut contig_status = ContigStatus { + full_length: Some(!vstarts.is_empty() & !jstops.is_empty()), + ..Default::default() + }; + + // filter vstarts to require START codon + vstarts.retain(|v| have_start(contig, v.tig_start)); + contig_status.has_v_start = match (contig_status.full_length, vstarts.is_empty()) { + (Some(true), false) => Some(true), + (_, _) => Some(false), + }; + + let inframe_pair = find_inframe_vdj_pair(vstarts, jstops); + contig_status.in_frame = Some(inframe_pair.is_some()); + + if let Some((vstart, jstop)) = inframe_pair { + contig_status.no_premature_stop = Some( + !(vstart.tig_start..jstop.tig_stop - 3) + .step_by(3) + .any(|j| have_stop(contig, j)), + ); + }; + + let found_cdr3s = get_cdr3_using_ann(contig, reference, ann); + contig_status.has_cdr3 = Some(!found_cdr3s.is_empty()); + + if let (Some((vstart, jstop)), Some(cdr3)) = (inframe_pair, found_cdr3s.first()) { + let expected_len = (refs[vstart.ref_id].len() + refs[jstop.ref_id].len()) as i32 + + (3 * cdr3.aa_seq.len() as i32) + - 20; + let observed_len = jstop.tig_stop as i32 - vstart.tig_start as i32; + let delta = expected_len - observed_len; + let min_delta = if vdj_chain == VdjChain::IGH { + MIN_DELTA_IGH + } else { + MIN_DELTA + }; + contig_status.has_expected_size = if delta < min_delta || delta > MAX_DELTA { + Some(false) + } else { + Some(true) + } + }; + + let observed_order: Vec = ann + .iter() + .map(|a| reference.segtype[a.ref_id as usize]) + .map(|s| match s { + "U" => 0, + "V" => 1, + "D" => 2, + "J" => 3, + "C" => 4, + _ => panic!("Invalid segtype"), + }) + .collect(); + let mut expected_order = observed_order.clone(); + expected_order.sort(); + contig_status.correct_ann_order = Some(observed_order == expected_order); + + Some(contig_status) +} + +pub fn is_productive_contig( + b: &DnaString, + refdata: &RefData, + ann: &[Annotation], +) -> (bool, ContigStatus) { + let contig_status = VDJ_CHAINS + .iter() + .map(|chain| VdjChain::from_str(chain).unwrap()) + .filter_map(|chain| evaluate_contig_status(chain, ann, refdata, b)) + .min_by_key(ContigStatus::order_by); + if let Some(cs) = contig_status { + return (cs.is_productive(), cs.clone()); + } + (false, ContigStatus::default()) +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// JUNCTION REGION CODE +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Given a valid contig, find the junction sequence, which we define to be the 100 +// bases ending where the right end of a J region aligns to the contig. + +pub fn junction_seq(tig: &DnaString, refdata: &RefData, ann: &[Annotation], jseq: &mut DnaString) { + let refs = &refdata.refs; + let segtype = &refdata.segtype; + const TAG: i32 = 100; + let jstop = ann + .iter() + .filter_map(|a| { + if segtype[a.ref_id as usize] == "J" + && (a.ref_start + a.match_len) as usize == refs[a.ref_id as usize].len() + && a.tig_start + a.match_len >= TAG + { + Some(a.tig_start + a.match_len) + } else { + None + } + }) + .min() + .unwrap_or_else(|| panic!("Could not find jstop for a valid contig!")); + let jstart = jstop - TAG; + *jseq = tig.slice(jstart as usize, jstop as usize).to_owned(); +} + +// Given a valid contig, find the read support for the junction sequence. Return a +// pair (UMIs, nreads), consisting of the number of UMIs that cover the junction +// sequence, and the total number of reads on those UMIs that cover the junction +// sequence. +// +// This is a very restrictive definition of junction support! +// +// Note that it is possible to find zero UMIs, because each UMI individually may +// not cover the junction. + +pub fn junction_supp( + tig: &DnaString, + reads: &[DnaString], + x: &Hyper, + umi_id: &[i32], + refdata: &RefData, + ann: &[Annotation], + jsupp: &mut (i32, i32), +) { + let mut jseq = DnaString::new(); + junction_seq(tig, refdata, ann, &mut jseq); + junction_supp_core(reads, x, umi_id, &jseq, jsupp); +} + +pub fn junction_supp_core( + reads: &[DnaString], + x: &Hyper, + umi_id: &[i32], + jseq: &DnaString, + jsupp: &mut (i32, i32), +) { + let mut ids = Vec::::new(); + // ◼ What we're doing here is converting a Vec into a Vec. + // ◼ There should be a function to do that. + for e in 0..x.h.g.edge_count() { + for id in &x.ids[e] { + ids.push(*id as i32); + } + } + unique_sort(&mut ids); + let tigs = vec![jseq.clone()]; + let mut kmers_plus = Vec::<(Kmer20, i32, i32)>::new(); + make_kmer_lookup_20_single(&tigs, &mut kmers_plus); + let mut idi = 0; + let k = x.h.k as usize; + jsupp.0 = 0; + jsupp.1 = 0; + while idi < ids.len() { + let mut idj = idi + 1; + while idj < ids.len() && umi_id[ids[idj] as usize] == umi_id[ids[idi] as usize] { + idj += 1; + } + let mut mm = Vec::<(i32, i32)>::new(); + for ida in &ids[idi..idj] { + let b = &reads[*ida as usize]; + if b.len() < k { + continue; + } + for j in 0..b.len() - k + 1 { + let z: Kmer20 = b.get_kmer(j); + let low = lower_bound1_3(&kmers_plus, &z) as usize; + for kmer in &kmers_plus[low..] { + if kmer.0 != z { + break; + } + let p = kmer.2 as usize; + if j > 0 && p > 0 && b.get(j - 1) == jseq.get(p - 1) { + continue; + } + let mut len = k; + loop { + if j + len == b.len() || p + len == jseq.len() { + break; + } + if b.get(j + len) != jseq.get(p + len) { + break; + } + len += 1; + } + mm.push((p as i32, (p + len) as i32)); + } + } + } + mm.sort_unstable(); + let mut cov = true; + if mm.is_empty() || mm[0].0 > 0 { + cov = false; + } + let mut reach = 0; + for m in &mm { + if m.0 <= reach { + reach = max(reach, m.1); + } + } + if reach < jseq.len() as i32 { + cov = false; + } + if cov { + jsupp.0 += 1; + jsupp.1 += mm.len() as i32; + } + idi = idj; + } +} diff --git a/lib/rust/vdj_ann/src/vdj_features.rs b/lib/rust/vdj_ann/src/vdj_features.rs new file mode 100644 index 0000000..c285889 --- /dev/null +++ b/lib/rust/vdj_ann/src/vdj_features.rs @@ -0,0 +1,546 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +// This file contains functions that take as input an amino acid reference sequence for a V +// segment, along with its chain type (IGH, IGK, IGL, TRA or TRB), and attempt to find features in +// the sequence. +// +// These functions can fail, in particular for reference sequences that are damaged and possibly +// for other sequences. +// +// The same functions can also be applied to a protein sequence, however the sequence needs to be +// modified to add a fake leader sequence on the left (we use MXXXXXXXXXXXXXXXXXXXX), and to +// truncate on the right to trim a bit beyond the start of the CDR3. + +use vector_utils::reverse_sort; + +type Score = usize; + +/// A scored set of sequence elements to look for at a particular offset. +struct ScoredElements { + /// The offest into the sequence to search for these elements. + offset: usize, + /// The elements to match; each byte in the string is one candidate. + elements: &'static str, + /// The score for matching an element at offset. + score: Score, +} + +impl ScoredElements { + /// Return the score if this matches the sequence. + pub fn score(&self, seq: &[u8]) -> Option { + let seq_element = seq[self.offset]; + for search_element in self.elements.bytes() { + if seq_element == search_element { + return Some(self.score); + } + } + None + } +} + +struct Motif { + elements: Vec, + /// The length of this motif. + len: usize, +} + +impl Motif { + pub fn from_items(elements: impl IntoIterator) -> Self { + let elements: Vec<_> = elements + .into_iter() + .map(|(offset, elements, score)| ScoredElements { + offset, + elements, + score, + }) + .collect(); + Self { + len: elements.iter().map(|motif| motif.offset).max().unwrap() + 1, + elements, + } + } + + /// Score this motif against the provided sequence. + /// If the sequence is not long enough to be matched against the full motif, + /// return None. + fn score(&self, seq: &[u8]) -> Option { + if seq.len() < self.len { + return None; + } + let score: Score = self + .elements + .iter() + .filter_map(|element| element.score(seq)) + .sum(); + if score == 0 { + None + } else { + Some(score) + } + } + + /// Search for the best match in a sliding window through a sequence. + /// The search starts matching the motif at the start element, and tries to + /// match against all motif start positions in the range + /// [start, start + width). If the sequence is not long + /// enough to match the full motif against the sequence starting from + /// the first start position, return TooShort. + pub fn best_match(&self, seq: &[u8], start: usize, width: usize) -> MatchResult { + if seq.len() < start + self.len { + return Err(NoMatch::TooShort); + } + let end = start + width; + + match (start..usize::min(end, seq.len())) + .filter_map(|motif_start| { + self.score(&seq[motif_start..]) + .map(|score| (score, motif_start)) + }) + .max_by_key(|(score, _)| *score) + { + Some((_, motif_start)) => Ok(motif_start), + None => Err(NoMatch::NotFound), + } + } +} + +/// Represent the result of matching a motif against a sequence window. +type MatchResult = Result; + +/// Ways we can fail to match a motif against a sequence window. +#[derive(Debug, PartialEq, Eq)] +enum NoMatch { + TooShort, + NotFound, +} + +trait WithOffset { + fn with_offset(self, offset: impl FnOnce(usize) -> i64) -> Self; +} + +impl WithOffset for MatchResult { + /// Call the provided offset closure with the found start position. + /// Add the resulting offset to the start position. + /// Internal math is performed as signed integers, so the offset can + /// safely be negative. + fn with_offset(self, offset: impl FnOnce(usize) -> i64) -> Self { + self.map(|p| { + let off = offset(p); + let with_offset = p as i64 + off; + assert!( + with_offset >= 0, + "applying offset {off} resulting in a negative sequence index {with_offset}", + ); + + with_offset as usize + }) + } +} + +/// Given the amino acid sequence for a V reference sequence, attempt to find the start of the +/// framework one region, which is immmediately after the signal peptide. +/// +/// Scoring motif: +/// +/// pos weight values +/// 1 150 Q, E, D, G, K +/// 2 50 V, I, Q, A +/// 4 100 L, V, M +/// 6 250 Q, E +/// 22 250 C +/// 23 250 C +/// +/// If the starting amino acid is C, we add one to the start position. +pub fn fr1_start(aa: &[u8], chain_type: &str) -> Option { + let motif = Motif::from_items([ + (0, "QEDGK", 150), + (1, "VIQA", 50), + (3, "LVM", 100), + (5, "QE", 250), + (21, "C", if chain_type == "IGH" { 500 } else { 250 }), + (22, "C", 250), + ]); + + motif + .best_match(aa, 0, if chain_type == "IGL" { 26 } else { 41 }) + .with_offset(|p| if aa[p] == b'C' { 1 } else { 0 }) + .ok() +} + +/// Given the amino acid sequence for a V reference sequence, attempt to find the start of the +/// CDR1 region. Note that there is more than one convention regarding the CDR1 start, and these +/// conventions appear to differ by fixed offsets. The convention used here is for IMGT. +/// Chain type is one of IGH, IGK, IGL, TRA or TRB. +pub fn cdr1_start(aa: &[u8], chain_type: &str, _verbose: bool) -> Option { + let motif = Motif::from_items([ + (0, "V", 50), + (1, "T", 30), + (2, "LIVM", 200), + (3, "STR", 80), + (4, "C", 250), + (7, "SID", 100), + ]); + + let (start, end) = { + let start = 25; + let fr1 = fr1_start(aa, chain_type)?; + let end = fr1 + 20; + if start <= end { + (start, end) + } else { + (end, start) + } + }; + let width = end - start; + + motif + .best_match(aa, start, width) + .with_offset(|_| { + if chain_type.starts_with("TR") || chain_type == "IGH" { + 8 + } else { + 5 + } + }) + .ok() +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Given the amino acid sequence for a V reference sequence, attempt to find the start of the +// FR2 region. Chain type is one of IGH, IGK, IGL, TRA or TRB' + +pub fn fr2_start(aa: &[u8], chain_type: &str, _verbose: bool) -> Option { + let motif = Motif::from_items([ + (0, "LMVF", 50), + (1, "Y", if chain_type == "IGL" { 250 } else { 0 }), + (2, "W", 250), + (3, "Y", 150), + (4, "R", 100), + (5, "Q", 250), + (8, "G", 110), + (9, "KQ", 60), + (10, "GKA", 40), + ]); + + motif + .best_match(aa, 40, if chain_type == "IGH" { 23 } else { 34 }) + .with_offset(|_| { + let mut offset = -1; + if chain_type != "IGH" { + offset += 1; + } + if chain_type == "IGK" || chain_type == "IGL" { + offset += 2; + } + offset + }) + .ok() +} + +/// Given the amino acid sequence for a V reference sequence, attempt to find the start of the +/// CDR2 region. Chain type is one of IGH, IGK, IGL, TRA or TRB. +pub fn cdr2_start(aa: &[u8], chain_type: &str, _verbose: bool) -> Option { + let fwr2_start = fr2_start(aa, chain_type, false)?; + + if chain_type == "IGH" { + // Six amino acids preceeding the CDR2 start. + let motif = Motif::from_items([ + (0, "L", 80), + (1, "E", 80), + (2, "W", 80), + (3, "VMIL", 40), + (4, "GSA", 40), + // NOTE: this originally had a trailing sixth empty entry, not sure if it was doing anything + // besides effectively asserting that the sequence needed to have at + // least six elements. + ]); + + motif + .best_match(aa, fwr2_start + 8, 6) + .with_offset(|_| 7) + .ok() + } else if chain_type == "TRA" { + let motif = Motif::from_items([ + (0, "PL", 15), + (1, "QVETI", 15), + (2, "LF", 20), + (3, "L", 35), + (4, "LI", 15), + // NOTE: this originally had a trailing sixth empty entry, not sure if it was doing anything + // besides effectively asserting that the sequence needed to have at + // least six elements. + ]); + + motif + .best_match(aa, fwr2_start + 10, 3) + .with_offset(|_| 6) + .ok() + } else { + Some( + fwr2_start + + (if chain_type == "IGK" || chain_type == "IGL" { + 15 + } else { + 17 + }), + ) + } +} + +pub fn cdr3_start(aa: &[u8], _chain_type: &str, _verbose: bool) -> usize { + let motif = [b"LQPEDSAVYYC", b"VEASQTGTYFC", b"ATSGQASLYLC"]; + let nm = motif[0].len(); + let reach = 18; + let mut scores = Vec::<(usize, usize)>::new(); + for j in aa.len().saturating_sub(nm + reach)..=aa.len().saturating_sub(nm) { + let mut score = 0; + for k in 0..nm { + for m in motif { + if aa[j + k] == m[k] { + score += 1; + if aa[j + k] == b'Q' { + break; + } + } + } + } + scores.push((score, j + nm)); + } + reverse_sort(&mut scores); + scores[0].1 +} + +pub fn cdr3_score(aa: &[u8], _chain_type: &str, _verbose: bool) -> usize { + let motif = [b"LQPEDSAVYYC", b"VEASQTGTYFC", b"ATSGQASLYLC"]; + let nm = motif[0].len(); + const REACH: usize = 18; + let mut scores = Vec::<(usize, usize)>::with_capacity(REACH + 1); + for j in aa.len().saturating_sub(nm + REACH)..=aa.len().saturating_sub(nm) { + let mut score = 0; + for k in 0..nm { + for m in motif { + if aa[j + k] == m[k] { + score += 1; + if aa[j + k] == b'Q' { + break; + } + } + } + } + scores.push((score, j + nm)); + } + reverse_sort(&mut scores); + scores[0].0 +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Given the amino acid sequence for a V reference sequence, attempt to find the start of the +// FR3 region. + +pub fn fr3_start(aa: &[u8], chain_type: &str, verbose: bool) -> Option { + let cdr3_start = cdr3_start(aa, chain_type, verbose); + + if chain_type == "IGK" || chain_type == "IGL" { + let motif = Motif::from_items([ + (0, "G", 100), + (2, "P", 100), + (4, "R", 100), + (5, "F", 100), + (7, "G", 100), + ]); + + // Score positions. + + if cdr3_start < 35 { + return None; + } + + let start = cdr3_start - 35; + let width = 8; + + motif.best_match(aa, start, width).ok() + } else if chain_type == "IGH" { + let motif = Motif::from_items([ + (0, "YN", 600), + (1, "Y", 500), + (2, "AN", 400), + (5, "FL", 850), + (6, "KQR", 800), + (8, "RK", 1000), + (9, "FVAL", 700), + ]); + + // Score positions. + if cdr3_start < 40 { + return None; + } + + motif + .best_match(aa, cdr3_start - 40, 11) + .with_offset(|_| -1) + .ok() + } else if chain_type == "TRA" { + let motif = Motif::from_items([ + (0, "EVNK", 50), + (1, "TKAE", 50), + (2, "ES", 50), + (3, "NDS", 50), + (4, "GN", 50), + (5, "RGM", 80), + (6, "FYAI", 50), + (7, "ST", 50), + (8, "AV", 50), + (9, "TE", 50), + (11, "ND", 50), + ]); + + // Score positions. + if cdr3_start < 36 { + return None; + }; + + motif + .best_match(aa, cdr3_start - 36, 4) + .with_offset(|_| 1) + .ok() + } else { + // Do TRB. + let motif = Motif::from_items([ + (2, "KED", 50), + (3, "GSQ", 200), + (4, "DEGS", 200), + (5, "IVLM", 200), + (6, "PS", 100), + ]); + + // Score positions. + if cdr3_start < 38 { + return None; + } + + motif.best_match(aa, cdr3_start - 38, 4).ok() + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn score_fwr3(aa: &[u8], r: usize, freqs: &[Vec>]) -> f64 { + let chain_type; + if r == 0 { + chain_type = "IGH"; + } else if r == 1 { + chain_type = "IGK"; + } else if r == 2 { + chain_type = "IGL"; + } else if r == 3 { + chain_type = "TRA"; + } else { + chain_type = "TRB"; + } + let cdr3 = cdr3_start(aa, chain_type, false); + let motif = freqs[0].len(); + let mut score = 0.0; + for j in 0..motif { + let x = aa[cdr3 - j - 1]; + let mut m = 0; + let mut total = 0; + for k in 0..freqs[r][j].len() { + let count = freqs[r][j][k].0; + let y = freqs[r][j][k].1; + total += count; + if y == x { + m += count; + } + } + score += m as f64 / total as f64; + } + score +} + +pub fn score4(aa: &[u8], r: usize) -> usize { + let chain_type; + if r == 0 { + chain_type = "IGH"; + } else if r == 1 { + chain_type = "IGK"; + } else if r == 2 { + chain_type = "IGL"; + } else if r == 3 { + chain_type = "TRA"; + } else { + chain_type = "TRB"; + } + let cdr3 = cdr3_start(aa, chain_type, false); + let n = aa.len(); + assert!(n >= 22); + let mut score = 0; + let x = aa[cdr3 - 4]; + if x == b'V' || x == b'T' || x == b'L' { + score += 1; + } + let x = aa[cdr3 - 3]; + if x == b'Y' { + score += 1; + } + let x = aa[cdr3 - 2]; + if x == b'Y' || x == b'F' || x == b'L' { + score += 1; + } + let x = aa[cdr3 - 1]; + if x == b'C' { + score += 3; + } + score +} + +#[cfg(test)] +mod test { + use super::{Motif, NoMatch, ScoredElements}; + + #[test] + fn test_scored_element() { + let e = ScoredElements { + offset: 1, + elements: "ABC", + score: 1, + }; + assert_eq!(None, e.score("XX".as_bytes())); + assert_eq!(Some(1), e.score("XA".as_bytes())); + assert_eq!(Some(1), e.score("XC".as_bytes())); + assert_eq!(None, e.score("XXA".as_bytes())); + } + + #[test] + fn test_motif_match() { + use NoMatch::*; + let motif = Motif::from_items([(0, "ABC", 10), (2, "D", 3)]); + assert_eq!(TooShort, motif.best_match("".as_bytes(), 0, 1).unwrap_err()); + assert_eq!( + TooShort, + motif.best_match("A".as_bytes(), 0, 1).unwrap_err() + ); + assert_eq!( + TooShort, + motif.best_match("AA".as_bytes(), 0, 1).unwrap_err() + ); + assert_eq!( + TooShort, + motif.best_match("AAA".as_bytes(), 1, 1).unwrap_err() + ); + assert_eq!(Ok(0), motif.best_match("AAA".as_bytes(), 0, 5)); + + assert_eq!(Ok(0), motif.best_match("AXX".as_bytes(), 0, 1)); + assert_eq!(Ok(0), motif.best_match("AAD".as_bytes(), 0, 1)); + assert_eq!(Ok(1), motif.best_match("AADD".as_bytes(), 0, 2)); + + assert_eq!( + NotFound, + motif.best_match("XXX".as_bytes(), 0, 1).unwrap_err() + ); + // potential change to legacy behavior/implicit in current impl: + // later matches end up being preferred for same score. + assert_eq!(Ok(1), motif.best_match("AAAA".as_bytes(), 0, 2)); + } +} diff --git a/lib/rust/vdj_ann_ref/Cargo.toml b/lib/rust/vdj_ann_ref/Cargo.toml new file mode 100644 index 0000000..a1fe7b1 --- /dev/null +++ b/lib/rust/vdj_ann_ref/Cargo.toml @@ -0,0 +1,31 @@ +[dependencies] +[dependencies.debruijn] +workspace = true + +[dependencies.flate2] +workspace = true + +[dependencies.io_utils] +path = '../io_utils' + +[dependencies.sha2] +workspace = true + +[dependencies.string_utils] +path = '../string_utils' + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'vdj_ann_ref' +publish = false +version = '0.1.0' diff --git a/lib/rust/vdj_ann_ref/src/lib.rs b/lib/rust/vdj_ann_ref/src/lib.rs new file mode 100644 index 0000000..129aee1 --- /dev/null +++ b/lib/rust/vdj_ann_ref/src/lib.rs @@ -0,0 +1,142 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// This file contains code to make reference data. +// +// ◼ Experiment with building a reference from scratch. This would be a better +// ◼ solution than ad hoc editing of a flawed reference. +// +// ◼ Document reference sequence requirements so that a customer who wishes to +// ◼ create a reference for a new species will know the conventions used by the +// ◼ code. + +use io_utils::read_to_string_safe; +use vdj_ann::refx::{make_vdj_ref_data_core, RefData}; + +pub fn human_ref() -> &'static str { + include_str!["../vdj_refs/human/fasta/regions.fa"] +} + +pub fn human_ref_old() -> &'static str { + include_str!["../vdj_refs_old/human/fasta/regions.fa"] +} + +pub fn human_ref_2_0() -> &'static str { + include_str!["../vdj_refs_2.0/human/fasta/regions.fa"] +} + +pub fn human_ref_3_1() -> &'static str { + include_str!["../vdj_refs_3.1/human/fasta/regions.fa"] +} + +pub fn human_ref_4_0() -> &'static str { + include_str!["../vdj_refs_4.0/human/fasta/regions.fa"] +} + +pub fn human_ref_5_0() -> &'static str { + include_str!["../vdj_refs_5.0/human/fasta/regions.fa"] +} + +pub fn human_ref_7_0() -> &'static str { + include_str!["../vdj_refs_7.0/human/fasta/regions.fa"] +} + +pub fn mouse_ref() -> &'static str { + include_str!["../vdj_refs/mouse/fasta/regions.fa"] +} + +pub fn mouse_ref_old() -> &'static str { + include_str!["../vdj_refs_old/mouse/fasta/regions.fa"] +} + +pub fn mouse_ref_3_1() -> &'static str { + include_str!["../vdj_refs_3.1/mouse/fasta/regions.fa"] +} + +pub fn mouse_ref_4_0() -> &'static str { + include_str!["../vdj_refs_4.0/mouse/fasta/regions.fa"] +} + +pub fn mouse_ref_5_0() -> &'static str { + include_str!["../vdj_refs_5.0/mouse/fasta/regions.fa"] +} + +pub fn mouse_ref_7_0() -> &'static str { + include_str!["../vdj_refs_7.0/mouse/fasta/regions.fa"] +} + +// ids_to_use_opt: Optional hashSet of ids. If specified only reference +// entries with id in the HashSet is used to construct RefData +#[allow(clippy::too_many_arguments)] +pub fn make_vdj_ref_data( + refdata: &mut RefData, + imgt: bool, + species: &str, + extended: bool, + is_tcr: bool, + is_bcr: bool, + human_supp_ref: &str, + mouse_supp_ref: &str, +) { + // Necessary for lifetime management of results from read_to_string_safe + let x: String; + let refx = match (imgt, species) { + (false, "human") => human_ref(), + (false, "mouse") => mouse_ref(), + (true, "human") => { + x = read_to_string_safe("vdj_IMGT_20170916-2.1.0/fasta/regions.fa"); + x.as_str() + } + (true, "mouse") => { + x = read_to_string_safe("vdj_IMGT_mouse_20180723-2.2.0/fasta/regions.fa"); + x.as_str() + } + _ => panic!("Invalid species {}.", &species), + }; + let ext_refx = if extended && !imgt { + match species { + "human" => human_supp_ref, + "mouse" => mouse_supp_ref, + _ => unreachable!("Invalid species {}.", &species), + } + } else { + "" + }; + assert!(!refx.is_empty(), "Reference file has zero length."); + make_vdj_ref_data_core(refdata, refx, ext_refx, is_tcr, is_bcr, None); +} + +#[cfg(test)] +mod tests { + use super::*; + + // The following test checks for alignment of a D region. This example was fixed by code + // changes in March 2020. + #[test] + fn test_d_region_alignment() { + use debruijn::dna_string::DnaString; + use vdj_ann::annotate::annotate_seq; + use vdj_ann::refx::make_vdj_ref_data_core; + let seq = DnaString::from_acgt_bytes( + b"GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAA\ + CCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTC\ + TTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACTATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTCTCCTGG\ + GAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAA\ + CAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAA\ + TGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCC\ + AAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATTTTTCTTGCCGGGACAGGGGGCTGGAGCGGCACTGAAGCTTTCTTT\ + GGACAAGGCACCAGACTCACAGTTGTAGAGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGA", + ); + let (refx, ext_refx) = (human_ref(), String::new()); + let (is_tcr, is_bcr) = (true, false); + let mut refdata = RefData::new(); + make_vdj_ref_data_core(&mut refdata, refx, &ext_refx, is_tcr, is_bcr, None); + let ann = annotate_seq(&seq, &refdata, true, false, true); + let mut have_d = false; + for a in ann { + if refdata.is_d(a.ref_id as usize) { + have_d = true; + } + } + assert!(have_d, "\nFailed to find alignment of D region.\n"); + } +} diff --git a/lib/rust/vdj_ann_ref/vdj_refs/human/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs/human/fasta/regions.fa new file mode 100644 index 0000000..af64537 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs/human/fasta/regions.fa @@ -0,0 +1,1384 @@ +>1|IGHA1 ENST00000641837|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAACAGGGAGGGCCCCCAGTAC +>2|IGHA1 ENST00000633714|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>3|IGHA2 ENST00000390539|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGTAAACCCACCCACATCAATGTGTCTGTTGTCATGGCGGAGGCGGATGGCACCTGCTAC +>4|IGHA2 ENST00000497872|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGCTCTTGCTGTGTTGCAGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAAGAGGGAGGGCCCCCAGTAC +>5|IGHA2 ENST00000622473|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>6|IGHD ENST00000633698|IGHD|C-REGION|IG|IGH|D|00 +CACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTACCTGGCCATGACCCCCCTGATCCCTCAGAGCAAGGATGAGAACAGCGATGACTACACGACCTTTGATGATGTGGGCAGCCTGTGGACCACCCTGTCCACGTTTGTGGCCCTCTTCATCCTCACCCTCCTCTACAGCGGCATTGTCACTTTCATCAAGGTGAAG +>7|IGHD1-1 ENST00000633210|IGHD1-1|D-REGION|IG|IGH|None|00 +GGTACAACTGGAACGAC +>8|IGHD1-14 ENST00000631884|IGHD1-14|D-REGION|IG|IGH|None|00 +GGTATAACCGGAACCAC +>9|IGHD1-20 ENST00000632968|IGHD1-20|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACGAC +>10|IGHD1-26 ENST00000633009|IGHD1-26|D-REGION|IG|IGH|None|00 +GGTATAGTGGGAGCTACTAC +>11|IGHD1-7 ENST00000632304|IGHD1-7|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACTAC +>12|IGHD1/OR15-1B ENST00000604838|IGHD1/OR15-1B|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACAAC +>13|IGHD2-15 ENST00000632473|IGHD2-15|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTGGTGGTAGCTGCTACTCC +>14|IGHD2-2 ENST00000631803|IGHD2-2|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTAGTACCAGCTGCTATGCC +>15|IGHD2-21 ENST00000632619|IGHD2-21|D-REGION|IG|IGH|None|00 +AGCATATTGTGGTGGTGACTGCTATTCC +>16|IGHD2-8 ENST00000633504|IGHD2-8|D-REGION|IG|IGH|None|00 +AGGATATTGTACTAATGGTGTATGCTATACC +>17|IGHD2/OR15-2B ENST00000604102|IGHD2/OR15-2B|D-REGION|IG|IGH|None|00 +AGAATATTGTAATAGTACTACTTTCTATGCC +>18|IGHD3-10 ENST00000632609|IGHD3-10|D-REGION|IG|IGH|None|00 +GTATTACTATGGTTCGGGGAGTTATTA +>19|IGHD3-16 ENST00000633379|IGHD3-16|D-REGION|IG|IGH|None|00 +GTATTATGATTACGTTTGGGGGAGTTATCGTTATACC +>20|IGHD3-22 ENST00000633765|IGHD3-22|D-REGION|IG|IGH|None|00 +GTATTACTATGATAGTAGTGGTTATTACTAC +>21|IGHD3-3 ENST00000633353|IGHD3-3|D-REGION|IG|IGH|None|00 +GTATTACGATTTTTGGAGTGGTTATTATACC +>22|IGHD3-9 ENST00000632911|IGHD3-9|D-REGION|IG|IGH|None|00 +GTATTACGATATTTTGACTGGTTATTA +>23|IGHD3/OR15-3B ENST00000603935|IGHD3/OR15-3B|D-REGION|IG|IGH|None|00 +GTATTATGATTTTTGGACTGGTTATTATACC +>24|IGHD4-17 ENST00000633010|IGHD4-17|D-REGION|IG|IGH|None|00 +TGACTACGGTGACTAC +>25|IGHD4-23 ENST00000633030|IGHD4-23|D-REGION|IG|IGH|None|00 +TGACTACGGTGGTAACTCC +>26|IGHD4-4 ENST00000634085|IGHD4-4|D-REGION|IG|IGH|None|00 +TGACTACAGTAACTAC +>27|IGHD4/OR15-4B ENST00000603693|IGHD4/OR15-4B|D-REGION|IG|IGH|None|00 +TGACTATGGTGCTAACTAC +>28|IGHD5-12 ENST00000631895|IGHD5-12|D-REGION|IG|IGH|None|00 +GTGGATATAGTGGCTACGATTAC +>29|IGHD5-24 ENST00000632963|IGHD5-24|D-REGION|IG|IGH|None|00 +GTAGAGATGGCTACAATTAC +>30|IGHD5-5 ENST00000633968|IGHD5-5|D-REGION|IG|IGH|None|00 +GTGGATACAGCTATGGTTAC +>31|IGHD5/OR15-5B ENST00000604446|IGHD5/OR15-5B|D-REGION|IG|IGH|None|00 +GTGGATATAGTGTCTACGATTAC +>32|IGHD6-13 ENST00000632859|IGHD6-13|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCAGCTGGTAC +>33|IGHD6-19 ENST00000633159|IGHD6-19|D-REGION|IG|IGH|None|00 +GGGTATAGCAGTGGCTGGTAC +>34|IGHD6-25 ENST00000634070|IGHD6-25|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCGGCTAC +>35|IGHD6-6 ENST00000632542|IGHD6-6|D-REGION|IG|IGH|None|00 +GAGTATAGCAGCTCGTCC +>36|IGHD7-27 ENST00000632524|IGHD7-27|D-REGION|IG|IGH|None|00 +CTAACTGGGGA +>37|IGHE ENST00000390541|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>38|IGHE ENST00000641420|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGAGCTGGACGTGTGCGTGGAGGAGGCCGAGGGCGAGGCGCCGTGGACGTGGACCGGCCTCTGCATCTTCGCCGCACTCTTCCTGCTCAGCGTGAGCTACAGCGCCGCCATCACGCTCCTCATGGTGCAGCGGTTCCTCTCAGCCACGCGGCAGGGGAGGCCCCAGACCTCCCTCGACTACACCAACGTCCTCCAGCCCCACGCC +>39|IGHE ENST00000610670|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCGAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>40|IGHG1 ENST00000631402|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>41|IGHG1 ENST00000631466|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>42|IGHG1 ENST00000631539|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTACAGGAACATGATCGGACAGGGGGCC +>43|IGHG2 ENST00000641095|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACCACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCATCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATCAGGCAGGGGGCC +>44|IGHG2 ENST00000621803|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>45|IGHG3 ENST00000641136|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTATAGGAACATGATTGGGCAGGGGGCC +>46|IGHG3 ENST00000632774|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>47|IGHG4 ENST00000641978|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATAAGGCAGGGGGCC +>48|IGHG4 ENST00000618981|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGGTAAA +>49|IGHJ1 ENST00000634062|IGHJ1|J-REGION|IG|IGH|None|00 +GCTGAATACTTCCAGCACTGGGGCCAGGGCACCCTGGTCACCGTCTCCTCAG +>50|IGHJ2 ENST00000390564|IGHJ2|J-REGION|IG|IGH|None|00 +TACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>51|IGHJ2 ENST00000632178|IGHJ2|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>52|IGHJ3 ENST00000463911|IGHJ3|J-REGION|IG|IGH|None|00 +GATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>53|IGHJ3 ENST00000633896|IGHJ3|J-REGION|IG|IGH|None|00 +TGATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>54|IGHJ4 ENST00000461719|IGHJ4|J-REGION|IG|IGH|None|00 +TACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>55|IGHJ4 ENST00000631521|IGHJ4|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>56|IGHJ5 ENST00000488476|IGHJ5|J-REGION|IG|IGH|None|00 +AACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>57|IGHJ5 ENST00000633501|IGHJ5|J-REGION|IG|IGH|None|00 +ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>58|IGHJ6 ENST00000390560|IGHJ6|J-REGION|IG|IGH|None|00 +TACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>59|IGHJ6 ENST00000631705|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>60|IGHM ENST00000637539|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGAGGGGGAGGTGAGCGCCGACGAGGAGGGCTTTGAGAACCTGTGGGCCACCGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGTACCACCGTCACCTTGTTCAAGGTGAAA +>61|IGHM ENST00000626472|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTAC +>62|IGHV1-18 ENST00000633147|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>63|IGHV1-18 ENST00000633147|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>64|IGHV1-2 ENST00000633350|IGHV1-2|5'UTR|IG|IGH|None|00 +GAGAGCATCACCCAGCAACCACATCTGTCCTCTAGAGAATCCCCTGAGAGCTCCGTTCCTCACC +>65|IGHV1-2 ENST00000633350|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCCACAGGAGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCGGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCTGGGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACATGGAGCTGAGCAGGCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>66|IGHV1-24 ENST00000633490|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>67|IGHV1-24 ENST00000633490|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>68|IGHV1-3 ENST00000632977|IGHV1-3|5'UTR|IG|IGH|None|00 +CCACATCCCTCCTCAGAAGCCCCCAGAGCACAACGCCTCACC +>69|IGHV1-3 ENST00000632977|IGHV1-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTTTTGGTGGCAGCAGCCACAGGTGCCCACTCCCAGGTCCAGCTTGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGCATTGGGTGCGCCAGGCCCCCGGACAAAGGCTTGAGTGGATGGGATGGATCAACGCTGGCAATGGTAACACAAAATATTCACAGAAGTTCCAGGGCAGAGTCACCATTACCAGGGACACATCCGCGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAAGACACGGCTGTGTATTACTGTGCGAGAGA +>70|IGHV1-45 ENST00000631826|IGHV1-45|5'UTR|IG|IGH|None|00 +ATCACCCAACAACCACATCCCTCCTCTAGAGAATCCCCTGAAAGCACAGCTCCTCACC +>71|IGHV1-45 ENST00000631826|IGHV1-45|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGAATCCTCTTCTTGGTGGCAGCAGTCACAGATGCCTACTCCCAGATGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGACTGGGTCCTCAGTGAAGGTTTCCTGCAAGGCTTCCGGATACACCTTCACCTACCGCTACCTGCACTGGGTGCGACAGGCCCCCGGACAAGCGCTTGAGTGGATGGGATGGATCACACCTTTCAATGGTAACACCAACTACGCACAGAAATTCCAGGACAGAGTCACCATTACCAGGGACAGGTCTATGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACAGCCATGTATTACTGTGCAAGATA +>72|IGHV1-46 ENST00000632105|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>73|IGHV1-46 ENST00000632105|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>74|IGHV1-58 ENST00000632614|IGHV1-58|5'UTR|IG|IGH|None|00 +AGCATCATCCAGAAACCACATCCCTCCGCTAGAGAAGCCCCTGACGGCACAGTTCCTCACT +>75|IGHV1-58 ENST00000632614|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGAGGATCCTCTTCTTGGTGGGAGCAGCGACAGGTGCCCACTCCCAAATGCAGCTGGTGCAGTCTGGGCCTGAGGTGAAGAAGCCTGGGACCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATTCACCTTTACTAGCTCTGCTGTGCAGTGGGTGCGACAGGCTCGTGGACAACGCCTTGAGTGGATAGGATGGATCGTCGTTGGCAGTGGTAACACAAACTACGCACAGAAGTTCCAGGAAAGAGTCACCATTACCAGGGACATGTCCACAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCCGAGGACACGGCCGTGTATTACTGTGCGGCAGA +>76|IGHV1-69 ENST00000632882|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>77|IGHV1-69 ENST00000632882|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>78|IGHV1-69-2 ENST00000632209|IGHV1-69-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCCTCTTGGTGGCAGCAGCTACAGGCACCCACGCCGAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCTACAGTGAAAATCTCCTGCAAGGTTTCTGGATACACCTTCACCGACTACTACATGCACTGGGTGCAACAGGCCCCTGGAAAAGGGCTTGAGTGGATGGGACTTGTTGATCCTGAAGATGGTGAAACAATATACGCAGAGAAGTTCCAGGGCAGAGTCACCATAACCGCGGACACGTCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>79|IGHV1-69D ENST00000624687|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>80|IGHV1-69D ENST00000624687|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>81|IGHV1-69D ENST00000633446|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCAGATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>82|IGHV1-69D ENST00000633446|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTCCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>83|IGHV1/OR15-1 ENST00000604066|IGHV1/OR15-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACATCTTCACCGACTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGAGCTTGGGTGGATGGGACGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCAGAGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACACGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCACGTATTACTGTGCGAGAGA +>84|IGHV1/OR21-1 ENST00000622028|IGHV1/OR21-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGAATTGGAGGATCCTGTTTTTGGTGGTCATAGCTGCGGGTGCCCAGTCCCAGGTACAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCATCACCAGCTACTGTATGCACTGGGTGCACCAGGTCCATGCACAAGGGCTTGAGTGGATGGGATTGGTGTGCCCTAGTGATGGCAGCACAAGCTATGCACAGAAGTTCCAGGCCAGAGTCACCATAACCAGGGACACATCCATGAGCACAGCCTACATGGAGCTAAGCAGTCTGAGATCTGAGGACACGGCCATGTATTACTGTGTGAGAGA +>85|IGHV2-26 ENST00000632457|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>86|IGHV2-26 ENST00000632457|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATAC +>87|IGHV2-5 ENST00000560724|IGHV2-5|5'UTR|IG|IGH|None|00 +AGTGACTCCTGTGCCCCACC +>88|IGHV2-5 ENST00000560724|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTCCACGCTCCTGCTGCTGACCATCCCTTCATGGGTCTTGTCCCAGATCACCTTGAAGGAGTCTGGTCCTACGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAGTGGGTGTGGGCTGGATCCGTCAGCCCCCAGGAAAGGCCCTGGAGTGGCTTGCACTCATTTATTGGGATGATGATAAGCGCTACAGCCCATCTCTGAAGAGCAGGCTCACCATCACCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACACAGAC +>89|IGHV2-70 ENST00000617374|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAGGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGTGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACTCATTGATTGGGATGATGATAAATACTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>90|IGHV2-70 ENST00000632173|IGHV2-70|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCCCCACC +>91|IGHV2-70 ENST00000632173|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATGCTTTGTTCCATGCTCCTGCTACTGACTGTCCCGTCTTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTACTGGAATGCGTGTGAGCTGGATCCGTCGGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATACTGCAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>92|IGHV2-70D ENST00000632005|IGHV2-70D|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCTCCACC +>93|IGHV2-70D ENST00000632005|IGHV2-70D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGCGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATTCTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>94|IGHV2/OR16-5 ENST00000567458|IGHV2/OR16-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACGTTTTGCTCCACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACTCTCTCTGGGTTCTCACTCAGCACTTCTGGAATGGGTATGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCTCACATTTTTTTGAATGACAAAAAATCCTACAGCACGTCTCTGAAGAACAGGCTCATCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCATGGAGAG +>95|IGHV3-11 ENST00000634015|IGHV3-11|5'UTR|IG|IGH|None|00 +CTCCCTCTGCTGATAAAAACCAGCCGAGCCCAGACCCTGCAGCTCTGGGAGAAGAGCCCCAGCCCCAGAATTCCCAGGAGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>96|IGHV3-11 ENST00000634015|IGHV3-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTATAAAAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCAAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTAGTAGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>97|IGHV3-13 ENST00000631975|IGHV3-13|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTGTATTCAGTGATCAGGACTGAACACACAGGACTCACC +>98|IGHV3-13 ENST00000631975|IGHV3-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATATTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACGACATGCACTGGGTCCGCCAAGCTACAGGAAAAGGTCTGGAGTGGGTCTCAGCTATTGGTACTGCTGGTGACCCATACTATCCAGGCTCCGTGAAGGGCCGATTCACCATCTCCAGAGAAAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGGGGACACGGCTGTGTATTACTGTGCAAGAGA +>99|IGHV3-15 ENST00000632959|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>100|IGHV3-15 ENST00000632959|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACAGA +>101|IGHV3-16 ENST00000631755|IGHV3-16|5'UTR|IG|IGH|None|00 +AGCCCTGGGAGAGAAGCCCCAGCCCTGGGATTCTCAGGTGTTTCTATTGGGTCAACAGCAATAAACAAATTACC +>102|IGHV3-16 ENST00000631755|IGHV3-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGCCCGCAAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGTGGACTCCGTGAAGCGCCGATTCATCATCTCCAGAGACAATTCCAGGAACTCCCTGTATCTGCAAAAGAACAGACGGAGAGCCGAGGACATGGCTGTGTATTACTGTGTGAGA +>103|IGHV3-20 ENST00000632076|IGHV3-20|5'UTR|IG|IGH|None|00 +CCAGCCCTGAGATTCCCACGTGTTTCCATTCAGTGATCAGCACTGAACACAGAGGACTCGCC +>104|IGHV3-20 ENST00000632076|IGHV3-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGTGTGGTACGGCCTGGGGGGTCCCTGAGACTCTCCTTTGCAGCCTCTGGATTCACCTTTGATGATTATGGCATGAGCTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGAGTGGGTCTCTGGTATTAATTGGAATGGTGGTAGCACAGGTTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCCTTGTATCACTGTGCGAGAGA +>105|IGHV3-21 ENST00000632980|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>106|IGHV3-21 ENST00000632980|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>107|IGHV3-23 ENST00000632630|IGHV3-23|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCCAGCCCTGGGATTTTCAGGTGTTTTCATTTGGTGATCAGGACTGAACAGAGAGAACTCACC +>108|IGHV3-23 ENST00000632630|IGHV3-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGCTTTTTCTTGTGGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGCAGCTATGCCATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGCTATTAGTGGTAGTGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGGTTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTATATTACTGTGCGAAAGA +>109|IGHV3-30 ENST00000633400|IGHV3-30|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>110|IGHV3-30 ENST00000633400|IGHV3-30|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAAA +>111|IGHV3-33 ENST00000390615|IGHV3-33|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>112|IGHV3-33 ENST00000390615|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCGTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATGGTATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>113|IGHV3-33 ENST00000631807|IGHV3-33|5'UTR|IG|IGH|None|00 +CGAGCCCAGCACTGGAAGTCGCCGGTGTTTCCATTCGGTGATCATCACTGAACACAGAGGACTCACC +>114|IGHV3-33 ENST00000631807|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGCAATAAATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>115|IGHV3-35 ENST00000632225|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>116|IGHV3-35 ENST00000632225|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGAAA +>117|IGHV3-38 ENST00000631785|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>118|IGHV3-38 ENST00000631785|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATATA +>119|IGHV3-43 ENST00000633040|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>120|IGHV3-43 ENST00000633040|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGATA +>121|IGHV3-48 ENST00000632296|IGHV3-48|5'UTR|IG|IGH|None|00 +AGCTCTCAGAGAGGTGCCTTAGCCCTGGATTCCAAGGCATTTCCACTTGGTGATCAGCACTGAACACAGAGGACTCACC +>122|IGHV3-48 ENST00000632296|IGHV3-48|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGTGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGTTATGAAATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTGGTAGTACCATATACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTTTATTACTGTGCGAGAGA +>123|IGHV3-49 ENST00000632211|IGHV3-49|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCGTGAGATTCCCAGGAGTTTCCACTTGGTGATCAGCACTGAACACAGACCACCAACC +>124|IGHV3-49 ENST00000632211|IGHV3-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTTAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAATGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCAGGGCGGTCCCTGAGACTCTCCTGTACAGCTTCTGGATTCACCTTTGGTGATTATGCTATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTAGGTTTCATTAGAAGCAAAGCTTATGGTGGGACAACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGCATCGCCTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACTAGAGA +>125|IGHV3-53 ENST00000633426|IGHV3-53|5'UTR|IG|IGH|None|00 +AATACCAATCTCCCCCAGGACACTTCATCTGCACGGAGCCCGGCCTCTCCTCAGATGTCCCACCCCAGAGCTTGCTATATAGTCGGGGACATGCAAATAGGGCCCTCCCTCTGCTGATGAAAACCAGCCCAGCTGACCCTGCAGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>126|IGHV3-53 ENST00000633426|IGHV3-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTTGGCTGAGCTGGGTTTTCCTTGTTGCTATTTCAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGACTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>127|IGHV3-64 ENST00000631710|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>128|IGHV3-64 ENST00000631710|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGAGA +>129|IGHV3-64D ENST00000632099|IGHV3-64D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTCTGGCTGAGCTGGGTTCTCCTTGTTGCCATTTTAAAAGATGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTTCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATACTACGCAGACTCCGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAGCAGTCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGAAAGA +>130|IGHV3-66 ENST00000632846|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>131|IGHV3-66 ENST00000632846|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>132|IGHV3-7 ENST00000633988|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>133|IGHV3-7 ENST00000633988|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>134|IGHV3-72 ENST00000633602|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>135|IGHV3-72 ENST00000633602|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGAGA +>136|IGHV3-73 ENST00000631708|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>137|IGHV3-73 ENST00000631708|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGACA +>138|IGHV3-74 ENST00000633987|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>139|IGHV3-74 ENST00000633987|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>140|IGHV3/OR15-7 ENST00000558565|IGHV3/OR15-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGTTCTCTGAGACTCTCATGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGAGCTGGGTCCGCCAGGCTCAAGGGAAAGGGCTAGAGTTGGTAGGTTTAATAAGAAACAAAGCTAACAGTTACACGACAGAATATGCTGCGTCTGTGAAAGGCAGACTTACCATCTCAAGAGAGGATTCAAAGAACACGCTGTATCTGCAAATGAGCAACCTGAAAACCGAGGACTTGGCCGTGTATTACTGTGCTAGAGA +>141|IGHV3/OR16-10 ENST00000425181|IGHV3/OR16-10|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGCTATATTAAAAGGTGTCCAGTGTGAGGTTCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACATCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGGCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTTCGCCAGGCTCCAGGAAAAGGTCTGGAGTGGGTATCAGCTATTGGTACTGGTGGTGGCACATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACATGGCTGTGTATTACTGTGCAAGAGA +>142|IGHV3/OR16-12 ENST00000570121|IGHV3/OR16-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGAGCTCAGCTGGGTTTTCCTTGTTGCTATTTTACAAGGTGTCCACTGTGAGGTGCAGCTGGTAGAGTCTGGGAGAGGCTTGGCCCAGCCTGGGGGGTACCTAAAACTCTCCGGTGCAGCCTCTGGATTCACCGTCGGTAGCTGGTACATGAGCTGGATCCACCAGGCTCCAGGGAAGGGTCTGGAGTGGGTCTCATACATTAGTAGTAGTGGTTGTAGCACAAACTACGCAGACTCTGTGAAGGGCAGATTCACCATCTCCACAGACAACTCAAAGAACACGCTCTACCTGCAAATGAACAGCCTGAGAGTGGAGGACACGGCCGTGTATTACTGTGCAAGAGA +>143|IGHV3/OR16-13 ENST00000562905|IGHV3/OR16-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCAGACTCCATGAAGGGCCAATTCACCATCTCCAGAGACAATGCTAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACATGGCTGTGTATTACTGTACTAGAGA +>144|IGHV3/OR16-8 ENST00000565407|IGHV3/OR16-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAACTGGGTTTTCCTTGTTGCTATTATAAAAGGTGCCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTGTCCTGTCCAGCCTCTGGATTCACCTTCAGTAACCACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACATTAGTGGTGATAGTGGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGGGACAACGCCAATAACTCACCGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGA +>145|IGHV4-28 ENST00000632719|IGHV4-28|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCTGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>146|IGHV4-28 ENST00000632719|IGHV4-28|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTACAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGACACCCTGTCCCTCACCTGCGCTGTCTCTGGTTACTCCATCAGCAGTAGTAACTGGTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTACATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATGTCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGTGGACACGGCCGTGTATTACTGTGCGAGAAA +>147|IGHV4-31 ENST00000438142|IGHV4-31|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>148|IGHV4-31 ENST00000438142|IGHV4-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>149|IGHV4-34 ENST00000612474|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>150|IGHV4-34 ENST00000612474|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGAGG +>151|IGHV4-39 ENST00000633618|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>152|IGHV4-39 ENST00000633618|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGACA +>153|IGHV4-4 ENST00000631379|IGHV4-4|5'UTR|IG|IGH|None|00 +AAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCATGGACCTCCTGCACAAGAAC +>154|IGHV4-4 ENST00000631379|IGHV4-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCTCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGGGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGTTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>155|IGHV4-59 ENST00000619078|IGHV4-59|5'UTR|IG|IGH|None|00 +TTTTCACCTCTCCATACAAAGGCACCACCCACATGCAAATCCTCACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>156|IGHV4-59 ENST00000619078|IGHV4-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACATCTGTGGTTCTTCCTTCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>157|IGHV4-61 ENST00000632960|IGHV4-61|5'UTR|IG|IGH|None|00 +ACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>158|IGHV4-61 ENST00000632960|IGHV4-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCGTCAGCAGTGGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>159|IGHV4/OR15-8 ENST00000557788|IGHV4/OR15-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTTCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGTTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGCTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCCCCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACAGGGCCGTGTATTACTGTGCGAGAGA +>160|IGHV5-10-1 ENST00000632950|IGHV5-10-1|5'UTR|IG|IGH|None|00 +AGTCTCCTTCACCACCCAGCTGGGATCTCAGGGCTTCCTTTTCTGTCCTCCTCCAGG +>161|IGHV5-10-1 ENST00000632950|IGHV5-10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAAGTGCAGCTGGTGCAGTCCGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAGGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCAGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGAGGATTGATCCTAGTGACTCTTATACCAACTACAGCCCGTCCTTCCAAGGCCACGTCACCATCTCAGCTGACAAGTCCATCAGCACTGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>162|IGHV5-51 ENST00000620764|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>163|IGHV5-51 ENST00000620764|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>164|IGHV6-1 ENST00000633299|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>165|IGHV6-1 ENST00000633299|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>166|IGHV7-4-1 ENST00000631943|IGHV7-4-1|5'UTR|IG|IGH|None|00 +ACAACCACACCCCTCCTAAGAAGAAGCCCCTAGACCACAGCTCCACACC +>167|IGHV7-4-1 ENST00000631943|IGHV7-4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAATCTGGGTCTGAGTTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGAATTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACACCAACACTGGGAACCCAACGTATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCTTGGACACCTCTGTCAGCACGGCATATCTGCAGATCTGCAGCCTAAAGGCTGAGGACACTGCCGTGTATTACTGTGCGAGAGA +>168|IGHV7-81 ENST00000390639|IGHV7-81|5'UTR|IG|IGH|None|00 +ACCCAACAACAACATCCCTCCTTGGGAGAATCCCCTAGAGCACAGCTCCTCACC +>169|IGHV7-81 ENST00000390639|IGHV7-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTCTTCTTGGTGGCAGCAGCAACAGGTACCTACTCCCAGGTGCAGCTGGTGCAGTCTGGCCATGAGGTGAAGCAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACAGTTTCACCACCTATGGTATGAATTGGGTGCCACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGTTCAACACCTACACTGGGAACCCAACATATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCATGGACACCTCTGCCAGCACAGCATACCTGCAGATCAGCAGCCTAAAGGCTGAGGACATGGCCATGTATTACTGTGCGAGA +>170|IGKC ENST00000390237|IGKC|C-REGION|IG|IGK|None|00 +GAACTGTGGCTGCACCATCTGTCTTCATCTTCCCGCCATCTGATGAGCAGTTGAAATCTGGAACTGCCTCTGTTGTGTGCCTGCTGAATAACTTCTATCCCAGAGAGGCCAAAGTACAGTGGAAGGTGGATAACGCCCTCCAATCGGGTAACTCCCAGGAGAGTGTCACAGAGCAGGACAGCAAGGACAGCACCTACAGCCTCAGCAGCACCCTGACGCTGAGCAAAGCAGACTACGAGAAACACAAAGTCTACGCCTGCGAAGTCACCCATCAGGGCCTGAGCTCGCCCGTCACAAAGAGCTTCAACAGGGGAGAGTGT +>171|IGKJ1 ENST00000390242|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGCCAAGGGACCAAGGTGGAAATCAAAC +>172|IGKJ2 ENST00000390241|IGKJ2|J-REGION|IG|IGK|None|00 +TGTGCAGTTTTGGCCAGGGGACCAAGCTGGAGATCAAAC +>173|IGKJ3 ENST00000390240|IGKJ3|J-REGION|IG|IGK|None|00 +ATTCACTTTCGGCCCTGGGACCAAAGTGGATATCAAAC +>174|IGKJ4 ENST00000390239|IGKJ4|J-REGION|IG|IGK|None|00 +CTCACTTTCGGCGGAGGGACCAAGGTGGAGATCAAAC +>175|IGKJ5 ENST00000390238|IGKJ5|J-REGION|IG|IGK|None|00 +GATCACCTTCGGCCAAGGGACACGACTGGAGATTAAAC +>176|IGKV1-12 ENST00000632502|IGKV1-12|5'UTR|IG|IGK|None|00 +AGGCTGATCACACCCTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>177|IGKV1-12 ENST00000632502|IGKV1-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>178|IGKV1-16 ENST00000632011|IGKV1-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>179|IGKV1-16 ENST00000632011|IGKV1-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGAGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAAGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>180|IGKV1-17 ENST00000632229|IGKV1-17|5'UTR|IG|IGK|None|00 +AGGAATCAGTCCCACTCAGGACACAGC +>181|IGKV1-17 ENST00000632229|IGKV1-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGGTGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCGCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>182|IGKV1-27 ENST00000631531|IGKV1-27|5'UTR|IG|IGK|None|00 +GTGCAGAAGTCTCTCTCAGTCAGGACACAGC +>183|IGKV1-27 ENST00000631531|IGKV1-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGACTCCTGCTGCTCTGGCTCCCAGATACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTATCAGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAATCAGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCAAAAGTATAACAGTGCCCCT +>184|IGKV1-33 ENST00000632835|IGKV1-33|5'UTR|IG|IGK|None|00 +GTGCAGGAGTCAGTCCCAACCAGGACACAGC +>185|IGKV1-33 ENST00000632835|IGKV1-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>186|IGKV1-37 ENST00000632103|IGKV1-37|5'UTR|IG|IGK|None|00 +AGGCTGGTCACACCCCGTGCAGCAGTCAGTCCCAGTCAGGACACAGC +>187|IGKV1-37 ENST00000632103|IGKV1-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCT +>188|IGKV1-39 ENST00000631411|IGKV1-39|5'UTR|IG|IGK|None|00 +GGGCTGGTCGCACCCTGTGCAGGAGTCAGTCTCAGTCAGGACACAGC +>189|IGKV1-39 ENST00000631411|IGKV1-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCT +>190|IGKV1-5 ENST00000632205|IGKV1-5|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCCCTGAAGCCTTATTAATAGGCTGGTCACACTTTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>191|IGKV1-5 ENST00000632205|IGKV1-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAAATGTGACATCCAGATGACCCAGTCTCCTTCCACCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGAGTATTAGTAGCTGGTTGGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATAAGGCGTCTAGTTTAGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACCATCAGCAGCCTGCAGCCTGATGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTATTCT +>192|IGKV1-6 ENST00000632891|IGKV1-6|5'UTR|IG|IGK|None|00 +GCAGGAGTCAGACCCACTCAGGACACAGC +>193|IGKV1-6 ENST00000632891|IGKV1-6|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTTGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTACAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGCACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAAGATTACAATTACCCT +>194|IGKV1-8 ENST00000631614|IGKV1-8|5'UTR|IG|IGK|None|00 +AGGCTGGACACACTTCATGCAGGAGTCAGACCCTGTCAGGACACAGCATAGAC +>195|IGKV1-8 ENST00000631614|IGKV1-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATCCTCATTCTCTGCATCTACAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTACCCT +>196|IGKV1-9 ENST00000633273|IGKV1-9|5'UTR|IG|IGK|None|00 +AGACTTCTTAATAGGCTGGTCACACCTGTGCAGGAGTCAGTCCCAGTCAGGACACAGC +>197|IGKV1-9 ENST00000633273|IGKV1-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTTCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGCTTAATAGTTACCCT +>198|IGKV1/OR2-108 ENST00000453673|IGKV1/OR2-108|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCGAGGTGCCAGATGTGACATCCAGGTGACCCAGTCTCCATCTTCCCTGTCTGCGTCTGTAGGAGACAGAGTCACCATCACCTGCCGGGCAAGTCAGGGCATTAGCAATGGGTTATCCTGGTATCAGCAGAAACCAGGGCAAGCCCCTACGCTCCTGATCTATGCTGCATCCAGTTTGCAGTCGGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCTACAGGATTATACTACCCCATT +>199|IGKV1D-12 ENST00000377032|IGKV1D-12|5'UTR|IG|IGK|None|00 +AGACCCACTCAGGACACAGC +>200|IGKV1D-12 ENST00000377032|IGKV1D-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>201|IGKV1D-13 ENST00000611391|IGKV1D-13|5'UTR|IG|IGK|None|00 +GAGTCAGACCCACTCAGGACACAGC +>202|IGKV1D-13 ENST00000611391|IGKV1D-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTTCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGCAGTGCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGATGCCTCCAGTTTGGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTTTAATAGTTACCCT +>203|IGKV1D-16 ENST00000492446|IGKV1D-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>204|IGKV1D-16 ENST00000492446|IGKV1D-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGAGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>205|IGKV1D-17 ENST00000483379|IGKV1D-17|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGCTGCTGAGTTACTGAGATGAGCCAGCCCTGCAGCTGCGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCATAGCCTCCTGCCCTGAAGCCTTATTAATAGGCTGGACACACTTCATGGAGGAATCAGTCCCACTCAGGACACAGC +>206|IGKV1D-17 ENST00000483379|IGKV1D-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTAACATCCAGATGACCCAGTCTCCATCTGCCATGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGGCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGTCCCTAAGCACCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>207|IGKV1D-42 ENST00000390278|IGKV1D-42|5'UTR|IG|IGK|None|00 +AGTCCCAGTCAGGACACAGC +>208|IGKV1D-42 ENST00000390278|IGKV1D-42|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGTCAGATTTGACATCCAGATGACCCAGTCTCCATCTTTCCTGTCTGCATCTGTAGGAGACAGAGTCAGTATCATTTGCTGGGCAAGTGAGGGCATTAGCAGTAATTTAGCCTGGTATCTGCAGAAACCAGGGAAATCCCCTAAGCTCTTCCTCTATGATGCAAAAGATTTGCACCCTGGGGTCTCATCGAGGTTCAGTGGCAGGGGATCTGGGACGGATTTCACTCTCACCATCATCAGCCTGAAGCCTGAAGATTTTGCAGCTTATTACTGTAAACAGGACTTCAGTTACCCTCC +>209|IGKV1D-43 ENST00000468879|IGKV1D-43|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAACCAGCCCTGCAGCTGTGCCCAGCCTGCCTTGCCCCCTGCTAATTTGCATGTTCCCAGAGCACATCCTCCTACCCTGAAGACTTATTAATGCGCTGGTCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>210|IGKV1D-43 ENST00000468879|IGKV1D-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTGCCCGCTCAGCGCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATTCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCTGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGCAAAAGCCCCTAAGCTCTTCATCTATTATGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTACCCCT +>211|IGKV1D-8 ENST00000471857|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>212|IGKV1D-8 ENST00000471857|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>213|IGKV1D-8 ENST00000628219|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>214|IGKV1D-8 ENST00000628219|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGTCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGTTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>215|IGKV2-24 ENST00000633851|IGKV2-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>216|IGKV2-24 ENST00000633851|IGKV2-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCACCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGATTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCATGCAAGCTACACAATTTCCT +>217|IGKV2-28 ENST00000633682|IGKV2-28|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>218|IGKV2-28 ENST00000633682|IGKV2-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>219|IGKV2-30 ENST00000632910|IGKV2-30|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>220|IGKV2-30 ENST00000632910|IGKV2-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACCGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>221|IGKV2D-24 ENST00000462693|IGKV2D-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>222|IGKV2D-24 ENST00000462693|IGKV2D-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCGCCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTTCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGGTTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCACGCAAGCTACACAATTTCCT +>223|IGKV2D-26 ENST00000390268|IGKV2D-26|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACT +>224|IGKV2D-26 ENST00000390268|IGKV2D-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCTTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGCAGAGATTGTGATGACCCAGACTCCACTCTCCTTGTCTATCACCCCTGGAGAGCAGGCCTCCATGTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTGATGGATACACCTATTTGTATTGGTTTCTGCAGAAAGCCAGGCCAGTCTCCACGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATTTTGGAGTTTATTACTGCATGCAAGATGCACAAGATCCT +>225|IGKV2D-29 ENST00000491977|IGKV2D-29|5'UTR|IG|IGK|None|00 +GATCAGGACTTCTCAGTTCATCTTCTCACC +>226|IGKV2D-29 ENST00000491977|IGKV2D-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGATACCTGGATCCAGTGCAGATATTGTGATGACCCAGACTCCACTCTCTCTGTCCGTCACCCCTGGACAGCCGGCCTCCATCTCCTGCAAGTCTAGTCAGAGCCTCCTGCATAGTGATGGAAAGACCTATTTGTATTGGTACCTGCAGAAGCCAGGCCAGCCTCCACAGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAAGTATACAGCTTCCT +>227|IGKV2D-30 ENST00000474213|IGKV2D-30|5'UTR|IG|IGK|None|00 +TGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>228|IGKV2D-30 ENST00000474213|IGKV2D-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACTGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>229|IGKV3-11 ENST00000632088|IGKV3-11|5'UTR|IG|IGK|None|00 +GTCAGAGCCCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>230|IGKV3-11 ENST00000632088|IGKV3-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAACAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCCT +>231|IGKV3-15 ENST00000632887|IGKV3-15|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>232|IGKV3-15 ENST00000632887|IGKV3-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGTATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCAGCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCT +>233|IGKV3-20 ENST00000632822|IGKV3-20|5'UTR|IG|IGK|None|00 +CCTGGGTCAGAGCTCTGGAGAAGAGCTGCTCAGTTAGGACCCAGAGGGAACC +>234|IGKV3-20 ENST00000632822|IGKV3-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGGCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>235|IGKV3-7 ENST00000633250|IGKV3-7|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCCCTGGGAAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>236|IGKV3-7 ENST00000633250|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCAGAGAAATTGTAATGACACAGTCTCCACCCACCCTGTCTTTGTCTCCAGGGGAAAGAGTCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAACCTGGTATCAGCAGAAACCTGGCCAGGCGCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTAGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCT +>237|IGKV3/OR2-268 ENST00000421835|IGKV3/OR2-268|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCACAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>238|IGKV3D-11 ENST00000390277|IGKV3D-11|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>239|IGKV3D-11 ENST00000390277|IGKV3D-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGCCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCATCC +>240|IGKV3D-15 ENST00000417279|IGKV3D-15|5'UTR|IG|IGK|None|00 +GGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>241|IGKV3D-15 ENST00000417279|IGKV3D-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCATCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCATCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCTCC +>242|IGKV3D-20 ENST00000390270|IGKV3D-20|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCCGCCCTGCAGTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>243|IGKV3D-20 ENST00000390270|IGKV3D-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCGGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCTGGCGCCCAGGCTCCTCATCTATGATGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>244|IGKV3D-7 ENST00000627132|IGKV3D-7|5'UTR|IG|IGK|None|00 +GAGGAACTGCTCAGTTAGGACCCAG +>245|IGKV3D-7 ENST00000627132|IGKV3D-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAACCATGGAAGCCCCAGCACAGCTTCTTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>246|IGKV4-1 ENST00000390243|IGKV4-1|5'UTR|IG|IGK|None|00 +TTTGGCTCTTGATTTACATTGGGTACTTTCACAACCCACTGCTCATGAAATTTGCTTTTGTACTCACTGGTTGTTTTTGCATAGGCCCCTCCAGGCCACGACCAGCTGTTTGGATTTTATAAACGGGCCGTTTGCATTGTGAACTGAGCTACAACAGGCAGGCAGGGGCAGCAAG +>247|IGKV4-1 ENST00000390243|IGKV4-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTTGCAGACCCAGGTCTTCATTTCTCTGTTGCTCTGGATCTCTGGTGCCTACGGGGACATCGTGATGACCCAGTCTCCAGACTCCCTGGCTGTGTCTCTGGGCGAGAGGGCCACCATCAACTGCAAGTCCAGCCAGAGTGTTTTATACAGCTCCAACAATAAGAACTACTTAGCTTGGTACCAGCAGAAACCAGGACAGCCTCCTAAGCTGCTCATTTACTGGGCATCTACCCGGGAATCCGGGGTCCCTGACCGATTCAGTGGCAGCGGGTCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGGCTGAAGATGTGGCAGTTTATTACTGTCAGCAATATTATAGTACTCCT +>248|IGKV5-2 ENST00000632585|IGKV5-2|5'UTR|IG|IGK|None|00 +ATAAAATCTGTGCTGTCAAACTGATTAGGAACTGACTACCACCTGCAGGTCAGGGCCAAGGTT +>249|IGKV5-2 ENST00000632585|IGKV5-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGGTCCCAGGTTCACCTCCTCAGCTTCCTCCTCCTTTGGATCTCTGATACCAGGGCAGAAACGACACTCACGCAGTCTCCAGCATTCATGTCAGCGACTCCAGGAGACAAAGTCAACATCTCCTGCAAAGCCAGCCAAGACATTGATGATGATATGAACTGGTACCAACAGAAACCAGGAGAAGCTGCTATTTTCATTATTCAAGAAGCTACTACTCTCGTTCCTGGAATCCCACCTCGATTCAGTGGCAGCGGGTATGGAACAGATTTTACCCTCACAATTAATAACATAGAATCTGAGGATGCTGCATATTACTTCTGTCTACAACATGATAATTTCCCT +>250|IGKV6-21 ENST00000631699|IGKV6-21|5'UTR|IG|IGK|None|00 +ATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>251|IGKV6-21 ENST00000631699|IGKV6-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTTGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCTTCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAACGTATTACTGTCATCAGAGTAGTAGTTTACCT +>252|IGKV6D-21 ENST00000436451|IGKV6D-21|5'UTR|IG|IGK|None|00 +GGTATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>253|IGKV6D-21 ENST00000436451|IGKV6D-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTCGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAGCGTATTACTGTCATCAGAGTAGTAGTTTACCT +>254|IGKV6D-41 ENST00000390271|IGKV6D-41|5'UTR|IG|IGK|None|00 +AGCAAAACTGAAGTCAAAACACTGAG +>255|IGKV6D-41 ENST00000390271|IGKV6D-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCCCGTTGCAATTCCTGCGGCTTCTGCTCCTCTGGGTTCCAGCCTCCAGGGGTGATGTTGTGATGACACAGTCTCCAGCTTTCCTCTCTGTGACTCCAGGGGAGAAAGTCACCATCACCTGCCAGGCCAGTGAAGGCATTGGCAACTACTTATACTGGTACCAGCAGAAACCAGATCAAGCCCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCTTTACCATCAGTAGCCTGGAAGCTGAAGATGCTGCAACATATTACTGTCAGCAGGGCAATAAGCACCCT +>256|IGLC1 ENST00000390321|IGLC1|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCCAACCCCACTGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTCCAAGCCAACAAGGCCACACTAGTGTGTCTGATCAGTGACTTCTACCCGGGAGCTGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCAAACCCTCCAAACAGAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>257|IGLC2 ENST00000390323|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTATCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>258|IGLC3 ENST00000390325|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAAAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>259|IGLC7 ENST00000390331|IGLC7|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCGTAAGTGACTTCAACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGTGGGAGTGGAGACCACCAAACCCTCCAAACAAAGCAACAACAAGTATGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCGGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTGCAGAATGCTCT +>260|IGLJ1 ENST00000390320|IGLJ1|J-REGION|IG|IGL|None|00 +TTATGTCTTCGGAACTGGGACCAAGGTCACCGTCCTAG +>261|IGLJ2 ENST00000390322|IGLJ2|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTCATGAGCAG +>262|IGLJ2 ENST00000390322|IGLJ2|J-REGION|IG|IGL|None|00 +TGTGGTATTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>263|IGLJ3 ENST00000390324|IGLJ3|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTC +>264|IGLJ3 ENST00000390324|IGLJ3|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>265|IGLJ4 ENST00000390326|IGLJ4|J-REGION|IG|IGL|None|00 +GTATTTGGTGGAGGAACCCAGCTGATCATTTTA +>266|IGLJ5 ENST00000390327|IGLJ5|J-REGION|IG|IGL|None|00 +CAGAGAGGGTTTTTGTATGAGCCTGTGTCACAGCACTGGGTGTTTGGTGAGGGGACCGAGCTGACCGTCCTA +>267|IGLJ6 ENST00000390328|IGLJ6|J-REGION|IG|IGL|None|00 +GGAGGGTTTGTGTGCAGGGTTATATCACAGTGTAATGTGTTCGGCAGTGGCACCAAGGTGACCGTCCTCG +>268|IGLJ7 ENST00000390330|IGLJ7|J-REGION|IG|IGL|None|00 +TCACTGTGTGCTGTGTTCGGAGGAGGCACCCAGCTGACCGTCCTCG +>269|IGLV1-36 ENST00000618026|IGLV1-36|5'UTR|IG|IGL|None|00 +GCTGCGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>270|IGLV1-36 ENST00000618026|IGLV1-36|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCCCCTCTCTTCCTCACCCTCATCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCGGTGTCTGAAGCCCCCAGGCAGAGGGTCACCATCTCCTGTTCTGGAAGCAGCTCCAACATCGGAAATAATGCTGTAAACTGGTACCAGCAGCTCCCAGGAAAGGCTCCCAAACTCCTCATCTATTATGATGATCTGCTGCCCTCAGGGGTCTCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>271|IGLV1-40 ENST00000610349|IGLV1-40|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAAGAGGCAGCACTCAGGACAATCTCCAGC +>272|IGLV1-40 ENST00000610349|IGLV1-40|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTCCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATCGGGGCAGGTTATGATGTACACTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCCAGTCCTATGACAGCAGCCTGAGTGGTTC +>273|IGLV1-44 ENST00000390297|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>274|IGLV1-44 ENST00000390297|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>275|IGLV1-47 ENST00000390294|IGLV1-47|5'UTR|IG|IGL|None|00 +GGGGAAGCTCAGCTTCAGCTGTGGTAGAGAAGACAGGATTCAGGACAATCTCCAGC +>276|IGLV1-47 ENST00000390294|IGLV1-47|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCGGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATTATGTATACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCGGTCCGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAGTGGT +>277|IGLV1-50 ENST00000390291|IGLV1-50|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAGGAGGCAGCACTCAGGACAATCTCCAGC +>278|IGLV1-50 ENST00000390291|IGLV1-50|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTTCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATTGGGGCGGGTTATGTTGTACATTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCAATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGACTCCAGTCTGAGGATGAGGCTGATTATTACTGCAAAGCATGGGATAACAGCCTGAATGCT +>279|IGLV1-51 ENST00000390290|IGLV1-51|5'UTR|IG|IGL|None|00 +TGAGCGCAGAAGGCAGGACTCGGGACAATCTTCATC +>280|IGLV1-51 ENST00000390290|IGLV1-51|L-REGION+V-REGION|IG|IGL|None|00 +ATGACCTGCTCCCCTCTCCTCCTCACCCTTCTCATTCACTGCACAGGGTCCTGGGCCCAGTCTGTGTTGACGCAGCCGCCCTCAGTGTCTGCGGCCCCAGGACAGAAGGTCACCATCTCCTGCTCTGGAAGCAGCTCCAACATTGGGAATAATTATGTATCCTGGTACCAGCAGCTCCCAGGAACAGCCCCCAAACTCCTCATTTATGACAATAATAAGCGACCCTCAGGGATTCCTGACCGATTCTCTGGCTCCAAGTCTGGCACGTCAGCCACCCTGGGCATCACCGGACTCCAGACTGGGGACGAGGCCGATTATTACTGCGGAACATGGGATAGCAGCCTGAGTGCTGG +>281|IGLV10-54 ENST00000390287|IGLV10-54|5'UTR|IG|IGL|None|00 +GGGAATCTGCACC +>282|IGLV10-54 ENST00000390287|IGLV10-54|L-REGION+V-REGION|IG|IGL|None|00 +ATGCCCTGGGCTCTGCTCCTCCTGACCCTCCTCACTCACTCTGCAGTGTCAGTGGTCCAGGCAGGGCTGACTCAGCCACCCTCGGTGTCCAAGGGCTTGAGACAGACCGCCACACTCACCTGCACTGGGAACAGCAACATTGTTGGCAACCAAGGAGCAGCTTGGCTGCAGCAGCACCAGGGCCACCCTCCCAAACTCCTATCCTACAGGAATAACAACCGGCCCTCAGGGATCTCAGAGAGATTCTCTGCATCCAGGTCAGGAAACACAGCCTCCCTGACCATTACTGGACTCCAGCCTGAGGACGAGGCTGACTATTACTGCTCAGCATTGGACAGCAGCCTCAGTGCTC +>283|IGLV11-55 ENST00000390286|IGLV11-55|5'UTR|IG|IGL|None|00 +GCTGTGTCCACT +>284|IGLV11-55 ENST00000390286|IGLV11-55|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCCTGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCGGCCCGTGCTGACTCAGCCGCCCTCCCTGTCTGCATCCCCGGGAGCAACAGCCAGACTCCCCTGCACCCTGAGCAGTGACCTCAGTGTTGGTGGTAAAAACATGTTCTGGTACCAGCAGAAGCTAGGGAGCTCTCCCAGGTTATTCCTGTATCACTACTCAGACTCAGACAAGCAGCTGGGACCTGGGGTCCCCAGTCGAGTCTCTGGCTCCAAGGAGACCTCAAGTAACACAGCGTTTTTGCTCATCTCTGGGCTCCAGCCTGAGGACGAGGCCGATTATTACTGCCAGGTGTACGAAAGTAGTGCTAAT +>285|IGLV2-11 ENST00000390314|IGLV2-11|5'UTR|IG|IGL|None|00 +TGCTGGGGTCTCAGGAGGCAGCACTCTCGGGACGTCTCCACC +>286|IGLV2-11 ENST00000390314|IGLV2-11|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCAGCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCGCTCAGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGATGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCTGCTCATATGCAGGCAGCTACACTTTCCACA +>287|IGLV2-14 ENST00000390312|IGLV2-14|5'UTR|IG|IGL|None|00 +GCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACATCTCCACC +>288|IGLV2-14 ENST00000390312|IGLV2-14|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTCATATACAAGCAGCAGCACTCTCCACAGTG +>289|IGLV2-18 ENST00000390310|IGLV2-18|5'UTR|IG|IGL|None|00 +GAATATCTCCACC +>290|IGLV2-18 ENST00000390310|IGLV2-18|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCCCTCCGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTAGTTATAACCGTGTCTCCTGGTACCAGCAGCCCCCAGGCACAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGGTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTTATATACAAGCAGCAGCACTTTC +>291|IGLV2-23 ENST00000390306|IGLV2-23|5'UTR|IG|IGL|None|00 +TCTCTGAGCCCAGGCCCACGTGAGGGTGGGGTGAGGAGAGGAGCCCAGGATGCTGATTTTCATGGAGGCCCCGCCCTCCTCTGAGGCAAAGGGGATAAGACAGGGCTGGGGCAGGGCCAGTGCTGGGGTCACAAGAGGCAGCGCTCTCGGGACGTCTCCACC +>292|IGLV2-23 ENST00000390306|IGLV2-23|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACTCTCCTCACTCAGGACACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGGAGTTATAACCTTGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGGCAGTAAGCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACAATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCTGCTCATATGCAG +>293|IGLV2-33 ENST00000629472|IGLV2-33|5'UTR|IG|IGL|None|00 +GGCTAGAGGCAGGCCCGGTGCTGGGGTCTCAAGGCAGCGCTCTCGGGACATCTCCACC +>294|IGLV2-33 ENST00000629472|IGLV2-33|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAATCTGCCCTGACTCAGCCTCCTTTTGTGTCCGGGGCTCCTGGACAGTCGGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGGGATTATGATCATGTCTTCTGGTACCAAAAGCGTCTCAGCACTACCTCCAGACTCCTGATTTACAATGTCAATACTCGGCCTTCAGGGATCTCTGACCTCTTCTCAGGCTCCAAGTCTGGCAACATGGCTTCCCTGACCATCTCTGGGCTCAAGTCCGAGGTTGAGGCTAATTATCACTGCAGCTTATATTCAAGTAGTTACACTTTC +>295|IGLV2-8 ENST00000620395|IGLV2-8|5'UTR|IG|IGL|None|00 +TCTCTAAGCCCAGGCCCAAGTGAGGGTGGGGTGAGAAGAGGAGCTCAGGATGCAGATTTGCATGGAGGTCCCGCCCTTCTCTGAGGCAGAGGGGATAAGACAGGGCTGGGGGCAGGCCCAGTGCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACGTCACCACC +>296|IGLV2-8 ENST00000620395|IGLV2-8|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTCCCTCCGCGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCGTCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCAGCTCATATGCAGGCAGCAACAATTTC +>297|IGLV3-1 ENST00000390319|IGLV3-1|5'UTR|IG|IGL|None|00 +AAGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGAGGTGCCTCAGCC +>298|IGLV3-1 ENST00000390319|IGLV3-1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGATCCCTCTCTTCCTCGGCGTCCTTGCTTACTGCACAGGATCCGTGGCCTCCTATGAGCTGACTCAGCCACCCTCAGTGTCCGTGTCCCCAGGACAGACAGCCAGCATCACCTGCTCTGGAGATAAATTGGGGGATAAATATGCTTGCTGGTATCAGCAGAAGCCAGGCCAGTCCCCTGTGCTGGTCATCTATCAAGATAGCAAGCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACAGCCACTCTGACCATCAGCGGGACCCAGGCTATGGATGAGGCTGACTATTACTGTCAGGCGTGGGACAGCAGCACTGCACACA +>299|IGLV3-10 ENST00000390315|IGLV3-10|5'UTR|IG|IGL|None|00 +GTGGGCTCAGGAGGCAGAGCTCTGGGAATCTCACC +>300|IGLV3-10 ENST00000390315|IGLV3-10|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTGCTCCCCCTCCTCACTTTCTGCACAGTCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAAACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGTCAGGCCAGGCCCCTGTGCTGGTCATCTATGAGGACAGCAAACGACCCTCCGGGATCCCTGAGAGATTCTCTGGCTCCAGCTCAGGGACAATGGCCACCTTGACTATCAGTGGGGCCCAGGTGGAGGATGAAGCTGACTACTACTGTTACTCAACAGACAGCAGTGGTAATCATAG +>301|IGLV3-12 ENST00000390313|IGLV3-12|5'UTR|IG|IGL|None|00 +GCCTCAGCC +>302|IGLV3-12 ENST00000390313|IGLV3-12|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTCCTCAGCCTCCTCGCTCACTGCACAGGCTCTGCGACCTCCTATGAGCTGACTCAGCCACACTCAGTGTCAGTGGCCACAGCACAGATGGCCAGGATCACCTGTGGGGGAAACAACATTGGAAGTAAAGCTGTGCACTGGTACCAGCAAAAGCCAGGCCAGGACCCTGTGCTGGTCATCTATAGCGATAGCAACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACCCAGGGAACACCGCCACCCTAACCATCAGCAGGATCGAGGCTGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGTAGTAGTGATCATCC +>303|IGLV3-16 ENST00000390311|IGLV3-16|5'UTR|IG|IGL|None|00 +TCTGTGGGTCCAGGAGGCACAGCTCTGGGAATCTCACC +>304|IGLV3-16 ENST00000390311|IGLV3-16|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCTAGGACAGATGGCCAGGATCACCTGCTCTGGAGAAGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGTTCCCTGTGCTGGTGATATATAAAGACAGCGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAATAGTCACATTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCTATCAGCAGACAGCAGTGGTACTTATCC +>305|IGLV3-19 ENST00000390309|IGLV3-19|5'UTR|IG|IGL|None|00 +AGCTGTGGGCTCAGAAGCAGAGTTCTGGGGTGTCTCCACC +>306|IGLV3-19 ENST00000390309|IGLV3-19|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCTGGCTCACTCTCCTCACTCTTTGCATAGGTTCTGTGGTTTCTTCTGAGCTGACTCAGGACCCTGCTGTGTCTGTGGCCTTGGGACAGACAGTCAGGATCACATGCCAAGGAGACAGCCTCAGAAGCTATTATGCAAGCTGGTACCAGCAGAAGCCAGGACAGGCCCCTGTACTTGTCATCTATGGTAAAAACAACCGGCCCTCAGGGATCCCAGACCGATTCTCTGGCTCCAGCTCAGGAAACACAGCTTCCTTGACCATCACTGGGGCTCAGGCGGAAGATGAGGCTGACTATTACTGTAACTCCCGGGACAGCAGTG +>307|IGLV3-21 ENST00000390308|IGLV3-21|5'UTR|IG|IGL|None|00 +GCACAGAGGAGCTGTGCCCTGGAATGGGGCCTGTACCTGTCCAAGGCTTGTGCCGTCCCCTGTGGGAGATGAGAAGCGTCCCTGCATTGGGCTCTTGGGGACCCGTCTTGGACATGAATCTCCTCCAGCAGCAGCCTCTGACTCTGCTGATTTGCATCATGGGCCGCTCTCTCCAGCAAGGGGATAAGAGAGGCCTGGGAGGAACCTGCTCAGTCTGGGCCTAAGGAAGCAGCACTGGTGGTGCCTCAGCC +>308|IGLV3-21 ENST00000390308|IGLV3-21|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGTTCTCCTCCTCGGCCTCCTCTCTCACTGCACAGGCTCTGTGACCTCCTATGTGCTGACTCAGCCACCCTCGGTGTCAGTGGCCCCAGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAGTGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCGTCTATGATGATAGCGACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACGGCCACCCTGACCATCAGCAGGGTCGAAGCCGGGGATGAGGCCGACTATTACTGTCAGGTGTGGGATAGTAGTAGTGATCATCCCACG +>309|IGLV3-22 ENST00000390307|IGLV3-22|5'UTR|IG|IGL|None|00 +AAGAGAGGCCTGGGAAGCCCAGCTGTGCTGTGGGCTCAGGAGGCAGAGCTGTGGGTGTCTCACC +>310|IGLV3-22 ENST00000390307|IGLV3-22|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGGCCACACTCCTGCTCCCACTCCTCAACCTCTACACAGGCTCTGTTGCCTCCTATGAGCTGACACAGCTACCCTCGGTGTCAGTGTCCCCAGGACAGACAGCCAGGATCACCTGCTCTGGAGATGTACTGGGGGAAAATTATGCTGACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGAGTTGGTGATATACGAAGATAGTGAGCGGTACCCTGGAATCCCTGAACGATTCTCTGGGTCCACCTCAGGGAACACGACCACCCTGACCATCAGCAGGGTCCTGACCGAAGACGAGGCTGACTATTACTGTTTGTCTGGGGATGAGGACAATCCCTCA +>311|IGLV3-25 ENST00000390305|IGLV3-25|5'UTR|IG|IGL|None|00 +GCTGTGCTGTGGGTCCAGGAGGCAGAACTCTGGGTGTCTCACC +>312|IGLV3-25 ENST00000390305|IGLV3-25|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTACTTCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAGACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAGCAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATATATAAAGACAGTGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAACAGTCACGTTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCAATCAGCAGACAGCAGTG +>313|IGLV3-27 ENST00000390304|IGLV3-27|5'UTR|IG|IGL|None|00 +GCTGTAGGCTCAGGAGGCAGAGCTCTGAATGTCTCACC +>314|IGLV3-27 ENST00000390304|IGLV3-27|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCATTCTCTGCACAGTCTCTGTGGCCTCCTATGAGCTGACACAGCCATCCTCAGTGTCAGTGTCTCCGGGACAGACAGCCAGGATCACCTGCTCAGGAGATGTACTGGCAAAAAAATATGCTCGGTGGTTCCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATTTATAAAGACAGTGAGCGGCCCTCAGGGATCCCTGAGCGATTCTCCGGCTCCAGCTCAGGGACCACAGTCACCTTGACCATCAGCGGGGCCCAGGTTGAGGATGAGGCTGACTATTACTGTTACTCTGCGGCTGACAACAAT +>315|IGLV3-32 ENST00000627634|IGLV3-32|5'UTR|IG|IGL|None|00 +GCTGTGGACTCAGAGGCAGAGCTCTGGGGCATTTCCATT +>316|IGLV3-32 ENST00000627634|IGLV3-32|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCCCCTGCTCGTCCTCACTCTCTGCACAGGCTCCGTTATTTCCTCTGGGCCAACTCAGGTGCCTGCAGTGTCTGTGGCCTTGGGACAAATGGCCAGGATCACCTGCCAGGGAGACAGCATGGAAGGCTCTTATGAACACTGGTACCAGCAGAAGCCAGGCCAGGCCCCCGTGCTGGTCATCTATGATAGCAGTGACCGGCCCTCAAGGATCCCTGAGCGATTCTCTGGCTCCAAATCAGGCAACACAACCACCCTGACCATCACTGGGGCCCAGGCTGAGGATGAGGCTGATTATTACTATCAGTTGATAGACAACCATGCTACTCAACT +>317|IGLV3-9 ENST00000390316|IGLV3-9|5'UTR|IG|IGL|None|00 +CTTGACTCTGCTGATTTGCATCACAGGCTGCTCTCTTCAGCAAGGGGATAAGAGAGGGCTGGAAGGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGGGGTGCCGCAGCC +>318|IGLV3-9 ENST00000390316|IGLV3-9|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGCTCTCCTTCTGAGCCTCCTTGCTCACTTTACAGGTTCTGTGGCCTCCTATGAGCTGACTCAGCCACTCTCAGTGTCAGTGGCCCTGGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAATGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCATCTATAGGGATAGCAACCGGCCCTCTGGGATCCCTGAGCGATTCTCTGGCTCCAACTCGGGGAACACGGCCACCCTGACCATCAGCAGAGCCCAAGCCGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGCAGCACTGCACACA +>319|IGLV4-3 ENST00000390318|IGLV4-3|5'UTR|IG|IGL|None|00 +CTCGAATAGAGCTCTTGGAAGTCCCTCCAACC +>320|IGLV4-3 ENST00000390318|IGLV4-3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGTCTCCTTCTACCTACTGCCCTTCATTTTCTCCACAGGTCTCTGTGCTCTGCCTGTGCTGACTCAGCCCCCGTCTGCATCTGCCTTGCTGGGAGCCTCGATCAAGCTCACCTGCACCCTAAGCAGTGAGCACAGCACCTACACCATCGAATGGTATCAACAGAGACCAGGGAGGTCCCCCCAGTATATAATGAAGGTTAAGAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCCGATCGCTTCATGGGCTCCAGTTCTGGGGCTGACCGCTACCTCACCTTCTCCAACCTCCAGTCTGACGATGAGGCTGAGTATCACTGTGGAGAGAGCCACACGATTGATGGCCAAGTCGGT +>321|IGLV4-60 ENST00000390284|IGLV4-60|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCACTCCTCCTCCTCTTCCCTCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCCTGTGCTGACTCAATCATCCTCTGCCTCTGCTTCCCTGGGATCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGTAGCTACATCATCGCATGGCATCAGCAGCAGCCAGGGAAGGCCCCTCGGTACTTGATGAAGCTTGAAGGTAGTGGAAGCTACAACAAGGGGAGCGGAGTTCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGACCGCTACCTCACCATCTCCAACCTCCAGTTTGAGGATGAGGCTGATTATTACTGTGAGACCTGGGACAGTAACACTCA +>322|IGLV4-69 ENST00000390282|IGLV4-69|5'UTR|IG|IGL|None|00 +AGGGTGGGTAAGAAATACCTGCAACTGTCAGCCTCAGCAGAGCTCTGGGGAGTCTGCACC +>323|IGLV4-69 ENST00000390282|IGLV4-69|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCTTGGACCCCACTCCTCTTCCTCACCCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCTTGTGCTGACTCAATCGCCCTCTGCCTCTGCCTCCCTGGGAGCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGCAGCTACGCCATCGCATGGCATCAGCAGCAGCCAGAGAAGGGCCCTCGGTACTTGATGAAGCTTAACAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGAGCGCTACCTCACCATCTCCAGCCTCCAGTCTGAGGATGAGGCTGACTATTACTGTCAGACCTGGGGCACTGGCATTCA +>324|IGLV5-37 ENST00000628968|IGLV5-37|5'UTR|IG|IGL|None|00 +CCACC +>325|IGLV5-37 ENST00000628968|IGLV5-37|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTTCTTCTCTTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCCTCCTCCGCATCTCCTGGAGAATCCGCCAGACTCACCTGCACCTTGCCCAGTGACATCAATGTTGGTAGCTACAACATATACTGGTACCAGCAGAAGCCAGGGAGCCCTCCCAGGTATCTCCTGTACTACTACTCAGACTCAGATAAGGGCCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAGCCAATACAGGGATTTTACTCATCTCCGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCCAAGCAATGCTTCT +>326|IGLV5-39 ENST00000630493|IGLV5-39|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGCCTGTGCTGACTCAGCCAACCTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGATTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCTTCCCCGGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAACCAATGCAGGCCTTTTACTCATCTCTGGGCTCCAGTCTGAAGATGAGGCTGACTATTACTGTGCCATTTGGTACAGCAGCACTTCT +>327|IGLV5-45 ENST00000390296|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>328|IGLV5-45 ENST00000390296|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGTGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>329|IGLV5-45 ENST00000626489|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>330|IGLV5-45 ENST00000626489|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>331|IGLV5-52 ENST00000390289|IGLV5-52|5'UTR|IG|IGL|None|00 +CCACC +>332|IGLV5-52 ENST00000390289|IGLV5-52|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCTTCTCCTTCTCGTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCATCTTCCCATTCTGCATCTTCTGGAGCATCAGTCAGACTCACCTGCATGCTGAGCAGTGGCTTCAGTGTTGGGGACTTCTGGATAAGGTGGTACCAACAAAAGCCAGGGAACCCTCCCCGGTATCTCCTGTACTACCACTCAGACTCCAATAAGGGCCAAGGCTCTGGAGTTCCCAGCCGCTTCTCTGGATCCAACGATGCATCAGCCAATGCAGGGATTCTGCGTATCTCTGGGCTCCAGCCTGAGGATGAGGCTGACTATTACTGTGGTACATGGCACAGCAACTCTAAGACTCA +>333|IGLV6-57 ENST00000390285|IGLV6-57|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCACTACTTCTCACCCTCCTCGCTCACTGCACAGGTTCTTGGGCCAATTTTATGCTGACTCAGCCCCACTCTGTGTCGGAGTCTCCGGGGAAGACGGTAACCATCTCCTGCACCGGCAGCAGTGGCAGCATTGCCAGCAACTATGTGCAGTGGTACCAGCAGCGCCCGGGCAGTGCCCCCACCACTGTGATCTATGAGGATAACCAAAGACCCTCTGGGGTCCCTGATCGGTTCTCTGGCTCCATCGACAGCTCCTCCAACTCTGCCTCCCTCACCATCTCTGGACTGAAGACTGAGGACGAGGCTGACTACTACTGTCAGTCTTATGATAGCAGCAATCA +>334|IGLV7-43 ENST00000618644|IGLV7-43|5'UTR|IG|IGL|None|00 +TCTGGCGCCAGGGGTCCCTTCCAATATCAGCACC +>335|IGLV7-43 ENST00000618644|IGLV7-43|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCTCAGACTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGCTTCCAGCACTGGAGCAGTCACCAGTGGTTACTATCCAAACTGGTTCCAGCAGAAACCTGGACAAGCACCCAGGGCACTGATTTATAGTACAAGCAACAAACACTCCTGGACCCCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACACTGTCAGGTGTGCAGCCTGAGGACGAGGCTGAGTATTACTGCCTGCTCTACTATGGTGGTGCTCAG +>336|IGLV7-46 ENST00000390295|IGLV7-46|5'UTR|IG|IGL|None|00 +TCTGGCACCAGGGGTCCCTTCCAATATCAGCACC +>337|IGLV7-46 ENST00000390295|IGLV7-46|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCCCAGGCTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGGCTCCAGCACTGGAGCTGTCACCAGTGGTCATTATCCCTACTGGTTCCAGCAGAAGCCTGGCCAAGCCCCCAGGACACTGATTTATGATACAAGCAACAAACACTCCTGGACACCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACCCTTTTGGGTGCGCAGCCTGAGGATGAGGCTGAGTATTACTGCTTGCTCTCCTATAGTGGTGCTCGG +>338|IGLV8-61 ENST00000390283|IGLV8-61|5'UTR|IG|IGL|None|00 +GAGGAAAACAAACCCCAGCTGGGAAGCCTGAGAACACTTAGCCTTC +>339|IGLV8-61 ENST00000390283|IGLV8-61|L-REGION+V-REGION|IG|IGL|None|00 +ATGAGTGTCCCCACCATGGCCTGGATGATGCTTCTCCTCGGACTCCTTGCTTATGGATCAGGAGTGGATTCTCAGACTGTGGTGACCCAGGAGCCATCGTTCTCAGTGTCCCCTGGAGGGACAGTCACACTCACTTGTGGCTTGAGCTCTGGCTCAGTCTCTACTAGTTACTACCCCAGCTGGTACCAGCAGACCCCAGGCCAGGCTCCACGCACGCTCATCTACAGCACAAACACTCGCTCTTCTGGGGTCCCTGATCGCTTCTCTGGCTCCATCCTTGGGAACAAAGCTGCCCTCACCATCACGGGGGCCCAGGCAGATGATGAATCTGATTATTACTGTGTGCTGTATATGGGTAGTGGCATTTC +>340|IGLV9-49 ENST00000427632|IGLV9-49|5'UTR|IG|IGL|None|00 +GAGAGACTGAAGAACCCAGCATTGCAGCAGCTCCACC +>341|IGLV9-49 ENST00000427632|IGLV9-49|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCTCTGCTCCTCACCCTCCTCAGTCTCCTCACAGGGTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCTGCATCAGCCTCCCTGGGAGCCTCGGTCACACTCACCTGCACCCTGAGCAGCGGCTACAGTAATTATAAAGTGGACTGGTACCAGCAGAGACCAGGGAAGGGCCCCCGGTTTGTGATGCGAGTGGGCACTGGTGGGATTGTGGGATCCAAGGGGGATGGCATCCCTGATCGCTTCTCAGTCTTGGGCTCAGGCCTGAATCGGTACCTGACCATCAAGAACATCCAGGAAGAGGATGAGAGTGACTACCACTGTGGGGCAGACCATGGCAGTGGGAGCAACTTCGTG +>342|TRAC ENST00000611116|TRAC|C-REGION|TR|TRA|None|00 +ATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>343|TRAJ1 ENST00000390536|TRAJ1|J-REGION|TR|TRA|None|00 +GTATGAAAGTATTACCTCCCAGTTGCAATTTGGCAAAGGAACCAGAGTTTCCACTTCTCCCC +>344|TRAJ10 ENST00000390527|TRAJ10|J-REGION|TR|TRA|None|00 +ATACTCACGGGAGGAGGAAACAAACTCACCTTTGGGACAGGCACTCAGCTAAAAGTGGAACTCA +>345|TRAJ11 ENST00000390526|TRAJ11|J-REGION|TR|TRA|None|00 +TGAATTCAGGATACAGCACCCTCACCTTTGGGAAGGGGACTATGCTTCTAGTCTCTCCAG +>346|TRAJ12 ENST00000390525|TRAJ12|J-REGION|TR|TRA|None|00 +GGATGGATAGCAGCTATAAATTGATCTTCGGGAGTGGGACCAGACTGCTGGTCAGGCCTG +>347|TRAJ13 ENST00000390524|TRAJ13|J-REGION|TR|TRA|None|00 +TGAATTCTGGGGGTTACCAGAAAGTTACCTTTGGAACTGGAACAAAGCTCCAAGTCATCCCAA +>348|TRAJ14 ENST00000390523|TRAJ14|J-REGION|TR|TRA|None|00 +ATTTATAGCACATTCATCTTTGGGAGTGGGACAAGATTATCAGTAAAACCTG +>349|TRAJ16 ENST00000390521|TRAJ16|J-REGION|TR|TRA|None|00 +GGTTTTCAGATGGCCAGAAGCTGCTCTTTGCAAGGGGGACCATGTTAAAGGTGGATCTTA +>350|TRAJ17 ENST00000390520|TRAJ17|J-REGION|TR|TRA|None|00 +TGATCAAAGCTGCAGGCAACAAGCTAACTTTTGGAGGAGGAACCAGGGTGCTAGTTAAACCAA +>351|TRAJ18 ENST00000390519|TRAJ18|J-REGION|TR|TRA|None|00 +CCGACAGAGGCTCAACCCTGGGGAGGCTATACTTTGGAAGAGGAACTCAGTTGACTGTCTGGCCTG +>352|TRAJ19 ENST00000390518|TRAJ19|J-REGION|TR|TRA|None|00 +GCTATCAAAGATTTTACAATTTCACCTTTGGAAAGGGATCCAAACATAATGTCACTCCAA +>353|TRAJ2 ENST00000390535|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGAACAATTGATAAACTCACATTTGGGAAAGGGACCCATGTATTCATTATATCTG +>354|TRAJ20 ENST00000390517|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTAACGACTACAAGCTCAGCTTTGGAGCCGGAACCACAGTAACTGTAAGAGCAA +>355|TRAJ21 ENST00000390516|TRAJ21|J-REGION|TR|TRA|None|00 +TACAACTTCAACAAATTTTACTTTGGATCTGGGACCAAACTCAATGTAAAACCAA +>356|TRAJ22 ENST00000390515|TRAJ22|J-REGION|TR|TRA|None|00 +TTTCTTCTGGTTCTGCAAGGCAACTGACCTTTGGATCTGGGACACAATTGACTGTTTTACCTG +>357|TRAJ23 ENST00000390514|TRAJ23|J-REGION|TR|TRA|None|00 +TGATTTATAACCAGGGAGGAAAGCTTATCTTCGGACAGGGAACGGAGTTATCTGTGAAACCCA +>358|TRAJ24 ENST00000390513|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGACAGCTGGGGGAAATTCCAGTTTGGAGCAGGGACCCAGGTTGTGGTCACCCCAG +>359|TRAJ25 ENST00000390512|TRAJ25|J-REGION|TR|TRA|None|00 +CAGAAGGACAAGGCTTCTCCTTTATCTTTGGGAAGGGGACAAGGCTGCTTGTCAAGCCAA +>360|TRAJ26 ENST00000390511|TRAJ26|J-REGION|TR|TRA|None|00 +GGGATAACTATGGTCAGAATTTTGTCTTTGGTCCCGGAACCAGATTGTCCGTGCTGCCCT +>361|TRAJ27 ENST00000390510|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATGCAGGCAAATCAACCTTTGGGGATGGGACTACGCTCACTGTGAAGCCAA +>362|TRAJ28 ENST00000390509|TRAJ28|J-REGION|TR|TRA|None|00 +CATACTCTGGGGCTGGGAGTTACCAACTCACTTTCGGGAAGGGGACCAAACTCTCGGTCATACCAA +>363|TRAJ29 ENST00000390508|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAACACACCTCTTGTCTTTGGAAAGGGCACAAGACTTTCTGTGATTGCAA +>364|TRAJ3 ENST00000390534|TRAJ3|J-REGION|TR|TRA|None|00 +GGGGTACAGCAGTGCTTCCAAGATAATCTTTGGATCAGGGACCAGACTCAGCATCCGGCCAA +>365|TRAJ30 ENST00000390507|TRAJ30|J-REGION|TR|TRA|None|00 +TGAACAGAGATGACAAGATCATCTTTGGAAAAGGGACACGACTTCATATTCTCCCCA +>366|TRAJ31 ENST00000390506|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAACAATGCCAGACTCATGTTTGGAGATGGAACTCAGCTGGTGGTGAAGCCCA +>367|TRAJ32 ENST00000390505|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGTGGTGCTACAAACAAGCTCATCTTTGGAACTGGCACTCTGCTTGCTGTCCAGCCAA +>368|TRAJ33 ENST00000390504|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTAATCTGGGGCGCTGGGACCAAGCTAATTATAAAGCCAG +>369|TRAJ34 ENST00000390503|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTATAACACCGACAAGCTCATCTTTGGGACTGGGACCAGATTACAAGTCTTTCCAA +>370|TRAJ35 ENST00000390502|TRAJ35|J-REGION|TR|TRA|None|00 +GATAGGCTTTGGGAATGTGCTGCATTGCGGGTCCGGCACTCAAGTGATTGTTTTACCAC +>371|TRAJ36 ENST00000614481|TRAJ36|J-REGION|TR|TRA|None|00 +TCAAACTGGGGCAAACAACCTCTTCTTTGGGACTGGAACGAGACTCACCGTTATTCCCT +>372|TRAJ37 ENST00000612375|TRAJ37|J-REGION|TR|TRA|None|00 +TGGCTCTAGCAACACAGGCAAACTAATCTTTGGGCAAGGGACAACTTTACAAGTAAAACCAG +>373|TRAJ38 ENST00000390499|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGCTGGCAACAACCGTAAGCTGATTTGGGGATTGGGAACAAGCCTGGCAGTAAATCCGA +>374|TRAJ39 ENST00000390498|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGCAACATGCTCACCTTTGGAGGGGGAACAAGGTTAATGGTCAAACCCC +>375|TRAJ4 ENST00000390533|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTTTCTGGTGGCTACAATAAGCTGATTTTTGGAGCAGGGACCAGGCTGGCTGTACACCCAT +>376|TRAJ40 ENST00000390497|TRAJ40|J-REGION|TR|TRA|None|00 +ACTACCTCAGGAACCTACAAATACATCTTTGGAACAGGCACCAGGCTGAAGGTTTTAGCAA +>377|TRAJ41 ENST00000390496|TRAJ41|J-REGION|TR|TRA|None|00 +GAACTCAAATTCCGGGTATGCACTCAACTTCGGCAAAGGCACCTCGCTGTTGGTCACACCCC +>378|TRAJ42 ENST00000390495|TRAJ42|J-REGION|TR|TRA|None|00 +TGAATTATGGAGGAAGCCAAGGAAATCTCATCTTTGGAAAAGGCACTAAACTCTCTGTTAAACCAA +>379|TRAJ43 ENST00000390494|TRAJ43|J-REGION|TR|TRA|None|00 +ACAATAACAATGACATGCGCTTTGGAGCAGGGACCAGACTGACAGTAAAACCAA +>380|TRAJ44 ENST00000390493|TRAJ44|J-REGION|TR|TRA|None|00 +TAAATACCGGCACTGCCAGTAAACTCACCTTTGGGACTGGAACAAGACTTCAGGTCACGCTCG +>381|TRAJ45 ENST00000390492|TRAJ45|J-REGION|TR|TRA|None|00 +TGTATTCAGGAGGAGGTGCTGACGGACTCACCTTTGGCAAAGGGACTCATCTAATCATCCAGCCCT +>382|TRAJ46 ENST00000390491|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAGAAAAGCAGCGGAGACAAGCTGACTTTTGGGACCGGGACTCGTTTAGCAGTTAGGCCCA +>383|TRAJ47 ENST00000390490|TRAJ47|J-REGION|TR|TRA|None|00 +TGGAATATGGAAACAAACTGGTCTTTGGCGCAGGAACCATTCTGAGAGTCAAGTCCT +>384|TRAJ48 ENST00000390489|TRAJ48|J-REGION|TR|TRA|None|00 +TATCTAACTTTGGAAATGAGAAATTAACCTTTGGGACTGGAACAAGACTCACCATCATACCCA +>385|TRAJ49 ENST00000390488|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACCGGTAACCAGTTCTATTTTGGGACAGGGACAAGTTTGACGGTCATTCCAA +>386|TRAJ5 ENST00000390532|TRAJ5|J-REGION|TR|TRA|None|00 +TGGACACGGGCAGGAGAGCACTTACTTTTGGGAGTGGAACAAGACTCCAAGTGCAACCAA +>387|TRAJ50 ENST00000390487|TRAJ50|J-REGION|TR|TRA|None|00 +TGAAAACCTCCTACGACAAGGTGATATTTGGGCCAGGGACAAGCTTATCAGTCATTCCAA +>388|TRAJ52 ENST00000390486|TRAJ52|J-REGION|TR|TRA|None|00 +CTAATGCTGGTGGTACTAGCTATGGAAAGCTGACATTTGGACAAGGGACCATCTTGACTGTCCATCCAA +>389|TRAJ53 ENST00000390485|TRAJ53|J-REGION|TR|TRA|None|00 +AGAATAGTGGAGGTAGCAACTATAAACTGACATTTGGAAAAGGAACTCTCTTAACCGTGAATCCAA +>390|TRAJ54 ENST00000390484|TRAJ54|J-REGION|TR|TRA|None|00 +TAATTCAGGGAGCCCAGAAGCTGGTATTTGGCCAAGGAACCAGGCTGACTATCAACCCAA +>391|TRAJ56 ENST00000390483|TRAJ56|J-REGION|TR|TRA|None|00 +TTATACTGGAGCCAATAGTAAGCTGACATTTGGAAAAGGAATAACTCTGAGTGTTAGACCAG +>392|TRAJ57 ENST00000390482|TRAJ57|J-REGION|TR|TRA|None|00 +TAACTCAGGGCGGATCTGAAAAGCTGGTCTTTGGAAAGGGAACGAAACTGACAGTAAACCCAT +>393|TRAJ58 ENST00000390481|TRAJ58|J-REGION|TR|TRA|None|00 +TTTAAGAAACCAGTGGCTCTAGGTTGACCTTTGGGGAAGGAACACAGCTCACAGTGAATCCTG +>394|TRAJ59 ENST00000390480|TRAJ59|J-REGION|TR|TRA|None|00 +GGAAGGAAGGAAACAGGAAATTTACATTTGGAATGGGGACGCAAGTGAGAGTGA +>395|TRAJ6 ENST00000390531|TRAJ6|J-REGION|TR|TRA|None|00 +TGCATCAGGAGGAAGCTACATACCTACATTTGGAAGAGGAACCAGCCTTATTGTTCATCCGT +>396|TRAJ61 ENST00000390479|TRAJ61|J-REGION|TR|TRA|None|00 +GGTACCGGGTTAATAGGAAACTGACATTTGGAGCCAACACTAGAGGAATCATGAAACTCA +>397|TRAJ7 ENST00000390530|TRAJ7|J-REGION|TR|TRA|None|00 +TGACTATGGGAACAACAGACTCGCTTTTGGGAAGGGGAACCAAGTGGTGGTCATACCAA +>398|TRAJ8 ENST00000390529|TRAJ8|J-REGION|TR|TRA|None|00 +TGAACACAGGCTTTCAGAAACTTGTATTTGGAACTGGCACCTGACTTCTGGTCAGTCCAA +>399|TRAJ9 ENST00000390528|TRAJ9|J-REGION|TR|TRA|None|00 +GGAAATACTGGAGGCTTCAAAACTATCTTTGGAGCAGGAACAAGACTATTTGTTAAAGCAA +>400|TRAV1-1 ENST00000542354|TRAV1-1|5'UTR|TR|TRA|None|00 +CTTCTGCAGACTACAGTGGCTCAGGAACCGGGGATGCAGTGCCAGGCTCATGGTATCCTGCAGCAG +>401|TRAV1-1 ENST00000542354|TRAV1-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGCTTTCCTTCTCTATGTTTCCATGAAGATGGGAGGCACTGCAGGACAAAGCCTTGAGCAGCCCTCTGAAGTGACAGCTGTGGAAGGAGCCATTGTCCAGATAAACTGCACGTACCAGACATCTGGGTTTTATGGGCTGTCCTGGTACCAGCAACATGATGGCGGAGCACCCACATTTCTTTCTTACAATGCTCTGGATGGTTTGGAGGAGACAGGTCGTTTTTCTTCATTCCTTAGTCGCTCTGATAGTTATGGTTACCTCCTTCTACAGGAGCTCCAGATGAAAGACTCTGCCTCTTACTTCTGCGCTGTGAGAGA +>402|TRAV1-2 ENST00000390423|TRAV1-2|5'UTR|TR|TRA|None|00 +CCCACATGAAGTGTCTACCTTCTGCAGACTCCAATGGCTCAGGAACTGGGAATGCAGTGCCAGGCTCGTGGTATCCTGCAGCAG +>403|TRAV1-2 ENST00000390423|TRAV1-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGTTTTCCTTCTTTATGTTTCCATGAAGATGGGAGGCACTACAGGACAAAACATTGACCAGCCCACTGAGATGACAGCTACGGAAGGTGCCATTGTCCAGATCAACTGCACGTACCAGACATCTGGGTTCAACGGGCTGTTCTGGTACCAGCAACATGCTGGCGAAGCACCTACATTTCTGTCTTACAATGTTCTGGATGGTTTGGAGGAGAAAGGTCGTTTTTCTTCATTCCTTAGTCGGTCTAAAGGGTACAGTTACCTCCTTTTGAAGGAGCTCCAGATGAAAGACTCTGCCTCTTACCTCTGTGCT +>404|TRAV10 ENST00000390432|TRAV10|5'UTR|TR|TRA|None|00 +AGTCAACTTCTGGGAGCAGATCTCTGCAGAATAAAA +>405|TRAV10 ENST00000390432|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCATCTGACGACCTTCTTGGTGATTTTGTGGCTTTATTTTTATAGGGGGAATGGCAAAAACCAAGTGGAGCAGAGTCCTCAGTCCCTGATCATCCTGGAGGGAAAGAACTGCACTCTTCAATGCAATTATACAGTGAGCCCCTTCAGCAACTTAAGGTGGTATAAGCAAGATACGGGGAGAGGTCCTGTTTCCCTGACAATCATGACTTTCAGTGAGAACACAAAGTCGAACGGAAGATATACAGCAACTCTGGATGCAGACACAAAGCAAAGCTCTCTGCACATCACAGCCTCCCAGCTCAGCGATTCAGCCTCCTACATCTGTGTGGTGAGCG +>406|TRAV12-1 ENST00000390433|TRAV12-1|5'UTR|TR|TRA|None|00 +ATG +>407|TRAV12-1 ENST00000390433|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGATATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACGGAAGGAGGTGGAGCAGGATCCTGGACCCTTCAATGTTCCAGAGGGAGCCACTGTCGCTTTCAACTGTACTTACAGCAACAGTGCTTCTCAGTCTTTCTTCTGGTACAGACAGGATTGCAGGAAAGAACCTAAGTTGCTGATGTCCGTATACTCCAGTGGTAATGAAGATGGAAGGTTTACAGCACAGCTCAATAGAGCCAGCCAGTATATTTCCCTGCTCATCAGAGACTCCAAGCTCAGTGATTCAGCCACCTACCTCTGTGTGGTGAACA +>408|TRAV12-2 ENST00000390437|TRAV12-2|5'UTR|TR|TRA|None|00 +AAAGCAGATTCTTTTTATGATTTTTAAAGTAGAAATATCCATTCTAGGTGCATTTTTTAAGGGTTTAAAATTTGAATCCTCAGTGAACCAGGGCAGAGAAGAATG +>409|TRAV12-2 ENST00000390437|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGAGTTTTACTAGTGATCCTGTGGCTTCAGTTGAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGAATTCTGGACCCCTCAGTGTTCCAGAGGGAGCCATTGCCTCTCTCAACTGCACTTACAGTGACCGAGGTTCCCAGTCCTTCTTCTGGTACAGACAATATTCTGGGAAAAGCCCTGAGTTGATAATGTTCATATACTCCAATGGTGACAAAGAAGATGGAAGGTTTACAGCACAGCTCAATAAAGCCAGCCAGTATGTTTCTCTGCTCATCAGAGACTCCCAGCCCAGTGATTCAGCCACCTACCTCTGTGCCGTGAACA +>410|TRAV12-3 ENST00000390442|TRAV12-3|5'UTR|TR|TRA|None|00 +ATTATTTTTTTTTCGTGTTTAAGGTTTGAATCCTCAGTGAACCAGGGCAGAAAAGA +>411|TRAV12-3 ENST00000390442|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGGATCCTGGACCACTCAGTGTTCCAGAGGGAGCCATTGTTTCTCTCAACTGCACTTACAGCAACAGTGCTTTTCAATACTTCATGTGGTACAGACAGTATTCCAGAAAAGGCCCTGAGTTGCTGATGTACACATACTCCAGTGGTAACAAAGAAGATGGAAGGTTTACAGCACAGGTCGATAAATCCAGCAAGTATATCTCCTTGTTCATCAGAGACTCACAGCCCAGTGATTCAGCCACCTACCTCTGTGCAATGAGCG +>412|TRAV13-1 ENST00000390436|TRAV13-1|5'UTR|TR|TRA|None|00 +GATCTTAATTGGGAAGAACAAGG +>413|TRAV13-1 ENST00000390436|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACATCCATTCGAGCTGTATTTATATTCCTGTGGCTGCAGCTGGACTTGGTGAATGGAGAGAATGTGGAGCAGCATCCTTCAACCCTGAGTGTCCAGGAGGGAGACAGCGCTGTTATCAAGTGTACTTATTCAGACAGTGCCTCAAACTACTTCCCTTGGTATAAGCAAGAACTTGGAAAAGGACCTCAGCTTATTATAGACATTCGTTCAAATGTGGGCGAAAAGAAAGACCAACGAATTGCTGTTACATTGAACAAGACAGCCAAACATTTCTCCCTGCACATCACAGAGACCCAACCTGAAGACTCGGCTGTCTACTTCTGTGCAGCAAGTA +>414|TRAV13-2 ENST00000390439|TRAV13-2|5'UTR|TR|TRA|None|00 +CGATGATGGAAGTAGCTCTTATGGCTGGAGATTGCAGGTTTATGACTGATCCTATTTGGGAAGAACAATG +>415|TRAV13-2 ENST00000390439|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCAGGCATTCGAGCTTTATTTATGTACTTGTGGCTGCAGCTGGACTGGGTGAGCAGAGGAGAGAGTGTGGGGCTGCATCTTCCTACCCTGAGTGTCCAGGAGGGTGACAACTCTATTATCAACTGTGCTTATTCAAACAGCGCCTCAGACTACTTCATTTGGTACAAGCAAGAATCTGGAAAAGGTCCTCAATTCATTATAGACATTCGTTCAAATATGGACAAAAGGCAAGGCCAAAGAGTCACCGTTTTATTGAATAAGACAGTGAAACATCTCTCTCTGCAAATTGCAGCTACTCAACCTGGAGACTCAGCTGTCTACTTTTGTGCAGAGAATA +>416|TRAV14/DV4 ENST00000390440|TRAV14/DV4|5'UTR|TR|TRA|None|00 +GCCAGGTTCACTTCACAGTACAGAGTCCTGAAAATAAAGAAGAAAATTTTTTTTTATCTAGAAAAAGAACCAAAC +>417|TRAV14/DV4 ENST00000390440|TRAV14/DV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGTCACTTTCTAGCCTGCTGAAGGTGGTCACAGCTTCACTGTGGCTAGGACCTGGCATTGCCCAGAAGATAACTCAAACCCAACCAGGAATGTTCGTGCAGGAAAAGGAGGCTGTGACTCTGGACTGCACATATGACACCAGTGATCCAAGTTATGGTCTATTCTGGTACAAGCAGCCCAGCAGTGGGGAAATGATTTTTCTTATTTATCAGGGGTCTTATGACCAGCAAAATGCAACAGAAGGTCGCTACTCATTGAATTTCCAGAAGGCAAGAAAATCCGCCAACCTTGTCATCTCCGCTTCACAACTGGGGGACTCAGCAATGTACTTCTGTGCAATGAGAGAGGG +>418|TRAV16 ENST00000390444|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCCCACCCTCATCTCAGTGCTTGTGATAATATTTATACTCAGAGGAACAAGAGCCCAGAGAGTGACTCAGCCCGAGAAGCTCCTCTCTGTCTTTAAAGGGGCCCCAGTGGAGCTGAAGTGCAACTATTCCTATTCTGGGAGTCCTGAACTCTTCTGGTATGTCCAGTACTCCAGACAACGCCTCCAGTTACTCTTGAGACACATCTCTAGAGAGAGCATCAAAGGCTTCACTGCTGACCTTAACAAAGGCGAGACATCTTTCCACCTGAAGAAACCATTTGCTCAAGAGGAAGACTCAGCCATGTATTACTGTGCTCTAAGTGG +>419|TRAV17 ENST00000390445|TRAV17|5'UTR|TR|TRA|None|00 +AGGACTGAGCTTGCCTGTGACTGGCTAGGGAGGAACCTGAGACTAGGGGACAGAAAGACTAGGGATTCACCCAGTAAAGAGAGCTCATCTGTGACTGAGGAGCCTTGCTCCATTTCAGGTCTTCTGTGATTTCAATAAGGAAGAAGA +>420|TRAV17 ENST00000390445|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAAACTCTCCTGGGAGTGTCTTTGGTGATTCTATGGCTTCAACTGGCTAGGGTGAACAGTCAACAGGGAGAAGAGGATCCTCAGGCCTTGAGCATCCAGGAGGGTGAAAATGCCACCATGAACTGCAGTTACAAAACTAGTATAAACAATTTACAGTGGTATAGACAAAATTCAGGTAGAGGCCTTGTCCACCTAATTTTAATACGTTCAAATGAAAGAGAGAAACACAGTGGAAGATTAAGAGTCACGCTTGACACTTCCAAGAAAAGCAGTTCCTTGTTGATCACGGCTTCCCGGGCAGCAGACACTGCTTCTTACTTCTGTGCTACGGACG +>421|TRAV18 ENST00000390446|TRAV18|5'UTR|TR|TRA|None|00 +GATTTTGTAGAAGATTCCGCCAAAGACTCAACAACATAAAGAAATATATATACCTTTCGGTTTGGATATCTCTCAACAAAACCTTCTACTGCTTCTCAGCCAGCC +>422|TRAV18 ENST00000390446|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGTCTGCTTCCTGCTCAGGACTTGTGATCTTGTTGATATTCAGAAGGACCAGTGGAGACTCGGTTACCCAGACAGAAGGCCCAGTTACCCTCCCTGAGAGGGCAGCTCTGACATTAAACTGCACTTATCAGTCCAGCTATTCAACTTTTCTATTCTGGTATGTCCAGTATCTAAACAAAGAGCCTGAGCTCCTCCTGAAAAGTTCAGAAAACCAGGAGACGGACAGCAGAGGTTTTCAGGCCAGTCCTATCAAGAGTGACAGTTCCTTCCACCTGGAGAAGCCCTCGGTGCAGCTGTCGGACTCTGCCGTGTACTACTGCGCTCTGAGAGA +>423|TRAV19 ENST00000390447|TRAV19|5'UTR|TR|TRA|None|00 +CAGAAGCCTCACACAGCCCAGTAACTTTGCTAGTACCTCTTGAGTGCAAGGTGGAGAATTAAGATCTGGATTTGAGACGGAGCACGGAACATTTCACTCAGGGGAAGAGCTATGAAC +>424|TRAV19 ENST00000390447|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGACTGCCAGCCTGTTGAGGGCAGTCATAGCCTCCATCTGTGTTGTATCCAGCATGGCTCAGAAGGTAACTCAAGCGCAGACTGAAATTTCTGTGGTGGAGAAGGAGGATGTGACCTTGGACTGTGTGTATGAAACCCGTGATACTACTTATTACTTATTCTGGTACAAGCAACCACCAAGTGGAGAATTGGTTTTCCTTATTCGTCGGAACTCTTTTGATGAGCAAAATGAAATAAGTGGTCGGTATTCTTGGAACTTCCAGAAATCCACCAGTTCCTTCAACTTCACCATCACAGCCTCACAAGTCGTGGACTCAGCAGTATACTTCTGTGCTCTGAGTGAGGC +>425|TRAV2 ENST00000390424|TRAV2|5'UTR|TR|TRA|None|00 +CATTTTGGCC +>426|TRAV2 ENST00000390424|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTGCAGAGCACTCTGGGGGCGGTGTGGCTAGGGCTTCTCCTCAACTCTCTCTGGAAGGTTGCAGAAAGCAAGGACCAAGTGTTTCAGCCTTCCACAGTGGCATCTTCAGAGGGAGCTGTGGTGGAAATCTTCTGTAATCACTCTGTGTCCAATGCTTACAACTTCTTCTGGTACCTTCACTTCCCGGGATGTGCACCAAGACTCCTTGTTAAAGGCTCAAAGCCTTCTCAGCAGGGACGATACAACATGACCTATGAACGGTTCTCTTCATCGCTGCTCATCCTCCAGGTGCGGGAGGCAGATGCTGCTGTTTACTACTGTGCTGTGGAGGA +>427|TRAV20 ENST00000390448|TRAV20|5'UTR|TR|TRA|None|00 +ACAGAAGTGGCGCCTCTGAGAAAAGAAGGTTGGAATTATCGTAATTTGTTTCTAGGCTGAGATACCAGC +>428|TRAV20 ENST00000390448|TRAV20|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAAATGTTGGAGTGTGCATTCATAGTCTTGTGGCTTCAGCTTGGCTGGTTGAGTGGAGAAGACCAGGTGACGCAGAGTCCCGAGGCCCTGAGACTCCAGGAGGGAGAGAGTAGCAGTCTCAACTGCAGTTACACAGTCAGCGGTTTAAGAGGGCTGTTCTGGTATAGGCAAGATCCTGGGAAAGGCCCTGAATTCCTCTTCACCCTGTATTCAGCTGGGGAAGAAAAGGAGAAAGAAAGGCTAAAAGCCACATTAACAAAGAAGGAAAGCTTTCTGCACATCACAGCCCCTAAACCTGAAGACTCAGCCACTTATCTCTGTGCTGTGCAGG +>429|TRAV21 ENST00000390449|TRAV21|5'UTR|TR|TRA|None|00 +AGAAGGA +>430|TRAV21 ENST00000390449|TRAV21|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACCCTCTTGGGCCTGCTTATCCTTTGGCTGCAGCTGCAATGGGTGAGCAGCAAACAGGAGGTGACGCAGATTCCTGCAGCTCTGAGTGTCCCAGAAGGAGAAAACTTGGTTCTCAACTGCAGTTTCACTGATAGCGCTATTTACAACCTCCAGTGGTTTAGGCAGGACCCTGGGAAAGGTCTCACATCTCTGTTGCTTATTCAGTCAAGTCAGAGAGAGCAAACAAGTGGAAGACTTAATGCCTCGCTGGATAAATCATCAGGACGTAGTACTTTATACATTGCAGCTTCTCAGCCTGGTGACTCAGCCACCTACCTCTGTGCTGTGAGG +>431|TRAV22 ENST00000390450|TRAV22|5'UTR|TR|TRA|None|00 +GGCTTTGTCGGGTGGAGCTGATTGGTTGCAGGAGCAGCAACAGTTCCAGAGCCAAGTCATGACACCGACCTCCCCAAGGTTTAGTTAAATATATCTTATGGTGAAAATGCCCGGAGCAAGAAGGCAAAGCATC +>432|TRAV22 ENST00000390450|TRAV22|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGATATTGGGAGCTCTGCTGGGGCTCTTGAGTGCCCAGGTTTGCTGTGTGAGAGGAATACAAGTGGAGCAGAGTCCTCCAGACCTGATTCTCCAGGAGGGAGCCAATTCCACGCTGCGGTGCAATTTTTCTGACTCTGTGAACAATTTGCAGTGGTTTCATCAAAACCCTTGGGGACAGCTCATCAACCTGTTTTACATTCCCTCAGGGACAAAACAGAATGGAAGATTAAGCGCCACGACTGTCGCTACGGAACGCTACAGCTTATTGTACATTTCCTCTTCCCAGACCACAGACTCAGGCGTTTATTTCTGTGCTGTGGAGC +>433|TRAV23/DV6 ENST00000390451|TRAV23/DV6|5'UTR|TR|TRA|None|00 +CTGGAAGACCACCTGGGCTGTCATTGAGCTCTGGTGCCAGGAGGA +>434|TRAV23/DV6 ENST00000390451|TRAV23/DV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCTTAGGAGCATCATTTTTAGTTCTGTGGCTTCAACTATGCTGGGTGAGTGGCCAACAGAAGGAGAAAAGTGACCAGCAGCAGGTGAAACAAAGTCCTCAATCTTTGATAGTCCAGAAAGGAGGGATTTCAATTATAAACTGTGCTTATGAGAACACTGCGTTTGACTACTTTCCATGGTACCAACAATTCCCTGGGAAAGGCCCTGCATTATTGATAGCCATACGTCCAGATGTGAGTGAAAAGAAAGAAGGAAGATTCACAATCTCCTTCAATAAAAGTGCCAAGCAGTTCTCATCGCATATCATGGATTCCCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGCA +>435|TRAV24 ENST00000390453|TRAV24|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGAATCCTTTGGCAGCCCCATTACTAATCCTCTGGTTTCATCTTGACTGCGTGAGCAGCATACTGAACGTGGAACAAAGTCCTCAGTCACTGCATGTTCAGGAGGGAGACAGCACCAATTTCACCTGCAGCTTCCCTTCCAGCAATTTTTATGCCTTACACTGGTACAGATGGGAAACTGCAAAAAGCCCCGAGGCCTTGTTTGTAATGACTTTAAATGGGGATGAAAAGAAGAAAGGACGAATAAGTGCCACTCTTAATACCAAGGAGGGTTACAGCTATTTGTACATCAAAGGATCCCAGCCTGAAGACTCAGCCACATACCTCTGTGCCTTTA +>436|TRAV25 ENST00000390454|TRAV25|5'UTR|TR|TRA|None|00 +ACTATTTCTATTGATCTGGAAGAAGCTTGTACCAGGCAACCCATTTAGGAGAAGTTGGATGAAGAGGGAGAGGGAG +>437|TRAV25 ENST00000390454|TRAV25|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTACTCATCACATCAATGTTGGTCTTATGGATGCAATTGTCACAGGTGAATGGACAACAGGTAATGCAAATTCCTCAGTACCAGCATGTACAAGAAGGAGAGGACTTCACCACGTACTGCAATTCCTCAACTACTTTAAGCAATATACAGTGGTATAAGCAAAGGCCTGGTGGACATCCCGTTTTTTTGATACAGTTAGTGAAGAGTGGAGAAGTGAAGAAGCAGAAAAGACTGACATTTCAGTTTGGAGAAGCAAAAAAGAACAGCTCCCTGCACATCACAGCCACCCAGACTACAGATGTAGGAACCTACTTCTGTGCAGGG +>438|TRAV26-1 ENST00000390455|TRAV26-1|5'UTR|TR|TRA|None|00 +AGGAACATGACTAAACCTGGGGAGGAAGACATAGAAAAGCAACTGCTCTATCATTGGCTGACAAGATCCTGACAACAACACAATGAGAGCTGCACTCCTTGCAAGTCTTTACTAGTAGCTGTTGCTTCTGTTCTCTGGAAATTCTTTAAACCTAGAATCAGACACAAAAACTGAACTCTGGGTCCACAATCCTCATTTGTCCTTGAAGT +>439|TRAV26-1 ENST00000390455|TRAV26-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCTGGTGGCAAGAGTAACTGTGTTTCTGACCTTTGGAACTATAATTGATGCTAAGACCACCCAGCCCACCTCCATGGATTGCGCTGAAGGAAGAGCTGCAAACCTGCCTTGTAATCACTCTACCATCAGTGGAAATGAGTATGTGTATTGGTATCGACAGATTCACTCCCAGGGGCCACAGTATATCATTCATGGTCTAAAAAACAATGAAACCAATGAAATGGCCTCTCTGATCATCACAGAAGACAGAAAGTCCAGCACCTTGATCCTGCCCCACGCTACGCTGAGAGACACTGCTGTGTACTATTGCATCGTCAGAGTCG +>440|TRAV26-2 ENST00000390460|TRAV26-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTTGGTGACAAGCATTACTGTACTCCTATCTTTGGGTATTATGGGTGATGCTAAGACCACACAGCCAAATTCAATGGAGAGTAACGAAGAAGAGCCTGTTCACTTGCCTTGTAACCACTCCACAATCAGTGGAACTGATTACATACATTGGTATCGACAGCTTCCCTCCCAGGGTCCAGAGTACGTGATTCATGGTCTTACAAGCAATGTGAACAACAGAATGGCCTCTCTGGCAATCGCTGAAGACAGAAAGTCCAGTACCTTGATCCTGCACCGTGCTACCTTGAGAGATGCTGCTGTGTACTACTGCATCCTGAGAGAC +>441|TRAV27 ENST00000390457|TRAV27|5'UTR|TR|TRA|None|00 +AAGCACTCTTCTAGCCCAGAGAAGTCTGTTCCAGGACGGGCTCTTTCAGGAGCAGCTAAAGTCAGGGGCCATGTCCACCATGTGATAGAAAGACAAG +>442|TRAV27 ENST00000390457|TRAV27|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTCCTGAAATTCTCCGTGTCCATTCTTTGGATTCAGTTGGCATGGGTGAGCACCCAGCTGCTGGAGCAGAGCCCTCAGTTTCTAAGCATCCAAGAGGGAGAAAATCTCACTGTGTACTGCAACTCCTCAAGTGTTTTTTCCAGCTTACAATGGTACAGACAGGAGCCTGGGGAAGGTCCTGTCCTCCTGGTGACAGTAGTTACGGGTGGAGAAGTGAAGAAGCTGAAGAGACTAACCTTTCAGTTTGGTGATGCAAGAAAGGACAGTTCTCTCCACATCACTGCAGCCCAGACTGGTGATACAGGCCTCTACCTCTGTGCAGGAG +>443|TRAV29/DV5 ENST00000390458|TRAV29/DV5|5'UTR|TR|TRA|None|00 +ATATGTAAAATGAAGGGTCTGTGGAAGGACATGAATAAAGCACAGGAGGTTGAAGTCAGATTTGCAGCTTTCTAGGCAGGAGATAAGACAATCTGCATCTTCACAGGAGGG +>444|TRAV29/DV5 ENST00000390458|TRAV29/DV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCATGCTCCTGGGGGCATCAGTGCTGATTCTGTGGCTTCAGCCAGACTGGGTAAACAGTCAACAGAAGAATGATGACCAGCAAGTTAAGCAAAATTCACCATCCCTGAGCGTCCAGGAAGGAAGAATTTCTATTCTGAACTGTGACTATACTAACAGCATGTTTGATTATTTCCTATGGTACAAAAAATACCCTGCTGAAGGTCCTACATTCCTGATATCTATAAGTTCCATTAAGGATAAAAATGAAGATGGAAGATTCACTGTTTTCTTAAACAAAAGTGCCAAGCACCTCTCTCTGCACATTGTGCCCTCCCAGCCTGGAGACTCTGCAGTGTACTTCTGTGCAGCAAGCG +>445|TRAV3 ENST00000390425|TRAV3|5'UTR|TR|TRA|None|00 +CCGGTGTCGGGAAGCACCAGTGCCCTGAGGAAGGGCCATTTCCAAAAGCCCTGTGCTGACACAGGGTTGCTGGTTCCTCTTCAAGAGCCCACTCTCTGGGGTGGGGCCATATCTCCAGCAGAGGTGGGCTGGAAAGGACCCCCCCAATCCCGCCCGCCGTGAGCTTAGCTGGAGCC +>446|TRAV3 ENST00000390425|TRAV3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCTCTGCACCCATCTCGATGCTTGCGATGCTCTTCACATTGAGTGGGCTGAGAGCTCAGTCAGTGGCTCAGCCGGAAGATCAGGTCAACGTTGCTGAAGGGAATCCTCTGACTGTGAAATGCACCTATTCAGTCTCTGGAAACCCTTATCTTTTTTGGTATGTTCAATACCCCAACCGAGGCCTCCAGTTCCTTCTGAAATACATCACAGGGGATAACCTGGTTAAAGGCAGCTATGGCTTTGAAGCTGAATTTAACAAGAGCCAAACCTCCTTCCACCTGAAGAAACCATCTGCCCTTGTGAGCGACTCCGCTTTGTACTTCTGTGCTGTGAGAGACA +>447|TRAV30 ENST00000557168|TRAV30|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTCTCCTGAAAGTGCTTTCAGGCACCTTGTTGTGGCAGTTGACCTGGGTGAGAAGCCAACAACCAGTGCAGAGTCCTCAAGCCGTGATCCTCCGAGAAGGGGAAGATGCTGTCATCAACTGCAGTTCCTCCAAGGCTTTATATTCTGTACACTGGTACAGGCAGAAGCATGGTGAAGCACCCGTCTTCCTGATGATATTACTGAAGGGTGGAGAACAGAAGGGTCATGACAAAATATCTGCTTCATTTAATGAAAAAAAGCAGCAAAGCTCCCTGTACCTTACGGCCTCCCAGCTCAGTTACTCAGGAACCTACTTCTGCGGCACAGAGA +>448|TRAV34 ENST00000390461|TRAV34|5'UTR|TR|TRA|None|00 +AATAGCTAAGGG +>449|TRAV34 ENST00000390461|TRAV34|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTGTTCTGCAAGTACTCCTAGGGATATTGGGGTTCCAAGCAGCCTGGGTCAGTAGCCAAGAACTGGAGCAGAGTCCTCAGTCCTTGATCGTCCAAGAGGGAAAGAATCTCACCATAAACTGCACGTCATCAAAGACGTTATATGGCTTATACTGGTATAAGCAAAAGTATGGTGAAGGTCTTATCTTCTTGATGATGCTACAGAAAGGTGGGGAAGAGAAAAGTCATGAAAAGATAACTGCCAAGTTGGATGAGAAAAAGCAGCAAAGTTCCCTGCATATCACAGCCTCCCAGCCCAGCCATGCAGGCATCTACCTCTGTGGAGCAGACA +>450|TRAV35 ENST00000390462|TRAV35|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTTGAACATTTATTAATAATCTTGTGGATGCAGCTGACATGGGTCAGTGGTCAACAGCTGAATCAGAGTCCTCAATCTATGTTTACCCAGGAAGGAGAAGATGTCTCCATGAACTGCACTTCTTCAAGCATATTTAACACCTGACTATGGTACAAGCAGGACCCTGGGGAAGGTCCTGTCCTCTTGATAGCCTTATATAAGGCTGGTGAATTGACCTCAAATGGAAGACTGACTGCTCAGTTTGGTATAACCAGAAAGGACAGCTTCCTGAATATCTCAGCATCCATACCTAGTGATGTAGGCATCTACTTCTGTGCTGGGCAG +>451|TRAV36/DV7 ENST00000390463|TRAV36/DV7|5'UTR|TR|TRA|None|00 +ACTTGATAACTGAAGG +>452|TRAV36/DV7 ENST00000390463|TRAV36/DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAGTGTCCACAGGCTTTACTAGCTATCTTTTGGCTTCTACTGAGCTGGGTGAGCAGTGAAGACAAGGTGGTACAAAGCCCTCTATCTCTGGTTGTCCACGAGGGAGACACCGTAACTCTCAATTGCAGTTATGAAGTGACTAACTTTCGAAGCCTACTATGGTACAAGCAGGAAAAGAAAGCTCCCACATTTCTATTTATGCTAACTTCAAGTGGAATTGAAAAGAAGTCAGGAAGACTAAGTAGCATATTAGATAAGAAAGAACTTTTCAGCATCCTGAACATCACAGCCACCCAGACCGGAGACTCGGCCATCTACCTCTGTGCTGTGGAGG +>453|TRAV38-1 ENST00000390464|TRAV38-1|5'UTR|TR|TRA|None|00 +AGC +>454|TRAV38-1 ENST00000390464|TRAV38-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACACGAGTTAGCTTGCTGTGGGCAGTCGTGGTCTCCACCTGTCTTGAATCCGGCATGGCCCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACTGTGACCCTGAGTTGCACATATGACACCAGTGAGAATAATTATTATTTGTTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACGGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGACACTGCGATGTATTTCTGTGCTTTCATGAAGCA +>455|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|5'UTR|TR|TRA|None|00 +AGATCAGAAGAGGAGGCTTCTCACCCTGCAGCAGGGACCTGTGAGC +>456|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCATGCCCTGGCTTCCTGTGGGCACTTGTGATCTCCACCTGTCTTGAATTTAGCATGGCTCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACCGTGACCCTGAGCTGCACATATGACACCAGTGAGAGTGATTATTATTTATTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACAGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGATGCCGCGATGTATTTCTGTGCTTATAGGAGCG +>457|TRAV39 ENST00000390466|TRAV39|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAAGCTACTAGCAATGATTCTGTGGCTTCAACTAGACCGGTTAAGTGGAGAGCTGAAAGTGGAACAAAACCCTCTGTTCCTGAGCATGCAGGAGGGAAAAAACTATACCATCTACTGCAATTATTCAACCACTTCAGACAGACTGTATTGGTACAGGCAGGATCCTGGGAAAAGTCTGGAATCTCTGTTTGTGTTGCTATCAAATGGAGCAGTGAAGCAGGAGGGACGATTAATGGCCTCACTTGATACCAAAGCCCGTCTCAGCACCCTCCACATCACAGCTGCCGTGCATGACCTCTCTGCCACCTACTTCTGTGCCGTGGACA +>458|TRAV4 ENST00000390426|TRAV4|5'UTR|TR|TRA|None|00 +CTGGGCTCATTGCAGCTCAGACACAGCAAAAGAGCCTAGAACCTGGGTCCTAGTTTGCACCTAGAAT +>459|TRAV4 ENST00000390426|TRAV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCAAGTGGCGAGAGTGATCGTGTTCCTGACCCTGAGTACTTTGAGCCTTGCTAAGACCACCCAGCCCATCTCCATGGACTCATATGAAGGACAAGAAGTGAACATAACCTGTAGCCACAACAACATTGCTACAAATGATTATATCACGTGGTACCAACAGTTTCCCAGCCAAGGACCACGATTTATTATTCAAGGATACAAGACAAAAGTTACAAACGAAGTGGCCTCCCTGTTTATCCCTGCCGACAGAAAGTCCAGCACTCTGAGCCTGCCCCGGGTTTCCCTGAGCGACACTGCTGTGTACTACTGCCTCGTGGGTGACA +>460|TRAV40 ENST00000390467|TRAV40|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCCTCTCTGGACTTTCTAATTCTGATCTTAATGTTTGGAGGAACCAGCAGCAATTCAGTCAAGCAGACGGGCCAAATAACCGTCTCGGAGGGAGCATCTGTGACTATGAACTGCACATACACATCCACGGGGTACCCTACCCTTTTCTGGTATGTGGAATACCCCAGCAAACCTCTGCAGCTTCTTCAGAGAGAGACAATGGAAAACAGCAAAAACTTCGGAGGCGGAAATATTAAAGACAAAAACTCCCCCATTGTGAAATATTCAGTCCAGGTATCAGACTCAGCCGTGTACTACTGTCTTCTGGGAGA +>461|TRAV41 ENST00000390468|TRAV41|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTGAAGATCCGGCAATTTTTGTTGGCTATTTTGTGGCTTCAGCTAAGCTGTGTAAGTGCCGCCAAAAATGAAGTGGAGCAGAGTCCTCAGAACCTGACTGCCCAGGAAGGAGAATTTATCACAATCAACTGCAGTTACTCGGTAGGAATAAGTGCCTTACACTGGCTGCAACAGCATCCAGGAGGAGGCATTGTTTCCTTGTTTATGCTGAGCTCAGGGAAGAAGAAGCATGGAAGATTAATTGCCACAATAAACATACAGGAAAAGCACAGCTCCCTGCACATCACAGCCTCCCATCCCAGAGACTCTGCCGTCTACATCTGTGCTGTCAGA +>462|TRAV5 ENST00000390427|TRAV5|5'UTR|TR|TRA|None|00 +GTGGGGAGAACA +>463|TRAV5 ENST00000390427|TRAV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATTTGCTGGATTTTCGTTCCTGTTTTTGTGGCTGCAGCTGGACTGTATGAGTAGAGGAGAGGATGTGGAGCAGAGTCTTTTCCTGAGTGTCCGAGAGGGAGACAGCTCCGTTATAAACTGCACTTACACAGACAGCTCCTCCACCTACTTATACTGGTATAAGCAAGAACCTGGAGCAGGTCTCCAGTTGCTGACGTATATTTTTTCAAATATGGACATGAAACAAGACCAAAGACTCACTGTTCTATTGAATAAAAAGGATAAACATCTGTCTCTGCGCATTGCAGACACCCAGACTGGGGACTCAGCTATCTACTTCTGTGCAGAGAGTA +>464|TRAV6 ENST00000390428|TRAV6|5'UTR|TR|TRA|None|00 +AAACAGA +>465|TRAV6 ENST00000390428|TRAV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTTTGGCTGAGAAGCCTGGGTCTACATTTCAGGCCACATTTGGGGAGACGAATGGAGTCATTCCTGGGAGGTGTTTTGCTGATTTTGTGGCTTCAAGTGGACTGGGTGAAGAGCCAAAAGATAGAACAGAATTCCGAGGCTCTGAACATTCAGGAGGGTAAAACGGCCACCCTGACCTGCAACTATACAAACTATTCTCCAGCATACTTACAGTGGTACCGACAAGATCCAGGAAGAGGCCCTGTTTTCTTGCTACTCATACGTGAAAATGAGAAAGAAAAAAGGAAAGAAAGACTGAAGGTCACCTTTGATACCACCCTTAAACAGAGTTTGTTTCATATCACAGCCTCCCAGCCTGCAGACTCAGCTACCTACCTCTGTGCTCTAGACA +>466|TRAV7 ENST00000390429|TRAV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGATGCGGAGACCTGTCCTAATTATATTTTGTCTATGTCTTGGCTGGGCAAATGGAGAAAACCAGGTGGAGCACAGCCCTCATTTTCTGGGACCCCAGCAGGGAGACGTTGCCTCCATGAGCTGCACGTACTCTGTCAGTCGTTTTAACAATTTGCAGTGGTACAGGCAAAATACAGGGATGGGTCCCAAACACCTATTATCCATGTATTCAGCTGGATATGAGAAGCAGAAAGGAAGACTAAATGCTACATTACTGAAGAATGGAAGCAGCTTGTACATTACAGCCGTGCAGCCTGAAGATTCAGCCACCTATTTCTGTGCTGTAGATG +>467|TRAV8-1 ENST00000390430|TRAV8-1|5'UTR|TR|TRA|None|00 +CCAAAACAAGAGACTTGCCTAGCCCAACCTTCCTCACGCTCGCTATTCTCAAGACCTGGGTTCCAGCCACTTTCCTACTGGCCCCGAGGAGAATTTCCAAAGAGACGCCTGCAGTGTTTCCACAGCTCAGCC +>468|TRAV8-1 ENST00000390430|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGTTGCTCATACCAGTGCTGGGGATGATTTTTGCCCTGAGAGATGCCAGAGCCCAGTCTGTGAGCCAGCATAACCACCACGTAATTCTCTCTGAAGCAGCCTCACTGGAGTTGGGATGCAACTATTCCTATGGTGGAACTGTTAATCTCTTCTGGTATGTCCAGTACCCTGGTCAACACCTTCAGCTTCTCCTCAAGTACTTTTCAGGGGATCCACTGGTTAAAGGCATCAAGGGCTTTGAGGCTGAATTTATAAAGAGTAAATTCTCCTTTAATCTGAGGAAACCCTCTGTGCAGTGGAGTGACACAGCTGAGTACTTCTGTGCCGTGAATGC +>469|TRAV8-2 ENST00000390434|TRAV8-2|5'UTR|TR|TRA|None|00 +GGCTGATGTAGCTCACTGATGTCTGTGTAGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGACTCCTTAAGAGAAAGCCTTTCTGTTTTGGAAACTTTTCAAAGCCAGGGACTTGTCCAGCCCAACCTCCCCATTGCTCCTAGCTCCCGAGGCTCAGGACCCCTGGCTTCTGTCCTCCCTGCTCAGGGTCCTGCAGCGTTGCCTCTGCTCAGCC +>470|TRAV8-2 ENST00000390434|TRAV8-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGACAGCCACGTCTCTGTCTCTGAAGGAACCCCGGTGCTGCTGAGGTGCAACTACTCATCTTCTTATTCACCGTCTCTCTTCTGGTATGTGCAACACCCCAACAAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGTTGTGAGTGA +>471|TRAV8-3 ENST00000390435|TRAV8-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGAGCTTATCCCACTGCTGGGGATACATTTTGTCCTGAGAACTGCCAGAGCCCAGTCAGTGACCCAGCCTGACATCCACATCACTGTCTCTGAAGGAGCCTCACTGGAGTTGAGATGTAACTATTCCTATGGGGCAACACCTTATCTCTTCTGGTATGTCCAGTCCCCCGGCCAAGGCCTCCAGCTGCTCCTGAAGTACTTTTCAGGAGACACTCTGGTTCAAGGCATTAAAGGCTTTGAGGCTGAATTTAAGAGGAGTCAATCTTCCTTCAATCTGAGGAAACCCTCTGTGCATTGGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGC +>472|TRAV8-4 ENST00000390438|TRAV8-4|5'UTR|TR|TRA|None|00 +TTTTGAAACCCTTCAAAGGCAGAGACTTGTCCAGCCTAACCTGCCTGCTGCTCCTAGCTCCTGAGGCTCAGGGCCCTTGGCTTCTGTCCGCTCTGCTCAGGGCCCTCCAGCGTGGCCACTGCTCAGCC +>473|TRAV8-4 ENST00000390438|TRAV8-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGGCAGCCACGTCTCTGTCTCTGAAGGAGCCCTGGTTCTGCTGAGGTGCAACTACTCATCGTCTGTTCCACCATATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGCTGTGAGTGA +>474|TRAV8-6 ENST00000390443|TRAV8-6|5'UTR|TR|TRA|None|00 +GTAGCTCGTTGATGTCTGTGTGGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGGCTCCTTAAGGGAAAGCCTCTTTCTGTTTCTGAAACTTTTCAAAGCCAGGGACTTGTCCAATCCAACCTCCTCACAGTTCCTAGCTCCTGAGGCTCAGCGCCCTTGGCTTCTGTCCGCCCAGCTTAAGGTCCTGCAGCATTGCCACTGCTCAGCC +>475|TRAV8-6 ENST00000390443|TRAV8-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGCGTTCCAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCTGTGACCCAGCTTGACAGCCAAGTCCCTGTCTTTGAAGAAGCCCCTGTGGAGCTGAGGTGCAACTACTCATCGTCTGTTTCAGTGTATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTATTTATCAGGATCCACCCTGGTTGAAAGCATCAACGGTTTTGAGGCTGAATTTAACAAGAGTCAAACTTCCTTCCACTTGAGGAAACCCTCAGTCCATATAAGCGACACGGCTGAGTACTTCTGTGCTGTGAGTGA +>476|TRAV8-7 ENST00000390456|TRAV8-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCTTAGTGGTCATTCTGCTGCTTGGAATGTTCTTCACACTGAGTAAAACCCAGTCGGTGACCCAGCTTGATGGCCACATCACTGTCTCTGAAGAAGCCCCTCTGGAACTGAAGTGCAACTATTCCTATAGTGGAGTTCCTTCTCTCTTCTGGTATGTCCAATACTCTAGCCAAAGCCTCCAGCTTCTCCTCAAAGACCTAACAAAGGCCACCCAGGTTAAAGGCATCAGAGGTTTTGAGGCTGAATTTAAGAAGAGCGAAACCTCCTTCTACCTGAGGAAACCATCAACCCATGTGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGACAGGAG +>477|TRAV9-1 ENST00000390431|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATTCTTCTCCAGGACCAGCGATTGCACTATTCTTAATGTTTGGGGGAATCAATGGAGATTCAGTGGTCCAGACAGAAGGCCAAGTGCTCCCCTCTGAAGGGGATTCCCTGATTGTGAACTGCTCCTATGAAACCACACAGTACCCTTCCCTTTTTTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCACCTGAAAGCCATGAAGGCCAATGACAAGGGAAGGAACAAAGGTTTTGAAGCCATGTACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGACTCAGTTCAAGAGTCAGACTCCGCTGTGTACTTCTGTGCTCTGAGTGA +>478|TRAV9-2 ENST00000390441|TRAV9-2|5'UTR|TR|TRA|None|00 +CACTGTGATTTCTTCATGTTAAGGATCAAGACCATTATTTGGGTAACACACTAAAG +>479|TRAV9-2 ENST00000390441|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGGCTTAGTATCTCTGATACTCTTACTGCTTGGAAGAACCCGTGGAGATTCAGTGACCCAGATGGAAGGGCCAGTGACTCTCTCAGAAGAGGCCTTCCTGACTATAAACTGCACGTACACAGCCACAGGATACCCTTCCCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCTACAGCTCCTCCTGAAAGCCACGAAGGCTGATGACAAGGGAAGCAACAAAGGTTTTGAAGCCACATACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGGCTCAGTTCAAGTGTCAGACTCAGCGGTGTACTTCTGTGCTCTGAGTGA +>480|TRBC1 ENST00000633705|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>481|TRBC1 ENST00000632136|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>482|TRBC2 ENST00000466254|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>483|TRBC2 ENST00000622053|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>484|TRBD1 ENST00000632684|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>485|TRBJ1-1 ENST00000632951|TRBJ1-1|J-REGION|TR|TRB|None|00 +TGAACACTGAAGCTTTCTTTGGACAAGGCACCAGACTCACAGTTGTAG +>486|TRBJ1-2 ENST00000633553|TRBJ1-2|J-REGION|TR|TRB|None|00 +CTAACTATGGCTACACCTTCGGTTCGGGGACCAGGTTAACCGTTGTAG +>487|TRBJ1-3 ENST00000633936|TRBJ1-3|J-REGION|TR|TRB|None|00 +CTCTGGAAACACCATATATTTTGGAGAGGGAAGTTGGCTCACTGTTGTAG +>488|TRBJ1-4 ENST00000633891|TRBJ1-4|J-REGION|TR|TRB|None|00 +CAACTAATGAAAAACTGTTTTTTGGCAGTGGAACCCAGCTCTCTGTCTTGG +>489|TRBJ1-5 ENST00000633507|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAGCAATCAGCCCCAGCATTTTGGTGATGGGACTCGACTCTCCATCCTAG +>490|TRBJ1-6 ENST00000632228|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAACGGGACCAGGCTCACTGTGACAG +>491|TRBJ1-6 ENST00000633713|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAATGGGACCAGGCTCACTGTGACAG +>492|TRBJ2-1 ENST00000631600|TRBJ2-1|J-REGION|TR|TRB|None|00 +CTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAG +>493|TRBJ2-2 ENST00000633188|TRBJ2-2|J-REGION|TR|TRB|None|00 +CGAACACCGGGGAGCTGTTTTTTGGAGAAGGCTCTAGGCTGACCGTACTGG +>494|TRBJ2-2P ENST00000633209|TRBJ2-2P|J-REGION|TR|TRB|None|00 +CTGAGAGGCGCTGCTGGGCGTCTGGGCGGAGGACTCCTGGTTCTGG +>495|TRBJ2-3 ENST00000631840|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCG +>496|TRBJ2-4 ENST00000633836|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGCCAAAAACATTCAGTACTTCGGCGCCGGGACCCGGCTCTCAGTGCTGG +>497|TRBJ2-5 ENST00000634149|TRBJ2-5|J-REGION|TR|TRB|None|00 +ACCAAGAGACCCAGTACTTCGGGCCAGGCACGCGGCTCCTGGTGCTCG +>498|TRBJ2-6 ENST00000632996|TRBJ2-6|J-REGION|TR|TRB|None|00 +CTCTGGGGCCAACGTCCTGACTTTCGGGGCCGGCAGCAGGCTGACCGTGCTGG +>499|TRBJ2-7 ENST00000390419|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACTTCGGGCCGGGCACCAGGCTCACGGTCACAG +>500|TRBJ2-7 ENST00000633660|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACGTCGGGCCGGGCACCAGGCTCACGGTCACAG +>501|TRBV10-1 ENST00000632248|TRBV10-1|5'UTR|TR|TRB|None|00 +ACTGAGAGCCCAACTTCAGTCTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>502|TRBV10-1 ENST00000632248|TRBV10-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACGAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGAAATCACCCAGAGCCCAAGACACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGGCGTGTCACCAGACTTGGAACCACAACAATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCCATTACTCATATGGTGTTCACGACACTAACAAAGGAGAAGTCTCAGATGGCTACAGTGTCTCTAGATCAAACACAGAGGACCTCCCCCTCACTCTGGAGTCTGCTGCCTCCTCCCAGACATCTGTATATTTCTGCGCCAGCAGTGAGTC +>503|TRBV10-2 ENST00000426318|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>504|TRBV10-2 ENST00000426318|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTACGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>505|TRBV10-2 ENST00000633575|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>506|TRBV10-2 ENST00000633575|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTATGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>507|TRBV10-3 ENST00000611462|TRBV10-3|5'UTR|TR|TRB|None|00 +ATGAGATCCTGGCCTGGACCTGAA +>508|TRBV10-3 ENST00000611462|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCACCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>509|TRBV10-3 ENST00000631471|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCATCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>510|TRBV11-1 ENST00000634176|TRBV11-1|5'UTR|TR|TRB|None|00 +CCTGCCCTGACCCTGCC +>511|TRBV11-1 ENST00000634176|TRBV11-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCACCAGGCTTCTCTGCTGGATGGCCCTCTGTCTCCTGGGGGCAGAACTCTCAGAAGCTGAAGTTGCCCAGTCCCCCAGATATAAGATTACAGAGAAAAGCCAGGCTGTGGCTTTTTGGTGTGATCCTATTTCTGGCCATGCTACCCTTTACTGGTACCGGCAGATCCTGGGACAGGGCCCGGAGCTTCTGGTTCAATTTCAGGATGAGAGTGTAGTAGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>512|TRBV11-3 ENST00000634111|TRBV11-3|5'UTR|TR|TRB|None|00 +AGTGACCCTGATCTGGCAAAGCTTCCATCCTGCCCTGACCCTGCC +>513|TRBV11-3 ENST00000634111|TRBV11-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGGCTCCTCTGCTGGGTGGCCTTCTGTCTCCTGGTGGAAGAACTCATAGAAGCTGGAGTGGTTCAGTCTCCCAGATATAAGATTATAGAGAAAAAACAGCCTGTGGCTTTTTGGTGCAATCCTATTTCTGGCCACAATACCCTTTACTGGTACCTGCAGAACTTGGGACAGGGCCCGGAGCTTCTGATTCGATATGAGAATGAGGAAGCAGTAGACGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGA +>514|TRBV12-3 ENST00000633292|TRBV12-3|5'UTR|TR|TRB|None|00 +TTCTTTGCTCATGCTCACAGAGGGCCTGGTCTAGAATATTCCACATCTGCTCTCACTCTGCC +>515|TRBV12-3 ENST00000633292|TRBV12-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCTTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCGAAGCATACAGATGCTGGAGTTATCCAGTCACCCCGCCATGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGCCACAACTCCCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>516|TRBV12-4 ENST00000617347|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>517|TRBV12-4 ENST00000617347|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>518|TRBV12-4 ENST00000631824|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>519|TRBV12-4 ENST00000631824|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>520|TRBV12-5 ENST00000621184|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>521|TRBV12-5 ENST00000621184|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGCACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>522|TRBV12-5 ENST00000632829|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>523|TRBV12-5 ENST00000632829|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGGACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>524|TRBV13 ENST00000633796|TRBV13|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTTAGTCCTGACCTGCCTGACTCTGCCTGGAACACCAGGCTCCTCTGCCGTGTCATGCTTTGTCTCCTGGGAGCAGGTTCAGTGGCTGCTGGAGTCATCCAGTCCCCAAGACATCTGATCAAAGAAAAGAGGGAAACAGCCACTCTGAAATGCTATCCTATCCCTAGACACGACACTGTCTACTGGTACCAGCAGGGTCCAGGTCAGGACCCCCAGTTCCTCATTTCGTTTTATGAAAAGATGCAGAGCGATAAAGGAAGCATCCCTGATCGATTCTCAGCTCAACAGTTCAGTGACTATCATTCTGAACTGAACATGAGCTCCTTGGAGCTGGGGGACTCAGCCCTGTACTTCTGTGCCAGCAGCTTAGG +>525|TRBV14 ENST00000632432|TRBV14|5'UTR|TR|TRB|None|00 +CCTTTTTCTCATGCTTGTAAGCTCCTTCATCTGGAAATGTGATTTACCTGGGTCCTGCC +>526|TRBV14 ENST00000632432|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGTTTCCAGGCTTCTCAGTTTAGTGTCCCTTTGTCTCCTGGGAGCAAAGCACATAGAAGCTGGAGTTACTCAGTTCCCCAGCCACAGCGTAATAGAGAAGGGCCAGACTGTGACTCTGAGATGTGACCCAATTTCTGGACATGATAATCTTTATTGGTATCGACGTGTTATGGGAAAAGAAATAAAATTTCTGTTACATTTTGTGAAAGAGTCTAAACAGGATGAGTCCGGTATGCCCAACAATCGATTCTTAGCTGAAAGGACTGGAGGGACGTATTCTACTCTGAAGGTGCAGCCTGCAGAACTGGAGGATTCTGGAGTTTATTTCTGTGCCAGCAGCCAAGA +>527|TRBV15 ENST00000631835|TRBV15|5'UTR|TR|TRB|None|00 +ACTCCCACCTCTCAACCCAGGAATCAGAGCCTGAGACAGACAGATGCTTCATTCCTGTATGGGGTGGTATTCCTGCC +>528|TRBV15 ENST00000631835|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTCCTGGGCTTCTCCACTGGATGGCCCTTTGTCTCCTTGGAACAGGTCATGGGGATGCCATGGTCATCCAGAACCCAAGATACCAGGTTACCCAGTTTGGAAAGCCAGTGACCCTGAGTTGTTCTCAGACTTTGAACCATAACGTCATGTACTGGTACCAGCAGAAGTCAAGTCAGGCCCCAAAGCTGCTGTTCCACTACTATGACAAAGATTTTAACAATGAAGCAGACACCCCTGATAACTTCCAATCCAGGAGGCCGAACACTTCTTTCTGCTTTCTTGACATCCGCTCACCAGGCCTGGGGGACGCAGCCATGTACCTGTGTGCCACCAGCAGAGA +>529|TRBV16 ENST00000633244|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCCAATATTCACCTGCATCACAATCCTTTGTCTGCTGGCTGCAGGTTCTCCTGGTGAAGAAGTCGCCCAGACTCCAAAACATCTTGTCAGAGGGGAAGGACAGAAAGCAAAATTATATTGTGCCCCAATAAAAGGACACAGTTATGTTTTTTGGTACCAACAGGTCCTGAAAAACGAGTTCAAGTTCTTGATTTCCTTCCAGAATGAAAATGTCTTTGATGAAACAGGTATGCCCAAGGAAAGATTTTCAGCTAAGTGCCTCCCAAATTCACCCTGTAGCCTTGAGATCCAGGCTACGAAGCTTGAGGATTCAGCAGTGTATTTTTGTGCCAGCAGCCAATC +>530|TRBV17 ENST00000619103|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACACTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>531|TRBV17 ENST00000631663|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACGCTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>532|TRBV18 ENST00000611520|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>533|TRBV18 ENST00000611520|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGACTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>534|TRBV18 ENST00000631559|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>535|TRBV18 ENST00000631559|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGAGTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>536|TRBV19 ENST00000390393|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>537|TRBV19 ENST00000390393|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTCTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>538|TRBV19 ENST00000632638|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>539|TRBV19 ENST00000632638|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTTTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>540|TRBV2 ENST00000455382|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>541|TRBV2 ENST00000455382|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCGCTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>542|TRBV2 ENST00000632828|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>543|TRBV2 ENST00000632828|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCACTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>544|TRBV20-1 ENST00000390394|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>545|TRBV20-1 ENST00000390394|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>546|TRBV20-1 ENST00000633466|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>547|TRBV20-1 ENST00000633466|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCTGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>548|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|5'UTR|TR|TRB|None|00 +GATCAGTCATCCCTCCTCGCTGGTGA +>549|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTAGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAACATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGCTCCGGAAACAGAGCCTCATGCTGATGGCAACTTCCAATGAGGGCTCCGAGGTCACATACGAGCAAGGCGTCAAGAAGGACAAGTTTCCCATCAACCATCCAAACCTGACCTTCTCCGCTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGA +>550|TRBV23-1 ENST00000633842|TRBV23-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCGGCTGTGCAGCCCTGTGTCTCCTGGCAGCAGACTCTTTTCATGCCAAAGTCACACAGACTCCAGGACATTTGGTCAAAGGAAAAGGACAGAAAACAAAGATGGATTGTACCCCCGAAAAAGGACATACTTTTGTTTATTGGTATCAACAGAATCAGAATAAAGAGTTTATGCTTTTGATTTCCTTTCAGAATGAACAAGTTCTTCAAGAAACGGAGATGCACAAGAAGCGATTCTCATCTCAATGCCCCAAGAACGCACCCTGCAGCCTGGCAATCCTGTCCTCAGAACCGGGAGACACGGCACTGTATCTCTGCGCCAGCAGTCAATC +>551|TRBV24-1 ENST00000390397|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>552|TRBV24-1 ENST00000390397|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACAGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>553|TRBV24-1 ENST00000633092|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>554|TRBV24-1 ENST00000633092|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACGGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>555|TRBV25-1 ENST00000610439|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>556|TRBV25-1 ENST00000610439|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>557|TRBV25-1 ENST00000390398|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>558|TRBV25-1 ENST00000390398|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>559|TRBV27 ENST00000633283|TRBV27|5'UTR|TR|TRB|None|00 +ACCTGGAGCCCCCAGAACTGGCAGACACCTGCCTGATGCTGCC +>560|TRBV27 ENST00000633283|TRBV27|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCCAGCTCCTTGGCTATGTGGTCCTTTGCCTTCTAGGAGCAGGCCCCCTGGAAGCCCAAGTGACCCAGAACCCAAGATACCTCATCACAGTGACTGGAAAGAAGTTAACAGTGACTTGTTCTCAGAATATGAACCATGAGTATATGTCCTGGTATCGACAAGACCCAGGGCTGGGCTTAAGGCAGATCTACTATTCAATGAATGTTGAGGTGACTGATAAGGGAGATGTTCCTGAAGGGTACAAAGTCTCTCGAAAAGAGAAGAGGAATTTCCCCCTGATCCTGGAGTCGCCCAGCCCCAACCAGACCTCTCTGTACTTCTGTGCCAGCAGTTTATC +>561|TRBV28 ENST00000619125|TRBV28|5'UTR|TR|TRB|None|00 +ATTCTTTCTTCAAAGCAGCC +>562|TRBV28 ENST00000619125|TRBV28|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTATG +>563|TRBV29-1 ENST00000634198|TRBV29-1|5'UTR|TR|TRB|None|00 +GAAGGAAAGATGAACTTGAGTTTCACTTCTTAGTGCCTTTTCTCAGGGGAGAGGCCATCACTTGAAG +>564|TRBV29-1 ENST00000634198|TRBV29-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGAGTCTTCTGCTCCTTCTCCTGGGACTAGGCTCTGTGTTCAGTGCTGTCATCTCTCAAAAGCCAAGCAGGGATATCTGTCAACGTGGAACCTCCCTGACGATCCAGTGTCAAGTCGATAGCCAAGTCACCATGATGTTCTGGTACCGTCAGCAACCTGGACAGAGCCTGACACTGATCGCAACTGCAAATCAGGGCTCTGAGGCCACATATGAGAGTGGATTTGTCATTGACAAGTTTCCCATCAGCCGCCCAAACCTAACATTCTCAACTCTGACTGTGAGCAACATGAGCCCTGAAGACAGCAGCATATATCTCTGCAGCGTTGAAGA +>565|TRBV3-1 ENST00000632422|TRBV3-1|5'UTR|TR|TRB|None|00 +AGACCAGAATCCTGCCCTGGGCCTTGCCTGGTCTGCCTCACTCTGCC +>566|TRBV3-1 ENST00000632422|TRBV3-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTCCTCTGCTGTGTGGTCTTCTGCCTCCTCCAAGCAGGTCCCTTGGACACAGCTGTTTCCCAGACTCCAAAATACCTGGTCACACAGATGGGAAACGACAAGTCCATTAAATGTGAACAAAATCTGGGCCATGATACTATGTATTGGTATAAACAGGACTCTAAGAAATTTCTGAAGATAATGTTTAGCTACAATAATAAGGAGCTCATTATAAATGAAACAGTTCCAAATCGCTTCTCACCTAAATCTCCAGACAAAGCTCACTTAAATCTTCACATCAATTCCCTGGAGCTTGGTGACTCTGCTGTGTATTTCTGTGCCAGCAGCCAAGA +>567|TRBV30 ENST00000417977|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>568|TRBV30 ENST00000417977|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTTCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>569|TRBV30 ENST00000631690|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>570|TRBV30 ENST00000631690|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTCCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>571|TRBV4-1 ENST00000390357|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>572|TRBV4-1 ENST00000390357|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>573|TRBV4-1 ENST00000632713|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>574|TRBV4-1 ENST00000632713|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCGAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>575|TRBV4-2 ENST00000632512|TRBV4-2|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>576|TRBV4-2 ENST00000632512|TRBV4-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGGCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAACTTTAAAGAACAGACTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGTGCCAGCAGCCAAGA +>577|TRBV4-3 ENST00000631427|TRBV4-3|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>578|TRBV4-3 ENST00000631427|TRBV4-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGTCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAGTCTTGAAGAACGGGTTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>579|TRBV5-1 ENST00000633384|TRBV5-1|5'UTR|TR|TRB|None|00 +CTCAGAGGACCAGTATCCCTCACAGGGTGACACCTGACCAGCTCTGTCCCACCTGGCCATGGGCTCCAGGTACCTCTGATGGGAAGACCTTTGTCTCTTGGGAACAAGTGAATCCTTGGCACAGGCCCAGTGGATTCTGCTGTGCAGAACAGAGAGCAGTGGACCTCAGGAGGCCTGCAAGGGGAGGACATAGGACAGTGACATCACAGTATGCCCCTCCCACCAGGAAAAGCAAGGCTGAGAATTTAGCTCTTTCCCAGGAGGACCAAGCCCTGAGCACAGACACAGTGCTGCCTGCCCCTTTGTGCC +>580|TRBV5-1 ENST00000633384|TRBV5-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTGCTCTGTTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTAAAGGCTGGAGTCACTCAAACTCCAAGATATCTGATCAAAACGAGAGGACAGCAAGTGACACTGAGCTGCTCCCCTATCTCTGGGCATAGGAGTGTATCCTGGTACCAACAGACCCCAGGACAGGGCCTTCAGTTCCTCTTTGAATACTTCAGTGAGACACAGAGAAACAAAGGAAACTTCCCTGGTCGATTCTCAGGGCGCCAGTTCTCTAACTCTCGCTCTGAGATGAATGTGAGCACCTTGGAGCTGGGGGACTCGGCCCTTTATCTTTGCGCCAGCAGCTTGG +>581|TRBV5-3 ENST00000390362|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTATTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>582|TRBV5-3 ENST00000634123|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTGTTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>583|TRBV5-4 ENST00000454561|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACACAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGCCCCACTGTGCC +>584|TRBV5-4 ENST00000454561|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGAGACTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>585|TRBV5-4 ENST00000633696|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACTCAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGGCCCACTGTGCC +>586|TRBV5-4 ENST00000633696|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATGATAGCTCTGAGCTGAATGTGAATGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>587|TRBV5-5 ENST00000390372|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>588|TRBV5-5 ENST00000390372|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>589|TRBV5-5 ENST00000632187|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>590|TRBV5-5 ENST00000632187|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGTAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>591|TRBV5-6 ENST00000632216|TRBV5-6|5'UTR|TR|TRB|None|00 +AAGCCCTGAATCAGATGCAGTGCTTCCTGTCCCTCTGTGCC +>592|TRBV5-6 ENST00000632216|TRBV5-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGCACTGCTTTGTCTCCTGGGAGCAGGCTTAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTAAGTCTGGGCATGACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGGAGGAAGAGAGACAGAGAGGCAACTTCCCTGATCGATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>593|TRBV5-7 ENST00000633790|TRBV5-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGTGCTGCTTTGTCCCCTAGGAGAAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCACGTGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTCCTCGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCAATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTAGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>594|TRBV5-8 ENST00000631639|TRBV5-8|5'UTR|TR|TRB|None|00 +TGGCCACTGAGGAAAGGGAAGAGAATGTTGCCTGGGACAGGAAAATATAGAAAATGAAGGCCCAGAACTCACTCGGCTCTTCCCCAGGAAGACCAAGCCCTGAATCAGGTGCAGTGCCGCCTGGCCCACTGTGCC +>595|TRBV5-8 ENST00000631639|TRBV5-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGACCCAGGCTCCTCTTCTGGGCACTGCTTTGTCTCCTCGGAACAGGCCCAGTGGAGGCTGGAGTCACACAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGCGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTACTGGTACCAACAGGCCCTGGGTCTGGGCCTCCAGTTCCTCCTTTGGTATGACGAGGGTGAAGAGAGAAACAGAGGAAACTTCCCTCCTAGATTTTCAGGTCGCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGAGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>596|TRBV6-1 ENST00000631557|TRBV6-1|5'UTR|TR|TRB|None|00 +GTTCCCCTATCACCGATGCACAGACCCAGAAGACCCCTCCATCCTGTAGCACCTGCC +>597|TRBV6-1 ENST00000631557|TRBV6-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAAGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTCCATGTACTGGTATCGACAAGACCCAGGCATGGGACTGAGGCTGATTTATTACTCAGCTTCTGAGGGTACCACTGACAAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATTAAACAAACGGGAGTTCTCGCTCAGGCTGGAGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTGAAGC +>598|TRBV6-2 ENST00000632016|TRBV6-2|5'UTR|TR|TRB|None|00 +TCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>599|TRBV6-2 ENST00000632016|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>600|TRBV6-2 ENST00000634383|TRBV6-2|5'UTR|TR|TRB|None|00 +AGAATGACGCCCTTGAAAGACGTGTTCCCTTTTCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>601|TRBV6-2 ENST00000634383|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>602|TRBV6-4 ENST00000390360|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>603|TRBV6-4 ENST00000390360|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGACTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGAGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>604|TRBV6-4 ENST00000633472|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>605|TRBV6-4 ENST00000633472|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGATTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGCGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>606|TRBV6-5 ENST00000633072|TRBV6-5|5'UTR|TR|TRB|None|00 +GAGAGTCCTGCTCCCCTTTCATCAATGCACAGATACAGAAGACCCCTCCGTCATGCAGCATCTGCC +>607|TRBV6-5 ENST00000633072|TRBV6-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGCCTCCTGTGCTGTGCAGCCTTGTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGAATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGCTGGTATCACTGACCAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGCTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>608|TRBV6-6 ENST00000390371|TRBV6-6|5'UTR|TR|TRB|None|00 +CAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>609|TRBV6-6 ENST00000390371|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGACAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>610|TRBV6-6 ENST00000633963|TRBV6-6|5'UTR|TR|TRB|None|00 +ATCAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>611|TRBV6-6 ENST00000633963|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGATAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGTATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>612|TRBV6-7 ENST00000390373|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTGATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>613|TRBV6-7 ENST00000631511|TRBV6-7|5'UTR|TR|TRB|None|00 +ATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>614|TRBV6-7 ENST00000631511|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTTATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>615|TRBV6-8 ENST00000390376|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCCGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>616|TRBV6-8 ENST00000632425|TRBV6-8|5'UTR|TR|TRB|None|00 +GAGAGTCCTGTTCCCCTTTTATCAATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>617|TRBV6-8 ENST00000632425|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCGGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>618|TRBV6-9 ENST00000634093|TRBV6-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACTTGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCGCATTCATTACTCAGTTGCTGCTGGTATCACTGACAAAGGAGAAGTCCCCGATGGCTACAATGTATCCAGATCAAACACAGAGGATTTCCCGCTCAGGCTGGAGTCAGCTGCTCCCTCCCAGACATCTGTATACTTCTGTGCCAGCAGTTATTC +>619|TRBV7-1 ENST00000632308|TRBV7-1|5'UTR|TR|TRB|None|00 +CTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>620|TRBV7-1 ENST00000632308|TRBV7-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGCTCCTCTGCTGGGCAGCCATATGTCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGTCCCTGAGACACAAGGTAGCAAAGAAGGGAAAGGATGTAGCTCTCAGATATGATCCAATTTCAGGTCATAATGCCCTTTATTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTCCAATTTACTTCCAAGGCAAGGATGCAGCAGACAAATCGGGGCTTCCCCGTGATCGGTTCTCTGCACAGAGGTCTGAGGGATCCATCTCCACTCTGAAGTTCCAGCGCACACAGCAGGGGGACTTGGCTGTGTATCTCTGTGCCAGCAGCTCAGC +>621|TRBV7-2 ENST00000631392|TRBV7-2|5'UTR|TR|TRB|None|00 +CCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>622|TRBV7-2 ENST00000631392|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>623|TRBV7-2 ENST00000634605|TRBV7-2|5'UTR|TR|TRB|None|00 +ACAGTGATCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>624|TRBV7-2 ENST00000634605|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>625|TRBV7-3 ENST00000390361|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>626|TRBV7-3 ENST00000390361|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAAGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAAAGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCCGCGTATCTCCGTGCCAGCAGCTTAAC +>627|TRBV7-3 ENST00000631882|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>628|TRBV7-3 ENST00000631882|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAATATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAACGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCGGGGGGACTCAGCCGTGTATCTCTGTGCCAGCAGCTTAAC +>629|TRBV7-4 ENST00000390369|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>630|TRBV7-4 ENST00000633313|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGTGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>631|TRBV7-6 ENST00000390374|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGTCCTGACCCTGCC +>632|TRBV7-6 ENST00000390374|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>633|TRBV7-6 ENST00000633265|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGGCCTGACCCTGCC +>634|TRBV7-6 ENST00000633265|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCGTCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>635|TRBV7-7 ENST00000631548|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>636|TRBV7-8 ENST00000632560|TRBV7-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCTAGGTACAAAGTCGCAAAGAGAGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTTTTGGTACCAACAGGCCCTGGGGCAGGGGCCAGAGTTTCTGACTTATTTCCAGAATGAAGCTCAACTAGACAAATCGGGGCTGCCCAGTGATCGCTTCTTTGCAGAAAGGCCTGAGGGATCCGTCTCCACTCTGAAGATCCAGCGCACACAGCAGGAGGACTCCGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>637|TRBV7-9 ENST00000612787|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGAACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>638|TRBV7-9 ENST00000632021|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGGACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>639|TRBV9 ENST00000390363|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>640|TRBV9 ENST00000390363|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCACTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>641|TRBV9 ENST00000633328|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>642|TRBV9 ENST00000633328|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCAGTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>643|TRDC ENST00000390477|TRDC|C-REGION|TR|TRD|None|00 +GAAGTCAGCCTCATACCAAACCATCCGTTTTTGTCATGAAAAATGGAACAAATGTCGCTTGTCTGGTGAAGGAATTCTACCCCAAGGATATAAGAATAAATCTCGTGTCATCCAAGAAGATAACAGAGTTTGATCCTGCTATTGTCATCTCTCCCAGTGGGAAGTACAATGCTGTCAAGCTTGGTAAATATGAAGATTCAAATTCAGTGACATGTTCAGTTCAACACGACAATAAAACTGTGCACTCCACTGACTTTGAAGTGAAGACAGATTCTACAGATCACGTAAAACCAAAGGAAACTGAAAACACAAAGCAACCTTCAAAGAGCTGCCATAAACCCAAAGCCATAGTTCATACCGAGAAGGTGAACATGATGTCCCTCACAGTGCTTGGGCTACGAATGCTGTTTGCAAAGACTGTTGCCGTCAATTTTCTCTTGACTGCCAAGTTATTTTTCTTG +>644|TRDD1 ENST00000415118|TRDD1|D-REGION|TR|TRD|None|00 +GAAATAGT +>645|TRDD2 ENST00000434970|TRDD2|D-REGION|TR|TRD|None|00 +CCTTCCTAC +>646|TRDD3 ENST00000448914|TRDD3|D-REGION|TR|TRD|None|00 +ACTGGGGGATACG +>647|TRDJ1 ENST00000390473|TRDJ1|J-REGION|TR|TRD|None|00 +ACACCGATAAACTCATCTTTGGAAAAGGAACCCGTGTGACTGTGGAACCAA +>648|TRDJ2 ENST00000390475|TRDJ2|J-REGION|TR|TRD|None|00 +CTTTGACAGCACAACTCTTCTTTGGAAAGGGAACACAACTCATCGTGGAACCAG +>649|TRDJ3 ENST00000390476|TRDJ3|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTCGGAACTGGCATCAAACTCTTCGTGGAGCCCC +>650|TRDJ4 ENST00000390474|TRDJ4|J-REGION|TR|TRD|None|00 +CCAGACCCCTGATCTTTGGCAAAGGAACCTATCTGGAGGTACAACAAC +>651|TRDV1 ENST00000390452|TRDV1|5'UTR|TR|TRD|None|00 +CAAAGAGCTACATGCCAC +>652|TRDV1 ENST00000390452|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTGTTCTCCAGCCTGCTGTGTGTATTTGTGGCCTTCAGCTACTCTGGATCAAGTGTGGCCCAGAAGGTTACTCAAGCCCAGTCATCAGTATCCATGCCAGTGAGGAAAGCAGTCACCCTGAACTGCCTGTATGAAACAAGTTGGTGGTCATATTATATTTTTTGGTACAAGCAACTTCCCAGCAAAGAGATGATTTTCCTTATTCGCCAGGGTTCTGATGAACAGAATGCAAAAAGTGGTCGCTATTCTGTCAACTTCAAGAAAGCAGCGAAATCCGTCGCCTTAACCATTTCAGCCTTACAGCTAGAAGATTCAGCAAAGTACTTTTGTGCTCTTGGGGAACT +>653|TRDV2 ENST00000390469|TRDV2|5'UTR|TR|TRD|None|00 +ATTAGCAGGCAGCAGGCCCTGCGAGCCTCCTGTGATCAGCTAGATTTCTCTGGGGAATGAAACAGCTGCTGATAGGGACTGACTTCCTCAGTCACAAGTGTTTCACAAGTGTGTTGGTTCAGAGGAGGGACCAGGCAGAAGGTGGTTGAGAGGCAGAGCTGCCCCTGAGTGAGCC +>654|TRDV2 ENST00000390469|TRDV2|L-REGION+V-REGION|TR|TRD|None|00 +ATGCAGAGGATCTCCTCCCTCATCCATCTCTCTCTCTTCTGGGCAGGAGTCATGTCAGCCATTGAGTTGGTGCCTGAACACCAAACAGTGCCTGTGTCAATAGGGGTCCCTGCCACCCTCAGGTGCTCCATGAAAGGAGAAGCGATCGGTAACTACTATATCAACTGGTACAGGAAGACCCAAGGTAACACAATGACTTTCATATACCGAGAAAAGGACATCTATGGCCCTGGTTTCAAAGACAATTTCCAAGGTGACATTGATATTGCAAAGAACCTGGCTGTACTTAAGATACTTGCACCATCAGAGAGAGATGAAGGGTCTTACTACTGTGCCTGTGACACC +>655|TRDV3 ENST00000535880|TRDV3|5'UTR|TR|TRD|None|00 +TCTTTCATTAGAACCGTCAGATAGTCTCTGAGATCTTAGGAACCCTGTTTTGTTGTATATCCTCTGCCCTGATATGAAGAAAAG +>656|TRDV3 ENST00000535880|TRDV3|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTACTGTGGGCTTTAGCTTTTTGTTTTTCTACAGGGGCACGCTGTGTGACAAAGTAACCCAGAGTTCCCCGGACCAGACGGTGGCGAGTGGCAGTGAGGTGGTACTGCTCTGCACTTACGACACTGTATATTCAAATCCAGATTTATTCTGGTACCGGATAAGGCCAGATTATTCCTTTCAGTTTGTCTTTTATGGGGATAACAGCAGATCAGAAGGTGCAGATTTTACTCAAGGACGGTTTTCTGTGAAACACATTCTGACCCAGAAAGCCTTTCACTTGGTGATCTCTCCAGTAAGGACTGAAGACAGTGCCACTTACTACTGTGCCTTTAG +>657|TRGC1 ENST00000443402|TRGC1|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCAATTGCTGAAACAAAGCTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCTGATGTTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAAAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAGTTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCATCACAATGGATCCCAAAGACAATTGTTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACATGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>658|TRGC2 ENST00000436911|TRGC2|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCGATTGCTGAAACAAAACTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCAGATATTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAGAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAATTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCACCACAGTGGATCCCAAATACAATTATTCAAAGGATGCAAATGATGTCATCACAATGGATCCCAAAGACAATTGGTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACACGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>659|TRGJ2 ENST00000390333|TRGJ2|J-REGION|TR|TRG|None|00 +GAATTATTATAAGAAACTCTTTGGCAGTGGAACAACACTTGTTGTCACAG +>660|TRGJP ENST00000390338|TRGJP|J-REGION|TR|TRG|None|00 +GGGCAAGAGTTGGGCAAAAAAATCAAGGTATTTGGTCCCGGAACAAAGCTTATCATTACAG +>661|TRGJP1 ENST00000390339|TRGJP1|J-REGION|TR|TRG|None|00 +ATACCACTGGTTGGTTCAAGATATTTGCTGAAGGGACTAAGCTCATAGTAACTTCACCTG +>662|TRGJP2 ENST00000390334|TRGJP2|J-REGION|TR|TRG|None|00 +ATAGTAGTGATTGGATCAAGACGTTTGCAAAAGGGACTAGGCTCATAGTAACTTCGCCTG +>663|TRGV1 ENST00000390348|TRGV1|5'UTR|TR|TRG|None|00 +TACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>664|TRGV1 ENST00000390348|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGATATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCTGACTGGGTCATCTGCTGAAATCACCTGTGATCTTCCTGGAGCAAGTACCTTATACATCCACTGGTACCTGCACCAGGAGGGGAAGGCCCCACAGTGTCTTCTGTACTATGAACCCTACTACTCCAGGGTTGTGCTGGAATCAGGAATCACTCCAGGAAAGTATGACACTGGAAGCACAAGGAGCAATTGGAATTTGAGACTGCAAAATCTAATTAAAAATGATTCTGGGTTCTATTACTGTGCCACCTGGGACAGG +>665|TRGV10 ENST00000390341|TRGV10|5'UTR|TR|TRG|None|00 +ACTTTCCTGCCTTCTCCTTGGGTACACCGCCCCGAAGACAGGATGTCACTGCTGGAAGCATTTGCCTTCTCCTCCTGGGCTCCTGAGTTGCTGTCCGAACATTTCAGTCTAGCTGCGTGACCAAAATCATTCTTCAATGTTTCCCTCTTCTACTGTCAG +>666|TRGV10 ENST00000390341|TRGV10|L-REGION+V-REGION|TR|TRG|None|00 +ATGTTCATTGGAAATTCTCCTCTTTTACTTACAGTTGGACTTGGATTATCAAAAGTGGAGCAGTTCCAGCTATCCATTTCCACGGAAGTCAAGAAAAGTATTGACATACCTTGCAAGATATCGAGCACAAGGTTTGAAACAGATGTCATTCACTGGTACCGGCAGAAACCAAATCAGGCTTTGGAGCACCTGATCTATATTGTCTCAACAAAATCCGCAGCTCGACGCAGCATGGGTAAGACAAGCAACAAAGTGGAGGCAAGAAAGAATTCTCAAACTCTCACTTCAATCCTTACCATCAAGTCCGTAGAGAAAGAAGACATGGCCGTTTACTACTGTGCTGCGTGGGATTA +>667|TRGV2 ENST00000426402|TRGV2|5'UTR|TR|TRG|None|00 +GGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCCCTCTGCTTGTGTCTCAGGAAGACCACCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGAACCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>668|TRGV2 ENST00000426402|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTAACGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCAGTACTATGACTCCTACAACTCCAAGGTTGTGTTGGAATCAGGAGTCAGTCCAGGGAAGTATTATACTTACGCAAGCACAAGGAACAACTTGAGATTGATACTGCGAAATCTAATTGAAAATGACTTTGGGGTCTATTACTGTGCCACCTGGGACGGG +>669|TRGV3 ENST00000390346|TRGV3|5'UTR|TR|TRG|None|00 +CTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGTCTCAGGAAACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCGTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>670|TRGV3 ENST00000390346|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCAGACTGGGTCATCTGCTGAAATCACTTGCGATCTTACTGTAACAAATACCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCACCGCAAGGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGAGACTGCAAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>671|TRGV4 ENST00000390345|TRGV4|5'UTR|TR|TRG|None|00 +GGCCTGAGCTCTCCTGGCCCCTGGCTCTCTTCTGCAGAGGGCCTGCTCTCAGCTGCCACAAGAGGGCGCCGGAGAACGGACCTGAGCAAGAGAGGCAGGAGCTCCTCTGCAGGTCCTCCCAGGCACCAATCCTTCTGGGAGGGAGGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCTCTCTGCTTGTGTCTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCTCAGAGAGGAAGGC +>672|TRGV4 ENST00000390345|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTACCGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACACCTCCAGCGTTGTGTTGGAATCAGGAATCAGCCCAGGGAAGTATGATACTTACGGAAGCACAAGGAAGAACTTGAGAATGATACTGCGAAATCTTATTGAAAATGACTCTGGAGTCTATTACTGTGCCACCTGGGATGGG +>673|TRGV5 ENST00000390344|TRGV5|5'UTR|TR|TRG|None|00 +TTCTGGGAGGAAGGCTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGACTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCGGAGTTTTAAGAGGATCTTCTGCTCCTCCTCATCTGGTCCCTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>674|TRGV5 ENST00000390344|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGGGAACGAAGTCAGTCACGAGGCCGACTAGGTCATCTGCTGAAATCACTTGTGACCTTACTGTAATAAATGCCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCAACTCAAAGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGATACTACGAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>675|TRGV8 ENST00000390343|TRGV8|5'UTR|TR|TRG|None|00 +CTACTGTCTTCTGTGTTAGGGATCACTTCCTTGTTGAGTGGGACCTGAGTTTTGAGAGGGTCTTCTGCTCCTCTTCGTCTGGTCCCTTACTTCCAAGACCCCAGAGAGGAAGGC +>676|TRGV8 ENST00000390343|TRGV8|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTTGGCTCTAGCTCTGCTTCTAGCTTTCCTGCCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACAAAGTCAGTCACCAGGCCAACTGGGTCATCAGCTGTAATCACTTGTGATCTTCCTGTAGAAAATGCCGTCTACACCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACAACTCCAGGGTTGTGTTGGAATCAGGAATCAGTCGAGAAAAGTATCATACTTATGCAAGCACAGGGAAGAGCCTTAAATTTATACTGGAAAATCTAATTGAACGTGACTCTGGGGTCTATTACTGTGCCACCTGGGATAGG +>677|TRGV9 ENST00000444775|TRGV9|5'UTR|TR|TRG|None|00 +AAAAAAATTCAAGTCAATCCATAGAAGTGGGTCGTGGAATTCCAGGCAGAAAGTGACTAAATGAAGATGGAAGGACAGGGAGGGGGTGGCCACATCACAGAGAACCTCTTATCCTAAGAACTCTGGACTTCATCTTCAGAGGCAAGGTAGAGAGAGCAAGGACTTTAGAGCAGGAAAAGGACCAGGTCAGTCTAGTGGCCATGGGGAAGGTGGGTGGGAGGGGCCGAGATGGGATGTATGGAGGTGCGTGAGGTGGAGGCAGTGGTGAGCCAGGAAATGTTTAGGACGTAGAATCCTCAGGAATTAGAGTGCGGTGAATTAGAGGGGAGAATTGAGGCTGATGCTCAAGCTCCTGGCTTGGGCAATGTGGGTAGTTATGTCATACAGGGAACTCGGAAGAAGATATGGTTTGGGGGAAGGGAATGAGTTCACTCTGGCTATGAGCAGACTTTGTTTGAGATCCCATGTCAGACGTACTTGAAAATGTCCAAGAGTTAGCTGGATATGGGTACAGACAGCTTTCGATTTAACTGAGGTCCGACTTAAGATTTTTTTTTACTTTATGATGGTGCAAAAGTGACACGCATTTGGTAGAAAACATAATTTGACCTTTGCTGTTTCCCCAGGACAGTGATATAAGGTTATGATACTCTCTTGCGATGCTGGGCAGTGGCAGTGAGCTGCAGCTCCCAGTGGGTAAATTAAGCATGGAAATCTGGAACACAGCAGCTTTTAAGGGATGCACTGGGGAGAGCAGTTTGTAAAAATACCTTGGGACGGATTAAATGTCTTGGCTTAGAGAAAGAACAACAGACAATAGGAAACTGTCATTGAGGAGAAGCCGGGATTCAGGAGATGTACATTATTCAGGTAGCTGAGGGAGGGGACAGGAACCTGAATCTTCAACAGAAGCAAACAAACTGGGATGGAGGGCCCAGCCTCATGAAGGTGACCAGAAGGACCCGGTGCTGCAGGCTGTGTGGGTAGCTGAGCAGAGCTAAGCGGCTTGACGGACCAACATCTCTCCAGCTGGTTGAAGACAAGCTCTCAGAAGACAATGCTGCATGTCACAGCCCCAGCAACCAACAACACCAGCCTGACAACTTGCTGGGGTGGCCGCCTTGTGGTCTGAGGTGGCCGTCTAAACTATGTGGTCTGATCTCAGGCTGCAGACCTTGCAGGACTGTCTTCACACAGACTGGAAGTGCTAACAGGTGGTGAGGACACCGCTTTACAACGATGCAGGGGGCCCCATGTCACCCTCACCCATGGGAAGTTTGACTTGGTGGACTCAGCCAAGCCACAGAGGTCTAACGCTTCTCTGCGGTGATTTCAGGCTGCCCTGGCAGAAAGCACAGTGCCTGCAGAC +>678|TRGV9 ENST00000444775|TRGV9|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTCACTGCTCCACACATCAACGCTGGCAGTCCTTGGGGCTCTGTGTGTATATGGTGCAGGTCACCTAGAGCAACCTCAAATTTCCAGTACTAAAACGCTGTCAAAAACAGCCCGCCTGGAATGTGTGGTGTCTGGAATAACAATTTCTGCAACATCTGTATATTGGTATCGAGAGAGACCTGGTGAAGTCATACAGTTCCTGGTGTCCATTTCATATGACGGCACTGTCAGAAAGGAATCCGGCATTCCGTCAGGCAAATTTGAGGTGGATAGGATACCTGAAACGTCTACATCCACTCTCACCATTCACAATGTAGAGAAACAGGACATAGCTACCTACTACTGTGCCTTGTGGGAGGTG +>679|TRBD2 GRCh38-release94|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTAGCGGGAGGG +>680|TRAJ15 GRCh38-release94|TRAJ15|J-REGION|TR|TRA|None|00 +CCAACCAGGCAGGAACTGCTCTGATCTTTGGGAAGGGAACCACCTTATCAGTGAGTTCCA +>681|IGLV6-57 GRCh38-release94|IGLV6-57|5'UTR|IG|IGL|None|00 +TCTGAGGATACGCGTGACAGATAAGAAGGGCTGGTGGGATCAGTCCTGGTGGTAGCTCAGGAAGCAGAGCCTGGAGCATCTCCACT +>682|TRBV11-2 GRCh38-release94|TRBV11-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCGGCCCTCTGTCTCCTGGGAGCAGAACTCACAGAAGCTGGAGTTGCCCAGTCTCCCAGATATAAGATTATAGAGAAAAGGCAGAGTGTGGCTTTTTGGTGCAATCCTATATCTGGCCATGCTACCCTTTACTGGTACCAGCAGATCCTGGGACAGGGCCCAAAGCTTCTGATTCAGTTTCAGAATAACGGTGTAGTGGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAACCTGCAAAGCTTGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGC +>683|IGKV2D-40 GRCh38-release94|IGKV2D-40|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTC +>684|TRGV11 AC244625.2|TRGV11|L-REGION+V-REGION|TR|TRG|None|00 +ATGCCACTGGTAGTAGCTGTTATCTTCTTCTCCCTCTGGGTTTTTGCACTTGGGCAGTTGGAACAACCTGAAATATCTATTTCCAGACCAGCAAATAAGAGTGCCCACATATCTTGGAAGGCATCCATCCAAGGCTTTAGCAGTAAAATCATACACTGGTACTGGCAGAAACCAAACAAAGGCTTAGAATATTTATTACATGTCTTCTTGACAATCTCTGCTCAAGATTGCTCAGGTGGGAAGACTAAGAAACTTGAGGTAAGTAAAAATGCTCACACTTCCACTTCCACTTTGAAAATAAAGTTCTTAGAGAAAGAAGATGAGGTGGTGTACCACTGTGCCTGCTGGATTAGGCAC +>685|IGHV1-8 AC_000146.1|IGHV1-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAAGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCAGTTATGATATCAACTGGGTGCGACAGGCCACTGGACAAGGGCTTGAGTGGATGGGATGGATGAACCCTAACAGTGGTAACACAGGCTATGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGAACACCTCCATAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGG +>686|IGHJ6 GRCh38-release94|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACGGTATGGACGTCTGGGGCCAAGGGACCACGGTCACCGTCTCCTCAG +>687|TRBV20-1 GRCh38-release94|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>688|TRBV7-7 GRCh38-release94|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATTCTGTTTCCACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>689|IGHV3-9 GRCh38-release94|IGHV3-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGACTGAGCTGGATTTTCCTTTTGGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGCAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATGCCATGCACTGGGTCCGGCAAGCTCCAGGGAAGGGCCTGGAGTGGGTCTCAGGTATTAGTTGGAATAGTGGTAGCATAGGCTATGCGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACACGGCCTTGTATTACTGTGCAAAAGATA +>690|IGHV4-30-4 GRCh38-release94|IGHV4-30-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGATTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCAGACACGGCCGTGTATTACTGT +>691|IGKV1-NL1 GRCh38-release94|IGKV1-NL1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGCTCTATGCTGCATCCAGATTGGAAAGTGGGGTCCCATCCAGGTTCAGTGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGT +>692|IGHV4-38-2 GRCh38-release94|IGHV4-38-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGCACCTGTGGTTTTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTTACTCCATCAGCAGTGGTTACTACTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCCGTGTATTACTGT diff --git a/lib/rust/vdj_ann_ref/vdj_refs/mouse/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs/mouse/fasta/regions.fa new file mode 100644 index 0000000..fdf09a6 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs/mouse/fasta/regions.fa @@ -0,0 +1,1310 @@ +>1|IGHA ENSMUST00000178282|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGGTAAACCCACCAATGTCAGCGTGTCTGTGATCATGTCAGAGGGAGATGGCATCTGCTAC +>2|IGHA ENSMUST00000194738|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGAACGTCAAGAGCCACTTTCCTATGTGCTACTGGACCAGTCAGAAGACATCCTGGAGGAAGAGGCCCCAGGTGCCAGCCTGTGGCCCACCACTGTGACCTTCCTCACCCTCTTCCTACTGAGCTTGTTCTACAGCACAGCACTCACTGTTACAACTGTTCGAGGCCCGTTTGGCAGCAAAGAGGTCCCCCAGTAC +>3|IGHD ENSMUST00000192250|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGATGCTACCACCTCCTGCCTGAGTCAGACGGTCCTTCCAGGAGACCTGATGGTCCTGCCCTTGCC +>4|IGHD ENSMUST00000194162|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGCATAGTCAACACCATCCAACACTCGTGTATCATGGATGAGCAAAGTGACAGCTACATGGACTTAGAGGAGGAGAACGGCCTGTGGCCCACAATGTGCACCTTCGTGGCCCTCTTCCTGCTCACACTGCTCTACAGTGGCTTCGTCACCTTCATCAAGGTGAAG +>5|IGHD1-1 ENSMUST00000103439|IGHD1-1|D-REGION|IG|IGH|None|00 +TTTATTACTACGGTAGTAGCTAC +>6|IGHD2-3 ENSMUST00000177839|IGHD2-3|D-REGION|IG|IGH|None|00 +TCTATGATGGTTACTAC +>7|IGHD2-4 ENSMUST00000179560|IGHD2-4|D-REGION|IG|IGH|None|00 +TCTACTATGATTACGAC +>8|IGHD2-6 ENSMUST00000178230|IGHD2-6|D-REGION|IG|IGH|None|00 +CCTACTATAGTAACTAC +>9|IGHD2-7 ENSMUST00000177965|IGHD2-7|D-REGION|IG|IGH|None|00 +TCTACTATGGTTACGAC +>10|IGHD2-8 ENSMUST00000180001|IGHD2-8|D-REGION|IG|IGH|None|00 +TCTACTATGGTAACTAC +>11|IGHD3-1 ENSMUST00000180266|IGHD3-1|D-REGION|IG|IGH|None|00 +GGCACAGCTCGGGCTAC +>12|IGHD3-2 ENSMUST00000179883|IGHD3-2|D-REGION|IG|IGH|None|00 +AGACAGCTCAGGCTAC +>13|IGHD4-1 ENSMUST00000179520|IGHD4-1|D-REGION|IG|IGH|None|00 +CTAACTGGGAC +>14|IGHD5-5 ENSMUST00000178815|IGHD5-5|D-REGION|IG|IGH|None|00 +GACTACCTAC +>15|IGHD5-6 ENSMUST00000195858|IGHD5-6|D-REGION|IG|IGH|None|00 +GAATACCTAC +>16|IGHD5-7 ENSMUST00000178483|IGHD5-7|D-REGION|IG|IGH|None|00 +AGGCAGCTAGCCTCTGCAGTGCCACAACC +>17|IGHD5-8 ENSMUST00000178909|IGHD5-8|D-REGION|IG|IGH|None|00 +AGACAGCTAGCCTCTGCAGTGCCACAACC +>18|IGHE ENSMUST00000137336|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGGTAACACCTCCCTCCATCCCTCC +>19|IGHE ENSMUST00000223335|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGAGCTAGACCTCCAGGACCTATGTATTGAAGAGGTGGAGGGCGAGGAGCTGGAAGAGCTGTGGACCAGTATTTGTGTCTTCATCACCCTGTTCCTGCTCAGTGTGAGCTATGGGGCCACTGTCACCGTCCTCAAGGTGAAGTGGGTCTTCTCCACACCGATGCAGGATACACCCCAGACCTTCCAAGACTATGCCAACATCTTCCAGACCAGGGCA +>20|IGHG1 ENSMUST00000103420|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGTAAA +>21|IGHG1 ENSMUST00000194304|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGGCTGCAACTGGACGAGACCTGTGCTGAGGCCCAGGACGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGTGTGTGCTACAGCGCTGCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCGGTGGTGGAGCTGAAGCAGACACTGGTTCCTGAATACAAGAACATGATTGGGCAAGCACCC +>22|IGHG2B ENSMUST00000103418|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>23|IGHG2B ENSMUST00000192188|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGGCTAGACCTGGATGATATCTGTGCTGAGGCCAAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCAGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>24|IGHG2C ENSMUST00000103416|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGGCTAGACCTGGATGATGTCTGTACTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACAACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGTTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCTGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>25|IGHG2C ENSMUST00000195192|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGTAAA +>26|IGHG3 ENSMUST00000103423|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGGTAAA +>27|IGHG3 ENSMUST00000223179|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGAGCTGGAACTGAATGAGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>28|IGHJ1 ENSMUST00000103430|IGHJ1|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATGTCTGGGGCACAGGGACCACGGTCACCGTCTCCTCAG +>29|IGHJ2 ENSMUST00000192746|IGHJ2|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAAGGCACCACTCTCACAGTCTCCTCAG +>30|IGHJ3 ENSMUST00000103428|IGHJ3|J-REGION|IG|IGH|None|00 +CCTGGTTTGCTTACTGGGGCCAAGGGACTCTGGTCACTGTCTCTGCAG +>31|IGHJ4 ENSMUST00000103427|IGHJ4|J-REGION|IG|IGH|None|00 +ATTACTATGCTATGGACTACTGGGGTCAAGGAACCTCAGTCACCGTCTCCTCAG +>32|IGHM ENSMUST00000103426|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGGTAAACCCACACTGTACAATGTCTCCCTGATCATGTCTGACACAGGCGGCACCTGCTAT +>33|IGHM ENSMUST00000177715|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGAGGGGGAGGTGAATGCTGAGGAGGAAGGCTTTGAGAACCTGTGGACCACTGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGCACCACCGTCACCCTGTTCAAGGTGAAA +>34|IGHV1-11 ENSMUST00000191801|IGHV1-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCCAGATCACCCTCTTTCTGGTGGCAGCAATTACATGTGCCTACTCCCAGATCCAGCTGCAACAGTCAGGAGCTGAGCTGGCGAGTCCTGGGGCATCAGTGACACTGTCCTGCAAGGCTTCTGGCTACACATTTACTGACCATATTATGAATTGGGTAAAAAAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAGGATTTATCCAGTAAGTGGTGAAACTAACTACAATCAAAAGTTCATGGGCAAGGCCACATTCTCTGTAGACCGGTCCTCCAGCACAGTGTACATGGTGTTGAACAGCCTGACATCTGAGGACCCTGCTGTCTATTACTGTGGAAGG +>35|IGHV1-12 ENSMUST00000109711|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>36|IGHV1-12 ENSMUST00000109711|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>37|IGHV1-12 ENSMUST00000195469|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>38|IGHV1-12 ENSMUST00000195469|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGCTTATCTACAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTTACCAGTTACAATATGCACTGGGTAAAGCAGACACCTAGACAGGGCCTGGAATGGATTGGAGCTATTTATCCAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>39|IGHV1-15 ENSMUST00000192077|IGHV1-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAATTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGACGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGGGTGAAGCAGACACCTGTGCATGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTGGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCATACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>40|IGHV1-18 ENSMUST00000194350|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCCTCTTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATACCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGGACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTATCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACACTGCAGTCTATTACTGTGCAAGA +>41|IGHV1-19 ENSMUST00000193855|IGHV1-19|5'UTR|IG|IGH|None|00 +AACAACACATGTCCAATGTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>42|IGHV1-19 ENSMUST00000193855|IGHV1-19|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGTAAGGCTTCTGGATACACATTCACTGACTACTATATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGTTATTAATCCTTACAACGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTTGACAAGTCCTCCAGCACAGCCTACATGGAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>43|IGHV1-20 ENSMUST00000194968|IGHV1-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGCAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGATTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGATGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCGGAGCCTGACATCTGAGGACTCTGCAGTCTATTATTGTGCAAGA +>44|IGHV1-22 ENSMUST00000103507|IGHV1-22|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGAAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTAACCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAAACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCGGAGGATTCTGCAGTCTATTACTGTGCAAGA +>45|IGHV1-23 ENSMUST00000194625|IGHV1-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGTGTGAAGCAGACACCTGTGCACGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTTGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>46|IGHV1-24 ENSMUST00000191861|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCGGCTGCAGCAGTCTGGACCTAAGGTAGTGAATGCTGGGGCTTCCGTGAAGCTGTCCTGCAAGTCTTCTGGTTACTCATTCAGTAGATACAAAATGGAATGTGTGAAACAGAGCCATGGAAAGAGCCTTGAGTGGATTGAACATATTAATCTTTTCAAAGGTGTTACTAACTACAATGGAAAGTTCAAAAGCAAGGCCACATTGACTGTAGACATATCCTCTAGCACAGCCTATATGGAGCTTAGCAGATTGACATCTGAAGACTCAGAGGTATATTACTGTGCAAGA +>47|IGHV1-26 ENSMUST00000103510|IGHV1-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAATCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATACACGTTCACTGACTACTACATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>48|IGHV1-31 ENSMUST00000195735|IGHV1-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTATCTGGATCTTTCTCTTCCTTCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAGAGCCATGGAAATATCCTCGATTGGATTGGATATATTTATCCTTACAATGGTGTTTCTAGCTACAACCAGAAATTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCTAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>49|IGHV1-34 ENSMUST00000103512|IGHV1-34|5'UTR|IG|IGH|None|00 +GTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>50|IGHV1-34 ENSMUST00000103512|IGHV1-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGTTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTTATCCTAACAATGGTGGTAATGGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>51|IGHV1-36 ENSMUST00000191862|IGHV1-36|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGCCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATTCACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACTTGTTTATCCTTACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGGAGCTAAACAGCCTGACTTCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>52|IGHV1-37 ENSMUST00000193950|IGHV1-37|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGTAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCTGAGCCTGACATCTGAGGACTTTGCAGTCTATTATTGTGCAAGA +>53|IGHV1-39 ENSMUST00000103515|IGHV1-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTCTCAGGAACTGCAGGTGTCCACTCTGAGTTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGCGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGACTACAACATGAACTGGGTGAAGCAGAGCAATGGAAAGAGCCTTGAGTGGATTGGAGTAATTAATCCTAACTATGGTACTACTAGCTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACCAATCTTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>54|IGHV1-4 ENSMUST00000103493|IGHV1-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTTCCTGTTGTCAGTAACTTCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAGACCTGGTGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACACGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTGAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>55|IGHV1-42 ENSMUST00000191868|IGHV1-42|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAACTGGATCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGAACTGGGTGAAGCAAAGTCCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTACCTACAACCAGAAGTTCAAGGCCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>56|IGHV1-43 ENSMUST00000195417|IGHV1-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCAAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAAAGTTCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTAACTGTAGACAAGTCATCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCTGTCTATTACTGTGCAAGA +>57|IGHV1-47 ENSMUST00000194865|IGHV1-47|5'UTR|IG|IGH|None|00 +ATAAGATCAGTCTTCTCTATAATCACTGAGTGCAGAGGACCTCACA +>58|IGHV1-47 ENSMUST00000194865|IGHV1-47|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCGTGGATCTCTATCATCCTCTTCCTAGTGGCAACAGCTATAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTAGTGAAGCCTGGAGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACTACCTATCCTATAGAGTGGATGAAGCAGAATCATGGAAAGAGCCTAGAGTGGATTGGAAATTTTCATCCTTACAATGATGATACTAAGTACAATGAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGAAAAATCCTCTAGCACAGTCTACTTGGAGCTCAGCCGATTAACATCTGATGACTCTGCTGTTTATTACTGTGCAAGG +>59|IGHV1-49 ENSMUST00000192724|IGHV1-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGGTCTTTCTCTTCCTCCTGTCAGGAACTGCAGGAGTCCACTCACAGCGTGAGCTGCAGCAGTCTGGAGCTGAGTTGGTGAGACCTGGGTCCTCAGTGAAGTTGTCCTGCAAGGATTCTTACTTTGCCTTCATGGCCAGTGCTATGCACTGGGTGAAGCAAAGACCTGGACATGGCCTGGAATGGATAGGATCTTTTACTATGTACAGTGATGCTACTGAGTACAGTGAAAACTTCAAGGGCAAGGCCACATTGACTGCAAACACATCCTCGAGCACAGCCTACATGGAACTCAGCAGCCTCACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>60|IGHV1-5 ENSMUST00000191803|IGHV1-5|5'UTR|IG|IGH|None|00 +GATCAGTATCCTCTTCACAGTCACTGAAAACATTGACTCTAATC +>61|IGHV1-5 ENSMUST00000191803|IGHV1-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTAACTGGATACTTCCTTTTATTCTGTCGGTAACTTCAGGGGTCTACTCAGAGGTTCAGCTCCAGCAGTCTGGGACTGTGCTGGCAAGGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGACTTCTGGCTACACATTTACCAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATAGGGGCTATTTATCCTGGAAATAGTGATACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCAAACTGACTGCAGTCACATCCGCCAGCACTGCCTACATGGAGCTCAGCAGCCTGACAAATGAGGACTCTGCGGTCTATTACTGTACAAGA +>62|IGHV1-50 ENSMUST00000103521|IGHV1-50|5'UTR|IG|IGH|None|00 +CTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCGCC +>63|IGHV1-50 ENSMUST00000103521|IGHV1-50|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCTCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGCTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>64|IGHV1-52 ENSMUST00000192554|IGHV1-52|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCATTGGGTGAAGCAGAGGCCTATACAAGGCCTTGAATGGATTGGTAACATTGACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>65|IGHV1-53 ENSMUST00000103523|IGHV1-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGACTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAAATATTAATCCTAGCAATGGTGGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>66|IGHV1-54 ENSMUST00000103525|IGHV1-54|5'UTR|IG|IGH|None|00 +AGTCCCTGAACACACTGACTCTCACC +>67|IGHV1-54 ENSMUST00000103525|IGHV1-54|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCAGAGTCTTTATCTTTCTCCTATCAGTAACTGCAGGTGTTCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGATACGCCTTCACTAATTACTTGATAGAGTGGGTAAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGTGATTAATCCTGGAAGTGGTGGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCAACACTGACTGCAGACAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>68|IGHV1-55 ENSMUST00000103526|IGHV1-55|5'UTR|IG|IGH|None|00 +CACCACACAAAAAAGCATAAGATCACTGTTCTCTCTACAGTTACTAAGCACACAGGATCTCACC +>69|IGHV1-55 ENSMUST00000103526|IGHV1-55|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCATTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATAACCTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAGATATTTATCCTGGTAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>70|IGHV1-56 ENSMUST00000194071|IGHV1-56|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGTTGGGTCTTTCTTTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTCCTGGCTATACCTTCACCAGCCACTGGATGCAGTGGGTAAGACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>71|IGHV1-58 ENSMUST00000103529|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGATCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTCCAGCTTCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGTCCTCAGTGAAGATGTCCTGCAAGACTTCTGGATATACATTCACAAGCTACGGTATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTGGAATGGATTGGATATATTTATATTGGAAATGGTTATACTGAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTTCAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAATCTATTTCTGTGCAAGA +>72|IGHV1-59 ENSMUST00000195359|IGHV1-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATTGTCCTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGACTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTAAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGTGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>73|IGHV1-61 ENSMUST00000103531|IGHV1-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGGATTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAATGGATTGGTAACATTTACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>74|IGHV1-62-1 ENSMUST00000103503|IGHV1-62-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACAGAGTTGGGTCTTACTCTTCCTCCTGTCAGAAACTGCAGGTGTCCACTGCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACAGCAGAGAACTCTGCAATCTATCTGTGCAAGG +>75|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|5'UTR|IG|IGH|None|00 +GAACACACTGACTCAAACC +>76|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>77|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>78|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTTCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCAGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>79|IGHV1-63 ENSMUST00000103534|IGHV1-63|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCGGGGTCTTTATCTTTCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACCTTCACTAACTACTGGATAGGTTGGGCAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGATATTTACCCTGGAGGTGGTTATACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGTTCAGCAGCCTGACATCTGAGGACTCTGCCATCTATTACTGTGCAAGA +>80|IGHV1-64 ENSMUST00000103535|IGHV1-64|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACAGTTCTCTCTACAGTTACTGAGCACACAGGACCTCACA +>81|IGHV1-64 ENSMUST00000103535|IGHV1-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTATATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTAAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACTTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAATGATTCATCCTAATAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>82|IGHV1-66 ENSMUST00000103537|IGHV1-66|5'UTR|IG|IGH|None|00 +ATGATCAGTGTCCTCTCTACACAGTCCCTGACGACACTGACTCTAACC +>83|IGHV1-66 ENSMUST00000103537|IGHV1-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACAGCTTCACAAGCTACTATATACACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGTGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACGGCAGACACATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTAACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>84|IGHV1-69 ENSMUST00000199933|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGATGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGTCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>85|IGHV1-7 ENSMUST00000103496|IGHV1-7|5'UTR|IG|IGH|None|00 +GCATCCTCTCCACAGACACTGAAAACTCTGACTCAAC +>86|IGHV1-7 ENSMUST00000103496|IGHV1-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTCCCTGTTGTCAGTAATAGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAAACCTGGGGCCTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTGAGCAGCCTGACATATGAGGACTCTGCAGTCTATTACTGTGCAAGA +>87|IGHV1-71 ENSMUST00000196690|IGHV1-71|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>88|IGHV1-72 ENSMUST00000103541|IGHV1-72|5'UTR|IG|IGH|None|00 +AGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>89|IGHV1-72 ENSMUST00000103541|IGHV1-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>90|IGHV1-74 ENSMUST00000196587|IGHV1-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGCCAAGGCCTTGAGTGGATTGGAAGGATTCATCCTTCTGATAGTGATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAATA +>91|IGHV1-75 ENSMUST00000103544|IGHV1-75|5'UTR|IG|IGH|None|00 +CCTGACGACACTGACTCTAACC +>92|IGHV1-75 ENSMUST00000103544|IGHV1-75|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTACAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTTTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTTACTGTAGACAAATCCTCCAGCACAGCCTACATGTTGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>93|IGHV1-76 ENSMUST00000197537|IGHV1-76|5'UTR|IG|IGH|None|00 +CGACACTGATTCTAACC +>94|IGHV1-76 ENSMUST00000197537|IGHV1-76|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTGTCAGGTCCAGCTGAAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACTTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGCAAGGATTTATCCTGGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGAAAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCTGTCTATTTCTGTGCAAGA +>95|IGHV1-77 ENSMUST00000198777|IGHV1-77|5'UTR|IG|IGH|None|00 +AAACAACCTATGATCAGTGTCCTCTCCACAGTCTCTGAACACCCTTACTCAAACC +>96|IGHV1-77 ENSMUST00000198777|IGHV1-77|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTCCAGCTGAAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAAGATTGGTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>97|IGHV1-78 ENSMUST00000199373|IGHV1-78|5'UTR|IG|IGH|None|00 +GTCCCTGAACACACTGACTGTAACA +>98|IGHV1-78 ENSMUST00000199373|IGHV1-78|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTCTCTCTTCTTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGTTCAGCTGCAACAGTCTGACGCTGAGTTGGTGAAACCTGGAGCTTCAGTGAAGATATCCTGCAAGGTTTCTGGCTACACCTTCACTGACCATACTATTCACTGGATGAAGCAGAGGCCTGAACAGGGCCTGGAATGGATTGGATATATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>99|IGHV1-80 ENSMUST00000103547|IGHV1-80|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTTGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAAGCTTCTGGCTACGCATTCAGTAGCTACTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACAGATTTATCCTGGAGATGGTGATACTAACTACAACGGAAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>100|IGHV1-81 ENSMUST00000103548|IGHV1-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGATCTTTCTCTTCATCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGGCGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTATGGTATAAGCTGGGTGAAGCAGAGAACTGGACAGGGCCTTGAGTGGATTGGAGAGATTTATCCTAGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCGTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>101|IGHV1-82 ENSMUST00000196991|IGHV1-82|5'UTR|IG|IGH|None|00 +CTTCTCCACAGTCCCAGAACACACTCACTCTAACC +>102|IGHV1-82 ENSMUST00000196991|IGHV1-82|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTGTATCTTTCTCTTCCTCCTGTCAGTAACTGAAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAGGCTTCTGGCTACGCATTCAGTAGCTCCTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACGGATTTATCCTGGAGATGGAGATACTAACTACAATGGGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTACTTCTGTGCAAGA +>103|IGHV1-84 ENSMUST00000103551|IGHV1-84|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTTTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGATCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGCGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>104|IGHV1-85 ENSMUST00000103552|IGHV1-85|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTACGATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCGTACATGGAGCTCCACAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>105|IGHV1-9 ENSMUST00000193893|IGHV1-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGACCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGATGAAGCCTGGGGCCTCAGTGAAGCTTTCCTGCAAGGCTACTGGCTACACATTCACTGGCTACTGGATAGAGTGGGTAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGAGATTTTACCTGGAAGTGGTAGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACATTCACTGCAGATACATCCTCCAACACAGCCTACATGCAACTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>106|IGHV10-1 ENSMUST00000103492|IGHV10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGCTGTTGGGGCTGAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGGTCATTGAAACTCTCATGTGCAGCCTCTGGATTCAGCTTCAATACCTACGCCATGAACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAATAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCAGAAAGCATGCTCTATCTGCAAATGAACAACTTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGACA +>107|IGHV10-3 ENSMUST00000103495|IGHV10-3|5'UTR|IG|IGH|None|00 +GACAATATAACATTGAAC +>108|IGHV10-3 ENSMUST00000103495|IGHV10-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGTGTTGGGGCTTAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGATCATTGAAACTCTCATGTGCCGCCTCTGGTTTCACCTTCAATACCTATGCCATGCACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAGTAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCACAAAGCATGCTCTATCTGCAAATGAACAACCTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGAGA +>109|IGHV11-1 ENSMUST00000103466|IGHV11-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGAAGGCTTGGTGCCACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGCTTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCTGAGGACACAGCCACGTATTTCTGTATGAGATA +>110|IGHV11-2 ENSMUST00000103468|IGHV11-2|5'UTR|IG|IGH|None|00 +ATGCAAATAGGGCCTCTTTCTACTCATGAAACGCAGACCAACCTATCCTTGCAGTTCAGACAGAGGAGCTTGGCTCTGGTTCCCAAGACCTCTTACTCACTTCTCAAC +>111|IGHV11-2 ENSMUST00000103468|IGHV11-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGGAGGCTTGGTGCAACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGATTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCGGAGGACACAGCCACGTATTTCTGTATGAGATA +>112|IGHV12-3 ENSMUST00000103485|IGHV12-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGCTGGGATTTGTGTGCCTGGTGACAGTCCTTCCTGGTAGCCTGTCTCAGATGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCCTCACAGTCACTCTTCCTTACCTGCTCTATTACTGGTTTCCCCATCACCAGTGGTTACTACTGGATCTGGATCCGTCAGTCACCTGGGAAACCCCTAGAATGGATGGGGTACATCACTCATAGTGGGGAAACTTTCTACAACCCATCTCTCCAGAGCCCCATCTCCATTACTAGAGAAACGTCAAAGAACCAGTTCTTCCTCCAATTGAACTCTGTGACCACAGAGGACACAGCCATGTATTACTGTGCAGGAGACAG +>113|IGHV13-2 ENSMUST00000125484|IGHV13-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGACTGAGCTGGGTATTTCTTGTGGCTCTTTTGAACGGTGTCCAGTGTCAGGTGCAGCTTGTAGAGACCGGGGGAGGCTTGGTGAGGCCTGGAAATTCTCTGAAACTCTCCTGTGTTACCTCGGGATTCACTTTCAGTAACTACCGGATGCACTGGCTTCGCCAGCCTCCAGGGAAGAGGCTGGAGTGGATTGCTGTAATTACAGTCAAATCTGATAATTATGGAGCAAATTATGCAGAGTCTGTGAAAGGCAGATTCGCCATTTCAAGAGATGATTCAAAAAGCAGTGTCTACCTAGAGATGAACAGATTAAGAGAGGAAGACACTGCCACTTATTTTTGTAGTAGACA +>114|IGHV14-1 ENSMUST00000103463|IGHV14-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGATACTGAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATGACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>115|IGHV14-2 ENSMUST00000103467|IGHV14-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGATCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAAGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGACTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGAAACTAAATATGCCCCGAAATTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTGCTAGA +>116|IGHV14-3 ENSMUST00000103469|IGHV14-3|5'UTR|IG|IGH|None|00 +ATATGAGCCCTATATTCTCTACAGACACTGAATCTCAAGGTCCTTACA +>117|IGHV14-3 ENSMUST00000103469|IGHV14-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATTCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGTGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAAACACCTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGCGAATGGTAATACTAAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATAACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCATCTATTACTGTGCTAGA +>118|IGHV14-4 ENSMUST00000195706|IGHV14-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTATAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTTAACATTAAAGACGACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGATGGATTGATCCTGAGAATGGTGATACTGAATATGCCTCGAAGTTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>119|IGHV15-2 ENSMUST00000195337|IGHV15-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGATCACTCTCCATCTGCTGGCAGCAGCTACAGGTATCCAATCCCAGGTTCACCTACAACAGTCTGGTTCTGAACTGAGGAGTCCTGGGTCTTCAGTAAAGCTGTCATGCAAGGATTTTGATTCAGAAGTCTTCCCTATTGCTTATATGAGTTGGGTAAGGCAGAAGCCTGGGCATGGATTTGAATGGATTGGAGGCATACTCCCAAGTATTGGTAGAACAATCTATGGAGAGAAGTTTGAGGACAAAGCCACATTGGATGCAGACACACTGTCCAACACAGCCTACTTGGAGCTCAACAGTCTGACATCCGAGGACTCTGCTATCTACTACTGTGCAAGG +>120|IGHV16-1 ENSMUST00000195641|IGHV16-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTTAGTTGGGCTTTCCTTGTTATTTTAAAAGGCATACAGGGTGAGGTGCAGCTGGTGGAATCTGGAGGCAGCTTGGGACAGCCTGGAGGGTCCACTAAACTCTCTTGTGAAGAAGCATCTGGATTCACTTTCAGTGATCATTGGATGGACTGGTTTCGCCAAGCCCCAGGCATGAGGCTAGAATGGTTAGCAAATACAAACCATGATGAGAGTGGAAAAGGCTATGCAGAGTCTGTGAAAGACAGATTCTCCATCTCCAGAGACAATTCTGAGAACTTATTGTATCTACAAATGAACAGTCTGAGAAACGAAGACACGGCTCTGTATTATTGTGCCAGAGA +>121|IGHV2-2 ENSMUST00000103443|IGHV2-2|5'UTR|IG|IGH|None|00 +GC +>122|IGHV2-2 ENSMUST00000103443|IGHV2-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCTTGGGGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCAGCTTTCATATCCAGACTGAGCATCAGCAAGGACAATTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACAGCCATATATTACTGTGCCAGAAA +>123|IGHV2-3 ENSMUST00000178229|IGHV2-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCACTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCAGGGTTCTCATTAACCAGCTATGGTGTAAGCTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGACGGGAGCACAAATTATCATTCAGCTCTCATATCCAGACTGAGCATCAGCAAGGATAACTCCAAGAGCCAAGTTTTCTTAAAACTGAACAGTCTGCAAACTGATGACACAGCCACGTACTACTGTGCCAA +>124|IGHV2-4 ENSMUST00000103447|IGHV2-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCTGCTTTCATATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>125|IGHV2-5 ENSMUST00000195707|IGHV2-5|5'UTR|IG|IGH|None|00 +ATCCTTGCTCATTGTTTCCTTTTATCCTTTCAGAAACCTCCCCCAATGCAAAGCAGCCCTCAGGCAGAGGATAAAAGCCCACACAAAGCTGAGAAGCCCCATCCTCTTCTCATAGAGCCTCCATCAGAGC +>126|IGHV2-5 ENSMUST00000195707|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATAACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGAGGTGGAAGCACAGACTACAATGCAGCTTTCATGTCCAGACTGAGCATCACCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>127|IGHV2-6 ENSMUST00000179657|IGHV2-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTTCTCTGCCTGGTGACTTTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACCGTCTCAGGGTTCTCATTAACCAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGTAGTGATATGGAGTGATGGAAGCACAACCTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTCCAAACTGATGACACAGCCATGTACTACTGTGCCAGACA +>128|IGHV2-6-8 ENSMUST00000192911|IGHV2-6-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTATCCTTTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGTTGGAAGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAGTGA +>129|IGHV2-7 ENSMUST00000103456|IGHV2-7|5'UTR|IG|IGH|None|00 +AGAGC +>130|IGHV2-7 ENSMUST00000103456|IGHV2-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTCCTCTGCCTGGTGACCTTTCCAAGCTGTGTCCTGTCACAAGTGCAGATGAAGGAGTCAGGACCTGACCTTGTGCAGCCATCACAGACTCTGTCTCTCACCTGCACTGTCTCTGGGTTCTCATTAAGTAGCTATGGTGTACATTGGTTTCGCAAGCCTCCGAGAAAGGGATTGGAATGGTTGGGAGGAATATGGTCTGGTGGAAGCATATACTATACTCCAGCTCTCAGTTCCCGACTGAGTGTCAGCAGGGACACCTCTAAGAGCCAAGTTTTCTTTAAAATGAGCAGTCTGCAAAGTGAAGACACGGCTGTGTACCACTGTGCCAGATA +>131|IGHV2-9 ENSMUST00000103451|IGHV2-9|5'UTR|IG|IGH|None|00 +CCCCATCAGAGC +>132|IGHV2-9 ENSMUST00000103451|IGHV2-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGTTCCTCTGCCTGGTTGCATTTCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACTTGCACTGTCTCTGGGTTTTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGGTGGAAGCACAAATTATAATTCAGCTCTCATGTCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAAACA +>133|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|5'UTR|IG|IGH|None|00 +ATAGAGCCTCCATCAGAGC +>134|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTGCCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGCTATAAGCTGGGTTCGCCAGCCACCAGGAAAGGGTCTGGAGTGGCTTGGAGTAATATGGACTGGTGGAGGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGTCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCAGGTACTACTGTGCCAGAAA +>135|IGHV3-1 ENSMUST00000103478|IGHV3-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGCGTGCTGATTCTTTTGTGGCTGTTCACAGCCTTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCATGGTGAAACCTTCTCAGTCACTTTCCCTCACCTGCACTGTCACTGGCTACTCCATCACCAGTGGTTATGACTGGCACTGGATCCGACATTTTCCAGGAAACAAACTGGAGTGGATGGGCTACATAAGCTACAGTGGTAGCACTAACTACAACCCATCCCTCAAAAGTCGAATCTCCATCACTCATGACACATCTAAGAACCATTTCTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>136|IGHV3-3 ENSMUST00000191693|IGHV3-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAATGTTGAGTGTTCTGTACCTGTTGTCAGCCCTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTAGCCTGGTGAGACCTTCTCAGACACTCTCCCTTACCTGCACTGTTACTGGCTTCTCCATCAACAGTGATTGTTACTGGATCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTACATCGGGTACACATTCTACAGTGGTATCACTTACTACAACCCATCTCTTGAAAGTCGAACGTACATAACGCGTGACACATCTAAGAACCAGTTCTCACTGAAGTTGAGTTCTGTGACTACTGAGGACACAGCCACTTACTACTGTGCGAGAGA +>137|IGHV3-4 ENSMUST00000193408|IGHV3-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGTTGATTCTTGTGTACCTGTTGACAGCCCTTCCTGGTATCTTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGCCCTGGTGAAGCCTTCTCAGACAGTGTCCCTCACCTGCACTGTCACTGGCTACTCTATCACTAATGGTAATCACTGGTGGAACTGGATCCGGCAGGTTTCAGGAAGCAAACTGGAGTGGATAGGGTACATAAGCTCCAGTGGTAGCACTGACAGCAATCCATCTCTCAAAAGTCGAATCTCCATCACTAGAGACACTTCCAAGAACCAGTTATTCCTGCAGTTGAACTCTGTGACTACTGAAGATATAGCCACATATTACTGTGCAAGAGA +>138|IGHV3-5 ENSMUST00000195619|IGHV3-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAATGTTCACTCTTCTGTACCTGTTGACAGTCGTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCTTCTCAGACAGTGTTCCTCACCTGCACTGTCACTGGCATTTCCATCACCACTGGAAATTACAGGTGGAGCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTGGATAGGGTACATATACTACAGTGGTACCATTACCTACAATCCATCTCTCACAAGTCGAACCACCATCACTAGAGACACTCCCAAGAACCAGTTCTTCCTGGAAATGAACTCTTTGACTGCTGAGGACACAGCCACATACTACTGTGCACGAGA +>139|IGHV3-6 ENSMUST00000195124|IGHV3-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAGTGTTGAGTCTGTTGTACCTGTTGACAGCCATTCCTGGTATCCTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGGCCTCGTGAAACCTTCTCAGTCTCTGTCTCTCACCTGCTCTGTCACTGGCTACTCCATCACCAGTGGTTATTACTGGAACTGGATCCGGCAGTTTCCAGGAAACAAACTGGAATGGATGGGCTACATAAGCTACGATGGTAGCAATAACTACAACCCATCTCTCAAAAATCGAATCTCCATCACTCGTGACACATCTAAGAACCAGTTTTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>140|IGHV3-8 ENSMUST00000103483|IGHV3-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGTGTTAAGTCTTCTGTACCTGTTGACAGCCCTTCCGGGTATCCTGTCAGAGGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGCAAAACCTTCTCAGACTCTGTCCCTCACCTGTTCTGTCACTGGCTACTCCATCACCAGTGATTACTGGAACTGGATCCGGAAATTCCCAGGGAATAAACTTGAGTACATGGGGTACATAAGCTACAGTGGTAGCACTTACTACAATCCATCTCTCAAAAGTCGAATCTCCATAACTCGAGACACATCCAAGAACCAGTATTACCTGCAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGATACACAGTGTGGAGTCTTCAGTGTAGGCCCAGACATAAACCTCCTTGTA +>141|IGHV4-1 ENSMUST00000103464|IGHV4-1|5'UTR|IG|IGH|None|00 +GAAGCAAAGGGGATCAGCCCGAGATTCTCATTCAGTGATCAACACTGAACACACATCCCTTACC +>142|IGHV4-1 ENSMUST00000103464|IGHV4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTTTGGGCTGATTTTTTTTATTGTTGCTCTTTTAAAAGGGGTCCAGTGTGAGGTGAAGCTTCTCCAGTCTGGAGGTGGCCTGGTGCAGCCTGGAGGATCCCTGAAACTCTCCTGTGCAGCCTCAGGAATCGATTTTAGTAGATACTGGATGAGTTGGGTTCGGCGGGCTCCAGGGAAAGGACTAGAATGGATTGGAGAAATTAATCCAGATAGCAGTACAATAAACTATGCACCATCTCTAAAGGATAAATTCATCATCTCCAGAGACAACGCCAAAAATACGCTGTACCTGCAAATGAGCAAAGTGAGATCTGAGGACACAGCCCTTTATTACTGTGCAAGACC +>143|IGHV5-12 ENSMUST00000103450|IGHV5-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTGGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATTACATGTATTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAATGGTGGTGGTAGCACCTATTATCCAGACACTGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCCGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>144|IGHV5-12-4 ENSMUST00000195381|IGHV5-12-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCATATTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTCGTGGAGTCTGGGGGAGGTTTAGTGAAGCCTGGACAGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACTATTACATGTCTTGGGTTCACCAGACTCCGGAGAAGAGGCTGGAGTGGGTTGCATACATTAGTAGTAGTGGTGTTAGCACCTATTATCCAGACAATGTAAAGGGCCGATTCGCCATCTCCAGAGACAATGCCAAGAACACCCTTTACCTGCAAATGACCAGTCTGAAGTCAGAGGACACGGCCTTGTATTACTGTGCAAGAGG +>145|IGHV5-15 ENSMUST00000192877|IGHV5-15|5'UTR|IG|IGH|None|00 +CACTCATC +>146|IGHV5-15 ENSMUST00000192877|IGHV5-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCAGGCTCAGCTTACTTATTTTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTACGGAATGGCGTGGGTTCGACAGGCTCCAAGGAAGGGGCCTGAGTGGGTAGCATTCATTAGTAATTTGGCATATAGTATCTACTATGCAGACACTGTGACGGGCCGATTCACCATCTCTAGAGAGAATGCCAAGAACACCCTGTACCTGGAAATGAGCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGACA +>147|IGHV5-16 ENSMUST00000193652|IGHV5-16|5'UTR|IG|IGH|None|00 +ATCAGGACTGAACACAGACCAGTCACC +>148|IGHV5-16 ENSMUST00000193652|IGHV5-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTCAGGCTCAGCTCAGTTTTTCTTGTTCTTATTTTAAAAGGAGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGAGGGAGGCTTAGTGCAGCCTGGAAGTTCCATGAAACTCTCCTGCACAGCCTCTGGATTCACTTTCAGTGACTATTACATGGCTTGGGTCCGCCAGGTTCCAGAAAAGGGTCTAGAATGGGTTGCAAACATTAATTATGATGGTAGTAGCACCTACTATCTGGACTCCTTGAAGAGCCGTTTCATCATCTCGAGAGACAATGCAAAGAACATTCTATACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCACGTATTACTGTGCAAGAGA +>149|IGHV5-17 ENSMUST00000103459|IGHV5-17|5'UTR|IG|IGH|None|00 +TGGATTCCCAGGTCCTCACATTCAGTGATCAGCACTGAACACAGACCACTCACC +>150|IGHV5-17 ENSMUST00000103459|IGHV5-17|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTCCAGGCTCAATTTAGTTTTCCTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATGGAATGCACTGGGTTCGTCAGGCTCCAGAGAAGGGGCTGGAGTGGGTTGCATACATTAGTAGTGGCAGTAGTACCATCTACTATGCAGACACAGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTTCCTGCAAATGACCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGG +>151|IGHV5-2 ENSMUST00000195468|IGHV5-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCGGGCTCAGCTTGGTTTTCCTTGTCCTTATTTTAAAAAGTGTACAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGAGTCCCTGAAACTCTCCTGTGAATCCAATGAATACGAATTCCCTTCCCATGACATGTCTTGGGTCCGCAAGACTCCGGAGAAGAGGCTGGAGTTGGTCGCAGCCATTAATAGTGATGGTGGTAGCACCTACTATCCAGACACCATGGAGAGACGATTCATCATCTCCAGAGACAATACCAAGAAGACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACAGCCTTGTATTACTGTGCAAGACA +>152|IGHV5-4 ENSMUST00000103444|IGHV5-4|5'UTR|IG|IGH|None|00 +TGACAGAGGAGGCCGGTCCTGGATTCGAGTTCCTCACATTCAGTGATGAGCACTGAACACGGACCCCTCACC +>153|IGHV5-4 ENSMUST00000103444|IGHV5-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCGGAAAAGAGGCTGGAGTGGGTCGCAACCATTAGTGATGGTGGTAGTTACACCTACTATCCAGACAATGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACAACCTGTACCTGCAAATGAGCCATCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGAGA +>154|IGHV5-6 ENSMUST00000103446|IGHV5-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGACTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGGCATGTCTTGGGTTCGCCAGACTCCAGACAAGAGGCTGGAGTGGGTCGCAACCATTAGTAGTGGTGGTAGTTACACCTACTATCCAGACAGTGTGAAGGGGCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>155|IGHV5-9 ENSMUST00000103448|IGHV5-9|5'UTR|IG|IGH|None|00 +GGAGGCAGGTCCTAGATTTGAGTTCCTCACATTCAGTGATCAGCACTGAACACGGAACCCTCACC +>156|IGHV5-9 ENSMUST00000103448|IGHV5-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTTGGGCTGAGCTTGATTTTCCTTGTCCTAATTTTAAAAGGTGTCCAGTGTGAAGTGATGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATACCATGTCTTGGGTTCGCCAGACTCCGGAGAAGAGGCTGGAGTGGGTCGCAACCATTAGTGGTGGTGGTGGTAACACCTACTATCCAGACAGTGTGAAGGGTCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACGGCCTTGTATTACTGTGCAAGACA +>157|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|5'UTR|IG|IGH|None|00 +CTGGAATTGATTCCTAGTTCCTCACGTTCAGTG +>158|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGTACTGAACACAGACCCCTCACCATGAACTTCGGGCTCAGATTGATTTTCCTTGTCCTTACTTTAAAAGGTGTCCAGTGTGACGTGAAGCTGGTGGAGTCTGGGGAAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAGTGGTGGTGATTACATCTACTATGCAGACACTGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAGGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTACAAGAGA +>159|IGHV6-3 ENSMUST00000103486|IGHV6-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGAGACTGAGCTGTGCTTTTATTATTGTTCTTTTAAAAGGGGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTCAGTAACTACTGGATGAACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTCAAATTAGATTGAAATCTGATAATTATGCAACACATTATGCGGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAACTTAAGGGCTGAAGACACTGGAATTTATTACTGCACAGG +>160|IGHV6-4 ENSMUST00000191918|IGHV6-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGAACTGAGCTGTGTTTTCATTGTTGTTCTCTTAAAAGGTGTCCAGAGTGATGTGAACCTGGAAGTGTCTGGAGGAGGCTTAGTTAAACCTGGAGGATCCATGCAACTCTTTTGTGTAGCCTCTGGATTTACTTTTGTAGATGGCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGTCTTGAGTGGGTTGCTGAAATTGCAAACAAAGCTAATAATTATGCAACATATTATCCCGAGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTTCAAAAGTAGTGTCTACCTGCATATGAACAGCTTAAGAGCCGAAGATACAGGCATTTATTACTGTACAAGG +>161|IGHV6-5 ENSMUST00000193936|IGHV6-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGGAACTGAACTGTGTTTTCATTGTTGTCCTCTTAAAAGGTGTCCAGAGTGAAGTGAAAATTGAGGAGTCAGGAGGAGGCTTGGTCCAACCTGGAGGATCCATGAAACTCTCTTGTGCAGCCTCTGGATTCACTTTCAGTGATTACAGGATGGACTGGGTCCACCACTCTACAGAGAATGGGTTGGAGTGGGTTGCTGAAATTAGAAACAAAGCTAGTAATTATGCAACATATTATGTGGAGTCTGTGAATGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGATACTGGCATTTATTACTGTACAAGG +>162|IGHV6-6 ENSMUST00000103489|IGHV6-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAACTGTGTATTCATAGTTTTTCTCTTAAAAGGTGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCTTGTGCTGCCTCTGGATTCACTTTTAGTGACGCCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTGAAATTAGAAACAAAGCTAATAATCATGCAACATACTATGCTGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGACACTGGCATTTATTACTGTACCAGG +>163|IGHV6-7 ENSMUST00000193397|IGHV6-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAGCTGTGTATTCATTTTTTTTCTCTTAAAAGGTGTCCAGTGTGAGGAGAAGCTGGATGAGTCTGGAGGAGGCTTGGTGCAACCTGGGAGGTCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTTACTAACTCCTGGATGAACTGGTTCTGCCAGTCTCCAGAGAAAGGACTGGAGTGGGTAGCACAAATTAAAAGCAAACCTTATAATTATGAAACATATTATTCAGATTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTATACCTGCAAATGAACAACTTAAGAGCTGAAGACACGGGCATCTATTACTGTACATGG +>164|IGHV7-1 ENSMUST00000103474|IGHV7-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGTTAAACTGGGTTTTTCTTTTAACACTTTTACATGGTATCCAGTGTGAGGTGAAGCTGGTGGAATCTGGAGGAGGCTTGGTACAGTCTGGGCGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCAGTGATTTCTACATGGAGTGGGTCCGCCAAGCTCCAGGGAAGGGACTGGAGTGGATTGCTGCAAGTAGAAACAAAGCTAATGATTATACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCATCGTCTCCAGAGACACTTCCCAAAGCATCCTCTACCTTCAGATGAATGCCCTGAGAGCTGAGGACACTGCCATTTATTACTGTGCAAGAGATGCA +>165|IGHV7-2 ENSMUST00000193133|IGHV7-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGTTTAACATCATTATCTTCACAGTAACACCTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGAAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCACTGATTTCTACATGAACTGGGTCTGCCAGCCTCCAAGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGACTACAGTGCATCTATGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAACACACTGAGAACTGAGGACAGTGCCACTTATTACTGTGCAAGAGATACA +>166|IGHV7-3 ENSMUST00000103461|IGHV7-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGCTGAACTGGATTTTCCTTGTAACACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGTCTCTCCTGTGCAGCTTCTGGATTCACCTTCACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAATGCCCTGAGAGCTGAGGACAGTGCCACTTATTACTGTGCAAGATATA +>167|IGHV7-4 ENSMUST00000192499|IGHV7-4|5'UTR|IG|IGH|None|00 +ATGAACCTAGTCTTGATTTCCCCAGCCTTCAGTTCCCAGATTCAGTGATCAGCCTTGAACACAGACCTGTCACC +>168|IGHV7-4 ENSMUST00000192499|IGHV7-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGGTGAACTGGATTCTACTTGTAGCACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGATGGAATCTGGAGGAGGCTTGGTACAGCCTGGGGCTTCTCTGAGACTCTCCTGTGCAGCTTCTGGATTCACCTTTACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACCTGAGTGGTTGGCTTTGATTAGAAACAAAGCTAATGGTTACACAACAGAGTATACTGCATCTGTTAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAACATCCTCTATCTTCAAATGAACACCCTGAGGGCTGAGGACAGTGCCACTTATTACTGTGTAAAAGCTGTA +>169|IGHV8-11 ENSMUST00000103536|IGHV8-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGCTACTGATTGTTCCTGCATATGTCCTCTCCCAGATTACTCAGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTAGGCTGGATTCATCAGCCTTCAGGGAATGGTCTGGAGTGGCTGGCACACATTTGGTGGAATGATAATAAGTACTATAACACAGCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCGCCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>170|IGHV8-12 ENSMUST00000199266|IGHV8-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTGCTGCTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGTCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGAAAGGGTCTGGAGTGGCTGGCACACATTTACTGGGATGATGACAAGCGCTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAGAAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAAGAG +>171|IGHV8-2 ENSMUST00000195037|IGHV8-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGACTTACATTCTCATTCCTGCTGCTGCTGCCTGTCCCTGCATATGTCCTATCTCAGGTTACTCTGAAAGTGTCTGGCCCTGGGATATTGCAGCCATCACAGACTCTCAGCCTGGCCTGTACTTTCTCTGGGATTTCACTGAGTACTTCTGGTATGGGTTTGAGCTGGCTTCGTAAGCCCTCAGGGAAGGCTTTAGAGTGGCTGGCAAGCATTTGGAATAATGATAACTACTACAACCCATCTTTGAAGAGCCGGCTCACAATCTCCAAGGAGACCTCCAACTACCAAGTATTCCTTAAACTCACCAGTGTGGACACTGCAGATTCTGCCACATACTACGGTGCTTGGAGAGA +>172|IGHV8-4 ENSMUST00000192298|IGHV8-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTATGTCTTCATTCCTGCTGCTGGTTGTCCCTATATATGTTCTGTCCCAGATTACTCTGAAACAGTCTGGCCCTGGGATAGTGCAGCCATCCCAGCCCGTCAGACTTACTTGCACTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATAGGTGTAACCTGGATTCGTCAGCCCTCAGGGAAGGGTCTGGAGTGGCTGGCAACCATTTGGTGGGATGATGATAACCGCTACAACCCATCTCTAAAGAGCAGGCTCGCAGTCTCCAAAGACACCTCCAACAACCAAGCATTCCTGAATATCATCACTGTGGAAACTGCAGATACTGCCATATACTACTGTGCT +>173|IGHV8-5 ENSMUST00000194257|IGHV8-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCTTGCTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTAATATGGGTATAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTAGAGTGGCTGGCACACATTTGGTGGAATGATGATAAGTACTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCAAATAG +>174|IGHV8-6 ENSMUST00000193145|IGHV8-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCGCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGTACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGATCTGGAGTGGCTGGCACACATTTATTGGGATGATGACAAGCACTATAACCCATCCTTGAAGAGCCAGCTCAGAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGTAGATACTGCCACATACTACTGTGCTCGA +>175|IGHV8-8 ENSMUST00000192591|IGHV8-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGTTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTTTGGTATGGGTGTAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTGGTGGGATGATGATAAGTACTATAACCCAGCCCTGAAGAGTCGGCTCACAATCTCCAAGGATACCTCCAAAAACCAGGTATTCCTCAAGATCGCCAATGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>176|IGHV9-1 ENSMUST00000195884|IGHV9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATAGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCATGATATACACCGACACTGGAGAGCCAACATATGCTGAAGAGTTCAAGGGACGGTTTGCCTTCTCTTTGGAGACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGTAAGA +>177|IGHV9-2 ENSMUST00000103472|IGHV9-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATGGCAGCTGCCCAAAGGGCTCAAGCACAGATCCAGTTCGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGTGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCTGGATAAACACCTACTCTGGAGAGCCAACATATGCTGACGACTTCAAGGGACGGTTTGCCTTTTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>178|IGHV9-3 ENSMUST00000103473|IGHV9-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGTTGGCTGTGGAACTTGCTATTCCTGATGGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTACAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACCTATGGAATGAGCTGGGTGAAACAGGCTCCAGGAAAGGGTTTAAAGTGGATGGGCTGGATAAACACCTACTCTGGAGTGCCAACATATGCTGATGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>179|IGHV9-4 ENSMUST00000194159|IGHV9-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCTGTGGAACTTGCTATTTCTCATGGCAGCAGCTCAAAGTATCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACTGCTGGAATGCAGTGGGTGCAAAAGATGCCAGGAAAGGGTTTTAAGTGGATTGGCTGGATAAACACCCACTCTGGAGAGCCAAAATATGCAGAAGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTACAGATAAGCAACCTCAAAAATGAGGACACGGCTACGTATTTCTGTGCGAGA +>180|IGKC ENSMUST00000103410|IGKC|C-REGION|IG|IGK|None|00 +GGGCTGATGCTGCACCAACTGTATCCATCTTCCCACCATCCAGTGAGCAGTTAACATCTGGAGGTGCCTCAGTCGTGTGCTTCTTGAACAACTTCTACCCCAAAGACATCAATGTCAAGTGGAAGATTGATGGCAGTGAACGACAAAATGGCGTCCTGAACAGTTGGACTGATCAGGACAGCAAAGACAGCACCTACAGCATGAGCAGCACCCTCACGTTGACCAAGGACGAGTATGAACGACATAACAGCTATACCTGTGAGGCCACTCACAAGACATCAACTTCACCCATTGTCAAGAGCTTCAACAGGAATGAGTGT +>181|IGKJ1 ENSMUST00000103405|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGTGGAGGCACCAAGCTGGAAATCAAAC +>182|IGKJ2 ENSMUST00000198234|IGKJ2|J-REGION|IG|IGK|None|00 +TGTACACGTTCGGAGGGGGGACCAAGCTGGAAATAAAAC +>183|IGKJ3 ENSMUST00000199487|IGKJ3|J-REGION|IG|IGK|None|00 +AATCACATTCAGTGATGGGACCAGACTGGAAATAAAAC +>184|IGKJ4 ENSMUST00000103408|IGKJ4|J-REGION|IG|IGK|None|00 +ATTCACGTTCGGCTCGGGGACAAAGTTGGAAATAAAAC +>185|IGKJ5 ENSMUST00000199459|IGKJ5|J-REGION|IG|IGK|None|00 +GCTCACGTTCGGTGCTGGGACCAAGCTGGAGCTGAAAC +>186|IGKV1-110 ENSMUST00000103321|IGKV1-110|5'UTR|IG|IGK|None|00 +GATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>187|IGKV1-110 ENSMUST00000103321|IGKV1-110|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCCTTGTACACAGTAATGGAAACACCTATTTACATTGGTACCTGCAGAAGCCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTTCTGCTCTCAAAGTACACATGTTCCTCC +>188|IGKV1-117 ENSMUST00000103317|IGKV1-117|5'UTR|IG|IGK|None|00 +ACTGATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>189|IGKV1-117 ENSMUST00000103317|IGKV1-117|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTTTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCATTGTACATAGTAATGGAAACACCTATTTAGAATGGTACCTGCAGAAACCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTACTGCTTTCAAGGTTCACATGTTCCTCC +>190|IGKV1-122 ENSMUST00000103314|IGKV1-122|5'UTR|IG|IGK|None|00 +GTCTCCTCAGGCTCCCTCCTCAAA +>191|IGKV1-122 ENSMUST00000103314|IGKV1-122|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGCTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGGTCTAGTCAGAGCCTTGAAAACAGTAATGGAAACACCTATTTGAACTGGTACCTCCAGAAACCAGGCCAGTCTCCACAGCTCCTGATCTACAGGGTTTCCAACCGATTTTCTGGGGTCCTAGACAGGTTCAGTGGTAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTTCTGCCTCCAAGTTACACATGTCCCTCC +>192|IGKV1-131 ENSMUST00000103306|IGKV1-131|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGCTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTACATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCGCCTATTCTATCTGGTATCCAAACTGGACCCTGGCATCCCTGACAGTTTCAGTGGCAGTGGATCAGAGACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCCTGCAAGGTACACATTTTCCTCT +>193|IGKV1-132 ENSMUST00000103305|IGKV1-132|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGTTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTGTCTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCACCTAATGTATCAGGTGTCCAAACTGGACCCTGGCATCCCTGACAGGTTCAGTGGCAGTGGATCAGAAACAGATTTTACACTTAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCTTGCAAGGTACATATTATCCTCA +>194|IGKV1-133 ENSMUST00000103304|IGKV1-133|5'UTR|IG|IGK|None|00 +TATTTCCTCAAA +>195|IGKV1-133 ENSMUST00000103304|IGKV1-133|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAAACCTATTTGAATTGGTTATTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGAACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCGTGCAAGGTACACATTTTCCTCA +>196|IGKV1-135 ENSMUST00000103303|IGKV1-135|5'UTR|IG|IGK|None|00 +ACTGATCACTCTCCTATGTTCATTTCCTCAAA +>197|IGKV1-135 ENSMUST00000103303|IGKV1-135|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCGGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTAGATAGTGATGGAAAGACATATTTGAATTGGTTGTTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTGGCAAGGTACACATTTTCCTCA +>198|IGKV1-35 ENSMUST00000197820|IGKV1-35|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCACTCCATATTTATATTGTTGCTTTGGATTGTGGGAATCAGTGGTGACGTTGTGATGACCCAGACTCCACTCACTTTATCAGCTACCATTGGACAATCAGCCTCCGTCTCTTGCAGGTCAAGTCAGAGTCTCTTACATAGTAATGGAAACACATACTTGAATTGGTTTGTACAAAGGCCAGGCCCATCTCCACAGCTTCTAATTTATGGGGTGTTTGAACAGGAATCTGGGGTTCCTGACAGGTTCAGTGGCAGTGGGTCTGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCATGCAAGCTACCTATGAACCTCC +>199|IGKV1-88 ENSMUST00000103336|IGKV1-88|L-REGION+V-REGION|IG|IGK|None|00 +ATGAATTTGCCTGTTCATCTCTTGGTGCTTCTGTTGTTCTGGATTCCTGCTTCCAGAGGTGATGTTGTGGTGACTCAAACTCCACTCTCCCTGCCTGTCAGCTTTGGAGATCAAGTTTCTATCTCTTGCAGGTCTAGTCAGAGTCTTGCAAACAGTTATGGGAACACCTATTTGTCTTGGTACCTGCACAAGCCTGGCCAGTCTCCACAGCTCCTCATCTATGGGATTTCCAACAGATTTTCTGGGGTGCCAGACAGGTTCAGTGGCAGTGGTTCAGGGACAGATTTCACACTCAAGATCAGCACAATAAAGCCTGAGGACTTGGGAATGTATTACTGCTTACAAGGTACACATCAGCCTCC +>200|IGKV1-99 ENSMUST00000168090|IGKV1-99|5'UTR|IG|IGK|None|00 +GGCGCCTCATCAAA +>201|IGKV1-99 ENSMUST00000168090|IGKV1-99|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGCTGCCTGTTCTGCTAGTGGTGCTGCTATTGTTCACGAGTCCAGCCTCAAGCAGTGATGTTGTTCTGACCCAAACTCCACTCTCTCTGCCTGTCAATATTGGAGATCAAGCCTCTATCTCTTGCAAGTCTACTAAGAGTCTTCTGAATAGTGATGGATTCACTTATTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTAATATATTTGGTTTCTAATCGATTTTCTGGAGTTCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTTCCAGAGTAACTATCTTCCTCT +>202|IGKV10-94 ENSMUST00000103330|IGKV10-94|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGTGCAAGTCAGGGCATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAAGTTTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGACAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>203|IGKV10-95 ENSMUST00000198735|IGKV10-95|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTTTGTTTTCAAGGTACCAGATATGATATCCAGATGACACAGACTACTTCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTGAGGACATTAGCACTTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAGGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGGCAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>204|IGKV10-96 ENSMUST00000103328|IGKV10-96|5'UTR|IG|IGK|None|00 +CTCAGCCTGGAC +>205|IGKV10-96 ENSMUST00000103328|IGKV10-96|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTCAGGACATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTACTACACATCAAGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGAACAGATTATTCTCTCACCATTAGCAACCTGGAGCAAGAAGATATTGCCACTTACTTTTGCCAACAGGGTAATACGCTTCCTCC +>206|IGKV11-125 ENSMUST00000197406|IGKV11-125|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACACGAGGGCCCCTGCTGAGTTCCTTGGGTTCCTGTTGCTCTGGTTTTTAGGTGCCAGATGTGATGTCCAGATGATTCAGTCTCCATCCTCCCTGTCTGCATCTTTGGGAGACATAGTCACCATGACTTGCCAGGCAAGTCAGGGCACTAGCATTAATTTAAACTGGTTTCAGCAAAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGGTGCAAGCAACTTGGAAGATGGGGTCCCATCAAGGTTCAGTGGCAGTAGATATGGGACAGATTTCACTCTCACCATCAGCAGCCTGGAGGATGAAGATATGGCAACTTATTTCTGTCTACAGCATAGTTATCTCCCTCC +>207|IGKV12-38 ENSMUST00000198880|IGKV12-38|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAACTCCTGGGGTTGCTGCTGCTGTGGCTTACAGACGCAGGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTGGCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAACATTTACTACAGTTTAGCATGGTATCAGCAGAAGCAAGGGAAATCTCCTCAGCTCCTGATCTATAATGCAAACAGCTTGGAAGATGGTGTCCCATCGAGGTTCAGTGGCAGTGGATCTGGGACACAGTATTCTATGAAGATCAACAGCATGCAGCCTGAAGATACCGCAACTTATTTCTGTAAACAGGCTTATGACGTTCCTCC +>208|IGKV12-41 ENSMUST00000103369|IGKV12-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCTCACTCAGGTCCTGGCGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGGGAATATTCACAATTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGAACACAATATTCTCTCAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGAGTACTCCTCC +>209|IGKV12-44 ENSMUST00000103367|IGKV12-44|5'UTR|IG|IGK|None|00 +ATAGTCAGGTCACACCCTGTGCTGTAATCAGCATCACACTGAAAACACACAGAC +>210|IGKV12-44 ENSMUST00000103367|IGKV12-44|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGAAGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTTTTCTCTGAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATCATTATGGTACTCCTCC +>211|IGKV12-46 ENSMUST00000103365|IGKV12-46|5'UTR|IG|IGK|None|00 +GAGTCAGCCTCACACTGATCACACACAGAC +>212|IGKV12-46 ENSMUST00000103365|IGKV12-46|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGATGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGTATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTAATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATGCTGCAACAAACTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTATTCCCTCAAGATCAACAGCCTGCAGTCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGGGTACTCCTCC +>213|IGKV12-98 ENSMUST00000196839|IGKV12-98|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACATGCTCACTCAGCTCCTGGGATTACTGCTGCTCTGGTTTGCAGGTGGTAAATGTGACATTCAGATGACCCAGTCTCCTGCCTCCCAGTCTGCATCTCTGGGAGAAAGTGTCACCATCACATGCCTGGCAAGTCAGACCATTGGTACATGGTTAGCATGGTATCAGCAGAAACCAGGGAAATCTCCTCAGCTCCTGATTTATGCTGCAACCAGCTTGGCAGATGGGGTCCCATCAAGGTTCAGTGGTAGTGGATCTGGCACAAAATTTTCTTTCAAGATCAGCAGCCTACAGGCTGAAGATTTTGTAAGTTATTACTGTCAACAACTTTACAGTACTCCTCT +>214|IGKV13-84 ENSMUST00000103339|IGKV13-84|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTACTGCTGTTTGGAATCCCAGGCATGATATGTGACATCCAGATGACACAATCTTCATCCTCCTTTTCTGTATCTCTAGGAGACAGAGTCACCATTACTTGCAAGGCAAGTGAGGACATATATAATCGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>215|IGKV13-85 ENSMUST00000114212|IGKV13-85|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTCCTGCTGTTCAGAATCACAGGCATAATATGTGACATCCAGATGACACAATCTTCATCCTACTTGTCTGTATCTCTAGGAGGCAGAGTCACCATTACTTGCAAGGCAAGTGACCACATTAATAATTGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>216|IGKV14-100 ENSMUST00000199510|IGKV14-100|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCTTGCTCAGTTTCTTGCATTCTTGTTGCTTTGGTTTCCAGGTGCAAGATGTGACATCCTGATGACCCAATCTCCATCCTCCATGTCTGTATCTCTGGGAGACACAGTCAGCATCACTTGCCATGCAAGTCAGGGCATTAGCAGTAATATAGGGTGGTTGCAGCAGAAACCAGGGAAATCATTTAAGGGCCTGATCTATCATGGAACCAACTTGGAAGATGGAGTTCCATCAAGGTTCAGTGGCAGTGGATCTGGAGCAGATTATTCTCTCACCATCAGCAGCCTGGAATCTGAAGATTTTGCAGACTATTACTGTGTACAGTATGCTCAGTTTCCTCC +>217|IGKV14-111 ENSMUST00000103320|IGKV14-111|5'UTR|IG|IGK|None|00 +CAGCCAGGACTCAGC +>218|IGKV14-111 ENSMUST00000103320|IGKV14-111|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGACCCCTGCTCAGTTTCTTGGAATCTTGTTGCTCTGGTTTCCAGGTATCAAATGTGACATCAAGATGACCCAGTCTCCATCTTCCATGTATGCATCTCTAGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAATAGCTATTTAAGCTGGTTCCAGCAGAAACCAGGGAAATCTCCTAAGACCCTGATCTATCGTGCAAACAGATTGGTAGATGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTCACCATCAGCAGCCTGGAGTATGAAGATATGGGAATTTATTATTGTCTACAGTATGATGAGTTTCCTCC +>219|IGKV14-126 ENSMUST00000103310|IGKV14-126|5'UTR|IG|IGK|None|00 +TCAGC +>220|IGKV14-126 ENSMUST00000103310|IGKV14-126|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCCCCTGCTCAGTTTTTTGGGATCTTGTTGCTCTGGTTTCCAGGTATCAGATGTGACATCAAGATGACCCAGTCTCCATCCTCCATGTATGCATCGCTGGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAAAAGCTATTTAAGCTGGTACCAGCAGAAACCATGGAAATCTCCTAAGACCCTGATCTATTATGCAACAAGCTTGGCAGATGGGGTCCCATCAAGATTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTAACCATCAGCAGCCTGGAGTCTGACGATACAGCAACTTATTACTGTCTACAGCATGGTGAGAGCCCTCC +>221|IGKV14-130 ENSMUST00000196006|IGKV14-130|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGTTTCTTGGGATCTTGTTGCTCTGGTTCCCAGGTGCCAGATGTGAAATCCAGATGACCCAGTCTCCATCCTCTATGTCTGCATCTCTGGGAGACAGAATAACCATCACTTGCCAGGCAACTCAAGACATTGTTAAGAATTTAAACTGGTATCAGCAGAAACCAGGGAAACCCCCTTCATTCCTGATCTATTATGCAACTGAACTGGCAGAAGGGGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGACTATTCTCTGACAATCAGCAACCTGGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGTTTTATGAGTTTCCTCC +>222|IGKV15-103 ENSMUST00000103324|IGKV15-103|5'UTR|IG|IGK|None|00 +TCACTCTCAGTGAGGATACACCATCAGC +>223|IGKV15-103 ENSMUST00000103324|IGKV15-103|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCTTGCTGAGCTCCTGGGGCTGCTGCTGTTCTGCTTTTTAGGTGTGAGATGTGACATCCAGATGAACCAGTCTCCATCCAGTCTGTCTGCATCCCTTGGAGACACAATTACCATCACTTGCCATGCCAGTCAGAACATTAATGTTTGGTTAAGCTGGTACCAGCAGAAACCAGGAAATATTCCTAAACTATTGATCTATAAGGCTTCCAACTTGCACACAGGCGTCCCATCAAGGTTTAGTGGCAGTGGATCTGGAACAGGTTTCACATTAACCATCAGCAGCCTGCAGCCTGAAGACATTGCCACTTACTACTGTCAACAGGGTCAAAGTTATCCTCT +>224|IGKV16-104 ENSMUST00000103323|IGKV16-104|5'UTR|IG|IGK|None|00 +AATCAGTTCCTGCCAGGACACAGTTTAGAT +>225|IGKV16-104 ENSMUST00000103323|IGKV16-104|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCCAGGTTCAGGTTCTGGGGCTCCTTCTGCTCTGGATATCAGGTGCCCAGTGTGATGTCCAGATAACCCAGTCTCCATCTTATCTTGCTGCATCTCCTGGAGAAACCATTACTATTAATTGCAGGGCAAGTAAGAGCATTAGCAAATATTTAGCCTGGTATCAAGAGAAACCTGGGAAAACTAATAAGCTTCTTATCTACTCTGGATCCACTTTGCAATCTGGAATTCCATCAAGGTTCAGTGGCAGTGGATCTGGTACAGATTTCACTCTCACCATCAGTAGCCTGGAGCCTGAAGATTTTGCAATGTATTACTGTCAACAGCATAATGAATACCCGTAC +>226|IGKV17-121 ENSMUST00000197515|IGKV17-121|5'UTR|IG|IGK|None|00 +AAGGCC +>227|IGKV17-121 ENSMUST00000197515|IGKV17-121|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGTTCTCACTAGCTCTTCTCCTCAGTCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCATGGCTATAGGAGAAAAAGTCACCATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGTACAGATTTTGTTTTTACAATTGAAAACATGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACTTGCCTCT +>228|IGKV17-127 ENSMUST00000200586|IGKV17-127|5'UTR|IG|IGK|None|00 +AAGGCC +>229|IGKV17-127 ENSMUST00000200586|IGKV17-127|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGCTCTCACTAGCTCCTCTCCTCAGCCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCGTGGCTACAGGAGAAAAAGTCACTATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGCACAGATTTTGTTTTTACAATTGAAAACACGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACATGCCTCT +>230|IGKV18-36 ENSMUST00000200160|IGKV18-36|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACTCCAGCTTCATTTCTTTGCCTCCTTTTACTGTGGACCACGGCTGTCACTGGAGAAACAACACAGGCTCCAGCTTCTCTGAGTTTTTCTCTTGGTGAAACAGCAACACTGTCATGCAGGTCCAGTGAGAGTGTTGGCAGCTACTTAGCCTGGTACCAGCAGAAAGCAGAGCAAGTTCCCCGGCTCCTTATCCATAGTGCCTCCACTAGGGCCGGTGGTGTCCCAGTCCGGTTCAGTGGCACTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGTCTAGAACCTGAAGATGCTGCAGTTTACTACTGTCAACCTTTCAAAAGTTGGTCATA +>231|IGKV19-93 ENSMUST00000196863|IGKV19-93|5'UTR|IG|IGK|None|00 +AGGAGACGTTGTAGAA +>232|IGKV19-93 ENSMUST00000196863|IGKV19-93|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGACCGTCTATTCAGTTCCTGGGGCTCTTGTTGTTCTGGCTTCATGGTGCTCAGTGTGACATCCAGATGACACAGTCTCCATCCTCACTGTCTGCATCTCTGGGAGGCAAAGTCACCATCACTTGCAAGGCAAGCCAAGACATTAACAAGTATATAGCTTGGTACCAACACAAGCCTGGAAAAGGTCCTAGGCTGCTCATACATTACACATCTACATTACAGCCAGGCATCCCATCAAGGTTCAGTGGAAGTGGGTCTGGGAGAGATTATTCCTTCAGCATCAGCAACCTGGAGCCTGAAGATATTGCAACTTATTATTGTCTACAGTATGATAATCTTCTACC +>233|IGKV2-109 ENSMUST00000103322|IGKV2-109|5'UTR|IG|IGK|None|00 +CAAGTTCGCAGA +>234|IGKV2-109 ENSMUST00000103322|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCATTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAAGCCAGGCCAGTCTCCTCAGCTCCTGATTTATCAGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTAGCAGTGGGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTGCTCAAAATCTAGAACTTCCTCC +>235|IGKV2-112 ENSMUST00000103318|IGKV2-112|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCTCTCTTCAGTTCCTGGGGGTGCTTATGTTCTGGATCTCTGGAGTCAGTGGGGATATTGTGATAACCCAGGATGAACTCTCCAATCCTGTCACTTCTGGAGAATCAGTTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTATATAAGGATGGGAAGACATACTTGAATTGGTTTCTGCAGAGACCAGGACAATCTCCTCAGCTCCTGATCTATTTGATGTCCACCCGTGCATCAGGAGTCTCAGACCGGTTTAGTGGCAGTGGGTCAGGAACAGATTTCACCCTGGAAATCAGTAGAGTGAAGGCTGAGGATGTGGGTGTGTATTACTGTCAACAACTTGTAGAGTATCCTC +>236|IGKV2-137 ENSMUST00000103302|IGKV2-137|5'UTR|IG|IGK|None|00 +GGCTACTTTTCACACAGCTGCACCAAGCAGGGGATTTGCATATTGCTCCCTTGGGAGGATCTCTCCTGCAGGTCCAAGACAAAAGCTAGCCTCCATTTCTGTCTTGACTACTCAAGACTTTTTGTATCAAGTTCTCAGA +>237|IGKV2-137 ENSMUST00000103302|IGKV2-137|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCCTAGCTGAGTTCCTGGGGCTGCTTGTGCTCTGGATCCCTGGAGCCATTGGGGATATTGTGATGACTCAGGCTGCACCCTCTGTACCTGTCACTCCTGGAGAGTCAGTATCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTGCATAGTAATGGCAACACTTACTTGTATTGGTTCCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACTGCTTTCACACTGAGAATCAGTAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTATGCAACATCTAGAATATCCTTT +>238|IGKV20-101-2 ENSMUST00000200406|IGKV20-101-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGCTCTAGTTCAGCTCCTAGGGATGCTGATGCTCTGGCTCCAAGGCATGAGCTGTAATATCCAGGTGATCCAGTCACCATTTCTGTCTGCATCTGTGGGAGAGAGGGTCACAATCAGCTGCAAGACACATCAGCATATTAACAGTTCCATAGCCTGGTACCAGCAAAAAGTTGGAAAAGCTCCCATACTCCTGATAAGAGATGCAAGTTTTTCTCTAACAGACACCCCATCAAGGTTCACTGGGAATGGATTTGGCACAGATTTCACACTCAGCATCAGCAGTATGCAGTCTCAAGATGGTGCCACATATTTCTGCCAGCAGCATTTTCACTATTAC +>239|IGKV3-1 ENSMUST00000103404|IGKV3-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTCACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGAGCCACCATCTCCTGCAGAGCCAGTGAAAGTGTTGAATATTATGGCACAAGTTTAATGCAGTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACGTAGAATCTGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTGTGGAGGAGGATGATATTGCAATGTATTTCTGTCAGCAAAGTAGGAAGGTTCCTTC +>240|IGKV3-10 ENSMUST00000196940|IGKV3-10|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTAACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTGATCCTGTGGAGGCTGATGATGCTGCAACCTATTACTGTCAGCAAAATAATGAGGATCCTCC +>241|IGKV3-12 ENSMUST00000103396|IGKV3-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGTTATGGGTACTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCAAAAGTGTCAGTACATCTGGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCACAGTAGGGAGCTTCCTCC +>242|IGKV3-2 ENSMUST00000103403|IGKV3-2|5'UTR|IG|IGK|None|00 +TCTCTTCCAGTTCTCAGAG +>243|IGKV3-2 ENSMUST00000103403|IGKV3-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGAAAGACACACTCCTGCTATGGGTCCTGCTTCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAGAGCCAGCGAAAGTGTTGATAATTATGGCATTAGTTTTATGAACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCAAGGATCCGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTATGGAGGAGGATGATACTGCAATGTATTTCTGTCAGCAAAGTAAGGAGGTTCCTCC +>244|IGKV3-3 ENSMUST00000103402|IGKV3-3|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGAGCCACTATCTTCTGCAGAGCCAGCCAGAGTGTCGATTATAATGGAATTAGTTATATGCACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAAGATGCTGCAACCTATTACTGTCAGCAAAGTATTGAGGATCCTCC +>245|IGKV3-4 ENSMUST00000103401|IGKV3-4|5'UTR|IG|IGK|None|00 +G +>246|IGKV3-4 ENSMUST00000103401|IGKV3-4|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACAATCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAAGGCCAGCCAAAGTGTTGATTATGATGGTGATAGTTATATGAACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAATCTAGAATCTGGGATCCCAGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>247|IGKV3-5 ENSMUST00000103400|IGKV3-5|5'UTR|IG|IGK|None|00 +ATCCTCTCTTCCAGCTCTCAGAG +>248|IGKV3-5 ENSMUST00000103400|IGKV3-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTAATCCTGTGGAGGCTGATGATGTTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>249|IGKV3-7 ENSMUST00000197560|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCCAAAGTGTCAGTACATCTAGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCAAGTATGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATACTGCAACATATTACTGTCAGCACAGTTGGGAGATTCCTCC +>250|IGKV3-9 ENSMUST00000103398|IGKV3-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACCCACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGGGCCACCATATCCTGCCAAGCCAGCGAAAGTGTCAGTTTTGCTGGTACAAGTTTAATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGAGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGAGTCAGACTTCACTCTCACCATCGATCCTGTGGAGGAAGATGATGCTGCAATGTATTACTGTATGCAAAGTATGGAAGATCCTCC +>251|IGKV4-50 ENSMUST00000103363|IGKV4-50|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTATCTCAGTTGTAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGAAGGTCACCATGAGCTGCAGGGCCAGCTCAAGTGTAAATTACATGTACTGGTACCAGCAGAAGTCAGATGCCTCCCCCAAACTATGGATTTATTACACATCCAACCTGGCTCCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGAACTCTTATTCTCTCACAATCAGCAGCATGGAGGGTGAAGATGCTGCCACTTATTACTGCCAGCAGTTTACTAGTTCCCCATCCA +>252|IGKV4-51 ENSMUST00000103345|IGKV4-51|5'UTR|IG|IGK|None|00 +GCAGGAATTAGCCAGGGACTAAAATTCAAAGACACA +>253|IGKV4-51 ENSMUST00000103345|IGKV4-51|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCATTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCCCCCAAACTCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGGCTGGGATCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAAATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>254|IGKV4-53 ENSMUST00000198328|IGKV4-53|5'UTR|IG|IGK|None|00 +AAAAACACA +>255|IGKV4-53 ENSMUST00000198328|IGKV4-53|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCATGTGCAGATTTTCAGCTTCATGCTAATCAGTGTCACAGTCATATTGTCCAGTGGAGAAATTGTGCTCACCCAGTCTCCAGCACTCATGGCTGCATCTCCAGGGGAGAAGGTCACCATCACCTGCAGTGTCAGCTCAAGTATAAGTTCCAGCAACTTGCACTGGTACCAGCAGAAGTCAGAAACCTCCCCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGTCAACAGTGGAGTAGTTACCCACTCA +>256|IGKV4-54 ENSMUST00000199437|IGKV4-54|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACAGGTACCAGCAGAAGCCAGGATCCTCACCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAATATCATAGTTACCCACCCA +>257|IGKV4-55 ENSMUST00000103359|IGKV4-55|5'UTR|IG|IGK|None|00 +AGCTAGGGACCAAAGTTCAAAGACAAA +>258|IGKV4-55 ENSMUST00000103359|IGKV4-55|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCCTGATTTATGACACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTTACCCACCCA +>259|IGKV4-57 ENSMUST00000103357|IGKV4-57|L-REGION+V-REGION|IG|IGK|None|00 +ATGCATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATAACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTTCCAGCAGAAGCCAGGCACTTCTCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAAAGGAGTAGTTACCCACCCA +>260|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|5'UTR|IG|IGK|None|00 +AAATTCAAATACACA +>261|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCTGGTGCAGATTTTCAGCTTCTTGCTAATCAGTGCCTCAGTTGCAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGGGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGTGCCTCCCCCAAACTCTGGATTTATAGCACATCCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCACTCA +>262|IGKV4-58 ENSMUST00000197448|IGKV4-58|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCAGTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGCAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGCGCTTCCCCCAAACCCTTGATTCATAGGACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCGTGGAGGCTGAAGATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>263|IGKV4-59 ENSMUST00000103354|IGKV4-59|5'UTR|IG|IGK|None|00 +AAAATTCAAAGACAAA +>264|IGKV4-59 ENSMUST00000103354|IGKV4-59|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATATCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>265|IGKV4-61 ENSMUST00000199160|IGKV4-61|5'UTR|IG|IGK|None|00 +ATTAGCTAGGGACCAAAATTCAAAGACAGA +>266|IGKV4-61 ENSMUST00000199160|IGKV4-61|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATATCCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATCGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTATCATAGTTACCCACCCA +>267|IGKV4-62 ENSMUST00000198345|IGKV4-62|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGCCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGCTCCTCCCCCAGACTCTGGATTTATGACACATCCAACCTGGTTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTAGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCATCCA +>268|IGKV4-63 ENSMUST00000196595|IGKV4-63|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGAGAAAATGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAAGCACCTCCCCCAAACTCTGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCAGGTCGCTTCAGTGGCAGTGGGTCTGGAAACTCTTACTCTCTCACGATCAGCAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTTTTCAGGGGAGTGGGTACCCACTCA +>269|IGKV4-68 ENSMUST00000103350|IGKV4-68|5'UTR|IG|IGK|None|00 +AGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>270|IGKV4-68 ENSMUST00000103350|IGKV4-68|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATGAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCACTCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAAGATCCTCCCCCAAACCCTGGATTTATCTCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>271|IGKV4-69 ENSMUST00000103349|IGKV4-69|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTTAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTCTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCGCCCAAACCCTGGATTTATGACACATCCAACCTGGCTTCTGGATTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCATAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>272|IGKV4-70 ENSMUST00000103348|IGKV4-70|5'UTR|IG|IGK|None|00 +AATTAGCTAGGGACCAAAATTCAAAGACAAA +>273|IGKV4-70 ENSMUST00000103348|IGKV4-70|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTATAAGTTACATGCACTGGTACCAGCAGAAGCCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>274|IGKV4-71 ENSMUST00000196201|IGKV4-71|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTATTCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCTGGATTTATTTAACATTCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCTCAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>275|IGKV4-72 ENSMUST00000103346|IGKV4-72|5'UTR|IG|IGK|None|00 +TACTTATGAGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>276|IGKV4-72 ENSMUST00000103346|IGKV4-72|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTGTTCTCTCCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACAATGACTTGCAGGGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATGCCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGAGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>277|IGKV4-74 ENSMUST00000103344|IGKV4-74|5'UTR|IG|IGK|None|00 +GCAGTAATTAGCTAGGGACCAAAATTCAAAGGAAAA +>278|IGKV4-74 ENSMUST00000103344|IGKV4-74|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAACGGGTCACCATGACCTGCACTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCACCAGTATCATCGTTCCCCACCCA +>279|IGKV4-78 ENSMUST00000103343|IGKV4-78|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCATGACCTGCAGTGCCAGATCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTTTTACTGCCAGCAGTACAGTGGTTACCCATCCA +>280|IGKV4-79 ENSMUST00000103342|IGKV4-79|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCTTGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCTCTTATTTCTGCCATCAGTGGAGTAGTTACCCACCCC +>281|IGKV4-80 ENSMUST00000103341|IGKV4-80|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGGAGATCACCCTAACCTGCAGTGCCAGCTCGAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACTTCTCCCAAACTCTTGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTTCTCGCTTCAGTGGCAGTGGGTCTGGGACCTTTTATTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCGATTATTACTGCCATCAGTGGAGTAGTTATCCA +>282|IGKV4-81 ENSMUST00000197966|IGKV4-81|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGTTAATCAGTGTCTCAGTCATAATGTCCAGAGGAGAAAATGTGCTGACCCAGTCTCCAGCAATCATGGCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCTAGTAACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCTACCAAATTCTGGATTTATAGGACATCCAACCTGGCTTCAGAAGTCCCAGCTCCCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTTACAATCAGCAGCGTGGAGGCCGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTGGTTACCCACCCA +>283|IGKV4-86 ENSMUST00000200454|IGKV4-86|5'UTR|IG|IGK|None|00 +CACTAATTAGCCAGAGACCAAAATCCAAATACACA +>284|IGKV4-86 ENSMUST00000200454|IGKV4-86|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACTTTCGGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTGTCCAGAGGAGAAATTGTGCTCACTCAGTCTCCAGCCATCACAGCTGCATCTCTGGGGCAAAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAACCATGGATTTATGAAATATCCAAACTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCATTTATTACTGCCAGCAGTGGAATTATCCTCTTA +>285|IGKV4-90 ENSMUST00000103334|IGKV4-90|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTCATATTGACCAATGGAGAAATTTTGCTCACCCAGTCTCCAGCAATCATAGCTGCATCTCCTGGGGAGAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGAACTGGTACCAGCAGAAACCAGGATCCTCCCCCAAAATATGGATTTATGGTATATCCAACCTGGCTTCTGGAGTTCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACATCTTTCTCTTTCACAATCAACAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTCAGCAAAGGAGTAGTTACCCACCCA +>286|IGKV4-91 ENSMUST00000103333|IGKV4-91|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGATGCAGATTATCAGCTTGCTGCTAATCAGTGTCACAGTCATAGTGTCTAATGGAGAAATTGTGCTCACCCAGTCTCCAACCACCATGGCTGCATCTCCCGGGGAGAAGATCACTATCACCTGCAGTGCCAGCTCAAGTATAAGTTCCAATTACTTGCATTGGTATCAGCAGAAGCCAGGATTCTCCCCTAAACTCTTGATTTATAGGACATCCAATCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATTGGCACCATGGAGGCTGAAGATGTTGCCACTTACTACTGCCAGCAGGGTAGTAGTATACCACGCA +>287|IGKV4-92 ENSMUST00000103332|IGKV4-92|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATATGTGGGTGCAGATTTTCAGCTTACTGCTAATCTGTGTCACAGTGTCAAAGGGAGAAATGGTTCTCACCCAGTCTCCAGTATCCATAACTGCATCTCGAGGGGAGAAGGTCACCATCACCTGCCGTGCCAGCTCAAGTATAAGTTCCAATTACTTACACTGGTACCAGCAGAAGCCAGGATCCTCCCCTAAACTTTTGATTTATAGGACATCCATCCTGGCATCTGGAGTCCTAGACAGCTTCAGTGGCAGTGGGTCTGAGAGCTCTTACACTCTGACAATCAGCTGCATGCAGGACGAAGTTGCTGCCACTTACTATTGTCAGCAGGGGAGTAGTAGCCCACCA +>288|IGKV5-37 ENSMUST00000103372|IGKV5-37|5'UTR|IG|IGK|None|00 +GAAAGCTTAAAG +>289|IGKV5-37 ENSMUST00000103372|IGKV5-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATTCACACCTCATATCCTTGGACTTCTGCTTTTCTGGATTTCAGCCTCCACAGGTGACATCCTGCTGACCCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGAAACAGTCAGTCTTTCCTGTAGGGCCAGCCAGAGTATTTACAAGAACCTACACTGGTATCAACAGAAATCACATCGGTCTCCAAGGCTTCTCATCAAGTATGCTTCTGATTCCATCTCTGGGATCCCCTCCAGGTTCACTGGCAGTGGATCAGGGACAGATTACACTCTCAGTATCAACAGTGTGAAGCCCGAAGATGAAGGAATATATTACTGTCTTCAAGGTTACAGCACACCTTC +>290|IGKV5-39 ENSMUST00000197290|IGKV5-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCACTTCTCAGCTCCTTGGACTTTTGCTTTTCTGGACTTCAGCCTCCAGATGTGACATTGTGATGACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCTCTCTTTCCTGCAGGGCCAGCCAGAGTATTAGCGACTACTTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAATATGCTTCCCAATCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGTCAGATTTCACTCTCAGTATCAACAGTGTGGAACCTGAAGATGTTGGAGTGTATTACTGTCAAAATGGTCACAGCTTTCCTCC +>291|IGKV5-43 ENSMUST00000103368|IGKV5-43|5'UTR|IG|IGK|None|00 +ATGAGCCACACAAACTCAGGGAAAGCTCGAAG +>292|IGKV5-43 ENSMUST00000103368|IGKV5-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATACTTGGACTTATGCTTTTTTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGCGTCAGTCTTTCCTGCAGGGCCAGCCAAAGTATTAGCAACAACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>293|IGKV5-45 ENSMUST00000103366|IGKV5-45|5'UTR|IG|IGK|None|00 +TGTGTCATGATCCACACAAACTCAGGGAAAGCTCGAAG +>294|IGKV5-45 ENSMUST00000103366|IGKV5-45|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATTCTTGGACTTATGCTTTTCTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCAGTCTTTCCTGCAGGGCCAGTCAAAGTATTAGCAACTACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>295|IGKV5-48 ENSMUST00000103364|IGKV5-48|5'UTR|IG|IGK|None|00 +GGAAAGTTTGAAG +>296|IGKV5-48 ENSMUST00000103364|IGKV5-48|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCCACACCTCAGTTCCTTGTATTTTTGCTTTTCTGGATTCCAGCCTCCAGAGGTGACATCTTGCTGACTCAGTCTCCAGCCATCCTGTCTGTGAGTCCAGGAGAAAGAGTCAGTTTCTCCTGCAGGGCCAGTCAGAGCATTGGCACAAGCATACACTGGTATCAGCAAAGAACAAATGGTTCTCCAAGGCTTCTCATAAAGTATGCTTCTGAGTCTATCTCTGGGATCCCTTCCAGGTTTAGTGGCAGTGGATCAGGGACAGATTTTACTCTTAGCATCAACAGTGTGGAGTCTGAAGATATTGCAGATTATTACTGTCAACAAAGTAATAGCTGGCCAAC +>297|IGKV6-13 ENSMUST00000198184|IGKV6-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGCTTCAAGATGGAGTCTCATACTCAGGCCTTTGTATTCGCGTTTCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCAATCGGTACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATATGCAGTCTGAAGACCTGGCAGATTATTTCTGCCAGCAATATAGCAGCTATCCTCT +>298|IGKV6-14 ENSMUST00000103394|IGKV6-14|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTCTTTGTATTCGTGTTGCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTTCGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAGTCTCCTAAAGCACTGATTTACTTGGCATCCAACCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAATCTGAAGACCTGGCAGATTATTTCTGTCTGCAACATTGGAATTATCCTCT +>299|IGKV6-15 ENSMUST00000103393|IGKV6-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGACTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCGTCACCTGCAAGGCCAGTCAGAATGTGGGTACTAATGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAAGCACTGATTTACTCGGCATCCTACCGGTACAGTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATGTGCAGTCTGAAGACTTGGCAGAGTATTTCTGTCAGCAATATAACAGCTATCCTCT +>300|IGKV6-17 ENSMUST00000103391|IGKV6-17|5'UTR|IG|IGK|None|00 +GAAATGCATCACACCAGCATGGGCATCAAA +>301|IGKV6-17 ENSMUST00000103391|IGKV6-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGTCTTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCTACCGGTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATCTGGGACGGATTTCACTTTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAACATTATAGTACTCCTCC +>302|IGKV6-20 ENSMUST00000103388|IGKV6-20|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>303|IGKV6-20 ENSMUST00000103388|IGKV6-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACACTGGGGTCCCCGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGAGTTACAGCTATCCTCC +>304|IGKV6-23 ENSMUST00000103386|IGKV6-23|5'UTR|IG|IGK|None|00 +TCAGACCAGCATGGGCATCAAG +>305|IGKV6-23 ENSMUST00000103386|IGKV6-23|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACACATTCTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGAAGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAGTCTGAAGACTTGGCAGATTATTTCTGTCAGCAATATAGCAGCTATCCTCT +>306|IGKV6-25 ENSMUST00000103383|IGKV6-25|5'UTR|IG|IGK|None|00 +TATGAAATGCATCGCACCAGCATGGGCATCAAG +>307|IGKV6-25 ENSMUST00000103383|IGKV6-25|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGCATTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAAAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTATACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCACTTTATTACTGTCAGCAACATTATAGCACTCCTCC +>308|IGKV6-29 ENSMUST00000197371|IGKV6-29|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>309|IGKV6-29 ENSMUST00000197371|IGKV6-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACCCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTCTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGGGTTACAGCTATCTTCC +>310|IGKV6-32 ENSMUST00000103377|IGKV6-32|5'UTR|IG|IGK|None|00 +GGCAGGCAAGGGCATCAAG +>311|IGKV6-32 ENSMUST00000103377|IGKV6-32|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTCACAGACCCAGGTCTTCGTATTTCTACTGCTCTGTGTGTCTGGTGCTCATGGGAGTATTGTGATGACCCAGACTCCCAAATTCCTGCTTGTATCAGCAGGAGACAGGGTTACCATAACCTGCAAGGCCAGTCAGAGTGTGAGTAATGATGTAGCTTGGTACCAACAGAAGCCAGGGCAGTCTCCTAAACTGCTGATATACTATGCATCCAATCGCTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATATGGGACGGATTTCACTTTCACCATCAGCACTGTGCAGGCTGAAGACCTGGCAGTTTATTTCTGTCAGCAGGATTATAGCTCTCCTCC +>312|IGKV7-33 ENSMUST00000197429|IGKV7-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTACTCATGTCCCTGCTGCTCTGCATGTCTGGTGCCTGTGCAGACATTGTGATGACTCAGTCTCCAACTTTCCTTGCTGTGACAGCAAGTAAGAAGGTCACCATTAGTTGCACGGCCAGTGAGAGCCTTTATTCAAGCAAACACAAGGTGCACTACTTGGCTTGGTACCAGAAGAAACCAGAGCAATCTCCTAAACTGCTGATATACGGGGCATCCAACCGATACATTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTGACCATCAGCAGTGTACAGGTTGAAGACCTCACACATTATTACTGTGCACAGTTTTACAGCTATCCTCT +>313|IGKV8-16 ENSMUST00000195945|IGKV8-16|5'UTR|IG|IGK|None|00 +GGCAGGGGAGCAAT +>314|IGKV8-16 ENSMUST00000195945|IGKV8-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCAGAGACCCATGTCCTCATATTTTTGCTGCTATGGGTGTCTGGTGCTTGTGGGGAAATTGTGTTGACCCAGTCTATACCATCCCTGACTGTGTCAGCAGGAGAGAGGGTCACTATCAGCTGCAAATCCAATCAGAATCTTTTATGGAGTGGAAACCAAAGGTACTGTTTGGTCTGGCACCAGTGGAAACCAGGGCAAACTCCTACACCGTTGATCACCTGGACATCTGATAGGTACTCTGGAGTCCCTGATCGTTTCATAGGCAGTGGATCTGTGACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGATGTGGCAGTTTATTTCTGTCAGCAGCATTTACACATTCCTCC +>315|IGKV8-18 ENSMUST00000103390|IGKV8-18|5'UTR|IG|IGK|None|00 +CATCAGTCAGGCAGGGGGGAGAAAG +>316|IGKV8-18 ENSMUST00000103390|IGKV8-18|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGATGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAATAACTACTTATCCTGGTACCAGCAGAAACAAGGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGATTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAGCACAATCATGGCAGCTTTCTCCCCC +>317|IGKV8-19 ENSMUST00000196599|IGKV8-19|5'UTR|IG|IGK|None|00 +GCAAG +>318|IGKV8-19 ENSMUST00000196599|IGKV8-19|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATGTCCCTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGACTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGACCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATTATAGTTATCCTCC +>319|IGKV8-21 ENSMUST00000103387|IGKV8-21|5'UTR|IG|IGK|None|00 +AGACAGGCAGTGGGAGCAAG +>320|IGKV8-21 ENSMUST00000103387|IGKV8-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATATTGCTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTGGCTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAATCCAGTCAGAGTCTGCTCAACAGTAGAACCCGAAAGAACTACTTGGCTTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGCAAGCAATCTTATAATCTTCC +>321|IGKV8-24 ENSMUST00000103384|IGKV8-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCAGGTCCTCATGTTTCTTCTGCTCTGGGTATCTGGTGCCTGTGCAGACATTGTGATGACACAGTCTCCATCCTCCCTGGCTATGTCAGTAGGACAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTAAATAGTAGCAATCAAAAGAACTATTTGGCCTGGTACCAGCAGAAACCAGGACAGTCTCCTAAACTTCTGGTATACTTTGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACAGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGATTACTTCTGTCAGCAACATTATAGCACTCCTCC +>322|IGKV8-26 ENSMUST00000103382|IGKV8-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGAACCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAAGAACTACTTGTCCTGGTACCAGCAGAAACAAAGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGGTTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAACACAATCATGGCAGCTTTCTCCCCCC +>323|IGKV8-27 ENSMUST00000197272|IGKV8-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCTTCCTCTCCCTGCTGCTCTGGGTATCTGGTACCTGTGGGAACATTATGATGACACAGTCGCCATCATCTCTGGCTGTGTCTGCAGGAGAAAAGGTCACTATGAGCTGTAAGTCCAGTCAAAGTGTTTTATACAGTTCAAATCAGAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGTGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTTACTCTTACCATCAGCAGTGTACAAGCTGAAGACCTGGCAGTTTATTACTGTCATCAATACCTCTCCTCG +>324|IGKV8-28 ENSMUST00000197525|IGKV8-28|5'UTR|IG|IGK|None|00 +GCAAG +>325|IGKV8-28 ENSMUST00000197525|IGKV8-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATCTCCTTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGAGTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACGGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACCGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATCATAGTTATCCTCC +>326|IGKV8-30 ENSMUST00000103378|IGKV8-30|5'UTR|IG|IGK|None|00 +AAG +>327|IGKV8-30 ENSMUST00000103378|IGKV8-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATGTTACTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTAGCTGTGTCAGTTGGAGAGAAGGTTACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTATATAGTAGCAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATTTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGAAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAATATTATAGCTATCCTCC +>328|IGKV8-34 ENSMUST00000196959|IGKV8-34|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTCCTCATGTTGCTGCTGCTATCGGTATCTGGTACCTGTGGAGACATTTTGATGACCCAGTCTCCATCCTCCCTGACTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTAGCTAGTGGCAACCAAAATAACTACTTGGCCTGGCACCAGCAGAAACCAGGACGATCTCCTAAAATGCTGATAATTTGGGCATCCACTAGGGTATCTGGAGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACGGATTTCACTCTGACCATCAACAGTGTGCAGGCTGAAGATCTGGCTGTTTATTACTGTCAGCAGTCCTACAGCGCTCCTAC +>329|IGKV9-120 ENSMUST00000103316|IGKV9-120|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCACAGATTTTTGGCTTCTTGTTGCTCTTGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGACATTGGTAGTAGCTTAAACTGGCTTCAGCAGGAACCAGATGGAACTATTAAACGCCTGATCTACGCCACATCCAGTTTAGATTCTGGTGTCCCCAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGTAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>330|IGKV9-123 ENSMUST00000103313|IGKV9-123|5'UTR|IG|IGK|None|00 +TTGTCATTGCATTCAGAACTCAGC +>331|IGKV9-123 ENSMUST00000103313|IGKV9-123|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATCAGGGCTCCTGCTCAGTTTCTTGGCATCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGATTCAGTCTCCATCGTCCATGTTTGCCTCTCTGGGAGACAGAGTCAGTCTCTCTTGTCGGGCTAGTCAGGGCATTAGAGGTAATTTAGACTGGTATCAGCAGAAACCAGGTGGAACTATTAAACTCCTGATCTACTCCACATCCAATTTAAATTCTGGTGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTAGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGCGTAATGCGTATCCTCT +>332|IGKV9-124 ENSMUST00000196768|IGKV9-124|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTTCCTGCTCACGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGAAATTAGTGGTTACTTAAGCTGGCTTCAGCAGAAACCAGATGGAACTATTAAACGCCTGATCTACGCCGCATCCACTTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTATCCTCC +>333|IGKV9-129 ENSMUST00000200578|IGKV9-129|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGCCGGGCAAGTCAGGACATTCATGGTTATTTAAACTTGTTTCAGCAGAAACCAGGTGAAACTATTAAACACCTGATCTATGAAACATCCAATTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCATTATCGGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>334|IGLC1 ENSMUST00000200568|IGLC1|C-REGION|IG|IGL|None|00 +GCCAGCCCAAGTCTTCGCCATCAGTCACCCTGTTTCCACCTTCCTCTGAAGAGCTCGAGACTAACAAGGCCACACTGGTGTGTACGATCACTGATTTCTACCCAGGTGTGGTGACAGTGGACTGGAAGGTAGATGGTACCCCTGTCACTCAGGGTATGGAGACAACCCAGCCTTCCAAACAGAGCAACAACAAGTACATGGCTAGCAGCTACCTGACCCTGACAGCAAGAGCATGGGAAAGGCATAGCAGTTACAGCTGCCAGGTCACTCATGAAGGTCACACTGTGGAGAAGAGTTTGTCCCGTGCTGACTGTTCC +>335|IGLC2 ENSMUST00000198182|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACTCTCACCGTGTTTCCACCTTCCTCTGAGGAGCTCAAGGAAAACAAAGCCACACTGGTGTGTCTGATTTCCAACTTTTCCCCGAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGGCAACAAGTTCATGGCCAGCAGCTTCCTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGTCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>336|IGLC3 ENSMUST00000200235|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACACTCACCATGTTTCCACCTTCCCCTGAGGAGCTCCAGGAAAACAAAGCCACACTCGTGTGTCTGATTTCCAATTTTTCCCCAAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGACAACAAGTACATGGCCAGCAGCTTCTTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGCCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>337|IGLC4 ENSMUST00000197046|IGLC4|C-REGION|IG|IGL|None|00 +GCCAACCCAAGGCTACACCCTCAGTTAATCTGTTCCCACCTTCCTCTGAAGAGCTCAAGACTAAAAAGGCCACACTGGTGTGTATGATCACTGAGTTCTACGCAGCTGCTGTGAGAGTGGCCTGGAAGGCAGATGGTACCCCTTTCACTCAGGGTGTAGAGACTACCCAGCCTCCCAAACAGAGGGACAACATGGCTAGCAGTTACCTGCTCTTCACAGCAGAAGCGTGGGAATCTCATAGCAGTTACAGCTGCCATGTCACTCATGAAGGGAACACTGTGGAGAAGAGTTTGTCCCGTGCTGAGTGTTCCTAG +>338|IGLJ1 ENSMUST00000199490|IGLJ1|J-REGION|IG|IGL|None|00 +CTGGGTGTTCGGTGGAGGAACCAAACTGACTGTCCTAG +>339|IGLJ2 ENSMUST00000197969|IGLJ2|J-REGION|IG|IGL|None|00 +TTATGTTTTCGGCGGTGGAACCAAGGTCACTGTCCTAG +>340|IGLJ3 ENSMUST00000200211|IGLJ3|J-REGION|IG|IGL|None|00 +GTTTATTTTCGGCAGTGGAACCAAGGTCACTGTCCTAG +>341|IGLJ3PSEUDOGENE ENSMUST00000200074|IGLJ3PSEUDOGENE|J-REGION|IG|IGL|None|00 +AGGTTCTTTTTCCTCAAATGGCCTATTGTATGCAGGAG +>342|IGLJ4 ENSMUST00000198313|IGLJ4|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGAGGTGGAACCAGATTGACTGTCCTAGATGA +>343|IGLV1 ENSMUST00000103746|IGLV1|5'UTR|IG|IGL|None|00 +GCTGACCAATATTGAAAAGAATAGACCTGGTTTGTGAATT +>344|IGLV1 ENSMUST00000103746|IGLV1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATTTCACTTATACTCTCTCTCCTGGCTCTCAGCTCAGGGGCCATTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGAAACAGTCACACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAACAACCGAGCTCCAGGTGTTCCTGCCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGAGGCAATATATTTCTGTGCTCTATGGTACAGCAACCATTTC +>345|IGLV2 ENSMUST00000197518|IGLV2|5'UTR|IG|IGL|None|00 +CTTGGTTTGTGAATT +>346|IGLV2 ENSMUST00000197518|IGLV2|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTTCACTTATACTCTCTCTCCTGGCTCTCTGCTCAGGAGCCAGTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGGAACAGTCATACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAGCAACCGAGCTCCAGGTGTTCCTGTCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGATGCAATGTATTTCTGTGCTCTATGGTACAGCACCCATTTC +>347|IGLV3 ENSMUST00000103751|IGLV3|5'UTR|IG|IGL|None|00 +GTACCTGCATT +>348|IGLV3 ENSMUST00000103751|IGLV3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTCTTCTTCTTTGTTCTTCATTGCTCAGGTTCTTTCTCCCAACTTGTGCTCACTCAGTCATCTTCAGCCTCTTTCTCCCTGGGAGCCTCAGCAAAACTCACGTGCACCTTGAGTAGTCAGCACAGTACGTACACCATTGAATGGTATCAGCAACAGCCACTCAAGCCTCCTAAGTATGTGATGGAGCTTAAGAAAGATGGAAGCCACAGCACAGGTGATGGGATTCCTGATCGCTTCTCTGGATCCAGCTCTGGTGCTGATCGCTACCTTAGCATTTCCAACATCCAGCCTGAAGATGAAGCAATATACATCTGTGGTGTGGGTGATACAATTAAGGAACAATTTGTGTAAC +>349|TRAC ENSMUST00000198398|TRAC|C-REGION|TR|TRA|None|00 +ACATCCAGAACCCAGAACCTGCTGTGTACCAGTTAAAAGATCCTCGGTCTCAGGACAGCACCCTCTGCCTGTTCACCGACTTTGACTCCCAAATCAATGTGCCGAAAACCATGGAATCTGGAACGTTCATCACTGACAAAACTGTGCTGGACATGAAAGCTATGGATTCCAAGAGCAATGGGGCCATTGCCTGGAGCAACCAGACAAGCTTCACCTGCCAAGATATCTTCAAAGAGACCAACGCCACCTACCCCAGTTCAGACGTTCCCTGTGATGCCACGTTGACTGAGAAAAGCTTTGAAACAGATATGAACCTAAACTTTCAAAACCTGTCAGTTATGGGACTCCGAATCCTCCTGCTGAAAGTAGCCGGATTTAACCTGCTCATGACGCTGAGGCTGTGGTCCAGT +>350|TRAJ11 ENSMUST00000103730|TRAJ11|J-REGION|TR|TRA|None|00 +TGACTCGGGATACAACAAACTCACTTTTGGAAAGGGCACGGTGCTTCTAGTCTCTCCAG +>351|TRAJ12 ENSMUST00000103729|TRAJ12|J-REGION|TR|TRA|None|00 +GGGACTGGAGGCTATAAAGTGGTCTTTGGAAGTGGGACTCGATTGCTGGTAAGCCCTG +>352|TRAJ13 ENSMUST00000103728|TRAJ13|J-REGION|TR|TRA|None|00 +CAAATTCTGGGACTTACCAGAGGTTTGGAACTGGGACAAAACTCCAAGTCGTTCCAA +>353|TRAJ15 ENSMUST00000103726|TRAJ15|J-REGION|TR|TRA|None|00 +CCTACCAGGGAGGCAGAGCTCTGATATTTGGAACAGGAACCACGGTATCAGTCAGCCCCA +>354|TRAJ16 ENSMUST00000103725|TRAJ16|J-REGION|TR|TRA|None|00 +GCAACTTCAAGTGGCCAGAAGCTGGTTTTTGGCCAGGGGACCATATTAAAGGTGTACCTGC +>355|TRAJ17 ENSMUST00000103724|TRAJ17|J-REGION|TR|TRA|None|00 +TGACTAACAGTGCAGGGAACAAGCTAACTTTTGGAATCGGAACCAGGGTGCTGGTCAGGCCAG +>356|TRAJ18 ENSMUST00000103723|TRAJ18|J-REGION|TR|TRA|None|00 +TAGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTTGGAGCTGGGACTCAGCTGATTGTCATACCTG +>357|TRAJ19 ENSMUST00000103722|TRAJ19|J-REGION|TR|TRA|None|00 +ATCTATCGAGGTTTTCATAAGTTCAGCTCTGGAATAGAATCCAAGCATAATGTAAGTCCTA +>358|TRAJ2 ENSMUST00000103738|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGACTAAGTGGTAAATTAACATTCGGGGAAGGGACCCAAGTGACGGTAATATCTG +>359|TRAJ20 ENSMUST00000103721|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTGGTAACTACAAGCTCGGTGTTGAGTCAGTAACCATGATGTCTGTAAGAGCAGG +>360|TRAJ21 ENSMUST00000103720|TRAJ21|J-REGION|TR|TRA|None|00 +TGTCTAATTACAACGTGCTTTACTTCGGATCTGGCACCAAACTCACTGTAGAGCCAA +>361|TRAJ22 ENSMUST00000103719|TRAJ22|J-REGION|TR|TRA|None|00 +CATCTTCTGGCAGCTGGCAACTCATCTTTGGATCTGGAACCCAACTGACAGTTATGCCTG +>362|TRAJ23 ENSMUST00000103718|TRAJ23|J-REGION|TR|TRA|None|00 +TGAATTATAACCAGGGGAAGCTTATCTTTGGACAGGGAACCAAGTTATCTATCAAGCCCA +>363|TRAJ24 ENSMUST00000103717|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGCCAGTTTGGGGAAACTGCAGTTTGGAACAGGAACCCAGGTTGTGGTGACCCCAG +>364|TRAJ25 ENSMUST00000103716|TRAJ25|J-REGION|TR|TRA|None|00 +GAAGGACAAAAGTCTCCTCTGTCTTTGGGACAGGGAGAAGGCTGCTGGTGAAGCCAA +>365|TRAJ26 ENSMUST00000103715|TRAJ26|J-REGION|TR|TRA|None|00 +GAAATAACTATGCCCAGGGATTAACCTTCGGTCTTGGCACCAGAGTATCTGTGTTTCCCT +>366|TRAJ27 ENSMUST00000103714|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATACAGGCAAATTAACCTTTGGGGATGGGACCGTGCTCACAGTGAAGCCAA +>367|TRAJ28 ENSMUST00000103713|TRAJ28|J-REGION|TR|TRA|None|00 +TCTACCAGGCACTGGGAGTAACAGGCTCACTTTTGGGAAAGGCACCAAATTCTCACTCATCCCGA +>368|TRAJ29 ENSMUST00000103712|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAGCAGGGAGCTTGTCTTAGGAAGGGAAGCAAGGCTTTCTATGATTGAAA +>369|TRAJ3 ENSMUST00000103737|TRAJ3|J-REGION|TR|TRA|None|00 +GGAATTCAGCTATAGCTCTAAACTAATCTTTGGAGCTGAAACCAAACTCAGAAATCCACCATATAC +>370|TRAJ30 ENSMUST00000103711|TRAJ30|J-REGION|TR|TRA|None|00 +TGACACAAATGCTTACAAAGTCATCTTTGGAAAAGGGACACATCTTCATGTTCTCCCTA +>371|TRAJ31 ENSMUST00000103710|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAGCAATAACAGAATCTTCTTTGGTGATGGGACGCAGCTGGTGGTGAAGCCCA +>372|TRAJ32 ENSMUST00000103709|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGGAGCAGTGGCAACAAGCTCATCTTTGGAATTGGGACTCTGCTTTCTGTCAAGCCAA +>373|TRAJ33 ENSMUST00000103708|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTGATCTGGGGCTCTGGGACCAAGCTAATTATAAAGCCAG +>374|TRAJ34 ENSMUST00000103707|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTCCAATACCAACAAAGTCGTCTTTGGAACAGGGACCAGATTACAAGTATTACCAA +>375|TRAJ35 ENSMUST00000103706|TRAJ35|J-REGION|TR|TRA|None|00 +GCAGACAGGCTTTGCAAGTGCGCTGACATTTGGATCTGGCACAAAAGTCATTCCATGTCTACCAT +>376|TRAJ37 ENSMUST00000103705|TRAJ37|J-REGION|TR|TRA|None|00 +TAACAGGCAATACCGGAAAACTCATCTTTGGACTGGGGACAACTTTACAAGTGCAACCAG +>377|TRAJ38 ENSMUST00000103704|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGTTGGTGACAACAGTAAGCTGATTTGGGGCTTGGGGACAAGTCTGGTAGTAAATCCAA +>378|TRAJ39 ENSMUST00000103703|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGTGCCAAGCTCACATTCGGAGGGGGAACAAGGTTAACGGTCAGACCCG +>379|TRAJ4 ENSMUST00000103736|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTATCTGGTAGCTTCAATAAGTTGACCTTTGGAGCAGGGACCAGACTGGCTGTGTGCCCAT +>380|TRAJ40 ENSMUST00000103702|TRAJ40|J-REGION|TR|TRA|None|00 +GTTAATACAGGAAACTACAAATACGTCTTTGGAGCAGGTACCAGACTGAAGGTTATAGCAC +>381|TRAJ41 ENSMUST00000103701|TRAJ41|J-REGION|TR|TRA|None|00 +GGTCTCAAACACTAGCTCCATGTTGGCAGAAGCACCTCATTATTGGTCACACCCG +>382|TRAJ42 ENSMUST00000103700|TRAJ42|J-REGION|TR|TRA|None|00 +AATTCTGGAGGAAGCAATGCAAAGCTAACCTTCGGGAAAGGCACTAAACTCTCTGTTAAATCAA +>383|TRAJ43 ENSMUST00000103699|TRAJ43|J-REGION|TR|TRA|None|00 +GCAATAACAACAATGCCCCACGATTTGGAGCGGGAACCAAATTATCAGTAAAACCAA +>384|TRAJ44 ENSMUST00000103698|TRAJ44|J-REGION|TR|TRA|None|00 +GTTACTGGCAGTGGTGGAAAACTCACTTTGGGGGCTGGAACAAGACTTCAGGTCAACCTTG +>385|TRAJ45 ENSMUST00000103697|TRAJ45|J-REGION|TR|TRA|None|00 +TGAATACAGAAGGTGCAGATAGACTCACCTTTGGGAAAGGAACTCAGCTGATCATCCAGCCCT +>386|TRAJ46 ENSMUST00000103696|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAAGACAGCAGTGTAGACATGCTGGCTTTGGGGATGGGGATGAACTTGGAGTGAGCACAAA +>387|TRAJ47 ENSMUST00000197949|TRAJ47|J-REGION|TR|TRA|None|00 +TGGACTATGCAAACAAGATGATCTTTGGCTTGGGAACCATTTTGAGAGTCAGACCTC +>388|TRAJ48 ENSMUST00000200046|TRAJ48|J-REGION|TR|TRA|None|00 +GCCAACTATGGAAATGAGAAAATAACTTTTGGGGCTGGAACCAAACTCACCATTAAACCCA +>389|TRAJ49 ENSMUST00000199452|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACGGGTTACCAGAACTTCTATTTTGGGAAAGGAACAAGTTTGACTGTCATTCCAA +>390|TRAJ5 ENSMUST00000103735|TRAJ5|J-REGION|TR|TRA|None|00 +GGGGACACAGGTTGTGGGGCAGCTCACTTTCGGGAGGGGGACAAGACTCCAAGTTTATGCAA +>391|TRAJ50 ENSMUST00000103693|TRAJ50|J-REGION|TR|TRA|None|00 +TAGCATCCTCCTCCTTCAGCAAGCTGGTGTTTGGGCAGGGGACATCCTTATCAGTCGTTCCAA +>392|TRAJ52 ENSMUST00000103691|TRAJ52|J-REGION|TR|TRA|None|00 +CTAACACTGGAGCTAACACTGGAAAGCTCACGTTTGGACACGGCACCATCCTTAGGGTCCATCCAA +>393|TRAJ53 ENSMUST00000103690|TRAJ53|J-REGION|TR|TRA|None|00 +GGAACAGTGGAGGCAGCAATTACAAACTGACATTTGGGAAAGGAACTCTCTTAACTGTGACTCCAA +>394|TRAJ56 ENSMUST00000103689|TRAJ56|J-REGION|TR|TRA|None|00 +TGGCTACTGGAGGCAATAATAAGCTGACTTTTGGTCAAGGAACCGTTCTGAGTGTTATACCAG +>395|TRAJ57 ENSMUST00000196977|TRAJ57|J-REGION|TR|TRA|None|00 +TGAATCAAGGAGGGTCTGCGAAGCTCATCTTTGGGGAGGGGACAAAGCTGACAGTGAGCTCAT +>396|TRAJ58 ENSMUST00000103687|TRAJ58|J-REGION|TR|TRA|None|00 +TGCAGCAAGGCACTGGGTCTAAGCTGTCATTTGGGAAGGGGGCAAAGCTCACAGTGAGTCCAG +>397|TRAJ59 ENSMUST00000197589|TRAJ59|J-REGION|TR|TRA|None|00 +CTACTAAAAAGAGAAGATAAAGCTACCTTTGCAACTGGAGGGTATGAAGCTGAGGAAGACCT +>398|TRAJ6 ENSMUST00000103734|TRAJ6|J-REGION|TR|TRA|None|00 +AACCTCAGGAGGAAACTACAAACCTACGTTTGGGAAAGGGACCAGCCTCGTGGTTCATCCAT +>399|TRAJ7 ENSMUST00000103733|TRAJ7|J-REGION|TR|TRA|None|00 +GGACTACAGCAACAACAGACTTACTTTGGGGAAGGGAACCCAGGTGGTGGTGTTACCAA +>400|TRAJ9 ENSMUST00000103731|TRAJ9|J-REGION|TR|TRA|None|00 +AGCAACATGGGCTACAAACTTACCTTCGGGACAGGAACAAGCTTGTTGGTTGATCCAA +>401|TRAV1 ENSMUST00000103567|TRAV1|5'UTR|TR|TRA|None|00 +GCTCAGGAGCTGGGGACTCAGTGTCAGGCTGGTGGTGTC +>402|TRAV1 ENSMUST00000103567|TRAV1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGCAGATGTGGGGGTTTGTTCTCTATCTCTTCCTGACGGTGGGAGGTGCTGCAGGACAGGGTGTGGAGCAGCCTGCCAAATTGATGTCTGTGGAGGGAACCTTTGCTCGGGTCAACTGCACATACAGCACCTCAGGGTTCAACGGGTTATCCTGGTACCAGCAACGTGAAGGCCAAGCCCCTGTATTTCTTTCTTATGTTGTTTTGGATGGTTTGAAGGACAGTGGGCATTTCTCCACTTTCCTGAGCCGCTCGAATGGGTACAGTTACCTGCTTCTGACAGAGCTCCAGATCAAAGACTCTGCCTCATACCTCTGTGCTGTGAGGGA +>403|TRAV10 ENSMUST00000103583|TRAV10|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>404|TRAV10 ENSMUST00000103583|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTATGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACATGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCTTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>405|TRAV10D ENSMUST00000103646|TRAV10D|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>406|TRAV10D ENSMUST00000103646|TRAV10D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>407|TRAV10N ENSMUST00000103612|TRAV10N|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAAAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTACAGTTTTATTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>408|TRAV11 ENSMUST00000103585|TRAV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGCG +>409|TRAV12-1 ENSMUST00000200115|TRAV12-1|5'UTR|TR|TRA|None|00 +GTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCT +>410|TRAV12-1 ENSMUST00000200115|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTCCTCAGTTCTCGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACCGAGGGGTTGCCTGTGAAGCTGAACTGCACCTATCAGACTACTTATTTAACTATTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTCAGGTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>411|TRAV12-2 ENSMUST00000180972|TRAV12-2|5'UTR|TR|TRA|None|00 +GTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>412|TRAV12-2 ENSMUST00000180972|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAACAATGGAGACTCTGTGACCCAGACAGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGAGTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTTTTGAAGAGCTTCACAGACAACAAGAGGCCCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTTTGAGTGA +>413|TRAV12-3 ENSMUST00000103657|TRAV12-3|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTTTGAGGAGATCCTGCAGTAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCTATGAAC +>414|TRAV12-3 ENSMUST00000103657|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGGCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGAGATGGAGACTCAGTGACCCAGAAGGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATGCTTTCCTTTTCTGGTATGTGCACTATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>415|TRAV12D-3 ENSMUST00000177703|TRAV12D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>416|TRAV12N-1 ENSMUST00000198682|TRAV12N-1|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>417|TRAV12N-1 ENSMUST00000198682|TRAV12N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTGCTTACTCAGATGTTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTAAACTACTCCTGCGGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>418|TRAV12N-2 ENSMUST00000196674|TRAV12N-2|5'UTR|TR|TRA|None|00 +GAGACTGTGCAGACAGAGGCCCTTGTCTGTGAGTGAGGAGTGTGAGGAGATTCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAGGGACCAAGTGTCATTTCTTCCATGAAC +>419|TRAV12N-2 ENSMUST00000196674|TRAV12N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAGCAATGGAGACTCAGTGACCCAGACAGAAGGCCTGGTCACTCTCACCAAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCTACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTTCTGTGCTTTGAGTGA +>420|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|5'UTR|TR|TRA|None|00 +CTGAAC +>421|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>422|TRAV13-1 ENSMUST00000103651|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGAGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCATAGTGGGAGACTGACATCCACTACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>423|TRAV13-2 ENSMUST00000103658|TRAV13-2|5'UTR|TR|TRA|None|00 +TGACACAACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCATCCACACAAGCACC +>424|TRAV13-2 ENSMUST00000103658|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGTTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACATCCTGGGGGAAGACTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAACGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATAGATC +>425|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>426|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCGGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>427|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|5'UTR|TR|TRA|None|00 +CCACCCTGACACCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>428|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>429|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>430|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAATGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>431|TRAV13D-4 ENSMUST00000196079|TRAV13D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACACAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATGGAAC +>432|TRAV13N-1 ENSMUST00000198359|TRAV13N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCATCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>433|TRAV13N-2 ENSMUST00000196941|TRAV13N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCAGCTGCAGTGGTTTTACCAAAGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAGGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTATAGATC +>434|TRAV13N-3 ENSMUST00000179580|TRAV13N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAACGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>435|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|5'UTR|TR|TRA|None|00 +GACTGGTTGCAGAAGAAGGAGGGGACACTTCAACAGCCACCCTGACACCACAGCCCAGGAGCTGGTTACTTGCTTCTGTCTCCAGCAGCTACACAAGCACC +>436|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>437|TRAV14-1 ENSMUST00000198297|TRAV14-1|5'UTR|TR|TRA|None|00 +CACCTGAGTTTCCCCCAAGCTTCAGTCTAGGAGGA +>438|TRAV14-1 ENSMUST00000198297|TRAV14-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATTCTGACAGCATCATTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGAAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGGAACCACAGTTCTGACCTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAACAGTTCCCTGGGGAAGGCCCTGCACTTCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAACCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCATAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>439|TRAV14-2 ENSMUST00000179267|TRAV14-2|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAAGAGGA +>440|TRAV14-2 ENSMUST00000179267|TRAV14-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACCATCAGTTCCCTGGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGTTCTCCTTGCACATCGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>441|TRAV14-3 ENSMUST00000103589|TRAV14-3|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAGGAGAA +>442|TRAV14-3 ENSMUST00000103589|TRAV14-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCATTTTTACTTCTAGGCCTTCACCTATCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTAAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCCACTTACTTCTGTGCAGCAAGTG +>443|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|5'UTR|TR|TRA|None|00 +CTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGACCACAGAGTTTCTCCCAAGCTTCAGTCTAGGAGGA +>444|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTTCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGTCCCGCTCTCCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATTGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>445|TRAV14N-1 ENSMUST00000196639|TRAV14N-1|5'UTR|TR|TRA|None|00 +GTGGGAGACAAAAGGTCACCTGAGTTCCCTTCAAGCTTCAGTCTAGGAGGA +>446|TRAV14N-1 ENSMUST00000196639|TRAV14N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCAACGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCACTCCTGATATCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>447|TRAV14N-2 ENSMUST00000197614|TRAV14N-2|5'UTR|TR|TRA|None|00 +GGAGCCTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGGCCACCTGAGTTCCCCCAAGCTTCAGTCTAGGAGGA +>448|TRAV14N-2 ENSMUST00000197614|TRAV14N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACTGGCAGTTCCCTAGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>449|TRAV14N-3 ENSMUST00000103652|TRAV14N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATTGTTTTTACTTCTAGGTCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTTCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAATCTCTCCTTGCACATCAAAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>450|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|5'UTR|TR|TRA|None|00 +GCTGAGGCAGAGCAGACACACTCATGCAGAGGACAGTGTGTCAC +>451|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCCAGAAAGTGATTCAGGTCTGGTCAACAACAAGCAGGCAGGAGGGCGAAAAACTCACACTGGACTGTTCATATAAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTGCTTATTCGACAAATGCCTTCTACTATTGCAATAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACGCAAATCCATCAGCCTTGTCATTTCAACCTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>452|TRAV15-2-DV6-2 ENSMUST00000103660|TRAV15-2-DV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGGACATGTGTCACATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGTCAACAGGCAGCAGTCAGTGGGGAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTCCTACCTTATTCTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGATACTCAGAACCAGAGGAGCGGCCACTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>453|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|5'UTR|TR|TRA|None|00 +GCACTTAGACACTGATCTCTGAGCTGAGGCAGAGCAGACACACTC +>454|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGACAGTGTGTCACATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>455|TRAV15N-1 ENSMUST00000197433|TRAV15N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>456|TRAV15N-2 ENSMUST00000199112|TRAV15N-2|5'UTR|TR|TRA|None|00 +GAGCTGAGGCAGAGCAGACACACTCATGCAGAGGGACATGTGTCAC +>457|TRAV15N-2 ENSMUST00000199112|TRAV15N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGCCAACAGGCAGCAGTCAGTGGGGAGAAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTTCTACCGTATTTTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGACACTCAGAACCAGAGGAGCGGCCGCTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>458|TRAV16 ENSMUST00000103667|TRAV16|5'UTR|TR|TRA|None|00 +CACAAAGTATAGATTAAGATCTGGTTGAGAGAGGACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>459|TRAV16 ENSMUST00000103667|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGCTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGAAGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACTGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>460|TRAV16D-DV11 ENSMUST00000103606|TRAV16D-DV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCTCCATTTTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCAGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCGGCAGTATATTTCTGTGCTATGAGAGAGGG +>461|TRAV16N ENSMUST00000199280|TRAV16N|5'UTR|TR|TRA|None|00 +ATAGATTAAGATCTGGTTGAGAGAGAACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>462|TRAV16N ENSMUST00000199280|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>463|TRAV17 ENSMUST00000103672|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGTTCCCAGTGACCATTCTGCTGCTCAGCGCGTTCTTCTCACTGAGAGGAAACAGTGCCCAGTCCGTGGACCAGCCTGATGCTCATGTCACGCTCTCTGAAGGAGCCTCCCTGGAGCTCAGATGCAGTTATTCATACAGTGCAGCACCTTACCTCTTCTGGTACGTGCAGTATCCTGGCCAGAGCCTCCAGTTTCTCCTCAAATACATCACAGGAGACACCGTTGTTAAAGGCACCAAGGGCTTTGAGGCCGAGTTTAGGAAGAGTAACTCCTCTTTCAACCTGAAGAAATCCCCAGCCCATTGGAGCGACTCAGCCAAGTACTTCTGTGCACTGGAGGG +>464|TRAV18 ENSMUST00000103673|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGAAACTCTCTGTGTTGCTCCTTTGGAATCAAGTGGCCCGTGTGGCCACTCAACGGCTGGAGCAGAGTCCTCGGTTTCTGAGTATCCAGGAGGGGCAAGATTTCACTGCACGCTGCAGCTCCTCAACCACCTTCCCCCAACTTTACTGGTACCGACAGGTCCCCAGGGAAGGTCCTGTCATCCTGGTGACATTGGTCAAGAGTGGAGAGGTAAAGGAGCAGAGGAGGATGACTGCTAAGTTTGGTGAAGCAAGAAAGAACAGCTCCCTATTCATCGCCAGAGCTCAGCCTGGAGACGCAGGCATCTACTTCTGTACAGGAA +>465|TRAV19 ENSMUST00000103674|TRAV19|5'UTR|TR|TRA|None|00 +AAAGGGAATAAAGTCAGGACAGGAAGATGAAATCTGAGTTGCAGTTCCCTGAGTAGAAGGAGAGACAACTCAAAGCTTCAGAGAAGAC +>466|TRAV19 ENSMUST00000103674|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGACTGGCTTCCTGAAGGCCTTGCTGTTGGTTCTGTGCCTGCGGCCAGAATGGGTAAAGAGTCAACAGAAGACTAGTGGCCAGCAAGTTAAACAAAGCTCTCCATCGCTGACTGTTCAAGAGGGAGGGATATCGATCCTGAATTGTGACTACGAGAATGATATGTTTGACTATTTTGCCTGGTACAAAAAATACCCTGACAACAGCCCCACACTCCTGATATCCGTACGCTCAAATGTGGATAAGAGGGAAGACGGAAGACTCACAGTTTTCTTGAACAAAAGCGGCAAACACTTCTCACTGCACATCACAGCCTCCCAGCCTGAAGACACAGCAGTGTACCTCTGCGCAGCAGGTG +>467|TRAV2 ENSMUST00000196939|TRAV2|5'UTR|TR|TRA|None|00 +CAGTGGCTTCTGAGTCTCCTCCTTGGTTCGTATTCTGGTCTAAGCTCAGATTCAGCAAAGAATCTGGAATCTGGGCCTGTGCTTACAAAGAGAAT +>468|TRAV2 ENSMUST00000196939|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCAGGTGGCAAAAGTGACTGTGCTCCTGATCTTGGTCTCATGGAGCCTTGCCAAGACCACCCAGCCCCCCTCCATGGAGGCCTATGAAGGGCAAGAAGTGAACGTGTCCTGCAGCCATACAAACATTGCTACAAGCGAGTACATCTACTGGTACCGACAGGTTCCCCACCAGGGACCACAGTTTATCATTCAAGGATATAAGGACTATGTGGTAAATGAAGTGGCATCTCTGTTTATCTCTGCTGACCGGAAGCTCAGCACTCTGAGCCTGCCCTGGGTTTCCCTGAGAGATGCTGCTGTGTATTACTGCATTGTGACTGACA +>469|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|5'UTR|TR|TRA|None|00 +ACAGATCTGAGCTCATCCATTTGCTCTTAACT +>470|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGATGTGTGAGTGGAATTGCCATTCTCCTGGCTTTGGGTATTGCGGGTGATGCTAAGACTACACAACCAGATTCAATGGAAAGTACTGAAGGAGAAACGGTGCACTTGCCTTGTAGCCACGCCACAATCAGTGGAAACGAGTACATCTATTGGTACCGACAGGTTCCTCTTCAGGGTCCAGAATATGTGACTCACGGTCTACAACAAAATACAACCAATAGTATGGCTTTCCTGGCTATTGCCTCTGACAGAAAGTCAAGCACCTTGATCCTGCCTCATGTCAGCCTGAGAGACGCGGCTGTGTACCACTGTATCCTGAGAGTAG +>471|TRAV3-1 ENSMUST00000103569|TRAV3-1|5'UTR|TR|TRA|None|00 +GGCATCTTGTCTGGCTGAAGGCCACAGTCCAGAGGGAGAGCA +>472|TRAV3-1 ENSMUST00000103569|TRAV3-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTGCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCATTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTCCTGGTACAAGCAAGAGGCGGGGGCAGGTCTTCAGTTGCTTATGAGTGTCCTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>473|TRAV3-3 ENSMUST00000181768|TRAV3-3|5'UTR|TR|TRA|None|00 +GAAGATGCCTCAGTGCTGTGGAGGTGATCACAGAGGCATCTTGTCTGGCTGAAGGTCAGAGTCTGGAGGGAGAGCA +>474|TRAV3-3 ENSMUST00000181768|TRAV3-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCACCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAAGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGCGTACTTCTGCGCAGTCAGTG +>475|TRAV3-4 ENSMUST00000103670|TRAV3-4|5'UTR|TR|TRA|None|00 +CAGTAGCCTTCTGTGCAGACAGGTGAAGTAGCCTCAGTGCTGTGGAGAACAGAGGAGGTGAGCTGATCACAGAGGCATCTTGTCTGGCTGAAGGCCAGAGTCTGGAGGGAGAGCA +>476|TRAV3-4 ENSMUST00000103670|TRAV3-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACAGTGGCTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGTTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCTTTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTACTGGTACAAGCAAGAGCCAGGGGCAGGTCTTCAGTTGCTTATGAGTGTCTTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCTGTGTACTTCTGCGCAGTCAGTG +>477|TRAV3N-3 ENSMUST00000197557|TRAV3N-3|5'UTR|TR|TRA|None|00 +ACACAGCTGAAGATGCCTCCGTGTTGTGGAGGTGATCACAGAGGCATCCTGTCTGGCTAAAGGTCAGAGTCTGGAGGGAGCGCA +>478|TRAV3N-3 ENSMUST00000197557|TRAV3N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCATCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAGGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACAACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>479|TRAV4-2 ENSMUST00000103637|TRAV4-2|5'UTR|TR|TRA|None|00 +CCCTGCTGACTGTTGGAAATCAGCAGCTTGACAGGGTCA +>480|TRAV4-2 ENSMUST00000103637|TRAV4-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAGCCCGGGAACTGTGCTGGGGCTGCTGTTGGTGCCGCTATGCTGGGTAAGAGGAATGCCGGTGGAACAGAATCCTCCAGCCCTGAGTCTTTATGAAGGAGCTGAGTCTGGTCTGAGATGCAATTTTTCTACCACCATGAAAGGTGTCCAGTGGTTTCAACAAAATCACAGAGGCAGACTTATCACTCTGTTTTACCTGGCTCAAGGAACAAAGGAGAATGGAAGGTTAAAGTCAACATTCAATTCTAAGGAGCGCTACAGCACCCTGCACATCAAGGATGCACAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGTTGAGG +>481|TRAV4-3 ENSMUST00000103655|TRAV4-3|5'UTR|TR|TRA|None|00 +AGTCTGTAAGCACAAGTGTGTCTGGGCATAAGACACCCTTCAGAGCTGGAGAGAAGACAACCAGCGATTGGACAGGGGCC +>482|TRAV4-3 ENSMUST00000103655|TRAV4-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAACAAAGTCCCTCAGCGCTGAGTCTCCAAGAAGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCCGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATCAATCTTTTTTACCTGGTTCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTCGATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>483|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|5'UTR|TR|TRA|None|00 +GAGAAGACAACCAGCGATTGGACAGGGGCC +>484|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGGCTGTGCAGTGGTTCCAACAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAACATTCAATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>485|TRAV4N-3 ENSMUST00000103618|TRAV4N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAGCAAAGTCCCTCAGCGCTGAGTCTCCAAGAGGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCTGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATGAATCTTTTTTACCTGGTGCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTTGATTCTAAGGAGAGCTACAGCACCCTGCACATTAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>486|TRAV4N-4 ENSMUST00000103627|TRAV4N-4|5'UTR|TR|TRA|None|00 +ATCCCAGCGATTGGACAGGGGCC +>487|TRAV4N-4 ENSMUST00000103627|TRAV4N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACTACCACCATGAGGGCTGTGCAGTGGTTCCGAAAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>488|TRAV5-1 ENSMUST00000103570|TRAV5-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGCTATTCATGCTTTATTTATTTTCTTCTGGCTACAGATGGACTGGAAGAGCCAAGGTGAGCAGGTGGAACAGCTCCCTTCCTCCCTGATTGTCCAGGAGGGAGCCAGTGTTCTGATCAACTGCTCCTACACAGACAGTGCCTCTGTCTACTTCCCTTGGTATAAGCAAGAGCCTGGGAAGCGTCTTCAGTTCATCATAGACATCCGTTCAAATATGGAAAGAAAGCAGACTCAAAGACTCACCCTTTTATTTGATAAGAAAACCAAACACCTTTCCCTGCACATTACAGCCACTCAGCCTGGAGACTCAGCCATCTACTTCTGCTCAGCAAGTA +>489|TRAV5-4 ENSMUST00000103664|TRAV5-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGCGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCAGTTATGAAGACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGATCCAAGAACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>490|TRAV5N-4 ENSMUST00000179997|TRAV5N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGTGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCACTTATGAGAACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGACCCAAGGACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>491|TRAV6-1 ENSMUST00000103571|TRAV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGCTTTAGTGACTGTGATGCTGTTTGTGTTTGGGAGGACCCATGGAGACTCAGTAACCCAGATGCAAGGTCAAGTGACCCTCTCAGAAGACGACTTCCTATTTATAAACTGTACTTATTCAACCACATGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAACAAGGGAATCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACAACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCTGCTGTGTACTACTGTGTTCTGGGTGA +>492|TRAV6-2 ENSMUST00000198058|TRAV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACACTTCTCCAGCTTTAGTGACTGTGATGCTGCTGTTCATGCTTGAGAGGACACATGGAAATTCAGTGACCCAGATGCAAGGTCAAGTGACCCTTTCAGAAGAGGAGTTTCTATTTATAAACTGTACCTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAATAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>493|TRAV6-3 ENSMUST00000180549|TRAV6-3|5'UTR|TR|TRA|None|00 +ATCATTTCTTCATGTGAAGAGTTGAGAGCATCACTCTGGTGACACTGAAG +>494|TRAV6-3 ENSMUST00000180549|TRAV6-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGAGA +>495|TRAV6-4 ENSMUST00000180711|TRAV6-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCAGCACTCTACACTGAAC +>496|TRAV6-4 ENSMUST00000180711|TRAV6-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTAACTGTGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACATACCCAACTCTTTTGTGGTATGTCCAATATCTTGGACAAGGTCCACAGCTCCTTCTGAAAGTGACAACTGCCAACAATAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>497|TRAV6-5 ENSMUST00000181210|TRAV6-5|5'UTR|TR|TRA|None|00 +AAAATATTTGTATTCACACACTCCAGTGGCTCAGAAA +>498|TRAV6-5 ENSMUST00000181210|TRAV6-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>499|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|5'UTR|TR|TRA|None|00 +AC +>500|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTAAGAATCATGAACACTGTCGAGATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGGCCACAGCTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCTTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>501|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|5'UTR|TR|TRA|None|00 +ACACTGAAG +>502|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGTGA +>503|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCATCACTCTACACTGAAC +>504|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTGACTGCGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACGTACCCAACTCTTTTCTGGTATGTCCAATATCCTGGACAAGGTCCACAGCTCCTTCTGAAAGTCACAACTGCCAACAACAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACCTCCTTCCACTTACAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>505|TRAV6D-5 ENSMUST00000180687|TRAV6D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGGATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCGGTGACTCAGACAAAAGGTCCAGTGACATTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACGTATGATAAAGGGACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>506|TRAV6D-6 ENSMUST00000197754|TRAV6D-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTTGGAAGGACCCACGGAGATTCCGTGACTCAAACAGAAGGCCCAGTGACCGTCTCAGAAAGCGAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGCTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>507|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|5'UTR|TR|TRA|None|00 +CTGTCGAGATGGGTCTAAAG +>508|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>509|TRAV6N-5 ENSMUST00000103611|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>510|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|5'UTR|TR|TRA|None|00 +ACTTTCTAGATGACACTAAAG +>511|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTGGGAAGGACCCATGGAGATTCCGTGACTCAAACAGAAGGCCAAGTGACTGTCTCAGAAAGCAAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGGTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGCGCTCTGAGTGA +>512|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|5'UTR|TR|TRA|None|00 +CTGTCGAG +>513|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>514|TRAV7-1 ENSMUST00000198019|TRAV7-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTCCTTGTGTGTTTCACTAGTGGTCCTGTGGCTTCAGCTACACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTAATTCTCAGTATTTCTGGTGGTACAGACAGCATTCTGGGGAAGGCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGACAAGAAGGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTATCCCTGCACATCAAAGACTCCCAACCCAGTGACTCTGCTCTCTACTTCTGTGCAGTGAGCA +>515|TRAV7-3 ENSMUST00000177622|TRAV7-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAACTTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAGGAAGAGAGA +>516|TRAV7-3 ENSMUST00000177622|TRAV7-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>517|TRAV7-4 ENSMUST00000181728|TRAV7-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>518|TRAV7-4 ENSMUST00000181728|TRAV7-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCAATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>519|TRAV7-5 ENSMUST00000200609|TRAV7-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGCAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACGTTCAGTGATGGTACTTCTAACAACTTCAGGTGGTACAGACAGCATTCTGCGAAAGGCCTTGAGGTGCTAGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGATTTACAGCTCACCTCAATAGAGCCAACTTGCATGTTTCCCTACACATCAGAGAACCACAACCCAGTGACTCTGCTGTCTACCTCTGTGCAGTGAGCA +>520|TRAV7-6 ENSMUST00000103641|TRAV7-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>521|TRAV7-6 ENSMUST00000103641|TRAV7-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGGTCTCCCTCAACTGCAGTTTCAGCGACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCAAAGCACTAATATCCATCTTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAAAGACTCCCAGCCCAGTGACTCCGCTGTCTACCTCTGTGCAGTGAGCA +>522|TRAV7D-2 ENSMUST00000200127|TRAV7D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGCA +>523|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAAATTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAAGAAGAGAGA +>524|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCGCTACACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>525|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>526|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTTACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>527|TRAV7N-4 ENSMUST00000103609|TRAV7N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAAGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTATTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAAGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGTTAGTGAGCA +>528|TRAV7N-5 ENSMUST00000199753|TRAV7N-5|5'UTR|TR|TRA|None|00 +ATG +>529|TRAV7N-5 ENSMUST00000199753|TRAV7N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGAAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTTCTTCTGACAACTTCAGGTGGTACAGACAGCATTCTGGGAAAGGCCTTGAGGTGCTGGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGTTTTACAGCTCACCTCAATAGAGCCAGCCTGCATGTTTTCCTACACATCAGAGAGCCGCAACCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>530|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>531|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGTCCTCCCTCAACTGCACTTTCAGCAACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCGAAGCACTAATATCCATATTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCCGTCTACCTCTGTGCAGTGAGCA +>532|TRAV8-1 ENSMUST00000103643|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGTTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATTCGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>533|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|5'UTR|TR|TRA|None|00 +AAACCAACCACCTTGAACAGGCCTGGAGCTGTATCTCTTGCGATCTGATCTTCATAGGGAAGA +>534|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGATGGTGTCACTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATCTGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCGAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>535|TRAV8D-2 ENSMUST00000198439|TRAV8D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCGAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTATACAACTGTTGTACACTGGTACAGGCAAGACTCAGGCAGAGGCCCTGCCCTGATAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTAAGAGCCACCCTTGACACCTCCAGCCAAAGTAGCTCTCTGTCCATCACTGCTGCTCAGTGTGAAGACACTGCTGTGTACTTCTGTGCTACAGATG +>536|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|5'UTR|TR|TRA|None|00 +CTGTCCTAGGAACCAGGTTCCACTTCAGGGTGCAGCACAGCCTTTCCTGTGACATCAATAAAGCAAGAAAA +>537|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCAAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTACACAACTGTTGTTCAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTCAGAGCCACCCTTGACACTTCCAGCCAGAGCAGCTCCCTGTCCATCACTGGTACTCTAGCTACAGACACTGCTGTGTACTTCTGTGCTACTGATG +>538|TRAV9-1 ENSMUST00000103581|TRAV9-1|5'UTR|TR|TRA|None|00 +TCTTTCCTGCACGAGCCAGGTTTTTCCAGAAAGGCACCAGAGCTGTTTCCAGTGTGCAGCC +>539|TRAV9-1 ENSMUST00000103581|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCATGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCGAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>540|TRAV9-2 ENSMUST00000103654|TRAV9-2|5'UTR|TR|TRA|None|00 +TTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCCTACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCTTTTCCAAGGCTCAGCC +>541|TRAV9-2 ENSMUST00000103654|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCTGCTGTGTACTTCTGTGTTTTGAGCG +>542|TRAV9-4 ENSMUST00000103662|TRAV9-4|5'UTR|TR|TRA|None|00 +TGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>543|TRAV9-4 ENSMUST00000103662|TRAV9-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCACTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACGCCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCATCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>544|TRAV9D-1 ENSMUST00000178426|TRAV9D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCGTGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCAAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>545|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>546|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>547|TRAV9N-2 ENSMUST00000198913|TRAV9N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTCCTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGTTCTGAGCG +>548|TRAV9N-3 ENSMUST00000177705|TRAV9N-3|5'UTR|TR|TRA|None|00 +ATCTCATCCCTCTTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGTTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCTGCTTTCCTGCCTGTCCTGTTCCAGAGTTTCTCCACAACAGAGCTGCAGCCTTCTCAAGGCTCAGTC +>549|TRAV9N-3 ENSMUST00000177705|TRAV9N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTCTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTTTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATCCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTGGGCTGTGTACTTCTGTGCTGTGAGCA +>550|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>551|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAACAGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>552|TRBC1 ENSMUST00000192856|TRBC1|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGCAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGGATTACCTCAGCATCCTATCAACAAGGGGTCTTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAAGCCACCCTGTATGCTGTGCTTGTCAGTACACTGGTGGTGATGGCTATGGTCAAAAGAAAGAATTCA +>553|TRBC2 ENSMUST00000103299|TRBC2|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGAAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGAATCACTTCAGCATCCTATCATCAGGGGGTTCTGTCTGCAACCATCCTCTATGAGATCCTACTGGGGAAGGCCACCCTATATGCTGTGCTGGTCAGTGGCCTGGTGCTGATGGCCATGGTCAAGAAAAAAAATTCC +>554|TRBD1 ENSMUST00000178537|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>555|TRBD2 ENSMUST00000178862|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTGGGGGGGC +>556|TRBJ1-1 ENSMUST00000103284|TRBJ1-1|J-REGION|TR|TRB|None|00 +CAAACACAGAAGTCTTCTTTGGTAAAGGAACCAGACTCACAGTTGTAG +>557|TRBJ1-2 ENSMUST00000103285|TRBJ1-2|J-REGION|TR|TRB|None|00 +CAAACTCCGACTACACCTTCGGCTCAGGGACCAGGCTTTTGGTAATAG +>558|TRBJ1-3 ENSMUST00000192366|TRBJ1-3|J-REGION|TR|TRB|None|00 +TTCTGGAAATACGCTCTATTTTGGAGAAGGAAGCCGGCTCATTGTTGTAG +>559|TRBJ1-4 ENSMUST00000103287|TRBJ1-4|J-REGION|TR|TRB|None|00 +TTTCCAACGAAAGATTATTTTTCGGTCATGGAACCAAGCTGTCTGTCCTGG +>560|TRBJ1-5 ENSMUST00000103288|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAACAACCAGGCTCCGCTTTTTGGAGAGGGGACTCGACTCTCTGTTCTAG +>561|TRBJ1-6 ENSMUST00000103289|TRBJ1-6|J-REGION|TR|TRB|None|00 +TTCCTATAATTCGCCCCTCTACTTTGCGGCAGGCACCCGGCTCACTGTGACAG +>562|TRBJ1-7 ENSMUST00000193061|TRBJ1-7|J-REGION|TR|TRB|None|00 +CCTGTGTTGGATGACCATGGTCTTGGAAAGGAACTTAGGTATAAGA +>563|TRBJ2-1 ENSMUST00000103293|TRBJ2-1|J-REGION|TR|TRB|None|00 +TAACTATGCTGAGCAGTTCTTCGGACCAGGGACACGACTCACCGTCCTAG +>564|TRBJ2-2 ENSMUST00000103294|TRBJ2-2|J-REGION|TR|TRB|None|00 +CAAACACCGGGCAGCTCTACTTTGGTGAAGGCTCAAAGCTGACAGTGCTGG +>565|TRBJ2-3 ENSMUST00000103295|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGTGCAGAAACGCTGTATTTTGGCTCAGGAACCAGACTGACTGTTCTCG +>566|TRBJ2-4 ENSMUST00000103296|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGTCAAAACACCTTGTACTTTGGTGCGGGCACCCGACTATCGGTGCTAG +>567|TRBJ2-5 ENSMUST00000103297|TRBJ2-5|J-REGION|TR|TRB|None|00 +AACCAAGACACCCAGTACTTTGGGCCAGGCACTCGGCTCCTCGTGTTAG +>568|TRBJ2-7 ENSMUST00000103298|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTATGAACAGTACTTCGGTCCCGGCACCAGGCTCACGGTTTTAG +>569|TRBV1 ENSMUST00000103262|TRBV1|5'UTR|TR|TRB|None|00 +GGATTCTCTTCTCTTGCCTGATGCCCTGCATGCCCCACAGAGATAGAGAGAACCTGAGGTCTCAGAG +>570|TRBV1 ENSMUST00000103262|TRBV1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGCAGTTTTGCATTCTGTGCCTCTGTGTACTCATGGCTTCTGTGGCTACAGACCCCACAGTGACTTTGCTGGAGCAAAACCCAAGGTGGCGTCTGGTACCACGTGGTCAAGCTGTGAACCTACGCTGCATCTTGAAGAATTCCCAGTATCCCTGGATGAGCTGGTATCAGCAGGATCTCCAAAAGCAACTACAGTGGCTGTTCACTCTGCGGAGTCCTGGGGACAAAGAGGTCAAATCTCTTCCCGGTGCTGATTACCTGGCCACACGGGTCACTGATACGGAGCTGAGGCTGCAAGTGGCCAACATGAGCCAGGGCAGAACCTTGTACTGCACCTGCAGTGCAGA +>571|TRBV10 ENSMUST00000103265|TRBV10|5'UTR|TR|TRB|None|00 +TCTGATAGCTGCAGTAGGTAGGGCTTATTTGCCCTGCCTTGACCCAACT +>572|TRBV10 ENSMUST00000103265|TRBV10|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGTAGGCTCCTAAGCTGTGTGGCCTTCTGCCTCTTGGGAATAGGCCCTTTGGAGACGGCTGTTTTCCAGACTCCAAACTATCATGTCACACAGGTGGGAAATGAAGTGTCTTTCAATTGTAAGCAAACTCTGGGCCACGATACTATGTATTGGTACAAGCAAGACTCTAAGAAATTGCTGAAGATTATGTTTAGCTACAATAATAAGCAACTCATTGTAAACGAAACAGTTCCAAGGCGCTTCTCACCTCAGTCTTCAGATAAAGCTCATTTGAATCTTCGAATCAAGTCTGTAGAGCCGGAGGACTCTGCTGTGTATCTCTGTGCCAGCAGCTAAGA +>573|TRBV12-1 ENSMUST00000103267|TRBV12-1|5'UTR|TR|TRB|None|00 +GCATCCTGAGAAGAAGC +>574|TRBV12-1 ENSMUST00000103267|TRBV12-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGTCCTCGCTGATTCTGCCTGGGGCATCACCCTGCTATCTTGGGTTACTGTCTTTCTCTTGGGAACAAGTTCAGCAGATTCTGGGGTTGTCCAGTCTCCAAGACACATAATCAAAGAAAAGGGAGGAAGGTCCGTTCTGACGTGTATTCCCATCTCTGGACATAGCAATGTGGTCTGGTACCAGCAGACTCTGGGGAAGGAATTAAAGTTCCTTATTCAGCATTATGAAAAGGTGGAGAGAGACAAAGGATTCCTACCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAAATGAACATGAGTGCCTTGGAACTGGAGGACTCTGCTATGTACTTCTGTGCCAGCTCTCTC +>575|TRBV12-2 ENSMUST00000103269|TRBV12-2|5'UTR|TR|TRB|None|00 +CCTGAGAGGAAGC +>576|TRBV12-2 ENSMUST00000103269|TRBV12-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAGTTCAGCAAATTCTGGGGTTGTCCAGTCTCCAAGATACATAATCAAAGGAAAGGGAGAAAGGTCCATTCTAAAATGTATTCCCATCTCTGGACATCTCTCTGTGGCCTGGTATCAACAGACTCAGGGGCAGGAACTAAAGTTCTTCATTCAGCATTATGATAAAATGGAGAGAGATAAAGGAAACCTGCCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAGATGAACATGAGTGCCTTGGAGCTAGAGGACTCTGCCGTGTACTTCTGTGCCAGCTCTCTC +>577|TRBV13-1 ENSMUST00000194399|TRBV13-1|5'UTR|TR|TRB|None|00 +AACATACAAGAGCCTGACTTGGTCGCGAG +>578|TRBV13-1 ENSMUST00000194399|TRBV13-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTTCTGGTCTTGAGCCTCCTGTGTACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCTAGAAACAAGGTGACAGTAACAGGAGGAAACGTGACATTGAGCTGTCGCCAGACTAATAGCCACAACTACATGTACTGGTATCGGCAGGACACTGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGCTGGCAACCTTCAAATAGGAGATGTCCCTGATGGGTACAAGGCCACCAGAACAACGCAAGAAGACTTCTTCCTCCTGCTGGAATTGGCTTCTCCCTCTCAGACATCTTTGTACTTCTGTGCCAGCAGTGATG +>579|TRBV13-2 ENSMUST00000103270|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>580|TRBV13-3 ENSMUST00000103271|TRBV13-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGACTCTTCTTTGTGGTTTTGATTCTCCTGTGTGCAAAACACATGGAGGCTGCAGTCACCCAAAGTCCAAGAAGCAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTCACCAGACTAATAACCATGACTATATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTACTCATATGTCGCTGACAGCACGGAGAAAGGAGATATCCCTGATGGGTACAAGGCCTCCAGACCAAGCCAAGAGAATTTCTCTCTCATTCTGGAGTTGGCTTCCCTTTCTCAGACAGCTGTATATTTCTGTGCCAGCAGTGATG +>581|TRBV14 ENSMUST00000103272|TRBV14|5'UTR|TR|TRB|None|00 +CCTCCTCTGCCCTCAATCTGCC +>582|TRBV14 ENSMUST00000103272|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTTCTTGGCTGGGCAGTGTTCTGTCTCCTTGACACAGTACTGTCTGAAGCTGGAGTCACCCAGTCTCCCAGATATGCAGTCCTACAGGAAGGGCAAGCTGTTTCCTTTTGGTGTGACCCTATTTCTGGACATGATACCCTTTACTGGTATCAGCAGCCCAGAGACCAGGGGCCCCAGCTTCTAGTTTACTTTCGGGATGAGGCTGTTATAGATAATTCACAGTTGCCCTCGGATCGATTTTCTGCTGTGAGGCCTAAAGGAACTAACTCCACTCTCAAGATCCAGTCTGCAAAGCAGGGCGACACAGCCACCTATCTCTGTGCCAGCAGTTTCT +>583|TRBV15 ENSMUST00000103273|TRBV15|5'UTR|TR|TRB|None|00 +GTCACATCAGTGCTCATCCCACT +>584|TRBV15 ENSMUST00000103273|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCATCCAGACCCTCTGTTGTGTGATCTTTTATGTTCTGATAGCAAATCACACAGATGCTGGAGTTACCCAGACACCCAGACATGAGGTGGCAGAGAAAGGACAAACAATAATCCTGAAGTGTGAGCCAGTTTCAGGCCACAATGACCTTTTCTGGTACAGACAGACCAAGATACAGGGACTAGAGTTGCTGAGCTACTTCCGCAGCAAGTCTCTTATGGAAGATGGTGGGGCTTTCAAGGATCGATTCAAAGCTGAGATGCTAAATTCATCCTTCTCCACTCTGAAGATTCAACCTACAGAACCCAAGGACTCAGCTGTGTATCTGTGTGCCAGCAGTTTAGC +>585|TRBV16 ENSMUST00000103274|TRBV16|5'UTR|TR|TRB|None|00 +TCTCGTGCTTACGTGGAGTTTCTATGAGTGAAGCCACTGCCTCATCTTGCC +>586|TRBV16 ENSMUST00000103274|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCCCCAGGCTCCTTTTCTGTCTGGTTCTTTGCTTCTTGAGAGCAGAACCAACAAATGCTGGTGTCATCCAAACACCTAGGCACAAGGTGACAGGGAAGGGACAAGAAGCAACTCTGTGGTGTGAGCCAATTTCAGGACATAGTGCTGTTTTCTGGTACAGACAGACCATTGTGCAGGGCCTGGAGTTCCTGACTTACTTTCGAAATCAAGCTCCTATAGATGATTCAGGGATGCCCAAGGAACGATTCTCAGCTCAGATGCCCAATCAGTCGCACTCAACTCTGAAGATCCAGAGCACGCAACCCCAGGACTCAGCGGTGTATCTTTGTGCAAGCAGCTTAGA +>587|TRBV17 ENSMUST00000103275|TRBV17|5'UTR|TR|TRB|None|00 +CAAATATTCCTTTCCTGTTCTGGACCATCC +>588|TRBV17 ENSMUST00000103275|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATCCTAGACTTCTTTGCTGTGTGATCTTCTGTCTTCTTGCAGCCACTTTTGTGGATACTACGGTTAAGCAGAACCCAAGATACAAGCTTGCAAGAGTTGGAAAACCAGTGAATTTGATCTGTTCTCAGACTATGAATCATGATACCATGTACTGGTACCAAAAGAAGCCAAACCAAGCACCAAAGCTTCTTCTTTTCTACTATGATAAGATTTTGAACAGGGAAGCTGACACTTTTGAGAAGTTCCAATCCAGTCGGCCTAACAATTCTTTCTGCTCTCTCTACATTGGCTCTGCAGGCCTAGAGTATTCTGCCATGTACCTCTGTGCTAGCAGTAGAGA +>589|TRBV19 ENSMUST00000103276|TRBV19|5'UTR|TR|TRB|None|00 +CCCCTCTTCTCAGAACTGGTGCAGATGCTTGGAGCCAGTGTCTGGCTCTCTGGTCTCCCTCTCCTTCTGCCACACCAGGAAGCTCCTTTTGAACATCTCAAGAGTCTTCCTACCATTCTAGTCATCATAGTTAGCCAGGTGGAGCCCCTGCATAGCGCGTCTCCTTGTTTCTCTTTTAACTAATGCCCAGAGCCAAAGAAAGTCCCTCCAAACT +>590|TRBV19 ENSMUST00000103276|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAACAAGTGGGTTTTCTGCTGGGTAACCCTTTGTCTCCTTACTGTAGAGACCACACATGGTGATGGTGGCATCATTACTCAGACACCCAAATTCCTGATTGGTCAGGAAGGGCAAAAACTGACCTTGAAATGTCAACAGAATTTCAATCATGATACAATGTACTGGTACCGACAGGATTCAGGGAAAGGATTGAGACTGATCTACTATTCAATAACTGAAAACGATCTTCAAAAAGGCGATCTATCTGAAGGCTATGATGCGTCTCGAGAGAAGAAGTCATCTTTTTCTCTCACTGTGACATCTGCCCAGAAGAACGAGATGGCCGTTTTTCTCTGTGCCAGCAGTATAG +>591|TRBV2 ENSMUST00000103263|TRBV2|5'UTR|TR|TRB|None|00 +GCACAAGAAACTGTCTGAGGAGACCCAAGAGGTAGCTGGGTATGGTCTAGGTCTGGGAGCCTATGCCCTGACAAGCATGAAGGGCAAAGAGGAAGTGTGAGCTGAAACCATCTACACAACAGGGAGCATCCAAGCAAAGCATTTTACAGGTCAGCAAAAGGCACCCAGACAGCCAGGATCCAAAGAGAAAGAGATCCTATCCTGTGTGACACTGCT +>592|TRBV2 ENSMUST00000103263|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCATTTTCCTCAGTTGCCTGGCCGTTTGTCTCCTGGTGGCAGGTCCAGTCGACCCGAAAATTATCCAGAAACCAAAATATCTGGTGGCAGTCACAGGGAGCGAAAAAATCCTGATATGCGAACAGTATCTAGGCCACAATGCTATGTATTGGTATAGACAAAGTGCTAAGAAGCCTCTAGAGTTCATGTTTTCCTACAGCTATCAAAAACTTATGGACAATCAGACTGCCTCAAGTCGCTTCCAACCTCAAAGTTCAAAGAAAAACCATTTAGACCTTCAGATCACAGCTCTAAAGCCTGATGACTCGGCCACATACTTCTGTGCCAGCAGCCAAGA +>593|TRBV20 ENSMUST00000103277|TRBV20|L-REGION+V-REGION|TR|TRB|None|00 +ATGTTACTGCTTCTATTACTTCTGGGGCCTGGCTGTGGGCTTGGAGCACTCGTCTATCAATATCCCAGAAGAACCATCTGTAAGAGTGGAACTTCCATGAGGATGGAGTGTCAAGCTGTGGGTTTTCAGGCAACTTCTGTAGCTTGGTATCGTCAATCGCCTCAAAAGACATTTGAACTGATAGCACTTTCTACTGTGAACTCAGCAATCAAATATGAACAAAATTTTACCCAGGAAAAATTTCCCATCAGTCATCCCAACTTATCCTTTTCATCTATGACAGTTTTAAATGCATATCTTGAAGACAGAGGCTTATATCTCTGTGGTGCTAGGGA +>594|TRBV21 ENSMUST00000195087|TRBV21|5'UTR|TR|TRB|None|00 +AGACAGCTAGCTGATCAGCACTCTCTATGAATCAACCATGCACTGCAAACTTTTCTACTGTGTGCCCTTTTATTCTGGACATCAAGCTCC +>595|TRBV23 ENSMUST00000193997|TRBV23|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTGCACGGCTCATTTGCTATGTAGCACTTTGCCTCCTGGGGGCAGGCTCTTTTGATGCTGCAGTTACACAGAAGCCAAGATATTTGATCAAAATGAAAGGCCAGGAAGCAGAGATGAAATGTATCCCTGAAAAGGGGCACACTGCTGTTTTCTGGTATCAACAAAAGCAGAGCAAAGAATTAAAGTTCCTGATTTACTTTCAGAATCAACAGCCTCTTGATCAAATAGACATGGTCAAGGAGAGATTCTCAGCTGTGTGCCCCTCCAGCTCACTCTGCAGCCTGGGAATCAGAACGTGCGAAGCAGAAGACTCAGCACTGTACTTGTGCTCCAGCAGTCAATC +>596|TRBV26 ENSMUST00000193064|TRBV26|5'UTR|TR|TRB|None|00 +TTTCGTACTTCTAAGCCACC +>597|TRBV26 ENSMUST00000193064|TRBV26|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCTACAAGGCTCCTCTGTTACACAGTACTTTGTCTCCTGGGTGCAAGAATTTTGAATTCAAAAGTCATTCAGACTCCAAGATATCTGGTGAAAGGGCAAGGACAAAAAGCAAAGATGAGGTGTATCCCTGAAAAGGGACATCCAGTTGTATTCTGGTATCAACAAAATAAGAACAATGAGTTTAAATTTTTGATTAACTTTCAGAATCAAGAAGTTCTTCAGCAAATAGACATGACTGAAAAACGATTCTCTGCTGAGTGTCCTTCAAACTCACCTTGCAGCCTAGAAATTCAGTCCTCTGAGGCAGGAGACTCAGCACTGTACCTCTGTGCCAGCAGTCTGTC +>598|TRBV29 ENSMUST00000103281|TRBV29|5'UTR|TR|TRB|None|00 +AAAACCACC +>599|TRBV29 ENSMUST00000103281|TRBV29|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAGTTAGGCTCATCTCTGCTGTGGTGCTGTGTTTCCTAGGAACAGGCCTTGTGGACATGAAAGTAACCCAGATGCCAAGATACCTGATCAAAAGAATGGGAGAGAATGTTTTGCTGGAATGTGGACAGGACATGAGCCATGAAACAATGTACTGGTATCGACAAGACCCTGGTCTGGGGCTACAGCTGATTTATATCTCATACGATGTTGATAGTAACAGCGAAGGAGACATCCCTAAAGGATACAGGGTCTCACGGAAGAAGCGGGAGCATTTCTCCCTGATTCTGGATTCTGCTAAAACAAACCAGACATCTGTGTACTTCTGTGCTAGCAGTTTATC +>600|TRBV3 ENSMUST00000103264|TRBV3|5'UTR|TR|TRB|None|00 +GTCAGACCTTGCCTATGGGACCATAGGATGCTAGCATACCCCTCCTGTTTCTGATGTGCAGTCAGTCAAGCTAGGAGAAACTACATTCCTGCCGTGACCCTACT +>601|TRBV3 ENSMUST00000103264|TRBV3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTTCTAGGTTGGATAATTTTTAGTTTCTTGGAAGCAGGACACACAGGACCCAAAGTCTTACAGATCCCAAGTCATCAAATAATAGATATGGGGCAGATGGTGACCCTCAATTGTGACCCAGTTTCTAATCACCTATATTTTTATTGGTATAAACAGATTTTAGGACAGCAGATGGAGTTTCTGGTTAATTTCTACAATGGTAAAGTCATGGAGAAGTCTAAACTGTTTAAGGATCAGTTTTCAGTTGAAAGACCAGATGGTTCATATTTCACTCTGAAAATCCAACCCACAGCACTGGAGGACTCAGCTGTGTACTTCTGTGCCAGCAGCTTAGCCACA +>602|TRBV30 ENSMUST00000191646|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGACATTCCTGCTACTTCTTTGGAGCCAAGGTTCTGTATTCAGTGTCCTCCTCTACCAAAAGCCAAACAGGGACATCTGTCAAAGTGGCACTTCACTGAAAATCCAGTGTGTGGCTGACAGTCAAGTTGTTTCGATGTTTTGGTACCAACAGTTCCAGGAACAGAGCTTGATGCTCATGGCAACTGCAAATGAAGGCTCTGAAGCCACATACGAGAGTGGATTCACCAAGGACAAGTTTCCAATCAGCCGGCCAAACCTAACATTCTCAACGTTGACAGTGAACAATGCAAGGCCTGGAGACAGCAGTATCTATTTCTGTAGTTCTAGAGA +>603|TRBV31 ENSMUST00000193003|TRBV31|5'UTR|TR|TRB|None|00 +GGAGGGGCCTGTGCATCTCTGGCTTAGAAAAGGAAGTACAAGTGCAGAGTAGACAAGCCTAGACAAAGACCATCTTGAACT +>604|TRBV31 ENSMUST00000193003|TRBV31|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGTACTCTCTCCTTGCCTTTCTCCTGGGCATGTTCTTGGGTGTTAGTGCTCAGACTATCCATCAATGGCCAGTTGCCGAGATCAAGGCTGTGGGCAGCCCACTGTCTCTGGGGTGTACCATAAAGGGGAAATCAAGCCCTAACCTCTACTGGTACTGGCAGGCCACAGGAGGCACCCTCCAGCAACTCTTCTACTCTATTACTGTTGGCCAGGTAGAGTCGGTGGTGCAACTGAACCTCTCAGCTTCCAGGCCGAAGGACGACCAATTCATCCTAAGCACGGAGAAGCTGCTTCTCAGCCACTCTGGCTTCTACCTCTGTGCCTGGAGTCT +>605|TRBV5 ENSMUST00000103266|TRBV5|5'UTR|TR|TRB|None|00 +AATACCCGTCTGGAGCCTGATTCCACC +>606|TRBV5 ENSMUST00000103266|TRBV5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCTGCAGGCTTCTCCTCTATGTTTCCCTATGTCTTGTGGAAACAGCACTCATGAACACTAAAATTACTCAGTCACCAAGATATCTAATCCTGGGAAGAGCAAATAAGTCTTTGGAATGTGAGCAACATCTGGGACATAATGCTATGTACTGGTATAAACAGAGCGCTGAGAAGCCGCCAGAGCTCATGTTTCTCTACAATCTTAAACAGTTGATTCGAAATGAGACGGTGCCCAGTCGTTTTATACCTGAATGCCCAGACAGCTCCAAGCTACTTTTACATATATCTGCCGTGGATCCAGAAGACTCAGCTGTCTATTTTTGTGCCAGCAGCCAAGA +>607|TRDC ENSMUST00000196323|TRDC|C-REGION|TR|TRD|None|00 +AAAGCCAGCCTCCGGCCAAACCATCTGTTTTCATCATGAAAAATGGAACAAATGTTGCTTGTCTGGTGAAAGATTTCTACCCTAAAGAGGTGACTATAAGTCTCAGATCATCCAAGAAGATTGTGGAATTCGACCCTGCTATAGTCATCTCCCCCAGCGGGAAGTACAGTGCTGTCAAGCTTGGTCAGTATGGAGATTCGAATTCAGTGACATGTTCAGTTCAGCACAACAGTGAAACTGTGCACTCGACTGACTTTGAACCATATGCAAATTCTTTCAATAATGAAAAACTACCAGAACCTGAAAATGACACACAAATTTCAGAGCCTTGCTATGGCCCAAGAGTCACAGTTCACACTGAGAAGGTAAACATGATGTCCCTCACGGTGCTGGGCCTACGACTGCTGTTTGCCAAGACCATTGCCATCAATTTTCTCTTGACTGTTAAGTTATTCTTT +>608|TRDD1 ENSMUST00000196221|TRDD1|D-REGION|TR|TRD|None|00 +ATGGCATAT +>609|TRDD2 ENSMUST00000177564|TRDD2|D-REGION|TR|TRD|None|00 +ATCGGAGGGATACGAG +>610|TRDJ1 ENSMUST00000103682|TRDJ1|J-REGION|TR|TRD|None|00 +CTACCGACAAACTCGTCTTTGGACAAGGAACCCAAGTGACTGTGGAACCAA +>611|TRDJ2 ENSMUST00000103683|TRDJ2|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTTGGAACTGGCATAGAGCTCTTTGTGGAGCCCC +>612|TRDV1 ENSMUST00000103676|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGGGATGCGCCTTCAAGTGCTTGCTTGGCTATTGACATTTCAGGCTGCCTGGGTCAACACCCAAATGTTGCATCAGAGTCCTCAGTCTCTGACAATCCAAGAAGGAGATGAAGTCACCATGAGCTGCAATTTATCAACATCTTTATATGCCTTACTCTGGTATAGGCAGGGGGATGATGGCAGCCTCGTCTCCTTGGTGACATTACAGAAAGGAGGAGATGAGAAAAGTAAGGACAAAATAACCGCTAATCTGGATAAGAAAATGCAACAAAGTTCCCTGTGGATCCAAGCCTCCCAGCCCAGCCACTCAGGCACTTACCTCTGTGGAGGGAAAG +>613|TRDV2-1 ENSMUST00000197130|TRDV2-1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGCAGTCCTTAGCTCACTGTGGGCAGTTGTGATCACCACCTGTCTAGGAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAGTCGGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCACTCAGGGGGAGC +>614|TRDV2-2 ENSMUST00000103678|TRDV2-2|5'UTR|TR|TRD|None|00 +AGTGCTAGCGCAGCTGAGAGCAAGGACTGATCTGAAGCCGGCTTCTAGC +>615|TRDV2-2 ENSMUST00000103678|TRDV2-2|L-REGION+V-REGION|TR|TRD|None|00 +ATGGTACGGCCGTTCTTCCTGTGGGTGCTCTTCCTTTCCACTTCTCTTGAAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAATCAGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCTCTCATGGAGCGC +>616|TRDV4 ENSMUST00000103679|TRDV4|5'UTR|TR|TRD|None|00 +AGCAGATAAGGATTCTCACGGAGACAGAGACAGAGGTGAGGCTCAGCAGGGCAGCCCAGGAAAGCACCAGCCGATTACAAACTCATCCTCAGTGAAACT +>617|TRDV4 ENSMUST00000103679|TRDV4|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTTTGGAGATGTCCAGTCCTCTGCATATTCATCTTCAGTACAGGGACCTCTTTGGATGTATATTTGGAACCAGTTGCCAAAACTTTTACTGTTGTAGCTGGGGATCCTGCCTCCTTCTACTGCACTGTAACAGGAGGGGACATGAAGAATTATCATATGAGCTGGTATAAGAAGAATGGAACTAATGCTCTGTTTTTAGTATACAAGCTAAATAGCAATTCTACTGATGGTGGAAAGAGCAACCTCAAAGGGAAAATTAACATTTCAAAAAATCAGTTTATACTCGACATTCAGAAGGCAACAATGAAAGACGCTGGTACGTACTACTGTGGGTCAGATATC +>618|TRDV5 ENSMUST00000103685|TRDV5|5'UTR|TR|TRD|None|00 +CCCTCCTGTCCCCTCCCTAGACAAAGCAATAGGGATGGTTAAAGAGAGTCCAGCAGCCCTCCTCCACGCTGTGCCCCTGTACCGACTGGAAGG +>619|TRDV5 ENSMUST00000103685|TRDV5|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTGCCGCGACCCTTACCCTTCTGTTTGCCTACAAGGATGTGCTGTGCATCACGCTGACCCAGAGCTCCACTGACCAGACAGTGGCAAGCGGCACTGAAGTAACACTGCTCTGCACGTACAATGCGGATTCTCCAAACCCAGATTTATTTTGGTATCGCAAAAGGCCAGACAGATCCTTCCAGTTCATCCTTTATAGGGACGACACTAGTTCCCATGATGCAGATTTTGTTCAAGGTCGATTTTCTGTGAAGCACAGCAAGGCCAACAGAACCTTCCATCTGGTGATCTCTCCAGTGAGCCTTGAAGACAGCGCTACTTATTACTGTGCCTCGGGGTAT +>620|TRGC1 ENSMUST00000103558|TRGC1|C-REGION|TR|TRG|None|00 +ACAAAAGGCTTGATGCAGACATTTCCCCCAAGCCCACTATTTTCCTTCCTTCTGTTGCTGAAACAAATCTCCATAAGACTGGGACATACCTTTGTCTCCTTGAAAAGTTCTTTCCAGATGTTATAAGGGTGTATTGGAAAGAAAAGGATGGCAATACTATCCTGGACTCCCAGGAAGGGGATACGCTGAAGACTAACGACACATACATGAAGTTTAGCTGGCTTACAGTGCCTGAAAGGGCAATGGGGAAAGAGCACAGATGTATTGTCAAACATGAGAACAACAAAGGAGGAGCAGATCAAGAGATTTTCTTTCCTTCAATAAAGAAAGTTGCTGTGAGTACCAAGCCTACAACTTGCTGGCAAGATAAAAATGATGTGCTGCAGCTCCAGTTCACGATCACCTCTGCCTACTACACCTACCTTCTCCTGCTCCTCAAGAGTGTGATCTACTTGGCCATCATCAGCTTCTCTCTGCTTAGAAGAACATCTGTCTGTGGCAATGAGAAGAAATCC +>621|TRGC2 ENSMUST00000103561|TRGC2|C-REGION|TR|TRG|None|00 +ACAAAAGGCTTGATGCAGACATTTCCCCCAAGCCCACTATTTTTCTTCCTTCTGTTGCTGAAACAAATCTCCATAAGACTGGGACATACCTTTGTCTCCTTGAAAAGTTCTTTCCCGATGTCATAAGGGTGTATTGGAAAGAAAAGAATGGCAATACTATCCTGGACTCCCAGGAAGGGGATACGCTGAAGACTAAGGGCACATACATGAAGTTTAGCTGGCTTACTGTGCCTGAAAGGGCAATGGGGAAAGAGCACAGTTGTATTGTCAAACATGAGAACAACAAAGGAGGAGCAGATCAAGAGATTTTCTTCCCTTCAATAAAGAAAGTTGCTACAACTTGCTGGCAAGATAAAAATGATGTGCTGCAGTTCCAGTTCACGAGCACCTCTGCCTACTACACCTACCTCCTCCTGCTCCTCAAGAGTGTGATCTACTTGGCCATCATCAGCTTCTCTCTGCTTAGAAGAACATCTGTCTGTGGCAATGAGAAGAAGTCC +>622|TRGC3 ENSMUST00000198163|TRGC3|C-REGION|TR|TRG|None|00 +ACAAAAAGCTTGATGCAGACATTTCCCCCAAGCCCACTATTTTTCTTCCTTCTGTTGCTGAAACAAATCTCCATAAGACTGGGACATACCTTTGTGTCCTTGAAAAGTTCTTTCCCGATGTCATAAGGGTGTATTGGAAAGAAAAGAAAGGCAATACCATCCTGGACTCCCAGGAAGGTGATATGCTGAAGACTAATGACACATACATGAAGTTTAGCTGGCTTACTGTGCCTGAAAGGTCAATGGGGAAAGAGCACAGATGTATTGTCAAACATGAGAACAACAAAGGAGGAGCAGATCAAGAGATTTTCTTTCCTTCAATAAAGAAAGTTGCCGTGAGTACCAAGCCTACAACTTGCTGGCAAGATAAAAATATGTGCTGCAGCTCCAGTTCACGATCACCTCTGCCTACTACACCTACCTTCTCCTGCTCCTCAAGAGTG +>623|TRGC4 ENSMUST00000179181|TRGC4|C-REGION|TR|TRG|None|00 +ACAAACGCACTGACTCAGACTTTTCTCCCAAGCCTACTATTTTCCTTCCTTCTGCTGCTGAAACAAATCTCCATAAGGCTGGGACCTACCTTTGTCTCCTTGAAAAGTTCTTTCCTGAAGTCATAAGGGTGTATTGGAAAGAAAAGGATGGTGAAAAGATTCTGGAATCCCAGGAAGGAAACACCATAAAAACTAATGACAGATACATGAAATTTAGTTGGCTGACGGTGACTGAAGATTCAATGGCTAAAGAACATAGTTGCATTGTCAAACACGAAAACAACAAAAGAGGAGTTGACCAAGAGATTCTGTTTCCTCCCATAGGTAAAGCTTTCACAACTATTAATGTTAATCCCAGAGATAGTGTTTTGCGGCATGAAAATGTTAACAATGCTACTGATCTGGAAGATTGCATGAAAGGAAGAAAGGATATGTTGCAGCTTCAGGTCACCACCACCTATGCATTCTACACCTACCTCATCCTGTTCTTCAAGAGCATGGTCCACTTGGCCTTCGTTGTATTCTGTCTATTCAGAAGAGCAGCCATGTCCTGTGATGATCAACGTTCA +>624|TRGJ1 ENSMUST00000200495|TRGJ1|J-REGION|TR|TRG|None|00 +ATAGCTCAGGTTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCCTCTG +>625|TRGJ2 ENSMUST00000197113|TRGJ2|J-REGION|TR|TRG|None|00 +ATAGCTCGGGCTTTCACAAGGTATTTGCAGAAGGAACAAAGCTCATAGTAATTCCCTCCG +>626|TRGJ3 ENSMUST00000103562|TRGJ3|J-REGION|TR|TRG|None|00 +ATAGTTGGGACTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCTTCTG +>627|TRGJ4 ENSMUST00000184430|TRGJ4|J-REGION|TR|TRG|None|00 +TCAGGCACATCATGGGTCAAGATATTTGCCAAAGGGACAAAGCTCGTAGTAATTCCCCCAG +>628|TRGV1 ENSMUST00000103564|TRGV1|5'UTR|TR|TRG|None|00 +CTCCCTGTGAAGCAGCCTGACCTTGGG +>629|TRGV1 ENSMUST00000103564|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGATGGCCCACCTTCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGAGACAGATGAGAGTGCGCAAATATCCTGTATAGTTTCTCTTCCATATTTCTCCAACACAGCTATACATTGGTACCGGCAAAAAGCAAAAAAGTTTGAGTATCTAATATATGTCTCAACAAACTACAATCAACGACCCTTAGGAGGGAAGAACAAAAAAATTGAAGCAAGTAAAGATTTTCAAACTTCTACCTCAACCTTGAAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATAAA +>630|TRGV2 ENSMUST00000103563|TRGV2|5'UTR|TR|TRG|None|00 +AACAGATCATGACCAACCCTGGGGGAACCCACTGACTGCATTTTTCTGAGACTATAGCACAGTCCCACCCTCCAGCTGGTGACCTGAAATTCCAGCCTGCAGAGCACTTCCTGCCTCCCTGTGAAGCAGTCCAACCTTGGG +>631|TRGV2 ENSMUST00000103563|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGATGGTTCACCTCCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGAGACAGATGAGAATGTGCAAATATCCTGTATAGTTTATCTTCCATATTTCTCCAACACAGCTATACATTGGTACCGGCAAAAAACAAATCAACAGTTTGAGTATCTAATATATGTCGCAACAAACTACAATCAACGACCCTTAGGAGGGAAGCACAAAAAAATTGAAGCAAGTAAAGATTTTAAAAGTTCTACCTCAACCTTGGAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATGAG +>632|TRGV3 ENSMUST00000198663|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGAATGTTCACCTCCTGCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGCAACAGATGAGAGTGCGCAAATATCCTGTATAGTTTCTCTTCCATGTTTCTCCAACACAGCTATACATTGGTACCGGCAAAAACCAAATCAACAGTTTGAGTATCTAATATATGTCGAGACAAACTACAATCAACAACCCTTAGGAGGGAAGAACAAGAAAATTGAAGCAAGTAAAGATTTTCAAACTTCTACCTCAACCTTGAAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATAAA +>633|TRGV4 ENSMUST00000103554|TRGV4|5'UTR|TR|TRG|None|00 +GCAGACC +>634|TRGV4 ENSMUST00000103554|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGAAGAACCCTGGCTCACAAGCCCTGCTTCCTTTATATCTTCCCTGGGAAGCCAACCTGGCAGATGAGAATCCACTCCTGAAAGTAGTCATTTTCTTATGCCTCTTGACATTTGGACATGGGAAGTTGGAGCAACCTGAAATATCAATTTCCAGACCAAGAGATGAGACTGCACAAATATCCTGTAAAGTTTTCATCGAAAGCTTTAGGAGTGTAACCATACACTGGTACCGGCAGAAACCAAACCAAGGTTTAGAGTTTCTATTATATGTCCTTGCAACCCCTACCCATATTTTCTTAGATAAGGAGTACAAGAAAATGGAGGCAAGTAAAAATCCTAGTGCTTCTACATCGATATTGACAATATATTCCTTGGAGGAAGAAGACGAAGCTATCTACTACTGTTCCTACGGCTAAAG +>635|TRGV5 ENSMUST00000199017|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGTCAACCTCTTGGCTTTTTCTTCTGTCTTTGACCTGTGTTTATGGAGACTCCTGGATATCTCAGGATCAGCTCTCCTTTACCCGAAGACCAAACAAGACGGTGCACATAAGTTGCAAGCTCTCTGGGGTTCCCCTTCATAACACCATTGTGCACTGGTACCAACTGAAAGAAGGGGAGCCCCTGAGACGAATCTTCTATGGCTCAGTCAAAACTTACAAACAAGACAAGTCCCACTCCCGCTTGGAAATTGATGAGAAGGATGATGGTACCTTTTACCTGATAATCAACAATGTTGTCACATCGGATGAAGCCACGTACTACTGTGCCTGCTGGGATCT +>636|TRGV6 ENSMUST00000198330|TRGV6|5'UTR|TR|TRG|None|00 +AAGGGCTGCAGG +>637|TRGV6 ENSMUST00000198330|TRGV6|L-REGION+V-REGION|TR|TRG|None|00 +ATGGGGCTTCTGCTACAAGTCTTCACACTGGCCTCCCTCAGGATTTATTCAGAGGGAAGCAGTCTCACGTCACCTCTGGGGTCATATGTCATCAAGAGGAAAGGAAATACGGCTTTTCTCAAATGTCAAATAAAAACAAGTGTTCAGAAGCCCGATGCATACATACACTGGTACCAAGAGAAGCCAGGCCAGCGTCTCCAAAGAATGCTGTGTAGTTCTTCAAAAGAAAACATTGTCTATGAGAAAGATTTTAGTGACGAAAGATATGAGGCAAGGACATGGCAGAGTGATTTGTCTTCAGTCCTCACCATACACCAAGTGACAGAAGAGGACACGGGAACTTATTACTGTGCATGCTGGGATA +>638|TRGV7 ENSMUST00000103553|TRGV7|5'UTR|TR|TRG|None|00 +GTTCTTATAGCACAAGGC +>639|TRGV7 ENSMUST00000103553|TRGV7|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTGGGCTCTGGCCCTACTTCTAGCTTTCTTGCCGGCTGGCAGACAAACATCCTCCAACTTGGAAGAAAGAATAATGTCAATCACCAAGCTAGAGGGGTCCTCTGCTATAATGACTTGTGATACTCACAGAACAGGCACTTACATCCACTGGTACCGATTCCAGAAAGGGAGGGCCCCAGAGCACCTTCTCTACTATAACTTCGTCAGTTCCACAACTGTGGTGGATTCCAGATTCAATTTGGAGAAATATCATGTTTATGAAGGCCCGGACAAGAGGTATAAATTTGTGCTTCGGAATGTGGAGGAGTCCGATTCTGCTCTGTACTACTGTGCCTCCTGGGCTGG +>640|IGKV12-89 GRCm38-release94|IGKV12-89|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGTGTACCCACTCAGCTCCTGTTGCTGTGGCTTACAGTCGTAGTTGTCAGATGTGACATCCAGATGACTCAGTCTCCAGCTTCACTGTCTGCATCTGTGGGAGAAACTGTCACCATCACATGTGGAGCAAGTGAGAATATTTACGGTGCTTTAAATTGGTATCAGCGGAAACAGGGAAAATCTCCTCAGCTCCTGATCTATGGTGCAACCAACTTGGCAGATGGCATGTCATCGAGGTTCAGTGGCAGTGGATCTGGTAGACAGTATTCTCTCAAGATCAGTAGCCTGCATCCTGACGATGTTGCAACGTATTACTGTCAAAATGTGTTAAGTACTCCTCC +>641|IGHV12-1 AJ851868.3|IGHV12-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGACTACTAGGGTTTCTCCTGTGCTTGGCAGCAGCTCTAAAAAGTGTTCTGTCCCAGATTCAGCTTAAGGAGTCTGGACCTGCTGTCATCAAGCCATCACAGTCACTGTCTCTCACCTGCATAGTCTCTGGATTCTCCATCACAAGTAGTAGTTATTGCTGGCACTGGATCCGCCAGCCCCCAGGAAAGGGGTTAGAGTGGATGGGGCGCATATGTTATGAAGGTTCAATATACTATAGTCCATCCATCAAAAGCCGCAGCACCATCTCCAGAGACACATCTCTGAACAAATTCTTTATCCAGCTGAGCTCTGTGACAAATGAGGACACAGCCATGTACTACTGTTCC +>642|IGHV1-unknown1 LVXK01034187.1|IGHV1-unknown1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGGTCGTTCTCTTCCTCCTGTCATTAACTGCAGGTGTCTATGCCCAGGGTCAGATGCAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGACTTCTGGCTTCACCTTCAGCAGTAGCTATATAAGTTGGTTGAAGCAAAAGCCTGGACAGAGTCTTGAGTGGATTGCATGGATTTATGCTGGAACTGGTGGTACTAGCTATAATCAGAAGTTCACAGGCAAGGCCCAACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAATTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>643|TRAV4-4-DV10 GRCm38-release94|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGGGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGATTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGAGTGTGCAGTGGTTCCGACAGAATTCCAGGGGCAGCCTCATCAGTTTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>644|TRAV13-1 GRCm38-release94|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAATGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGAGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>645|TRBV12-2+TRBV13-2 GRCm38-release94|TRBV12-2+TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>646|TRAV16N GRCm38-release94|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>647|TRAV6N-5 GRCm38-release94|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>648|TRAV13N-4 GRCm38-release94|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGTGCTTCTCAATTAGGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>649|TRBV13-2 GRCm38-release94|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAGTTTTGTCTTTCTTTTTATAGAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>650|IGHG3 GRCm38-release94|IGHG3|C-REGION|IG|IGH|G3|00 +AGCTGGAACTGAATGGGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTGTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>651|IGHG2B GRCm38-release94|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCCGTGACCTCTGGGTGCCTGGTCAAGGGGTACTTCCCTGAGCCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGCACCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTGAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACACTTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTTCTTGACTCTGACGGTTCTTACTTCATATATAGCAAGCTCAATATGAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>652|IGHV8-9 GRCm38-release94|IGHV8-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCCCAGACCCTCAGTCTGACCTGTTCTTTCTCTGTGTTTTCACTGAGCACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTATTGGGATGAGGACAAGCACTATAAACCATCCTTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGCAGATACTGCCACATACTACTGT +>653|IGKV2-109 GRCm38-release94|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCCTTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAATCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGGTGTCCAATCTGGCCTCAGGAGTCCCAAACAGGTTCAGTGGCAGTGAGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGT +>654|IGKV4-56 GRCm38-release94|IGKV4-56|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGCAGAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGCAGAAAGTCACCATAACCTGCAGTGCCATCTCAAGTGTAAATTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATGCAACATCCAAACTGGCTCTTGGAGTCCCTGCTTGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGTGGCTGAAGATGCCACCTCTTATTTCTGT +>655|IGHV1-2 GRCm38-release94|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGATACTTCCTTTTATTATGTCAGTAACTGCAGGTGTCTACTCACAGGTTCAGCTCCAGCAGTCTGGGCCTGAGCTGGCAAGGCCTTGGGCTTCAGTGAAGATATCCTGCCAGGCTTTCTACACCTTTTCCAGAAGGGTGCACTTTGCCATTAGGGATACCAACTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATCGGGGCTATTTATCCTGGAAATGGTGATACTAGTTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGT diff --git a/lib/rust/vdj_ann_ref/vdj_refs_2.0/human/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_2.0/human/fasta/regions.fa new file mode 100644 index 0000000..d6a048e --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_2.0/human/fasta/regions.fa @@ -0,0 +1,1462 @@ +>1|IGHE ENST00000390541|IGHE|C-REGION|IG|IGH|E|00 +GCCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>2|TRBV28 ENST00000390400|TRBV28|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTATG +>3|IGHD4-4 ENST00000414852|IGHD4-4|D-REGION|IG|IGH|None|00 +TGACTACAGTAACTAC +>4|IGHV4-39 ENST00000390619|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGA +>5|TRAV1-1 ENST00000542354|TRAV1-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGCTTTCCTTCTCTATGTTTCCATGAAGATGGGAGGCACTGCAGGACAAAGCCTTGAGCAGCCCTCTGAAGTGACAGCTGTGGAAGGAGCCATTGTCCAGATAAACTGCACGTACCAGACATCTGGGTTTTATGGGCTGTCCTGGTACCAGCAACATGATGGCGGAGCACCCACATTTCTTTCTTACAATGCTCTGGATGGTTTGGAGGAGACAGGTCGTTTTTCTTCATTCCTTAGTCGCTCTGATAGTTATGGTTACCTCCTTCTACAGGAGCTCCAGATGAAAGACTCTGCCTCTTACTTCTGCGCTGTGAGAGA +>6|IGLV1-40 ENST00000390299|IGLV1-40|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAAGAGGCAGCACTCAGGACAATCTCCAGC +>7|IGHD3-9 ENST00000390584|IGHD3-9|D-REGION|IG|IGH|None|00 +GTATTACGATATTTTGACTGGTTATTA +>8|IGLJ3 ENST00000390324|IGLJ3|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTC +>9|TRAV6 ENST00000390428|TRAV6|5'UTR|TR|TRA|None|00 +AAACAGA +>10|IGKV6-21 ENST00000631699|IGKV6-21|5'UTR|IG|IGK|None|00 +ATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>11|IGKV1-37 ENST00000465170|IGKV1-37|5'UTR|IG|IGK|None|00 +AGGCTGGTCACACCCCGTGCAGCAGTCAGTCCCAGTCAGGACACAGC +>12|IGLV3-21 ENST00000390308|IGLV3-21|5'UTR|IG|IGL|None|00 +GCACAGAGGAGCTGTGCCCTGGAATGGGGCCTGTACCTGTCCAAGGCTTGTGCCGTCCCCTGTGGGAGATGAGAAGCGTCCCTGCATTGGGCTCTTGGGGACCCGTCTTGGACATGAATCTCCTCCAGCAGCAGCCTCTGACTCTGCTGATTTGCATCATGGGCCGCTCTCTCCAGCAAGGGGATAAGAGAGGCCTGGGAGGAACCTGCTCAGTCTGGGCCTAAGGAAGCAGCACTGGTGGTGCCTCAGCC +>13|TRBV14 ENST00000617639|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGTTTCCAGGCTTCTCAGTTTAGTGTCCCTTTGTCTCCTGGGAGCAAAGCACATAGAAGCTGGAGTTACTCAGTTCCCCAGCCACAGCGTAATAGAGAAGGGCCAGACTGTGACTCTGAGATGTGACCCAATTTCTGGACATGATAATCTTTATTGGTATCGACGTGTTATGGGAAAAGAAATAAAATTTCTGTTACATTTTGTGAAAGAGTCTAAACAGGATGAGTCCGGTATGCCCAACAATCGATTCTTAGCTGAAAGGACTGGAGGGACGTATTCTACTCTGAAGGTGCAGCCTGCAGAACTGGAGGATTCTGGAGTTTATTTCTGTGCCAGCAGCCAAGA +>14|IGHV3-66 ENST00000632846|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>15|IGLV4-69 ENST00000390282|IGLV4-69|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCTTGGACCCCACTCCTCTTCCTCACCCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCTTGTGCTGACTCAATCGCCCTCTGCCTCTGCCTCCCTGGGAGCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGCAGCTACGCCATCGCATGGCATCAGCAGCAGCCAGAGAAGGGCCCTCGGTACTTGATGAAGCTTAACAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGAGCGCTACCTCACCATCTCCAGCCTCCAGTCTGAGGATGAGGCTGACTATTACTGTCAGACCTGGGGCACTGGCATTCA +>16|IGHD1OR15-1A ENST00000605284|IGHD1OR15-1A|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACAAC +>17|IGLV3-19 ENST00000390309|IGLV3-19|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCTGGCTCACTCTCCTCACTCTTTGCATAGGTTCTGTGGTTTCTTCTGAGCTGACTCAGGACCCTGCTGTGTCTGTGGCCTTGGGACAGACAGTCAGGATCACATGCCAAGGAGACAGCCTCAGAAGCTATTATGCAAGCTGGTACCAGCAGAAGCCAGGACAGGCCCCTGTACTTGTCATCTATGGTAAAAACAACCGGCCCTCAGGGATCCCAGACCGATTCTCTGGCTCCAGCTCAGGAAACACAGCTTCCTTGACCATCACTGGGGCTCAGGCGGAAGATGAGGCTGACTATTACTGTAACTCCCGGGACAGCAGTG +>18|TRAV9-2 ENST00000390441|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGGCTTAGTATCTCTGATACTCTTACTGCTTGGAAGAACCCGTGGAGATTCAGTGACCCAGATGGAAGGGCCAGTGACTCTCTCAGAAGAGGCCTTCCTGACTATAAACTGCACGTACACAGCCACAGGATACCCTTCCCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCTACAGCTCCTCCTGAAAGCCACGAAGGCTGATGACAAGGGAAGCAACAAAGGTTTTGAAGCCACATACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGGCTCAGTTCAAGTGTCAGACTCAGCGGTGTACTTCTGTGCTCTGAGTGA +>19|TRBV11-1 ENST00000390367|TRBV11-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCACCAGGCTTCTCTGCTGGATGGCCCTCTGTCTCCTGGGGGCAGAACTCTCAGAAGCTGAAGTTGCCCAGTCCCCCAGATATAAGATTACAGAGAAAAGCCAGGCTGTGGCTTTTTGGTGTGATCCTATTTCTGGCCATGCTACCCTTTACTGGTACCGGCAGATCCTGGGACAGGGCCCGGAGCTTCTGGTTCAATTTCAGGATGAGAGTGTAGTAGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>20|IGKV1-33 ENST00000632835|IGKV1-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>21|IGKV1D-42 ENST00000390278|IGKV1D-42|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGTCAGATTTGACATCCAGATGACCCAGTCTCCATCTTTCCTGTCTGCATCTGTAGGAGACAGAGTCAGTATCATTTGCTGGGCAAGTGAGGGCATTAGCAGTAATTTAGCCTGGTATCTGCAGAAACCAGGGAAATCCCCTAAGCTCTTCCTCTATGATGCAAAAGATTTGCACCCTGGGGTCTCATCGAGGTTCAGTGGCAGGGGATCTGGGACGGATTTCACTCTCACCATCATCAGCCTGAAGCCTGAAGATTTTGCAGCTTATTACTGTAAACAGGACTTCAGTTACCCTCC +>22|TRGV11 ENST00000390340|TRGV11|5'UTR|TR|TRG|None|00 +ATGCCACTGGTAGTAGCTGTTATCTTCTTCTCCCTCTGGGTTTGTGAGTTGCCCCCTAATCATTTCAGTCTACAGAAGAGATTGAAGTCATTCTGTATTATTACCTCTTCACGTATCGTTGGCTTATGGGAATTTCTCTTCACTTGCAATTGCA +>23|IGHD3-9 ENST00000632911|IGHD3-9|D-REGION|IG|IGH|None|00 +GTATTACGATATTTTGACTGGTTATTATAA +>24|TRBV23-1 ENST00000390396|TRBV23-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCGGCTGTGCAGCCCTGTGTCTCCTGGCAGCAGACTCTTTTCATGCCAAAGTCACACAGACTCCAGGACATTTGGTCAAAGGAAAAGGACAGAAAACAAAGATGGATTGTACCCCCGAAAAAGGACATACTTTTGTTTATTGGTATCAACAGAATCAGAATAAAGAGTTTATGCTTTTGATTTCCTTTCAGAATGAACAAGTTCTTCAAGAAACGGAGATGCACAAGAAGCGATTCTCATCTCAATGCCCCAAGAACGCACCCTGCAGCCTGGCAATCCTGTCCTCAGAACCGGGAGACACGGCACTGTATCTCTGCGCCAGCAGTCAATC +>25|IGKV1D-43 ENST00000468879|IGKV1D-43|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAACCAGCCCTGCAGCTGTGCCCAGCCTGCCTTGCCCCCTGCTAATTTGCATGTTCCCAGAGCACATCCTCCTACCCTGAAGACTTATTAATGCGCTGGTCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>26|TRBV5-6 ENST00000632216|TRBV5-6|5'UTR|TR|TRB|None|00 +AAGCCCTGAATCAGATGCAGTGCTTCCTGTCCCTCTGTGCC +>27|IGLV10-54 ENST00000390287|IGLV10-54|L-REGION+V-REGION|IG|IGL|None|00 +ATGCCCTGGGCTCTGCTCCTCCTGACCCTCCTCACTCACTCTGCAGTGTCAGTGGTCCAGGCAGGGCTGACTCAGCCACCCTCGGTGTCCAAGGGCTTGAGACAGACCGCCACACTCACCTGCACTGGGAACAGCAACATTGTTGGCAACCAAGGAGCAGCTTGGCTGCAGCAGCACCAGGGCCACCCTCCCAAACTCCTATCCTACAGGAATAACAACCGGCCCTCAGGGATCTCAGAGAGATTCTCTGCATCCAGGTCAGGAAACACAGCCTCCCTGACCATTACTGGACTCCAGCCTGAGGACGAGGCTGACTATTACTGCTCAGCATTGGACAGCAGCCTCAGTGCTC +>28|TRBJ2-2 ENST00000633188|TRBJ2-2|J-REGION|TR|TRB|None|00 +CGAACACCGGGGAGCTGTTTTTTGGAGAAGGCTCTAGGCTGACCGTACTGG +>29|TRBV7-3 ENST00000390361|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAAGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAAAGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCCGCGTATCTCCGTGCCAGCAGCTTAAC +>30|IGLV3-19 ENST00000390309|IGLV3-19|5'UTR|IG|IGL|None|00 +AGCTGTGGGCTCAGAAGCAGAGTTCTGGGGTGTCTCCACC +>31|TRBC2 ENST00000636844|TRBC2|C-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAACAGAGCCCCTACCAGAACCAGCAGTACTTCGGGCCGGGCACCAGGCTCACGGTCACAGAGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGGTGAGTGGGGCTTGTCAACAGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCC +>32|IGKV3-11 ENST00000483158|IGKV3-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAACAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCCT +>33|TRBV3-1 ENST00000390387|TRBV3-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTCCTCTGCTGTGTGGTCTTCTGCCTCCTCCAAGCAGGTCCCTTGGACACAGCTGTTTCCCAGACTCCAAAATACCTGGTCACACAGATGGGAAACGACAAGTCCATTAAATGTGAACAAAATCTGGGCCATGATACTATGTATTGGTATAAACAGGACTCTAAGAAATTTCTGAAGATAATGTTTAGCTACAATAATAAGGAGCTCATTATAAATGAAACAGTTCCAAATCGCTTCTCACCTAAATCTCCAGACAAAGCTCACTTAAATCTTCACATCAATTCCCTGGAGCTTGGTGACTCTGCTGTGTATTTCTGTGCCAGCAGCCAAGA +>34|TRBV7-7 ENST00000631548|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>35|TRBV12-5 ENST00000632829|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGGACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>36|TRBC1 ENST00000632136|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTCTGA +>37|IGLV3-25 ENST00000390305|IGLV3-25|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTACTTCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAGACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAGCAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATATATAAAGACAGTGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAACAGTCACGTTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCAATCAGCAGACAGCAGTG +>38|TRBV19 ENST00000390393|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTCTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>39|IGHV1-3 ENST00000632977|IGHV1-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTTTTGGTGGCAGCAGCCACAGGTGCCCACTCCCAGGTCCAGCTTGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGCATTGGGTGCGCCAGGCCCCCGGACAAAGGCTTGAGTGGATGGGATGGATCAACGCTGGCAATGGTAACACAAAATATTCACAGAAGTTCCAGGGCAGAGTCACCATTACCAGGGACACATCCGCGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAAGACACGGCTGTGTATTACTGTGCGAGAGA +>40|TRBV24-1 ENST00000633092|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACGGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>41|IGHV3-15 ENST00000390603|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACA +>42|TRBV28 ENST00000390400|TRBV28|5'UTR|TR|TRB|None|00 +ATTCTTTCTTCAAAGCAGCC +>43|IGHV3-33 ENST00000631807|IGHV3-33|5'UTR|IG|IGH|None|00 +CGAGCCCAGCACTGGAAGTCGCCGGTGTTTCCATTCGGTGATCATCACTGAACACAGAGGACTCACC +>44|IGLV6-57 ENST00000390285|IGLV6-57|5'UTR|IG|IGL|None|00 +TCTGAGGATACGCGTGACAGATAAGAAGGGCTGGTGGGATCAGTCCTGGTGGTAGCTCAGGAAGCAGAGCCTGGAGCATCTCCACT +>45|IGHD1-14 ENST00000451044|IGHD1-14|D-REGION|IG|IGH|None|00 +GGTATAACCGGAACCAC +>46|IGKV5-2 ENST00000632585|IGKV5-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGGTCCCAGGTTCACCTCCTCAGCTTCCTCCTCCTTTGGATCTCTGATACCAGGGCAGAAACGACACTCACGCAGTCTCCAGCATTCATGTCAGCGACTCCAGGAGACAAAGTCAACATCTCCTGCAAAGCCAGCCAAGACATTGATGATGATATGAACTGGTACCAACAGAAACCAGGAGAAGCTGCTATTTTCATTATTCAAGAAGCTACTACTCTCGTTCCTGGAATCCCACCTCGATTCAGTGGCAGCGGGTATGGAACAGATTTTACCCTCACAATTAATAACATAGAATCTGAGGATGCTGCATATTACTTCTGTCTACAACATGATAATTTCCCT +>47|TRBV24-1 ENST00000390397|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>48|IGLV1-51 ENST00000390290|IGLV1-51|L-REGION+V-REGION|IG|IGL|None|00 +ATGACCTGCTCCCCTCTCCTCCTCACCCTTCTCATTCACTGCACAGGGTCCTGGGCCCAGTCTGTGTTGACGCAGCCGCCCTCAGTGTCTGCGGCCCCAGGACAGAAGGTCACCATCTCCTGCTCTGGAAGCAGCTCCAACATTGGGAATAATTATGTATCCTGGTACCAGCAGCTCCCAGGAACAGCCCCCAAACTCCTCATTTATGACAATAATAAGCGACCCTCAGGGATTCCTGACCGATTCTCTGGCTCCAAGTCTGGCACGTCAGCCACCCTGGGCATCACCGGACTCCAGACTGGGGACGAGGCCGATTATTACTGCGGAACATGGGATAGCAGCCTGAGTGCTGGCACAGTGCTCC +>49|TRBV6-2 ENST00000632016|TRBV6-2|5'UTR|TR|TRB|None|00 +TCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>50|IGHV3-43 ENST00000633040|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGATA +>51|IGHD4-11 ENST00000431440|IGHD4-11|D-REGION|IG|IGH|None|00 +TGACTACAGTAACTAC +>52|TRBV12-3 ENST00000620569|TRBV12-3|5'UTR|TR|TRB|None|00 +TTCTTTGCTCATGCTCACAGAGGGCCTGGTCTAGAATATTCCACATCTGCTCTCACTCTGCC +>53|IGKV2-24 ENST00000484817|IGKV2-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCACCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGATTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCATGCAAGCTACACAATTTCCT +>54|IGHV1-2 ENST00000390594|IGHV1-2|5'UTR|IG|IGH|None|00 +GAGAGCATCACCCAGCAACCACATCTGTCCTCTAGAGAATCCCCTGAGAGCTCCGTTCCTCACC +>55|IGHV3-20 ENST00000632076|IGHV3-20|5'UTR|IG|IGH|None|00 +CCAGCCCTGAGATTCCCACGTGTTTCCATTCAGTGATCAGCACTGAACACAGAGGACTCGCC +>56|IGHV5-51 ENST00000620764|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>57|IGKV2-40 ENST00000632811|IGKV2-40|L-REGION+V-REGION|IG|IGK|None|00 +GAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTCCACA +>58|TRAJ50 ENST00000390487|TRAJ50|J-REGION|TR|TRA|None|00 +TGAAAACCTCCTACGACAAGGTGATATTTGGGCCAGGGACAAGCTTATCAGTCATTCCAA +>59|IGHV6-1 ENST00000390593|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>60|TRBV11-1 ENST00000390367|TRBV11-1|5'UTR|TR|TRB|None|00 +CCTGCCCTGACCCTGCC +>61|IGKV1D-39 ENST00000448155|IGKV1D-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCTCC +>62|IGKV3-11 ENST00000632088|IGKV3-11|5'UTR|IG|IGK|None|00 +GTCAGAGCCCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>63|TRBV6-9 ENST00000634093|TRBV6-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACTTGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCGCATTCATTACTCAGTTGCTGCTGGTATCACTGACAAAGGAGAAGTCCCCGATGGCTACAATGTATCCAGATCAAACACAGAGGATTTCCCGCTCAGGCTGGAGTCAGCTGCTCCCTCCCAGACATCTGTATACTTCTGTGCCAGCAGTTATTC +>64|TRBV4-2 ENST00000632512|TRBV4-2|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>65|TRAV6 ENST00000390428|TRAV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTTTGGCTGAGAAGCCTGGGTCTACATTTCAGGCCACATTTGGGGAGACGAATGGAGTCATTCCTGGGAGGTGTTTTGCTGATTTTGTGGCTTCAAGTGGACTGGGTGAAGAGCCAAAAGATAGAACAGAATTCCGAGGCTCTGAACATTCAGGAGGGTAAAACGGCCACCCTGACCTGCAACTATACAAACTATTCTCCAGCATACTTACAGTGGTACCGACAAGATCCAGGAAGAGGCCCTGTTTTCTTGCTACTCATACGTGAAAATGAGAAAGAAAAAAGGAAAGAAAGACTGAAGGTCACCTTTGATACCACCCTTAAACAGAGTTTGTTTCATATCACAGCCTCCCAGCCTGCAGACTCAGCTACCTACCTCTGTGCTCTAGACA +>66|TRBD2 TENX_TRBD2|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTAGCGGGAGGG +>67|IGLV3-12 ENST00000390313|IGLV3-12|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTCCTCAGCCTCCTCGCTCACTGCACAGGCTCTGCGACCTCCTATGAGCTGACTCAGCCACACTCAGTGTCAGTGGCCACAGCACAGATGGCCAGGATCACCTGTGGGGGAAACAACATTGGAAGTAAAGCTGTGCACTGGTACCAGCAAAAGCCAGGCCAGGACCCTGTGCTGGTCATCTATAGCGATAGCAACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACCCAGGGAACACCGCCACCCTAACCATCAGCAGGATCGAGGCTGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGTAGTAGTGATCATCCCACG +>68|IGHD2-2 ENST00000390591|IGHD2-2|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTAGTACCAGCTGCTATGCC +>69|TRAV29DV5 ENST00000390458|TRAV29DV5|5'UTR|TR|TRA|None|00 +ATATGTAAAATGAAGGGTCTGTGGAAGGACATGAATAAAGCACAGGAGGTTGAAGTCAGATTTGCAGCTTTCTAGGCAGGAGATAAGACAATCTGCATCTTCACAGGAGGG +>70|IGHV3-48 ENST00000390624|IGHV3-48|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGTGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGTTATGAAATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTGGTAGTACCATATACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTTTATTACTGTGCGAGAGA +>71|IGHV3-66 ENST00000632846|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>72|TRAJ47 ENST00000390490|TRAJ47|J-REGION|TR|TRA|None|00 +TGGAATATGGAAACAAACTGGTCTTTGGCGCAGGAACCATTCTGAGAGTCAAGTCCT +>73|IGHM ENST00000390559|IGHM|C-REGION|IG|IGH|M|00 +GGGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTAC +>74|IGLV3-16 ENST00000390311|IGLV3-16|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCTAGGACAGATGGCCAGGATCACCTGCTCTGGAGAAGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGTTCCCTGTGCTGGTGATATATAAAGACAGCGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAATAGTCACATTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCTATCAGCAGACAGCAGTG +>75|TRBJ1-6 ENST00000633713|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAATGGGACCAGGCTCACTGTGACAG +>76|TRBV6-4 ENST00000390360|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGACTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGAGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>77|IGLV3-25 ENST00000390305|IGLV3-25|5'UTR|IG|IGL|None|00 +GCTGTGCTGTGGGTCCAGGAGGCAGAACTCTGGGTGTCTCACC +>78|IGLJ2 ENST00000390322|IGLJ2|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTCATGAGCAG +>79|TRBV10-2 ENST00000426318|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTACGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>80|IGHV7-81 ENST00000390639|IGHV7-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTCTTCTTGGTGGCAGCAGCAACAGGTACCTACTCCCAGGTGCAGCTGGTGCAGTCTGGCCATGAGGTGAAGCAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACAGTTTCACCACCTATGGTATGAATTGGGTGCCACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGTTCAACACCTACACTGGGAACCCAACATATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCATGGACACCTCTGCCAGCACAGCATACCTGCAGATCAGCAGCCTAAAGGCTGAGGACATGGCCATGTATTACTGTGCGAGA +>81|TRAJ13 ENST00000390524|TRAJ13|J-REGION|TR|TRA|None|00 +TGAATTCTGGGGGTTACCAGAAAGTTACCTTTGGAACTGGAACAAAGCTCCAAGTCATCCCAA +>82|TRAV26-2 ENST00000390460|TRAV26-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTTGGTGACAAGCATTACTGTACTCCTATCTTTGGGTATTATGGGTGATGCTAAGACCACACAGCCAAATTCAATGGAGAGTAACGAAGAAGAGCCTGTTCACTTGCCTTGTAACCACTCCACAATCAGTGGAACTGATTACATACATTGGTATCGACAGCTTCCCTCCCAGGGTCCAGAGTACGTGATTCATGGTCTTACAAGCAATGTGAACAACAGAATGGCCTCTCTGGCAATCGCTGAAGACAGAAAGTCCAGTACCTTGATCCTGCACCGTGCTACCTTGAGAGATGCTGCTGTGTACTACTGCATCCTGAGAGAC +>83|IGHV4-59 ENST00000390629|IGHV4-59|5'UTR|IG|IGH|None|00 +TTTTCACCTCTCCATACAAAGGCACCACCCACATGCAAATCCTCACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>84|IGHJ6 ENST00000631705|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>85|IGHV4-61 ENST00000632960|IGHV4-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCGTCAGCAGTGGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>86|TRAV8-7 ENST00000390456|TRAV8-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCTTAGTGGTCATTCTGCTGCTTGGAATGTTCTTCACACTGAGTAAAACCCAGTCGGTGACCCAGCTTGATGGCCACATCACTGTCTCTGAAGAAGCCCCTCTGGAACTGAAGTGCAACTATTCCTATAGTGGAGTTCCTTCTCTCTTCTGGTATGTCCAATACTCTAGCCAAAGCCTCCAGCTTCTCCTCAAAGACCTAACAAAGGCCACCCAGGTTAAAGGCATCAGAGGTTTTGAGGCTGAATTTAAGAAGAGCGAAACCTCCTTCTACCTGAGGAAACCATCAACCCATGTGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGACAGGAG +>87|IGKV3-15 ENST00000390252|IGKV3-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGTATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCAGCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCT +>88|TRBJ1-6 ENST00000632228|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAACGGGACCAGGCTCACTGTGACAG +>89|TRGV4 ENST00000390345|TRGV4|5'UTR|TR|TRG|None|00 +GGCCTGAGCTCTCCTGGCCCCTGGCTCTCTTCTGCAGAGGGCCTGCTCTCAGCTGCCACAAGAGGGCGCCGGAGAACGGACCTGAGCAAGAGAGGCAGGAGCTCCTCTGCAGGTCCTCCCAGGCACCAATCCTTCTGGGAGGGAGGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCTCTCTGCTTGTGTCTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCTCAGAGAGGAAGGC +>90|IGHV3OR16-9 ENST00000354689|IGHV3OR16-9|L-REGION+V-REGION|IG|IGH|None|00 +GAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACCACTACACGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACAGTAGTGGTAATAGTGGTTACACAAACTACGCAGACTCTGTGAAAGGCCGATTCACCATCTCCAGGGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGTGAAA +>91|TRBV5-5 ENST00000632187|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGTAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>92|IGHV4OR15-8 ENST00000557788|IGHV4OR15-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTTCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGTTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGCTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCCCCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACAGGGCCGTGTATTACTGTGCGAGAGA +>93|IGHV2-70 ENST00000390634|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGCGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATTCTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>94|TRAJ57 ENST00000390482|TRAJ57|J-REGION|TR|TRA|None|00 +TAACTCAGGGCGGATCTGAAAAGCTGGTCTTTGGAAAGGGAACGAAACTGACAGTAAACCCAT +>95|IGHG1 ENST00000390549|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>96|IGLJ2 ENST00000390322|IGLJ2|J-REGION|IG|IGL|None|00 +ATGCCACCAGGGCCACTGGCCCCAGCTTCCTCCTTCACAGCTGCAGTGGGGGCTGGGGCTGGGGCATCCCAGGGAGGGTTTTTGTATGAGCCTGTGTCACAGTGTGTGGTATTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>97|IGKV1-39 ENST00000498574|IGKV1-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCT +>98|IGKV1-9 ENST00000633273|IGKV1-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTTCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGCTTAATAGTTACCCT +>99|IGLV1-40 ENST00000610349|IGLV1-40|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTCCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATCGGGGCAGGTTATGATGTACACTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCCAGTCCTATGACAGCAGCCTGAGTGGTTC +>100|TRAJ29 ENST00000390508|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAACACACCTCTTGTCTTTGGAAAGGGCACAAGACTTTCTGTGATTGCAA +>101|IGKV1-5 ENST00000632205|IGKV1-5|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCCCTGAAGCCTTATTAATAGGCTGGTCACACTTTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>102|IGHV1-58 ENST00000632614|IGHV1-58|5'UTR|IG|IGH|None|00 +AGCATCATCCAGAAACCACATCCCTCCGCTAGAGAAGCCCCTGACGGCACAGTTCCTCACT +>103|TRAV9-1 ENST00000390431|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATTCTTCTCCAGGACCAGCGATTGCACTATTCTTAATGTTTGGGGGAATCAATGGAGATTCAGTGGTCCAGACAGAAGGCCAAGTGCTCCCCTCTGAAGGGGATTCCCTGATTGTGAACTGCTCCTATGAAACCACACAGTACCCTTCCCTTTTTTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCACCTGAAAGCCATGAAGGCCAATGACAAGGGAAGGAACAAAGGTTTTGAAGCCATGTACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGACTCAGTTCAAGAGTCAGACTCCGCTGTGTACTTCTGTGCTCTGAGTGA +>104|IGKV1-17 ENST00000490686|IGKV1-17|5'UTR|IG|IGK|None|00 +AGGAATCAGTCCCACTCAGGACACAGC +>105|IGKV1D-8 ENST00000471857|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>106|TRBD1 ENST00000631435|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>107|IGHD3-16 ENST00000633379|IGHD3-16|D-REGION|IG|IGH|None|00 +GTATTATGATTACGTTTGGGGGAGTTATCGTTATACC +>108|TRBV10-3 ENST00000611462|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCACCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>109|IGHV1-45 ENST00000390621|IGHV1-45|5'UTR|IG|IGH|None|00 +ATCACCCAACAACCACATCCCTCCTCTAGAGAATCCCCTGAAAGCACAGCTCCTCACC +>110|IGHV3OR16-12 ENST00000570121|IGHV3OR16-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGAGCTCAGCTGGGTTTTCCTTGTTGCTATTTTACAAGGTGTCCACTGTGAGGTGCAGCTGGTAGAGTCTGGGAGAGGCTTGGCCCAGCCTGGGGGGTACCTAAAACTCTCCGGTGCAGCCTCTGGATTCACCGTCGGTAGCTGGTACATGAGCTGGATCCACCAGGCTCCAGGGAAGGGTCTGGAGTGGGTCTCATACATTAGTAGTAGTGGTTGTAGCACAAACTACGCAGACTCTGTGAAGGGCAGATTCACCATCTCCACAGACAACTCAAAGAACACGCTCTACCTGCAAATGAACAGCCTGAGAGTGGAGGACACGGCCGTGTATTACTGTGCAAGAGA +>111|TRAJ56 ENST00000390483|TRAJ56|J-REGION|TR|TRA|None|00 +TTATACTGGAGCCAATAGTAAGCTGACATTTGGAAAAGGAATAACTCTGAGTGTTAGACCAG +>112|IGHG1 ENST00000631539|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTACAGGAACATGATCGGACAGGGGGCCTAG +>113|TRBV5-5 ENST00000632187|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>114|TRDJ4 ENST00000390474|TRDJ4|J-REGION|TR|TRD|None|00 +CCAGACCCCTGATCTTTGGCAAAGGAACCTATCTGGAGGTACAACAAC +>115|IGLV3-16 ENST00000390311|IGLV3-16|5'UTR|IG|IGL|None|00 +TCTGTGGGTCCAGGAGGCACAGCTCTGGGAATCTCACC +>116|TRAV12-2 ENST00000390437|TRAV12-2|5'UTR|TR|TRA|None|00 +AAAGCAGATTCTTTTTATGATTTTTAAAGTAGAAATATCCATTCTAGGTGCATTTTTTAAGGGTTTAAAATTTGAATCCTCAGTGAACCAGGGCAGAGAAGAATG +>117|IGHM ENST00000626472|IGHM|C-REGION|IG|IGH|M|00 +GGGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTACTGA +>118|IGHV3-49 ENST00000390625|IGHV3-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTTAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAATGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCAGGGCGGTCCCTGAGACTCTCCTGTACAGCTTCTGGATTCACCTTTGGTGATTATGCTATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTAGGTTTCATTAGAAGCAAAGCTTATGGTGGGACAACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGCATCGCCTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACTAGAGA +>119|IGHV3-35 ENST00000390617|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGA +>120|TRBV6-6 ENST00000633963|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGATAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGTATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>121|IGLV1-44 ENST00000628287|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTC +>122|IGHJ6 ENST00000390560|IGHJ6|J-REGION|IG|IGH|None|00 +TACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>123|IGKV1-33 ENST00000558152|IGKV1-33|L-REGION+V-REGION|IG|IGK|None|00 +GACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCTCCCACAGTTGGCAAAGGACATGAACAGACACTTAAAAGA +>124|TRBV12-4 ENST00000631824|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>125|TRBV2 ENST00000455382|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>126|IGHV1-2 ENST00000633350|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCCACAGGAGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCGGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCTGGGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACATGGAGCTGAGCAGGCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>127|IGKV2D-28 ENST00000453166|IGKV2D-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>128|IGHV1OR15-9 ENST00000338912|IGHV1OR15-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCTGGACTTGGAGGATCCTGTTTTTGGTGGTCATAGCTGCAGGTGCCCAGTCCCAGGTACAGCTGATGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAGGATCTCCTGCAAGGCTTCTGGATACACCTTCACCAGCTACTGTATGCACTGGGTGTGCCAGGCCCATGCACAAGGGCTTGAGTGGATGGGATTGGTGTGCCCTAGTGATGGCAGCACAAGCTATGCACAGAAGTTCCAGGGCAGAGTCACCATAACCAGGGACACATCCATGGGCACAGCCTACATGGAGCTAAGCAGCCTGAGATCTGAGGACACGGCCATGTATTACTGTGTGAGAGA +>129|TRAV34 ENST00000390461|TRAV34|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTGTTCTGCAAGTACTCCTAGGGATATTGGGGTTCCAAGCAGCCTGGGTCAGTAGCCAAGAACTGGAGCAGAGTCCTCAGTCCTTGATCGTCCAAGAGGGAAAGAATCTCACCATAAACTGCACGTCATCAAAGACGTTATATGGCTTATACTGGTATAAGCAAAAGTATGGTGAAGGTCTTATCTTCTTGATGATGCTACAGAAAGGTGGGGAAGAGAAAAGTCATGAAAAGATAACTGCCAAGTTGGATGAGAAAAAGCAGCAAAGTTCCCTGCATATCACAGCCTCCCAGCCCAGCCATGCAGGCATCTACCTCTGTGGAGCAGACA +>130|TRAV2 ENST00000390424|TRAV2|5'UTR|TR|TRA|None|00 +CATTTTGGCC +>131|IGHD2-15 ENST00000390578|IGHD2-15|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTGGTGGTAGCTGCTACTCC +>132|TRBV3-1 ENST00000632422|TRBV3-1|5'UTR|TR|TRB|None|00 +AGACCAGAATCCTGCCCTGGGCCTTGCCTGGTCTGCCTCACTCTGCC +>133|IGLV2-18 ENST00000390310|IGLV2-18|5'UTR|IG|IGL|None|00 +GAATATCTCCACC +>134|TRAV26-1 ENST00000390455|TRAV26-1|5'UTR|TR|TRA|None|00 +AGGAACATGACTAAACCTGGGGAGGAAGACATAGAAAAGCAACTGCTCTATCATTGGCTGACAAGATCCTGACAACAACACAATGAGAGCTGCACTCCTTGCAAGTCTTTACTAGTAGCTGTTGCTTCTGTTCTCTGGAAATTCTTTAAACCTAGAATCAGACACAAAAACTGAACTCTGGGTCCACAATCCTCATTTGTCCTTGAAGT +>135|IGHV3-21 ENST00000390607|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>136|TRAJ33 ENST00000390504|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTAATCTGGGGCGCTGGGACCAAGCTAATTATAAAGCCAG +>137|IGHV3-49 ENST00000632211|IGHV3-49|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCGTGAGATTCCCAGGAGTTTCCACTTGGTGATCAGCACTGAACACAGACCACCAACC +>138|IGHV4-34 ENST00000390616|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>139|TRBV7-2 ENST00000634605|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>140|TRDV1 ENST00000390452|TRDV1|5'UTR|TR|TRD|None|00 +CAAAGAGCTACATGCCAC +>141|IGHV1-58 ENST00000632614|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGAGGATCCTCTTCTTGGTGGGAGCAGCGACAGGTGCCCACTCCCAAATGCAGCTGGTGCAGTCTGGGCCTGAGGTGAAGAAGCCTGGGACCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATTCACCTTTACTAGCTCTGCTGTGCAGTGGGTGCGACAGGCTCGTGGACAACGCCTTGAGTGGATAGGATGGATCGTCGTTGGCAGTGGTAACACAAACTACGCACAGAAGTTCCAGGAAAGAGTCACCATTACCAGGGACATGTCCACAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCCGAGGACACGGCCGTGTATTACTGTGCGGCAGA +>142|TRGV4 ENST00000390345|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTACCGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACACCTCCAGCGTTGTGTTGGAATCAGGAATCAGCCCAGGGAAGTATGATACTTACGGAAGCACAAGGAAGAACTTGAGAATGATACTGCGAAATCTTATTGAAAATGACTCTGGAGTCTATTACTGTGCCACCTGGGATGGG +>143|IGHV1OR21-1 ENST00000622028|IGHV1OR21-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGAATTGGAGGATCCTGTTTTTGGTGGTCATAGCTGCGGGTGCCCAGTCCCAGGTACAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCATCACCAGCTACTGTATGCACTGGGTGCACCAGGTCCATGCACAAGGGCTTGAGTGGATGGGATTGGTGTGCCCTAGTGATGGCAGCACAAGCTATGCACAGAAGTTCCAGGCCAGAGTCACCATAACCAGGGACACATCCATGAGCACAGCCTACATGGAGCTAAGCAGTCTGAGATCTGAGGACACGGCCATGTATTACTGTGTGAGAGA +>144|IGHV1-69-2 ENST00000633446|IGHV1-69-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTCCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>145|TRBV12-4 ENST00000617347|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>146|TRBV20-1 ENST00000633466|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>147|TRBV9 ENST00000633328|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCAGTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>148|IGHJ2 ENST00000390564|IGHJ2|J-REGION|IG|IGH|None|00 +TACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>149|TRBV6-3 ENST00000632148|TRBV6-3|5'UTR|TR|TRB|None|00 +AGAATGACGCCCTTGAAAGACGTGTTCCCTTTTCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>150|IGHV4-34 ENST00000612474|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGAGG +>151|IGHJ3 ENST00000463911|IGHJ3|J-REGION|IG|IGH|None|00 +GATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>152|IGHV4-39 ENST00000390619|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>153|TRAV23DV6 ENST00000390451|TRAV23DV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCTTAGGAGCATCATTTTTAGTTCTGTGGCTTCAACTATGCTGGGTGAGTGGCCAACAGAAGGAGAAAAGTGACCAGCAGCAGGTGAAACAAAGTCCTCAATCTTTGATAGTCCAGAAAGGAGGGATTTCAATTATAAACTGTGCTTATGAGAACACTGCGTTTGACTACTTTCCATGGTACCAACAATTCCCTGGGAAAGGCCCTGCATTATTGATAGCCATACGTCCAGATGTGAGTGAAAAGAAAGAAGGAAGATTCACAATCTCCTTCAATAAAAGTGCCAAGCAGTTCTCATCGCATATCATGGATTCCCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGCA +>154|IGHV1-18 ENST00000390605|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>155|TRBJ2-3 ENST00000631840|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCG +>156|IGHV3-73 ENST00000631708|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGACA +>157|TRAJ37 ENST00000612375|TRAJ37|J-REGION|TR|TRA|None|00 +TGGCTCTAGCAACACAGGCAAACTAATCTTTGGGCAAGGGACAACTTTACAAGTAAAACCAGGTA +>158|IGHV3-74 ENST00000424969|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>159|IGHD2-8 ENST00000390585|IGHD2-8|D-REGION|IG|IGH|None|00 +AGGATATTGTACTAATGGTGTATGCTATACC +>160|IGHV2-5 ENST00000390597|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTCCACGCTCCTGCTGCTGACCATCCCTTCATGGGTCTTGTCCCAGATCACCTTGAAGGAGTCTGGTCCTACGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAGTGGGTGTGGGCTGGATCCGTCAGCCCCCAGGAAAGGCCCTGGAGTGGCTTGCACTCATTTATTGGGATGATGATAAGCGCTACAGCCCATCTCTGAAGAGCAGGCTCACCATCACCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACACAGAC +>161|IGKV3-20 ENST00000632822|IGKV3-20|5'UTR|IG|IGK|None|00 +CCTGGGTCAGAGCTCTGGAGAAGAGCTGCTCAGTTAGGACCCAGAGGGAACC +>162|IGKV3D-7 ENST00000443397|IGKV3D-7|5'UTR|IG|IGK|None|00 +GAGGAACTGCTCAGTTAGGACCCAG +>163|IGHV2-70 ENST00000617374|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAGGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGTGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACTCATTGATTGGGATGATGATAAATACTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>164|TRBV7-3 ENST00000631882|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAATATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAACGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCGGGGGGACTCAGCCGTGTATCTCTGTGCCAGCAGCTTAAC +>165|TRAV9-2 ENST00000390441|TRAV9-2|5'UTR|TR|TRA|None|00 +CACTGTGATTTCTTCATGTTAAGGATCAAGACCATTATTTGGGTAACACACTAAAG +>166|TRAV38-1 ENST00000390464|TRAV38-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACACGAGTTAGCTTGCTGTGGGCAGTCGTGGTCTCCACCTGTCTTGAATCCGGCATGGCCCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACTGTGACCCTGAGTTGCACATATGACACCAGTGAGAATAATTATTATTTGTTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACGGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGACACTGCGATGTATTTCTGTGCTTTCATGAAGCA +>167|IGHD1-1 ENST00000633210|IGHD1-1|D-REGION|IG|IGH|None|00 +GGTACAACTGGAACGAC +>168|TRBV15 ENST00000631835|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTCCTGGGCTTCTCCACTGGATGGCCCTTTGTCTCCTTGGAACAGGTCATGGGGATGCCATGGTCATCCAGAACCCAAGATACCAGGTTACCCAGTTTGGAAAGCCAGTGACCCTGAGTTGTTCTCAGACTTTGAACCATAACGTCATGTACTGGTACCAGCAGAAGTCAAGTCAGGCCCCAAAGCTGCTGTTCCACTACTATGACAAAGATTTTAACAATGAAGCAGACACCCCTGATAACTTCCAATCCAGGAGGCCGAACACTTCTTTCTGCTTTCTTGACATCCGCTCACCAGGCCTGGGGGACGCAGCCATGTACCTGTGTGCCACCAGCAGAGA +>169|TRBV27 ENST00000633283|TRBV27|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCCAGCTCCTTGGCTATGTGGTCCTTTGCCTTCTAGGAGCAGGCCCCCTGGAAGCCCAAGTGACCCAGAACCCAAGATACCTCATCACAGTGACTGGAAAGAAGTTAACAGTGACTTGTTCTCAGAATATGAACCATGAGTATATGTCCTGGTATCGACAAGACCCAGGGCTGGGCTTAAGGCAGATCTACTATTCAATGAATGTTGAGGTGACTGATAAGGGAGATGTTCCTGAAGGGTACAAAGTCTCTCGAAAAGAGAAGAGGAATTTCCCCCTGATCCTGGAGTCGCCCAGCCCCAACCAGACCTCTCTGTACTTCTGTGCCAGCAGTTTATC +>170|IGHV1-24 ENST00000390610|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACA +>171|TRDV1 ENST00000390452|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTGTTCTCCAGCCTGCTGTGTGTATTTGTGGCCTTCAGCTACTCTGGATCAAGTGTGGCCCAGAAGGTTACTCAAGCCCAGTCATCAGTATCCATGCCAGTGAGGAAAGCAGTCACCCTGAACTGCCTGTATGAAACAAGTTGGTGGTCATATTATATTTTTTGGTACAAGCAACTTCCCAGCAAAGAGATGATTTTCCTTATTCGCCAGGGTTCTGATGAACAGAATGCAAAAAGTGGTCGCTATTCTGTCAACTTCAAGAAAGCAGCGAAATCCGTCGCCTTAACCATTTCAGCCTTACAGCTAGAAGATTCAGCAAAGTACTTTTGTGCTCTTGGGGAACT +>172|TRDV1 ENST00000621643|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +AAAAGTGGTCGCTATTCTGTCAACTTCAAGAAAGCAGCGAAATCCGTCGCCTTAACCATTTCAGCCTTACAGCTAGAAGATTCAGCAAAGTACTTTTGTGCT +>173|TRBV25-1 ENST00000390398|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>174|TRBJ2-6 ENST00000632996|TRBJ2-6|J-REGION|TR|TRB|None|00 +CTCTGGGGCCAACGTCCTGACTTTCGGGGCCGGCAGCAGGCTGACCGTGCTGG +>175|TRBV7-9 ENST00000612787|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGAACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>176|TRBV18 ENST00000611520|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGACTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>177|TRAV14DV4 ENST00000390440|TRAV14DV4|5'UTR|TR|TRA|None|00 +GCCAGGTTCACTTCACAGTACAGAGTCCTGAAAATAAAGAAGAAAATTTTTTTTTATCTAGAAAAAGAACCAAAC +>178|IGLV7-43 ENST00000390298|IGLV7-43|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCTCAGACTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGCTTCCAGCACTGGAGCAGTCACCAGTGGTTACTATCCAAACTGGTTCCAGCAGAAACCTGGACAAGCACCCAGGGCACTGATTTATAGTACAAGCAACAAACACTCCTGGACCCCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACACTGTCAGGTGTGCAGCCTGAGGACGAGGCTGAGTATTACTGCCTGCTCTACTATGGTGGTGCTCAG +>179|IGLJ7 ENST00000390330|IGLJ7|J-REGION|IG|IGL|None|00 +TCACTGTGTGCTGTGTTCGGAGGAGGCACCCAGCTGACCGTCCTCG +>180|IGHV1-45 ENST00000631826|IGHV1-45|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGAATCCTCTTCTTGGTGGCAGCAGTCACAGATGCCTACTCCCAGATGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGACTGGGTCCTCAGTGAAGGTTTCCTGCAAGGCTTCCGGATACACCTTCACCTACCGCTACCTGCACTGGGTGCGACAGGCCCCCGGACAAGCGCTTGAGTGGATGGGATGGATCACACCTTTCAATGGTAACACCAACTACGCACAGAAATTCCAGGACAGAGTCACCATTACCAGGGACAGGTCTATGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACAGCCATGTATTACTGTGCAAGATA +>181|TRBV6-3 ENST00000632148|TRBV6-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>182|IGHJ1 ENST00000634062|IGHJ1|J-REGION|IG|IGH|None|00 +GCTGAATACTTCCAGCACTGGGGCCAGGGCACCCTGGTCACCGTCTCCTCAG +>183|IGHV3-16 ENST00000631755|IGHV3-16|5'UTR|IG|IGH|None|00 +AGCCCTGGGAGAGAAGCCCCAGCCCTGGGATTCTCAGGTGTTTCTATTGGGTCAACAGCAATAAACAAATTACC +>184|TRAV8-3 ENST00000390435|TRAV8-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGAGCTTATCCCACTGCTGGGGATACATTTTGTCCTGAGAACTGCCAGAGCCCAGTCAGTGACCCAGCCTGACATCCACATCACTGTCTCTGAAGGAGCCTCACTGGAGTTGAGATGTAACTATTCCTATGGGGCAACACCTTATCTCTTCTGGTATGTCCAGTCCCCCGGCCAAGGCCTCCAGCTGCTCCTGAAGTACTTTTCAGGAGACACTCTGGTTCAAGGCATTAAAGGCTTTGAGGCTGAATTTAAGAGGAGTCAATCTTCCTTCAATCTGAGGAAACCCTCTGTGCATTGGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGC +>185|TRBV4-1 ENST00000632713|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCGAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>186|TRAJ34 ENST00000390503|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTATAACACCGACAAGCTCATCTTTGGGACTGGGACCAGATTACAAGTCTTTCCAA +>187|IGHV2OR16-5 ENST00000567458|IGHV2OR16-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACGTTTTGCTCCACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACTCTCTCTGGGTTCTCACTCAGCACTTCTGGAATGGGTATGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCTCACATTTTTTTGAATGACAAAAAATCCTACAGCACGTCTCTGAAGAACAGGCTCATCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCATGGAGAG +>188|IGHV1-69-2 ENST00000633446|IGHV1-69-2|5'UTR|IG|IGH|None|00 +ATCACATAACAACCAGATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>189|TRAJ49 ENST00000390488|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACCGGTAACCAGTTCTATTTTGGGACAGGGACAAGTTTGACGGTCATTCCAA +>190|IGKV2-30 ENST00000468494|IGKV2-30|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>191|TRAV18 ENST00000390446|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGTCTGCTTCCTGCTCAGGACTTGTGATCTTGTTGATATTCAGAAGGACCAGTGGAGACTCGGTTACCCAGACAGAAGGCCCAGTTACCCTCCCTGAGAGGGCAGCTCTGACATTAAACTGCACTTATCAGTCCAGCTATTCAACTTTTCTATTCTGGTATGTCCAGTATCTAAACAAAGAGCCTGAGCTCCTCCTGAAAAGTTCAGAAAACCAGGAGACGGACAGCAGAGGTTTTCAGGCCAGTCCTATCAAGAGTGACAGTTCCTTCCACCTGGAGAAGCCCTCGGTGCAGCTGTCGGACTCTGCCGTGTACTACTGCGCTCTGAGAGA +>192|TRBV5-4 ENST00000454561|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACACAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGCCCCACTGTGCC +>193|TRBV6-2 ENST00000634383|TRBV6-2|5'UTR|TR|TRB|None|00 +AGAATGACGCCCTTGAAAGACGTGTTCCCTTTTCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>194|IGKV1D-39 ENST00000448155|IGKV1D-39|5'UTR|IG|IGK|None|00 +GTCAGTCTCAGTCAGGACACAGC +>195|IGHV1-18 ENST00000390605|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGA +>196|TRAJ35 ENST00000390502|TRAJ35|J-REGION|TR|TRA|None|00 +GATAGGCTTTGGGAATGTGCTGCATTGCGGGTCCGGCACTCAAGTGATTGTTTTACCAC +>197|TRBV5-5 ENST00000390372|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>198|TRBC1 ENST00000633705|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>199|TRBC2 ENST00000614992|TRBC2|C-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGCAGCCCCTTCCCACTGTGCTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAGAGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGGTGAGTGGGGCTTGTCAACAGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCC +>200|TRAJ4 ENST00000390533|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTTTCTGGTGGCTACAATAAGCTGATTTTTGGAGCAGGGACCAGGCTGGCTGTACACCCAT +>201|IGHD1-7 ENST00000430425|IGHD1-7|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACTAC +>202|IGKV3-20 ENST00000632822|IGKV3-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGGCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>203|IGHD2OR15-2B ENST00000604102|IGHD2OR15-2B|D-REGION|IG|IGH|None|00 +AGAATATTGTAATAGTACTACTTTCTATGCC +>204|TRAJ40 ENST00000390497|TRAJ40|J-REGION|TR|TRA|None|00 +ACTACCTCAGGAACCTACAAATACATCTTTGGAACAGGCACCAGGCTGAAGGTTTTAGCAA +>205|TRAJ9 ENST00000390528|TRAJ9|J-REGION|TR|TRA|None|00 +GGAAATACTGGAGGCTTCAAAACTATCTTTGGAGCAGGAACAAGACTATTTGTTAAAGCAA +>206|TRBV6-4 ENST00000390360|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>207|IGKV1D-16 ENST00000492446|IGKV1D-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>208|IGLV2-33 ENST00000390302|IGLV2-33|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAATCTGCCCTGACTCAGCCTCCTTTTGTGTCCGGGGCTCCTGGACAGTCGGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGGGATTATGATCATGTCTTCTGGTACCAAAAGCGTCTCAGCACTACCTCCAGACTCCTGATTTACAATGTCAATACTCGGCCTTCAGGGATCTCTGACCTCTTCTCAGGCTCCAAGTCTGGCAACATGGCTTCCCTGACCATCTCTGGGCTCAAGTCCGAGGTTGAGGCTAATTATCACTGCAGCTTATATTCAAGTAGTTACACTTTC +>209|TRAJ11 ENST00000390526|TRAJ11|J-REGION|TR|TRA|None|00 +TGAATTCAGGATACAGCACCCTCACCTTTGGGAAGGGGACTATGCTTCTAGTCTCTCCAG +>210|IGLV4-3 ENST00000390318|IGLV4-3|5'UTR|IG|IGL|None|00 +CTCGAATAGAGCTCTTGGAAGTCCCTCCAACC +>211|IGHV4-31 ENST00000632151|IGHV4-31|5'UTR|IG|IGH|None|00 +ACTTTCTGAGAGTCCTGGACCTCCTGCACAAGAAC +>212|IGLV1-44 ENST00000390297|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>213|IGHV3-7 ENST00000633988|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>214|IGLV7-43 ENST00000390298|IGLV7-43|5'UTR|IG|IGL|None|00 +TCTGGCGCCAGGGGTCCCTTCCAATATCAGCACC +>215|TRBV7-3 ENST00000390361|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>216|IGHV3OR16-8 ENST00000565407|IGHV3OR16-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAACTGGGTTTTCCTTGTTGCTATTATAAAAGGTGCCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTGTCCTGTCCAGCCTCTGGATTCACCTTCAGTAACCACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACATTAGTGGTGATAGTGGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGGGACAACGCCAATAACTCACCGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGA +>217|IGLV3-32 ENST00000627634|IGLV3-32|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCCCCTGCTCGTCCTCACTCTCTGCACAGGCTCCGTTATTTCCTCTGGGCCAACTCAGGTGCCTGCAGTGTCTGTGGCCTTGGGACAAATGGCCAGGATCACCTGCCAGGGAGACAGCATGGAAGGCTCTTATGAACACTGGTACCAGCAGAAGCCAGGCCAGGCCCCCGTGCTGGTCATCTATGATAGCAGTGACCGGCCCTCAAGGATCCCTGAGCGATTCTCTGGCTCCAAATCAGGCAACACAACCACCCTGACCATCACTGGGGCCCAGGCTGAGGATGAGGCTGATTATTACTATCAGTTGATAGACAACCATGCTACTCAACT +>218|IGHD5-18 ENST00000390575|IGHD5-18|D-REGION|IG|IGH|None|00 +GTGGATACAGCTATGGTTAC +>219|IGKV3-7 ENST00000633250|IGKV3-7|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCCCTGGGAAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>220|IGHV1OR15-1 ENST00000604066|IGHV1OR15-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACATCTTCACCGACTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGAGCTTGGGTGGATGGGACGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCAGAGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACACGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCACGTATTACTGTGCGAGAGA +>221|TRAV19 ENST00000390447|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGACTGCCAGCCTGTTGAGGGCAGTCATAGCCTCCATCTGTGTTGTATCCAGCATGGCTCAGAAGGTAACTCAAGCGCAGACTGAAATTTCTGTGGTGGAGAAGGAGGATGTGACCTTGGACTGTGTGTATGAAACCCGTGATACTACTTATTACTTATTCTGGTACAAGCAACCACCAAGTGGAGAATTGGTTTTCCTTATTCGTCGGAACTCTTTTGATGAGCAAAATGAAATAAGTGGTCGGTATTCTTGGAACTTCCAGAAATCCACCAGTTCCTTCAACTTCACCATCACAGCCTCACAAGTCGTGGACTCAGCAGTATACTTCTGTGCTCTGAGTGAGGC +>222|TRBC2 ENST00000622053|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGCTAG +>223|TRBV2 ENST00000632828|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCACTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>224|IGHA1 ENST00000390547|IGHA1|C-REGION|IG|IGH|A1|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>225|IGKV1-17 ENST00000632229|IGKV1-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGGTGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCGCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>226|IGHD2OR15-2A ENST00000603077|IGHD2OR15-2A|D-REGION|IG|IGH|None|00 +AGAATATTGTAATAGTACTACTTTCTATGCC +>227|IGKV1D-37 ENST00000509129|IGKV1D-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCTCC +>228|TRAJ14 ENST00000390523|TRAJ14|J-REGION|TR|TRA|None|00 +ATTTATAGCACATTCATCTTTGGGAGTGGGACAAGATTATCAGTAAAACCTG +>229|TRBV20-1 ENST00000390394|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>230|TRGJP ENST00000390338|TRGJP|J-REGION|TR|TRG|None|00 +GGGCAAGAGTTGGGCAAAAAAATCAAGGTATTTGGTCCCGGAACAAAGCTTATCATTACAG +>231|IGLV5-52 ENST00000390289|IGLV5-52|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCTTCTCCTTCTCGTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCATCTTCCCATTCTGCATCTTCTGGAGCATCAGTCAGACTCACCTGCATGCTGAGCAGTGGCTTCAGTGTTGGGGACTTCTGGATAAGGTGGTACCAACAAAAGCCAGGGAACCCTCCCCGGTATCTCCTGTACTACCACTCAGACTCCAATAAGGGCCAAGGCTCTGGAGTTCCCAGCCGCTTCTCTGGATCCAACGATGCATCAGCCAATGCAGGGATTCTGCGTATCTCTGGGCTCCAGCCTGAGGATGAGGCTGACTATTACTGTGGTACATGGCACAGCAACTCTAAGACTCA +>232|TRBV14 ENST00000617639|TRBV14|5'UTR|TR|TRB|None|00 +CCTTTTTCTCATGCTTGTAAGCTCCTTCATCTGGAAATGTGATTTACCTGGGTCCTGCC +>233|TRBV4-3 ENST00000631427|TRBV4-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGTCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAGTCTTGAAGAACGGGTTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>234|IGHV3-64 ENST00000454421|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGA +>235|IGHD7-27 ENST00000439842|IGHD7-27|D-REGION|IG|IGH|None|00 +CTAACTGGGGA +>236|IGKJ2 ENST00000390241|IGKJ2|J-REGION|IG|IGK|None|00 +TGTGCAGTTTTGGCCAGGGGACCAAGCTGGAGATCAAAC +>237|IGKV2D-29 ENST00000491977|IGKV2D-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGATACCTGGATCCAGTGCAGATATTGTGATGACCCAGACTCCACTCTCTCTGTCCGTCACCCCTGGACAGCCGGCCTCCATCTCCTGCAAGTCTAGTCAGAGCCTCCTGCATAGTGATGGAAAGACCTATTTGTATTGGTACCTGCAGAAGCCAGGCCAGCCTCCACAGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAAGTATACAGCTTCCT +>238|IGKV1-39 ENST00000631411|IGKV1-39|5'UTR|IG|IGK|None|00 +GGGCTGGTCGCACCCTGTGCAGGAGTCAGTCTCAGTCAGGACACAGC +>239|TRGV8 ENST00000390343|TRGV8|5'UTR|TR|TRG|None|00 +CTACTGTCTTCTGTGTTAGGGATCACTTCCTTGTTGAGTGGGACCTGAGTTTTGAGAGGGTCTTCTGCTCCTCTTCGTCTGGTCCCTTACTTCCAAGACCCCAGAGAGGAAGGC +>240|IGLV10-54 ENST00000390287|IGLV10-54|5'UTR|IG|IGL|None|00 +GGGAATCTGCACC +>241|IGKV3D-11 ENST00000390277|IGKV3D-11|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>242|IGHD5-5 ENST00000390588|IGHD5-5|D-REGION|IG|IGH|None|00 +GTGGATACAGCTATGGTTAC +>243|IGKV2D-40 ENST00000560045|IGKV2D-40|L-REGION+V-REGION|IG|IGK|None|00 +GAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTCCACA +>244|IGHD1OR15-1B ENST00000604838|IGHD1OR15-1B|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACAAC +>245|TRAJ43 ENST00000390494|TRAJ43|J-REGION|TR|TRA|None|00 +ACAATAACAATGACATGCGCTTTGGAGCAGGGACCAGACTGACAGTAAAACCAA +>246|TRAV8-1 ENST00000390430|TRAV8-1|5'UTR|TR|TRA|None|00 +CCAAAACAAGAGACTTGCCTAGCCCAACCTTCCTCACGCTCGCTATTCTCAAGACCTGGGTTCCAGCCACTTTCCTACTGGCCCCGAGGAGAATTTCCAAAGAGACGCCTGCAGTGTTTCCACAGCTCAGCC +>247|IGLJ6 ENST00000390328|IGLJ6|J-REGION|IG|IGL|None|00 +GGAGGGTTTGTGTGCAGGGTTATATCACAGTGTAATGTGTTCGGCAGTGGCACCAAGGTGACCGTCCTCG +>248|IGKV3D-20 ENST00000390270|IGKV3D-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCGGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCTGGCGCCCAGGCTCCTCATCTATGATGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>249|TRAV1-2 ENST00000390423|TRAV1-2|5'UTR|TR|TRA|None|00 +CCCACATGAAGTGTCTACCTTCTGCAGACTCCAATGGCTCAGGAACTGGGAATGCAGTGCCAGGCTCGTGGTATCCTGCAGCAG +>250|IGHV1-3 ENST00000390595|IGHV1-3|5'UTR|IG|IGH|None|00 +CCACATCCCTCCTCAGAAGCCCCCAGAGCACAACGCCTCACC +>251|TRAJ45 ENST00000390492|TRAJ45|J-REGION|TR|TRA|None|00 +TGTATTCAGGAGGAGGTGCTGACGGACTCACCTTTGGCAAAGGGACTCATCTAATCATCCAGCCCT +>252|IGKV1OR2-108 ENST00000453673|IGKV1OR2-108|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCGAGGTGCCAGATGTGACATCCAGGTGACCCAGTCTCCATCTTCCCTGTCTGCGTCTGTAGGAGACAGAGTCACCATCACCTGCCGGGCAAGTCAGGGCATTAGCAATGGGTTATCCTGGTATCAGCAGAAACCAGGGCAAGCCCCTACGCTCCTGATCTATGCTGCATCCAGTTTGCAGTCGGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCTACAGGATTATACTACCCCATT +>253|IGKV2D-40 ENST00000429992|IGKV2D-40|L-REGION+V-REGION|IG|IGK|None|00 +ATGCTCTGGGTCCCTGGATCCAGTGAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTC +>254|TRAV20 ENST00000390448|TRAV20|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAAATGTTGGAGTGTGCATTCATAGTCTTGTGGCTTCAGCTTGGCTGGTTGAGTGGAGAAGACCAGGTGACGCAGAGTCCCGAGGCCCTGAGACTCCAGGAGGGAGAGAGTAGCAGTCTCAACTGCAGTTACACAGTCAGCGGTTTAAGAGGGCTGTTCTGGTATAGGCAAGATCCTGGGAAAGGCCCTGAATTCCTCTTCACCCTGTATTCAGCTGGGGAAGAAAAGGAGAAAGAAAGGCTAAAAGCCACATTAACAAAGAAGGAAAGCTTTCTGCACATCACAGCCCCTAAACCTGAAGACTCAGCCACTTATCTCTGTGCTGTGCAGG +>255|IGKV6D-21 ENST00000436451|IGKV6D-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTCGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAGCGTATTACTGTCATCAGAGTAGTAGTTTACCT +>256|TRBV6-2 ENST00000632016|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>257|TRBV30 ENST00000631690|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTCCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>258|IGHJ4 ENST00000631521|IGHJ4|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>259|IGHD3-10 ENST00000390583|IGHD3-10|D-REGION|IG|IGH|None|00 +GTATTACTATGGTTCGGGGAGTTATTA +>260|IGHE ENST00000610670|IGHE|C-REGION|IG|IGH|E|00 +GCCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCGAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAATGA +>261|IGKV3-15 ENST00000390252|IGKV3-15|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>262|TRAJ52 ENST00000390486|TRAJ52|J-REGION|TR|TRA|None|00 +CTAATGCTGGTGGTACTAGCTATGGAAAGCTGACATTTGGACAAGGGACCATCTTGACTGTCCATCCAA +>263|TRAV10 ENST00000390432|TRAV10|5'UTR|TR|TRA|None|00 +AGTCAACTTCTGGGAGCAGATCTCTGCAGAATAAAA +>264|TRBJ1-5 ENST00000634000|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAGCAATCAGCCCCAGCATTTTGGTGATGGGACTCGACTCTCCATCCTAG +>265|IGHV2-70 ENST00000390634|IGHV2-70|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCTCCACC +>266|IGHM ENST00000622287|IGHM|5'UTR|IG|IGH|None|00 +ACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAGGG +>267|IGLV4-60 ENST00000390284|IGLV4-60|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCACTCCTCCTCCTCTTCCCTCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCCTGTGCTGACTCAATCATCCTCTGCCTCTGCTTCCCTGGGATCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGTAGCTACATCATCGCATGGCATCAGCAGCAGCCAGGGAAGGCCCCTCGGTACTTGATGAAGCTTGAAGGTAGTGGAAGCTACAACAAGGGGAGCGGAGTTCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGACCGCTACCTCACCATCTCCAACCTCCAGTTTGAGGATGAGGCTGATTATTACTGTGAGACCTGGGACAGTAACACTCA +>268|IGKV1-12 ENST00000632502|IGKV1-12|5'UTR|IG|IGK|None|00 +AGGCTGATCACACCCTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>269|TRBV6-1 ENST00000390353|TRBV6-1|5'UTR|TR|TRB|None|00 +GTTCCCCTATCACCGATGCACAGACCCAGAAGACCCCTCCATCCTGTAGCACCTGCC +>270|TRBV7-1 ENST00000632308|TRBV7-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGCTCCTCTGCTGGGCAGCCATATGTCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGTCCCTGAGACACAAGGTAGCAAAGAAGGGAAAGGATGTAGCTCTCAGATATGATCCAATTTCAGGTCATAATGCCCTTTATTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTCCAATTTACTTCCAAGGCAAGGATGCAGCAGACAAATCGGGGCTTCCCCGTGATCGGTTCTCTGCACAGAGGTCTGAGGGATCCATCTCCACTCTGAAGTTCCAGCGCACACAGCAGGGGGACTTGGCTGTGTATCTCTGTGCCAGCAGCTCAGC +>271|IGKV1-8 ENST00000631614|IGKV1-8|5'UTR|IG|IGK|None|00 +AGGCTGGACACACTTCATGCAGGAGTCAGACCCTGTCAGGACACAGCATAGAC +>272|IGHG4 ENST00000618981|IGHG4|C-REGION|IG|IGH|G4|00 +GCTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGGTAAATGA +>273|IGLV3-27 ENST00000390304|IGLV3-27|5'UTR|IG|IGL|None|00 +GCTGTAGGCTCAGGAGGCAGAGCTCTGAATGTCTCACC +>274|TRAJ17 ENST00000390520|TRAJ17|J-REGION|TR|TRA|None|00 +TGATCAAAGCTGCAGGCAACAAGCTAACTTTTGGAGGAGGAACCAGGGTGCTAGTTAAACCAA +>275|IGHV1-69 ENST00000632882|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>276|TRAV29DV5 ENST00000390458|TRAV29DV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCATGCTCCTGGGGGCATCAGTGCTGATTCTGTGGCTTCAGCCAGACTGGGTAAACAGTCAACAGAAGAATGATGACCAGCAAGTTAAGCAAAATTCACCATCCCTGAGCGTCCAGGAAGGAAGAATTTCTATTCTGAACTGTGACTATACTAACAGCATGTTTGATTATTTCCTATGGTACAAAAAATACCCTGCTGAAGGTCCTACATTCCTGATATCTATAAGTTCCATTAAGGATAAAAATGAAGATGGAAGATTCACTGTTTTCTTAAACAAAAGTGCCAAGCACCTCTCTCTGCACATTGTGCCCTCCCAGCCTGGAGACTCTGCAGTGTACTTCTGTGCAGCAAGCG +>277|TRBV6-4 ENST00000633472|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGATTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGCGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>278|TRBV10-3 ENST00000611462|TRBV10-3|5'UTR|TR|TRB|None|00 +ATGAGATCCTGGCCTGGACCTGAA +>279|IGHV3-64 ENST00000454421|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>280|TRBJ1-4 ENST00000632041|TRBJ1-4|J-REGION|TR|TRB|None|00 +CAACTAATGAAAAACTGTTTTTTGGCAGTGGAACCCAGCTCTCTGTCTTGG +>281|IGKV1D-33 ENST00000611734|IGKV1D-33|L-REGION+V-REGION|IG|IGK|None|00 +GACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCTCCCACAGTTGGCAAAGGACATGAACAGACACTTAAAAGA +>282|TRGV5 ENST00000390344|TRGV5|5'UTR|TR|TRG|None|00 +TTCTGGGAGGAAGGCTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGACTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCGGAGTTTTAAGAGGATCTTCTGCTCCTCCTCATCTGGTCCCTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>283|IGHV1-69-2 ENST00000624687|IGHV1-69-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>284|TRBV7-2 ENST00000631392|TRBV7-2|5'UTR|TR|TRB|None|00 +CCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>285|IGHV2-26 ENST00000390611|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATA +>286|TRBV10-2 ENST00000633575|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTATGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>287|IGKV3D-20 ENST00000390270|IGKV3D-20|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCCGCCCTGCAGTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>288|IGLV1-36 ENST00000618026|IGLV1-36|5'UTR|IG|IGL|None|00 +GCTGCGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>289|IGLV3-32 ENST00000627634|IGLV3-32|5'UTR|IG|IGL|None|00 +GCTGTGGACTCAGAGGCAGAGCTCTGGGGCATTTCCATT +>290|TRBV7-6 ENST00000390374|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>291|IGKJ1 ENST00000390242|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGCCAAGGGACCAAGGTGGAAATCAAAC +>292|TRBC2 ENST00000613720|TRBC2|C-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTCCTCCAGGCTGTGAGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCGAGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGGTGAGTGGGGCTTGTCAACAGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCC +>293|IGHV3-53 ENST00000390627|IGHV3-53|5'UTR|IG|IGH|None|00 +AATACCAATCTCCCCCAGGACACTTCATCTGCACGGAGCCCGGCCTCTCCTCAGATGTCCCACCCCAGAGCTTGCTATATAGTCGGGGACATGCAAATAGGGCCCTCCCTCTGCTGATGAAAACCAGCCCAGCTGACCCTGCAGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>294|TRBV21-1 TENX_TRBV21|TRBV21-1|L-REGION+V-REGION|TR|TRB|None|00 +TGTGCCTCAGACTTCTCTGCTGTGTGGCCATTTCTTTCTGGGGAGCCAGGCTCCACGGACACCAAGGTCACCCAGAGACCTAGACTTCTGGCCAAAGCAAGTGAACAGAAAGCAAAGATGGATTGTGTTCCTATAAAAGCACATAGTTATGTTTACTGGTATCGTAAGAAGCTGGAAGAAGAGCTCAAGTTTTTGGTTTACTTTCAGAACGAAGAACTTATTCAGAAAGCAGAAATAATCAATGAGCGATTTTTAGCCCAATGCTCCAAAAACTCATCCTGTACCTTGGAGATCCAGTCCACGGAGTCAGGGGACACAGCACTGTATTTCTGTGCCAGCAGCAAAGC +>295|IGHV3-72 ENST00000633602|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>296|IGKV2D-28 ENST00000453166|IGKV2D-28|5'UTR|IG|IGK|None|00 +TTGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>297|TRAC ENST00000636588|TRAC|C-REGION|TR|TRA|None|00 +GGTGGCTACAATAAGCTGATTTTTGGAGCAGGGACCAGGCTGGCTGTACACCCATATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>298|IGKJ5 ENST00000390238|IGKJ5|J-REGION|IG|IGK|None|00 +GATCACCTTCGGCCAAGGGACACGACTGGAGATTAAAC +>299|TRAJ38 ENST00000390499|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGCTGGCAACAACCGTAAGCTGATTTGGGGATTGGGAACAAGCCTGGCAGTAAATCCGA +>300|TRAV2 ENST00000390424|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTGCAGAGCACTCTGGGGGCGGTGTGGCTAGGGCTTCTCCTCAACTCTCTCTGGAAGGTTGCAGAAAGCAAGGACCAAGTGTTTCAGCCTTCCACAGTGGCATCTTCAGAGGGAGCTGTGGTGGAAATCTTCTGTAATCACTCTGTGTCCAATGCTTACAACTTCTTCTGGTACCTTCACTTCCCGGGATGTGCACCAAGACTCCTTGTTAAAGGCTCAAAGCCTTCTCAGCAGGGACGATACAACATGACCTATGAACGGTTCTCTTCATCGCTGCTCATCCTCCAGGTGCGGGAGGCAGATGCTGCTGTTTACTACTGTGCTGTGGAGGA +>301|TRDJ2 ENST00000390475|TRDJ2|J-REGION|TR|TRD|None|00 +CTTTGACAGCACAACTCTTCTTTGGAAAGGGAACACAACTCATCGTGGAACCAG +>302|IGKV6D-41 ENST00000390271|IGKV6D-41|5'UTR|IG|IGK|None|00 +AGCAAAACTGAAGTCAAAACACTGAG +>303|TRBV20-1 ENST00000633466|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCTGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>304|IGHV3-35 ENST00000632225|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGAAA +>305|TRBV19 ENST00000390393|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>306|IGKV1-12 ENST00000632502|IGKV1-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>307|IGHV1-24 ENST00000633490|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>308|TRAV13-1 ENST00000390436|TRAV13-1|5'UTR|TR|TRA|None|00 +GATCTTAATTGGGAAGAACAAGG +>309|IGLV6-57 ENST00000390285|IGLV6-57|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCACTACTTCTCACCCTCCTCGCTCACTGCACAGGTTCTTGGGCCAATTTTATGCTGACTCAGCCCCACTCTGTGTCGGAGTCTCCGGGGAAGACGGTAACCATCTCCTGCACCGGCAGCAGTGGCAGCATTGCCAGCAACTATGTGCAGTGGTACCAGCAGCGCCCGGGCAGTGCCCCCACCACTGTGATCTATGAGGATAACCAAAGACCCTCTGGGGTCCCTGATCGGTTCTCTGGCTCCATCGACAGCTCCTCCAACTCTGCCTCCCTCACCATCTCTGGACTGAAGACTGAGGACGAGGCTGACTACTACTGTCAGTCTTATGATAGCAGCAATCACACAGTGCTCCAGACCCATGGGGAAGTGAGACAGAAACTCCCCAGAGCATCTCTACCTGGGCCAGTCTCAGCCTGTCTCCACCGGAGAGGG +>310|TRAJ39 ENST00000390498|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGCAACATGCTCACCTTTGGAGGGGGAACAAGGTTAATGGTCAAACCCC +>311|IGHV5-51 ENST00000390626|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>312|IGLV2-8 ENST00000620395|IGLV2-8|L-REGION+V-REGION|IG|IGL|None|00 +ATGCAGATTTGCATGGAGGTCCCGCCCTTCTCTGAGGCAGAGGGGATAAGACAGGGCTGGGGGCAGGCCCAGTGCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACGTCACCACCATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTCCCTCCGCGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCGTCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCAGCTCATATGCAGGCAGCAACAATTTCCACA +>313|IGHV3-43 ENST00000434710|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>314|TRAV36DV7 ENST00000390463|TRAV36DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAGTGTCCACAGGCTTTACTAGCTATCTTTTGGCTTCTACTGAGCTGGGTGAGCAGTGAAGACAAGGTGGTACAAAGCCCTCTATCTCTGGTTGTCCACGAGGGAGACACCGTAACTCTCAATTGCAGTTATGAAGTGACTAACTTTCGAAGCCTACTATGGTACAAGCAGGAAAAGAAAGCTCCCACATTTCTATTTATGCTAACTTCAAGTGGAATTGAAAAGAAGTCAGGAAGACTAAGTAGCATATTAGATAAGAAAGAACTTTTCAGCATCCTGAACATCACAGCCACCCAGACCGGAGACTCGGCCATCTACCTCTGTGCTGTGGAGG +>315|TRAV4 ENST00000390426|TRAV4|5'UTR|TR|TRA|None|00 +CTGGGCTCATTGCAGCTCAGACACAGCAAAAGAGCCTAGAACCTGGGTCCTAGTTTGCACCTAGAAT +>316|IGHV4-28 ENST00000390612|IGHV4-28|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTACAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGACACCCTGTCCCTCACCTGCGCTGTCTCTGGTTACTCCATCAGCAGTAGTAACTGGTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTACATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATGTCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGTGGACACGGCCGTGTATTACTGTGCGAGAAA +>317|IGLV3-9 ENST00000390316|IGLV3-9|5'UTR|IG|IGL|None|00 +CTTGACTCTGCTGATTTGCATCACAGGCTGCTCTCTTCAGCAAGGGGATAAGAGAGGGCTGGAAGGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGGGGTGCCGCAGCC +>318|TRAV3 ENST00000390425|TRAV3|5'UTR|TR|TRA|None|00 +CCGGTGTCGGGAAGCACCAGTGCCCTGAGGAAGGGCCATTTCCAAAAGCCCTGTGCTGACACAGGGTTGCTGGTTCCTCTTCAAGAGCCCACTCTCTGGGGTGGGGCCATATCTCCAGCAGAGGTGGGCTGGAAAGGACCCCCCCAATCCCGCCCGCCGTGAGCTTAGCTGGAGCC +>319|TRAV25 ENST00000390454|TRAV25|5'UTR|TR|TRA|None|00 +ACTATTTCTATTGATCTGGAAGAAGCTTGTACCAGGCAACCCATTTAGGAGAAGTTGGATGAAGAGGGAGAGGGAG +>320|TRBV6-8 ENST00000632425|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCGGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>321|TRAV34 ENST00000390461|TRAV34|5'UTR|TR|TRA|None|00 +AATAGCTAAGGG +>322|IGLC1 ENST00000390321|IGLC1|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCCAACCCCACTGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTCCAAGCCAACAAGGCCACACTAGTGTGTCTGATCAGTGACTTCTACCCGGGAGCTGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCAAACCCTCCAAACAGAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>323|TRAJ28 ENST00000390509|TRAJ28|J-REGION|TR|TRA|None|00 +CATACTCTGGGGCTGGGAGTTACCAACTCACTTTCGGGAAGGGGACCAAACTCTCGGTCATACCAA +>324|IGLC2 ENST00000390323|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTATCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>325|TRBV7-4 ENST00000633313|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGTGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>326|IGKV2D-24 ENST00000462693|IGKV2D-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCGCCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTTCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGGTTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCACGCAAGCTACACAATTTCCT +>327|IGLV3-27 ENST00000390304|IGLV3-27|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCATTCTCTGCACAGTCTCTGTGGCCTCCTATGAGCTGACACAGCCATCCTCAGTGTCAGTGTCTCCGGGACAGACAGCCAGGATCACCTGCTCAGGAGATGTACTGGCAAAAAAATATGCTCGGTGGTTCCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATTTATAAAGACAGTGAGCGGCCCTCAGGGATCCCTGAGCGATTCTCCGGCTCCAGCTCAGGGACCACAGTCACCTTGACCATCAGCGGGGCCCAGGTTGAGGATGAGGCTGACTATTACTGTTACTCTGCGGCTGACAACAAT +>328|TRBV5-6 ENST00000390375|TRBV5-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGCACTGCTTTGTCTCCTGGGAGCAGGCTTAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTAAGTCTGGGCATGACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGGAGGAAGAGAGACAGAGAGGCAACTTCCCTGATCGATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>329|TRAV16 ENST00000390444|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCCCACCCTCATCTCAGTGCTTGTGATAATATTTATACTCAGAGGAACAAGAGCCCAGAGAGTGACTCAGCCCGAGAAGCTCCTCTCTGTCTTTAAAGGGGCCCCAGTGGAGCTGAAGTGCAACTATTCCTATTCTGGGAGTCCTGAACTCTTCTGGTATGTCCAGTACTCCAGACAACGCCTCCAGTTACTCTTGAGACACATCTCTAGAGAGAGCATCAAAGGCTTCACTGCTGACCTTAACAAAGGCGAGACATCTTTCCACCTGAAGAAACCATTTGCTCAAGAGGAAGACTCAGCCATGTATTACTGTGCTCTAAGTGG +>330|IGKV2D-26 ENST00000390268|IGKV2D-26|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACT +>331|TRAV8-4 ENST00000390438|TRAV8-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGGCAGCCACGTCTCTGTCTCTGAAGGAGCCCTGGTTCTGCTGAGGTGCAACTACTCATCGTCTGTTCCACCATATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGCTGTGAGTGA +>332|TRGJ2 ENST00000390333|TRGJ2|J-REGION|TR|TRG|None|00 +GAATTATTATAAGAAACTCTTTGGCAGTGGAACAACACTTGTTGTCACAG +>333|TRAV13-1 ENST00000390436|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACATCCATTCGAGCTGTATTTATATTCCTGTGGCTGCAGCTGGACTTGGTGAATGGAGAGAATGTGGAGCAGCATCCTTCAACCCTGAGTGTCCAGGAGGGAGACAGCGCTGTTATCAAGTGTACTTATTCAGACAGTGCCTCAAACTACTTCCCTTGGTATAAGCAAGAACTTGGAAAAGGACCTCAGCTTATTATAGACATTCGTTCAAATGTGGGCGAAAAGAAAGACCAACGAATTGCTGTTACATTGAACAAGACAGCCAAACATTTCTCCCTGCACATCACAGAGACCCAACCTGAAGACTCGGCTGTCTACTTCTGTGCAGCAAGTA +>334|IGHD4OR15-4B ENST00000603693|IGHD4OR15-4B|D-REGION|IG|IGH|None|00 +TGACTATGGTGCTAACTAC +>335|IGHV3-38 ENST00000390618|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>336|TRBV16 ENST00000633244|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCCAATATTCACCTGCATCACAATCCTTTGTCTGCTGGCTGCAGGTTCTCCTGGTGAAGAAGTCGCCCAGACTCCAAAACATCTTGTCAGAGGGGAAGGACAGAAAGCAAAATTATATTGTGCCCCAATAAAAGGACACAGTTATGTTTTTTGGTACCAACAGGTCCTGAAAAACGAGTTCAAGTTCTTGATTTCCTTCCAGAATGAAAATGTCTTTGATGAAACAGGTATGCCCAAGGAAAGATTTTCAGCTAAGTGCCTCCCAAATTCACCCTGTAGCCTTGAGATCCAGGCTACGAAGCTTGAGGATTCAGCAGTGTATTTTTGTGCCAGCAGCCAATC +>337|IGLJ4 ENST00000390326|IGLJ4|J-REGION|IG|IGL|None|00 +GTATTTGGTGGAGGAACCCAGCTGATCATTTTA +>338|IGHV5-51 ENST00000390626|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGA +>339|IGKV1-6 ENST00000464162|IGKV1-6|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTTGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTACAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGCACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAAGATTACAATTACCCT +>340|IGHV3-30 ENST00000633400|IGHV3-30|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>341|IGKV1-8 ENST00000631614|IGKV1-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATCCTCATTCTCTGCATCTACAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTACCCT +>342|TRAJ23 ENST00000390514|TRAJ23|J-REGION|TR|TRA|None|00 +TGATTTATAACCAGGGAGGAAAGCTTATCTTCGGACAGGGAACGGAGTTATCTGTGAAACCCA +>343|TRBV5-3 ENST00000390362|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTATTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>344|IGHV3-35 ENST00000632225|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>345|IGLJ1 ENST00000390320|IGLJ1|J-REGION|IG|IGL|None|00 +CCCAGCAGGCTCCTGCTCCAGCCCAGCCCCCAGAGAGCAGACCCCAGGTGCTGGCCCCGGGGGTTTTGGTCTGAGCCTCAGTCACTGTGTTATGTCTTCGGAACTGGGACCAAGGTCACCGTCCTAG +>346|IGLV3-10 ENST00000390315|IGLV3-10|5'UTR|IG|IGL|None|00 +GTGGGCTCAGGAGGCAGAGCTCTGGGAATCTCACC +>347|IGKV6D-21 ENST00000436451|IGKV6D-21|5'UTR|IG|IGK|None|00 +GGTATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>348|TRAV25 ENST00000390454|TRAV25|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTACTCATCACATCAATGTTGGTCTTATGGATGCAATTGTCACAGGTGAATGGACAACAGGTAATGCAAATTCCTCAGTACCAGCATGTACAAGAAGGAGAGGACTTCACCACGTACTGCAATTCCTCAACTACTTTAAGCAATATACAGTGGTATAAGCAAAGGCCTGGTGGACATCCCGTTTTTTTGATACAGTTAGTGAAGAGTGGAGAAGTGAAGAAGCAGAAAAGACTGACATTTCAGTTTGGAGAAGCAAAAAAGAACAGCTCCCTGCACATCACAGCCACCCAGACTACAGATGTAGGAACCTACTTCTGTGCAGGG +>349|IGLV9-49 ENST00000427632|IGLV9-49|5'UTR|IG|IGL|None|00 +GAGAGACTGAAGAACCCAGCATTGCAGCAGCTCCACC +>350|IGLV9-49 ENST00000427632|IGLV9-49|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCTCTGCTCCTCACCCTCCTCAGTCTCCTCACAGGGTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCTGCATCAGCCTCCCTGGGAGCCTCGGTCACACTCACCTGCACCCTGAGCAGCGGCTACAGTAATTATAAAGTGGACTGGTACCAGCAGAGACCAGGGAAGGGCCCCCGGTTTGTGATGCGAGTGGGCACTGGTGGGATTGTGGGATCCAAGGGGGATGGCATCCCTGATCGCTTCTCAGTCTTGGGCTCAGGCCTGAATCGGTACCTGACCATCAAGAACATCCAGGAAGAGGATGAGAGTGACTACCACTGTGGGGCAGACCATGGCAGTGGGAGCAACTTCGTG +>351|IGKV1-6 ENST00000632891|IGKV1-6|5'UTR|IG|IGK|None|00 +GCAGGAGTCAGACCCACTCAGGACACAGC +>352|IGHV2-5 ENST00000560724|IGHV2-5|5'UTR|IG|IGH|None|00 +AGTGACTCCTGTGCCCCACC +>353|IGHD2-21 ENST00000632619|IGHD2-21|D-REGION|IG|IGH|None|00 +AGCATATTGTGGTGGTGACTGCTATTCC +>354|IGHJ4 ENST00000461719|IGHJ4|J-REGION|IG|IGH|None|00 +TACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>355|IGHG4 ENST00000390543|IGHG4|C-REGION|IG|IGH|G4|00 +GCTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGGTAAA +>356|TRBV27 ENST00000390399|TRBV27|5'UTR|TR|TRB|None|00 +ACCTGGAGCCCCCAGAACTGGCAGACACCTGCCTGATGCTGCC +>357|TRAC ENST00000637010|TRAC|C-REGION|TR|TRA|None|00 +GATGCTAAGACCACACAGCCAAATTCAATGGAGAGTAACGAAGAAGAGCCTGTTCACTTGCCTTGTAACCACTCCACAATCAGTGGAACTGATTACATACATTGGTATCGACAGCTTCCCTCCCAGGGTCCAGAGTACGTGATTCATGGTCTTACAAGCAATGTGAACAACAGAATGGCCTCTCTGGCAATCGCTGAAGACAGAAAGTCCAGTACCTTGATCCTGCACCGTGCTACCTTGAGAGATGCTGCCGTGTACTACTGTCTTCTGGGAGACACTGTAGGAGGTGCTGACGGACTCACCTTTGGCAAAGGGACTCATCTAATCATCCAGCCCTATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>358|TRAV18 ENST00000390446|TRAV18|5'UTR|TR|TRA|None|00 +GATTTTGTAGAAGATTCCGCCAAAGACTCAACAACATAAAGAAATATATATACCTTTCGGTTTGGATATCTCTCAACAAAACCTTCTACTGCTTCTCAGCCAGCC +>359|IGLV5-45 ENST00000390296|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGTGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>360|TRBV5-7 ENST00000633790|TRBV5-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGTGCTGCTTTGTCCCCTAGGAGAAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCACGTGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTCCTCGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCAATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTAGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>361|IGKV3D-15 ENST00000417279|IGKV3D-15|5'UTR|IG|IGK|None|00 +GGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>362|IGHG1 ENST00000631402|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAATGA +>363|TRAJ31 ENST00000390506|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAACAATGCCAGACTCATGTTTGGAGATGGAACTCAGCTGGTGGTGAAGCCCA +>364|TRGJP2 ENST00000390334|TRGJP2|J-REGION|TR|TRG|None|00 +ATAGTAGTGATTGGATCAAGACGTTTGCAAAAGGGACTAGGCTCATAGTAACTTCGCCTG +>365|IGHD3-3 ENST00000633353|IGHD3-3|D-REGION|IG|IGH|None|00 +GTATTACGATTTTTGGAGTGGTTATTATACC +>366|TRBJ1-1 ENST00000632951|TRBJ1-1|J-REGION|TR|TRB|None|00 +TGAACACTGAAGCTTTCTTTGGACAAGGCACCAGACTCACAGTTGTAG +>367|TRBV4-1 ENST00000390357|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>368|TRAV12-1 ENST00000390433|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGATATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACGGAAGGAGGTGGAGCAGGATCCTGGACCCTTCAATGTTCCAGAGGGAGCCACTGTCGCTTTCAACTGTACTTACAGCAACAGTGCTTCTCAGTCTTTCTTCTGGTACAGACAGGATTGCAGGAAAGAACCTAAGTTGCTGATGTCCGTATACTCCAGTGGTAATGAAGATGGAAGGTTTACAGCACAGCTCAATAGAGCCAGCCAGTATATTTCCCTGCTCATCAGAGACTCCAAGCTCAGTGATTCAGCCACCTACCTCTGTGTGGTGAACA +>369|IGHV3-13 ENST00000631975|IGHV3-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATATTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACGACATGCACTGGGTCCGCCAAGCTACAGGAAAAGGTCTGGAGTGGGTCTCAGCTATTGGTACTGCTGGTGACCCATACTATCCAGGCTCCGTGAAGGGCCGATTCACCATCTCCAGAGAAAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGGGGACACGGCTGTGTATTACTGTGCAAGAGA +>370|IGHD3-10 ENST00000632609|IGHD3-10|D-REGION|IG|IGH|None|00 +GTATTACTATGGTTCGGGGAGTTATTATAA +>371|IGLV8-61 ENST00000390283|IGLV8-61|5'UTR|IG|IGL|None|00 +GAGGAAAACAAACCCCAGCTGGGAAGCCTGAGAACACTTAGCCTTC +>372|IGHV1-46 ENST00000632105|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>373|TRBV29-1 ENST00000422143|TRBV29-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGAGTCTTCTGCTCCTTCTCCTGGGACTAGGCTCTGTGTTCAGTGCTGTCATCTCTCAAAAGCCAAGCAGGGATATCTGTCAACGTGGAACCTCCCTGACGATCCAGTGTCAAGTCGATAGCCAAGTCACCATGATGTTCTGGTACCGTCAGCAACCTGGACAGAGCCTGACACTGATCGCAACTGCAAATCAGGGCTCTGAGGCCACATATGAGAGTGGATTTGTCATTGACAAGTTTCCCATCAGCCGCCCAAACCTAACATTCTCAACTCTGACTGTGAGCAACATGAGCCCTGAAGACAGCAGCATATATCTCTGCAGCGTTGAAGA +>374|IGLV8-61 ENST00000390283|IGLV8-61|L-REGION+V-REGION|IG|IGL|None|00 +ATGAGTGTCCCCACCATGGCCTGGATGATGCTTCTCCTCGGACTCCTTGCTTATGGATCAGGAGTGGATTCTCAGACTGTGGTGACCCAGGAGCCATCGTTCTCAGTGTCCCCTGGAGGGACAGTCACACTCACTTGTGGCTTGAGCTCTGGCTCAGTCTCTACTAGTTACTACCCCAGCTGGTACCAGCAGACCCCAGGCCAGGCTCCACGCACGCTCATCTACAGCACAAACACTCGCTCTTCTGGGGTCCCTGATCGCTTCTCTGGCTCCATCCTTGGGAACAAAGCTGCCCTCACCATCACGGGGGCCCAGGCAGATGATGAATCTGATTATTACTGTGTGCTGTATATGGGTAGTGGCATTTC +>375|TRBV12-4 ENST00000631824|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>376|IGHV3-38 ENST00000390618|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATAT +>377|IGKV1D-43 ENST00000468879|IGKV1D-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTGCCCGCTCAGCGCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATTCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCTGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGCAAAAGCCCCTAAGCTCTTCATCTATTATGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTACCCCT +>378|TRDC ENST00000390477|TRDC|C-REGION|TR|TRD|None|00 +GAAGTCAGCCTCATACCAAACCATCCGTTTTTGTCATGAAAAATGGAACAAATGTCGCTTGTCTGGTGAAGGAATTCTACCCCAAGGATATAAGAATAAATCTCGTGTCATCCAAGAAGATAACAGAGTTTGATCCTGCTATTGTCATCTCTCCCAGTGGGAAGTACAATGCTGTCAAGCTTGGTAAATATGAAGATTCAAATTCAGTGACATGTTCAGTTCAACACGACAATAAAACTGTGCACTCCACTGACTTTGAAGTGAAGACAGATTCTACAGATCACGTAAAACCAAAGGAAACTGAAAACACAAAGCAACCTTCAAAGAGCTGCCATAAACCCAAAGCCATAGTTCATACCGAGAAGGTGAACATGATGTCCCTCACAGTGCTTGGGCTACGAATGCTGTTTGCAAAGACTGTTGCCGTCAATTTTCTCTTGACTGCCAAGTTATTTTTCTTG +>379|IGHG1 ENST00000390548|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTACAGGAACATGATCGGACAGGGGGCC +>380|IGHV1-46 ENST00000390622|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>381|IGKV1-33 ENST00000632835|IGKV1-33|5'UTR|IG|IGK|None|00 +GTGCAGGAGTCAGTCCCAACCAGGACACAGC +>382|IGLV2-11 ENST00000390314|IGLV2-11|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCAGCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCGCTCAGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGATGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCTGCTCATATGCAGGCAGCTACACTTTCCACA +>383|IGHD6-6 ENST00000632542|IGHD6-6|D-REGION|IG|IGH|None|00 +GAGTATAGCAGCTCGTCC +>384|IGLV5-45 ENST00000626489|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>385|TRBV10-2 ENST00000633575|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>386|TRBV30 ENST00000631690|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>387|IGHD4-17 ENST00000431870|IGHD4-17|D-REGION|IG|IGH|None|00 +TGACTACGGTGACTAC +>388|IGHV1-69 ENST00000390633|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>389|TRAV40 ENST00000390467|TRAV40|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCCTCTCTGGACTTTCTAATTCTGATCTTAATGTTTGGAGGAACCAGCAGCAATTCAGTCAAGCAGACGGGCCAAATAACCGTCTCGGAGGGAGCATCTGTGACTATGAACTGCACATACACATCCACGGGGTACCCTACCCTTTTCTGGTATGTGGAATACCCCAGCAAACCTCTGCAGCTTCTTCAGAGAGAGACAATGGAAAACAGCAAAAACTTCGGAGGCGGAAATATTAAAGACAAAAACTCCCCCATTGTGAAATATTCAGTCCAGGTATCAGACTCAGCCGTGTACTACTGTCTTCTGGGAGA +>390|TRBV24-1 ENST00000390397|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACAGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>391|TRAV22 ENST00000390450|TRAV22|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGATATTGGGAGCTCTGCTGGGGCTCTTGAGTGCCCAGGTTTGCTGTGTGAGAGGAATACAAGTGGAGCAGAGTCCTCCAGACCTGATTCTCCAGGAGGGAGCCAATTCCACGCTGCGGTGCAATTTTTCTGACTCTGTGAACAATTTGCAGTGGTTTCATCAAAACCCTTGGGGACAGCTCATCAACCTGTTTTACATTCCCTCAGGGACAAAACAGAATGGAAGATTAAGCGCCACGACTGTCGCTACGGAACGCTACAGCTTATTGTACATTTCCTCTTCCCAGACCACAGACTCAGGCGTTTATTTCTGTGCTGTGGAGC +>392|IGHV3-7 ENST00000633988|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>393|TRBV6-5 ENST00000633072|TRBV6-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGCCTCCTGTGCTGTGCAGCCTTGTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGAATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGCTGGTATCACTGACCAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGCTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>394|TRBV11-3 ENST00000634111|TRBV11-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGGCTCCTCTGCTGGGTGGCCTTCTGTCTCCTGGTGGAAGAACTCATAGAAGCTGGAGTGGTTCAGTCTCCCAGATATAAGATTATAGAGAAAAAACAGCCTGTGGCTTTTTGGTGCAATCCTATTTCTGGCCACAATACCCTTTACTGGTACCTGCAGAACTTGGGACAGGGCCCGGAGCTTCTGATTCGATATGAGAATGAGGAAGCAGTAGACGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGA +>395|TRAJ61 ENST00000390479|TRAJ61|J-REGION|TR|TRA|None|00 +GGTACCGGGTTAATAGGAAACTGACATTTGGAGCCAACACTAGAGGAATCATGAAACTCA +>396|TRBV7-1 ENST00000632308|TRBV7-1|5'UTR|TR|TRB|None|00 +CTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>397|TRAJ5 ENST00000390532|TRAJ5|J-REGION|TR|TRA|None|00 +TGGACACGGGCAGGAGAGCACTTACTTTTGGGAGTGGAACAAGACTCCAAGTGCAACCAA +>398|TRAV13-2 ENST00000390439|TRAV13-2|5'UTR|TR|TRA|None|00 +CGATGATGGAAGTAGCTCTTATGGCTGGAGATTGCAGGTTTATGACTGATCCTATTTGGGAAGAACAATG +>399|TRAJ10 ENST00000390527|TRAJ10|J-REGION|TR|TRA|None|00 +ATACTCACGGGAGGAGGAAACAAACTCACCTTTGGGACAGGCACTCAGCTAAAAGTGGAACTCA +>400|IGHG1 ENST00000631466|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAATGA +>401|IGHD3-22 ENST00000633765|IGHD3-22|D-REGION|IG|IGH|None|00 +GTATTACTATGATAGTAGTGGTTATTACTAC +>402|IGHV3-13 ENST00000631975|IGHV3-13|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTGTATTCAGTGATCAGGACTGAACACACAGGACTCACC +>403|IGKV1-37 ENST00000465170|IGKV1-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCT +>404|TRBV5-4 ENST00000633696|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATGATAGCTCTGAGCTGAATGTGAATGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>405|TRAJ8 ENST00000390529|TRAJ8|J-REGION|TR|TRA|None|00 +TGAACACAGGCTTTCAGAAACTTGTATTTGGAACTGGCACCTGACTTCTGGTCAGTCCAA +>406|TRDJ1 ENST00000390473|TRDJ1|J-REGION|TR|TRD|None|00 +ACACCGATAAACTCATCTTTGGAAAAGGAACCCGTGTGACTGTGGAACCAA +>407|IGHV3OR16-9 ENST00000558425|IGHV3OR16-9|L-REGION+V-REGION|IG|IGH|None|00 +GAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACCACTACACGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACAGTAGTGGTAATAGTGGTTACACAAACTACGCAGACTCTGTGAAAGGCCGATTCACCATCTCCAGGGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGT +>408|IGKV5-2 ENST00000390244|IGKV5-2|5'UTR|IG|IGK|None|00 +ATAAAATCTGTGCTGTCAAACTGATTAGGAACTGACTACCACCTGCAGGTCAGGGCCAAGGTT +>409|IGHV3-30 ENST00000603660|IGHV3-30|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAAA +>410|TRAJ21 ENST00000390516|TRAJ21|J-REGION|TR|TRA|None|00 +TACAACTTCAACAAATTTTACTTTGGATCTGGGACCAAACTCAATGTAAAACCAA +>411|IGHV6-1 ENST00000633299|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>412|IGHV2-26 ENST00000632457|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>413|TRBV23-1 TENX_TRBV23_1|TRBV23-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCGGCTGTGCAGCCCTGTGTCTCCTGGCAGCAGATGCGCCCTGAGCACAAAAGAAAAATCCTTGTCCTGGGCTTGCCAACCAGCAGATCCAAGCTTTGTTTTGTTTTGTTTTGTTTTGTTTTGTTTTGTTTTGTTTTGTTTGTTAAGCTCTTTCCTGGACTCTTTCTACAGCATCTGTTTCTTTCTCTTACAGACTCTTTTCATGCCAAAGTCACACAGACTCCAGGACATTTGGTCAAAGGAAAAGGACAGAAAACAAAGATGGATTGTACCCCCGAAAAAGGACATACTTTTGTTTATTGGTATCAACAGAATCAGAATAAAGAGTTTATGCTTTTGATTTCCTTTCAGAATGAACAAGTTCTTCAAGAAACGGAGATGCACAAGAAGCGATTCTCATCTCAATGCCCCAAGAACGCACCCTGCAGCCTGGCAATCCTGTCCTCAGAACCGGGAGACACGGCACTGTATCTCTGCGCCAGCAGTCAATC +>414|IGHV4-4 ENST00000631379|IGHV4-4|5'UTR|IG|IGH|None|00 +AAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCATGGACCTCCTGCACAAGAAC +>415|TRBJ2-5 ENST00000634149|TRBJ2-5|J-REGION|TR|TRB|None|00 +ACCAAGAGACCCAGTACTTCGGGCCAGGCACGCGGCTCCTGGTGCTCG +>416|IGHV3OR16-13 ENST00000562905|IGHV3OR16-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCAGACTCCATGAAGGGCCAATTCACCATCTCCAGAGACAATGCTAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACATGGCTGTGTATTACTGTACTAGAGA +>417|IGHD1-26 ENST00000633009|IGHD1-26|D-REGION|IG|IGH|None|00 +GGTATAGTGGGAGCTACTAC +>418|IGLV2-33 ENST00000390302|IGLV2-33|5'UTR|IG|IGL|None|00 +GGCTAGAGGCAGGCCCGGTGCTGGGGTCTCAAGGCAGCGCTCTCGGGACATCTCCACC +>419|IGLV5-37 ENST00000628968|IGLV5-37|5'UTR|IG|IGL|None|00 +CCACC +>420|TRBV25-1 ENST00000390398|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>421|IGHG3 ENST00000390551|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>422|TRAC ENST00000611116|TRAC|C-REGION|TR|TRA|None|00 +ATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>423|IGHD6-25 ENST00000452198|IGHD6-25|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCGGCTAC +>424|IGHD4OR15-4A ENST00000603326|IGHD4OR15-4A|D-REGION|IG|IGH|None|00 +TGACTATGGTGCTAACTAC +>425|TRAV7 ENST00000390429|TRAV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGATGCGGAGACCTGTCCTAATTATATTTTGTCTATGTCTTGGCTGGGCAAATGGAGAAAACCAGGTGGAGCACAGCCCTCATTTTCTGGGACCCCAGCAGGGAGACGTTGCCTCCATGAGCTGCACGTACTCTGTCAGTCGTTTTAACAATTTGCAGTGGTACAGGCAAAATACAGGGATGGGTCCCAAACACCTATTATCCATGTATTCAGCTGGATATGAGAAGCAGAAAGGAAGACTAAATGCTACATTACTGAAGAATGGAAGCAGCTTGTACATTACAGCCGTGCAGCCTGAAGATTCAGCCACCTATTTCTGTGCTGTAGATG +>426|IGKV2-40 ENST00000620613|IGKV2-40|L-REGION+V-REGION|IG|IGK|None|00 +GATCCAGTGAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCT +>427|IGHD5-12 ENST00000390581|IGHD5-12|D-REGION|IG|IGH|None|00 +GTGGATATAGTGGCTACGATTAC +>428|IGKV2-28 ENST00000482769|IGKV2-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>429|IGKV6-21 ENST00000390256|IGKV6-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTTGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCTTCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAACGTATTACTGTCATCAGAGTAGTAGTTTACCT +>430|TRBJ1-3 ENST00000633936|TRBJ1-3|J-REGION|TR|TRB|None|00 +CTCTGGAAACACCATATATTTTGGAGAGGGAAGTTGGCTCACTGTTGTAG +>431|IGHJ5 ENST00000633501|IGHJ5|J-REGION|IG|IGH|None|00 +ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>432|IGHD5OR15-5B ENST00000604446|IGHD5OR15-5B|D-REGION|IG|IGH|None|00 +GTGGATATAGTGTCTACGATTAC +>433|IGHV3-23 ENST00000390609|IGHV3-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGCTTTTTCTTGTGGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGCAGCTATGCCATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGCTATTAGTGGTAGTGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGGTTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTATATTACTGTGCGAAAGA +>434|IGKJ3 ENST00000390240|IGKJ3|J-REGION|IG|IGK|None|00 +ATTCACTTTCGGCCCTGGGACCAAAGTGGATATCAAAC +>435|IGKC ENST00000390237|IGKC|C-REGION|IG|IGK|None|00 +GAACTGTGGCTGCACCATCTGTCTTCATCTTCCCGCCATCTGATGAGCAGTTGAAATCTGGAACTGCCTCTGTTGTGTGCCTGCTGAATAACTTCTATCCCAGAGAGGCCAAAGTACAGTGGAAGGTGGATAACGCCCTCCAATCGGGTAACTCCCAGGAGAGTGTCACAGAGCAGGACAGCAAGGACAGCACCTACAGCCTCAGCAGCACCCTGACGCTGAGCAAAGCAGACTACGAGAAACACAAAGTCTACGCCTGCGAAGTCACCCATCAGGGCCTGAGCTCGCCCGTCACAAAGAGCTTCAACAGGGGAGAGTGT +>436|TRBC2 ENST00000466254|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>437|TRAJ19 ENST00000390518|TRAJ19|J-REGION|TR|TRA|None|00 +GCTATCAAAGATTTTACAATTTCACCTTTGGAAAGGGATCCAAACATAATGTCACTCCAA +>438|TRBV4-3 ENST00000631427|TRBV4-3|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>439|IGHV3-21 ENST00000632980|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>440|TRBV5-1 ENST00000633384|TRBV5-1|5'UTR|TR|TRB|None|00 +CTCAGAGGACCAGTATCCCTCACAGGGTGACACCTGACCAGCTCTGTCCCACCTGGCCATGGGCTCCAGGTACCTCTGATGGGAAGACCTTTGTCTCTTGGGAACAAGTGAATCCTTGGCACAGGCCCAGTGGATTCTGCTGTGCAGAACAGAGAGCAGTGGACCTCAGGAGGCCTGCAAGGGGAGGACATAGGACAGTGACATCACAGTATGCCCCTCCCACCAGGAAAAGCAAGGCTGAGAATTTAGCTCTTTCCCAGGAGGACCAAGCCCTGAGCACAGACACAGTGCTGCCTGCCCCTTTGTGCC +>441|IGKV1D-33 ENST00000390265|IGKV1D-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>442|TRAJ44 ENST00000390493|TRAJ44|J-REGION|TR|TRA|None|00 +TAAATACCGGCACTGCCAGTAAACTCACCTTTGGGACTGGAACAAGACTTCAGGTCACGCTCG +>443|IGHV3-23 ENST00000632630|IGHV3-23|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCCAGCCCTGGGATTTTCAGGTGTTTTCATTTGGTGATCAGGACTGAACAGAGAGAACTCACC +>444|TRAV5 ENST00000390427|TRAV5|5'UTR|TR|TRA|None|00 +GTGGGGAGAACA +>445|IGKV1D-17 ENST00000483379|IGKV1D-17|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGCTGCTGAGTTACTGAGATGAGCCAGCCCTGCAGCTGCGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCATAGCCTCCTGCCCTGAAGCCTTATTAATAGGCTGGACACACTTCATGGAGGAATCAGTCCCACTCAGGACACAGC +>446|TRAJ18 ENST00000390519|TRAJ18|J-REGION|TR|TRA|None|00 +CCGACAGAGGCTCAACCCTGGGGAGGCTATACTTTGGAAGAGGAACTCAGTTGACTGTCTGGCCTG +>447|TRBV10-1 ENST00000390364|TRBV10-1|5'UTR|TR|TRB|None|00 +ACTGAGAGCCCAACTTCAGTCTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>448|TRAV8-1 ENST00000390430|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGTTGCTCATACCAGTGCTGGGGATGATTTTTGCCCTGAGAGATGCCAGAGCCCAGTCTGTGAGCCAGCATAACCACCACGTAATTCTCTCTGAAGCAGCCTCACTGGAGTTGGGATGCAACTATTCCTATGGTGGAACTGTTAATCTCTTCTGGTATGTCCAGTACCCTGGTCAACACCTTCAGCTTCTCCTCAAGTACTTTTCAGGGGATCCACTGGTTAAAGGCATCAAGGGCTTTGAGGCTGAATTTATAAAGAGTAAATTCTCCTTTAATCTGAGGAAACCCTCTGTGCAGTGGAGTGACACAGCTGAGTACTTCTGTGCCGTGAATGC +>449|IGHV4-4 ENST00000455737|IGHV4-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCTCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGGGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGTTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>450|IGHG1 ENST00000390542|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>451|TRAJ53 ENST00000390485|TRAJ53|J-REGION|TR|TRA|None|00 +AGAATAGTGGAGGTAGCAACTATAAACTGACATTTGGAAAAGGAACTCTCTTAACCGTGAATCCAA +>452|TRGV2 ENST00000426402|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTAACGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCAGTACTATGACTCCTACAACTCCAAGGTTGTGTTGGAATCAGGAGTCAGTCCAGGGAAGTATTATACTTACGCAAGCACAAGGAACAACTTGAGATTGATACTGCGAAATCTAATTGAAAATGACTTTGGGGTCTATTACTGTGCCACCTGGGACGGG +>453|IGHV1-46 ENST00000632105|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>454|IGLV2-18 ENST00000390310|IGLV2-18|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCCCTCCGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTAGTTATAACCGTGTCTCCTGGTACCAGCAGCCCCCAGGCACAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGGTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTTATATACAAGCAGCAGCACTTTCCACAGAG +>455|IGHV3-73 ENST00000390636|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>456|IGKV3-7 ENST00000390247|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCAGAGAAATTGTAATGACACAGTCTCCACCCACCCTGTCTTTGTCTCCAGGGGAAAGAGTCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAACCTGGTATCAGCAGAAACCTGGCCAGGCGCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTAGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCT +>457|IGHV3-15 ENST00000390603|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>458|IGLV3-1 ENST00000390319|IGLV3-1|5'UTR|IG|IGL|None|00 +AAGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGAGGTGCCTCAGCC +>459|IGHV1-69-2 ENST00000624687|IGHV1-69-2|5'UTR|IG|IGH|None|00 +ATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>460|IGKV1-27 ENST00000631531|IGKV1-27|5'UTR|IG|IGK|None|00 +GTGCAGAAGTCTCTCTCAGTCAGGACACAGC +>461|TRBV6-1 ENST00000631557|TRBV6-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAAGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTCCATGTACTGGTATCGACAAGACCCAGGCATGGGACTGAGGCTGATTTATTACTCAGCTTCTGAGGGTACCACTGACAAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATTAAACAAACGGGAGTTCTCGCTCAGGCTGGAGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTGAAGC +>462|TRBV5-4 ENST00000633696|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACTCAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGGCCCACTGTGCC +>463|IGHV3-20 ENST00000390606|IGHV3-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGTGTGGTACGGCCTGGGGGGTCCCTGAGACTCTCCTTTGCAGCCTCTGGATTCACCTTTGATGATTATGGCATGAGCTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGAGTGGGTCTCTGGTATTAATTGGAATGGTGGTAGCACAGGTTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCCTTGTATCACTGTGCGAGAGA +>464|IGKV1D-8 ENST00000471857|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>465|TRAV23DV6 ENST00000390451|TRAV23DV6|5'UTR|TR|TRA|None|00 +CTGGAAGACCACCTGGGCTGTCATTGAGCTCTGGTGCCAGGAGGA +>466|TRGV10 ENST00000390341|TRGV10|L-REGION+V-REGION|TR|TRG|None|00 +ATGTTCATTGGAAATTCTCCTCTTTTACTTACAGTTGGACTTGGATTATCAAAAGTGGAGCAGTTCCAGCTATCCATTTCCACGGAAGTCAAGAAAAGTATTGACATACCTTGCAAGATATCGAGCACAAGGTTTGAAACAGATGTCATTCACTGGTACCGGCAGAAACCAAATCAGGCTTTGGAGCACCTGATCTATATTGTCTCAACAAAATCCGCAGCTCGACGCAGCATGGGTAAGACAAGCAACAAAGTGGAGGCAAGAAAGAATTCTCAAACTCTCACTTCAATCCTTACCATCAAGTCCGTAGAGAAAGAAGACATGGCCGTTTACTACTGTGCTGCGTGGGATTA +>467|IGLV3-22 ENST00000390307|IGLV3-22|5'UTR|IG|IGL|None|00 +AAGAGAGGCCTGGGAAGCCCAGCTGTGCTGTGGGCTCAGGAGGCAGAGCTGTGGGTGTCTCACC +>468|TRBV6-8 ENST00000390376|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCCGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>469|IGHD1-20 ENST00000450276|IGHD1-20|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACGAC +>470|TRGV5 ENST00000390344|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGGGAACGAAGTCAGTCACGAGGCCGACTAGGTCATCTGCTGAAATCACTTGTGACCTTACTGTAATAAATGCCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCAACTCAAAGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGATACTACGAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>471|IGKV3D-7 ENST00000443397|IGKV3D-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAACCATGGAAGCCCCAGCACAGCTTCTTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>472|TRAV4 ENST00000390426|TRAV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCAAGTGGCGAGAGTGATCGTGTTCCTGACCCTGAGTACTTTGAGCCTTGCTAAGACCACCCAGCCCATCTCCATGGACTCATATGAAGGACAAGAAGTGAACATAACCTGTAGCCACAACAACATTGCTACAAATGATTATATCACGTGGTACCAACAGTTTCCCAGCCAAGGACCACGATTTATTATTCAAGGATACAAGACAAAAGTTACAAACGAAGTGGCCTCCCTGTTTATCCCTGCCGACAGAAAGTCCAGCACTCTGAGCCTGCCCCGGGTTTCCCTGAGCGACACTGCTGTGTACTACTGCCTCGTGGGTGACA +>473|IGKV2D-30 ENST00000474213|IGKV2D-30|5'UTR|IG|IGK|None|00 +TGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>474|IGHV3-21 ENST00000632980|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>475|IGLV1-36 ENST00000618026|IGLV1-36|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCCCCTCTCTTCCTCACCCTCATCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCGGTGTCTGAAGCCCCCAGGCAGAGGGTCACCATCTCCTGTTCTGGAAGCAGCTCCAACATCGGAAATAATGCTGTAAACTGGTACCAGCAGCTCCCAGGAAAGGCTCCCAAACTCCTCATCTATTATGATGATCTGCTGCCCTCAGGGGTCTCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>476|TRBV30 ENST00000417977|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTTCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>477|IGHV4-59 ENST00000390629|IGHV4-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACATCTGTGGTTCTTCCTTCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>478|TRAV41 ENST00000390468|TRAV41|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTGAAGATCCGGCAATTTTTGTTGGCTATTTTGTGGCTTCAGCTAAGCTGTGTAAGTGCCGCCAAAAATGAAGTGGAGCAGAGTCCTCAGAACCTGACTGCCCAGGAAGGAGAATTTATCACAATCAACTGCAGTTACTCGGTAGGAATAAGTGCCTTACACTGGCTGCAACAGCATCCAGGAGGAGGCATTGTTTCCTTGTTTATGCTGAGCTCAGGGAAGAAGAAGCATGGAAGATTAATTGCCACAATAAACATACAGGAAAAGCACAGCTCCCTGCACATCACAGCCTCCCATCCCAGAGACTCTGCCGTCTACATCTGTGCTGTCAGA +>479|TRAV8-2 ENST00000390434|TRAV8-2|5'UTR|TR|TRA|None|00 +GGCTGATGTAGCTCACTGATGTCTGTGTAGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGACTCCTTAAGAGAAAGCCTTTCTGTTTTGGAAACTTTTCAAAGCCAGGGACTTGTCCAGCCCAACCTCCCCATTGCTCCTAGCTCCCGAGGCTCAGGACCCCTGGCTTCTGTCCTCCCTGCTCAGGGTCCTGCAGCGTTGCCTCTGCTCAGCC +>480|IGHV3-48 ENST00000390624|IGHV3-48|5'UTR|IG|IGH|None|00 +AGCTCTCAGAGAGGTGCCTTAGCCCTGGATTCCAAGGCATTTCCACTTGGTGATCAGCACTGAACACAGAGGACTCACC +>481|TRAV21 ENST00000390449|TRAV21|5'UTR|TR|TRA|None|00 +AGAAGGA +>482|TRDD3 ENST00000448914|TRDD3|D-REGION|TR|TRD|None|00 +ACTGGGGGATACG +>483|IGLV4-69 ENST00000390282|IGLV4-69|5'UTR|IG|IGL|None|00 +AGGGTGGGTAAGAAATACCTGCAACTGTCAGCCTCAGCAGAGCTCTGGGGAGTCTGCACC +>484|IGHD5-24 ENST00000632963|IGHD5-24|D-REGION|IG|IGH|None|00 +GTAGAGATGGCTACAATTAC +>485|TRDD1 ENST00000415118|TRDD1|D-REGION|TR|TRD|None|00 +GAAATAGT +>486|TRGJ1 ENST00000390337|TRGJ1|J-REGION|TR|TRG|None|00 +GAATTATTATAAGAAACTCTTTGGCAGTGGAACAACACTTGTTGTCACAG +>487|TRBV10-3 ENST00000631471|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCATCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>488|IGLV3-22 ENST00000390307|IGLV3-22|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGGCCACACTCCTGCTCCCACTCCTCAACCTCTACACAGGCTCTGTTGCCTCCTATGAGCTGACACAGCTACCCTCGGTGTCAGTGTCCCCAGGACAGACAGCCAGGATCACCTGCTCTGGAGATGTACTGGGGGAAAATTATGCTGACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGAGTTGGTGATATACGAAGATAGTGAGCGGTACCCTGGAATCCCTGAACGATTCTCTGGGTCCACCTCAGGGAACACGACCACCCTGACCATCAGCAGGGTCCTGACCGAAGACGAGGCTGACTATTACTGTTTGTCTGGGGATGAGGACAATCCCTCA +>489|IGHV4-39 ENST00000633618|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGACA +>490|TRBV7-8 ENST00000632560|TRBV7-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCTAGGTACAAAGTCGCAAAGAGAGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTTTTGGTACCAACAGGCCCTGGGGCAGGGGCCAGAGTTTCTGACTTATTTCCAGAATGAAGCTCAACTAGACAAATCGGGGCTGCCCAGTGATCGCTTCTTTGCAGAAAGGCCTGAGGGATCCGTCTCCACTCTGAAGATCCAGCGCACACAGCAGGAGGACTCCGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>491|TRAV20 ENST00000390448|TRAV20|5'UTR|TR|TRA|None|00 +ACAGAAGTGGCGCCTCTGAGAAAAGAAGGTTGGAATTATCGTAATTTGTTTCTAGGCTGAGATACCAGC +>492|IGHV3-53 ENST00000390627|IGHV3-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTTGGCTGAGCTGGGTTTTCCTTGTTGCTATTTCAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGACTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>493|IGHD ENST00000390556|IGHD|C-REGION|IG|IGH|D|00 +CACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTACCTGGCCATGACCCCCCTGATCCCTCAGAGCAAGGATGAGAACAGCGATGACTACACGACCTTTGATGATGTGGGCAGCCTGTGGACCACCCTGTCCACGTTTGTGGCCCTCTTCATCCTCACCCTCCTCTACAGCGGCATTGTCACTTTCATCAAGGTGAAG +>494|IGHV4-61 ENST00000390630|IGHV4-61|5'UTR|IG|IGH|None|00 +ACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>495|TRAJ27 ENST00000390510|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATGCAGGCAAATCAACCTTTGGGGATGGGACTACGCTCACTGTGAAGCCAA +>496|IGKV2-30 ENST00000468494|IGKV2-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACCGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>497|TRBV4-1 ENST00000390357|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>498|IGHV3-33 ENST00000390615|IGHV3-33|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>499|TRBV6-7 ENST00000631511|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTTATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>500|IGKV1D-12 ENST00000377032|IGKV1D-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>501|TRAV27 ENST00000390457|TRAV27|5'UTR|TR|TRA|None|00 +AAGCACTCTTCTAGCCCAGAGAAGTCTGTTCCAGGACGGGCTCTTTCAGGAGCAGCTAAAGTCAGGGGCCATGTCCACCATGTGATAGAAAGACAAG +>502|IGHA2 ENST00000390539|IGHA2|C-REGION|IG|IGH|A2|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGTAAACCCACCCACATCAATGTGTCTGTTGTCATGGCGGAGGCGGATGGCACCTGCTAC +>503|TRAV8-2 ENST00000390434|TRAV8-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGACAGCCACGTCTCTGTCTCTGAAGGAACCCCGGTGCTGCTGAGGTGCAACTACTCATCTTCTTATTCACCGTCTCTCTTCTGGTATGTGCAACACCCCAACAAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGTTGTGAGTGA +>504|TRGV1 ENST00000390348|TRGV1|5'UTR|TR|TRG|None|00 +TACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>505|TRBV18 ENST00000631559|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>506|TRDD2 ENST00000434970|TRDD2|D-REGION|TR|TRD|None|00 +CCTTCCTAC +>507|TRBV17 ENST00000619103|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACACTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>508|IGKV2-24 ENST00000484817|IGKV2-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>509|TRBV5-3 ENST00000634123|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTGTTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>510|TRAJ20 ENST00000390517|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTAACGACTACAAGCTCAGCTTTGGAGCCGGAACCACAGTAACTGTAAGAGCAA +>511|TRBV19 ENST00000632638|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTTTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>512|IGKV2D-30 ENST00000474213|IGKV2D-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACTGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>513|IGHV3-11 ENST00000634015|IGHV3-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTATAAAAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCAAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTAGTAGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>514|TRAJ54 ENST00000390484|TRAJ54|J-REGION|TR|TRA|None|00 +TAATTCAGGGAGCCCAGAAGCTGGTATTTGGCCAAGGAACCAGGCTGACTATCAACCCAA +>515|IGKV2D-29 ENST00000612356|IGKV2D-29|L-REGION+V-REGION|IG|IGK|None|00 +GATATTGTGATGACCCAGACTCCACTCTCTCTGTCCGTCACCCCTGGACAGCCGGCCTCCATCTCCTGCAAGTCTAGTCAGAGCCTCCTGCATAGTGATGGAAAGACCTATTTGTATTGGTACCTGCAGAAGCCAGGCCAGCCTCCACAGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAAGTATACAGCTTCCTCCCACA +>516|IGLV1-50 ENST00000390291|IGLV1-50|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTTCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATTGGGGCGGGTTATGTTGTACATTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCAATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGACTCCAGTCTGAGGATGAGGCTGATTATTACTGCAAAGCATGGGATAACAGCCTGAATGCT +>517|TRAJ12 ENST00000390525|TRAJ12|J-REGION|TR|TRA|None|00 +GGATGGATAGCAGCTATAAATTGATCTTCGGGAGTGGGACCAGACTGCTGGTCAGGCCTG +>518|TRAV8-6 ENST00000390443|TRAV8-6|5'UTR|TR|TRA|None|00 +GTAGCTCGTTGATGTCTGTGTGGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGGCTCCTTAAGGGAAAGCCTCTTTCTGTTTCTGAAACTTTTCAAAGCCAGGGACTTGTCCAATCCAACCTCCTCACAGTTCCTAGCTCCTGAGGCTCAGCGCCCTTGGCTTCTGTCCGCCCAGCTTAAGGTCCTGCAGCATTGCCACTGCTCAGCC +>519|IGHD3OR15-3A ENST00000604950|IGHD3OR15-3A|D-REGION|IG|IGH|None|00 +GTATTATGATTTTTGGACTGGTTATTATACC +>520|IGKV4-1 ENST00000390243|IGKV4-1|5'UTR|IG|IGK|None|00 +TTTGGCTCTTGATTTACATTGGGTACTTTCACAACCCACTGCTCATGAAATTTGCTTTTGTACTCACTGGTTGTTTTTGCATAGGCCCCTCCAGGCCACGACCAGCTGTTTGGATTTTATAAACGGGCCGTTTGCATTGTGAACTGAGCTACAACAGGCAGGCAGGGGCAGCAAG +>521|TRBV7-6 ENST00000390374|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGTCCTGACCCTGCC +>522|IGLV2-23 ENST00000390306|IGLV2-23|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACTCTCCTCACTCAGGACACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGGAGTTATAACCTTGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGGCAGTAAGCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACAATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCTGCTCATATGCAG +>523|TRAJ26 ENST00000390511|TRAJ26|J-REGION|TR|TRA|None|00 +GGGATAACTATGGTCAGAATTTTGTCTTTGGTCCCGGAACCAGATTGTCCGTGCTGCCCT +>524|TRAV30 ENST00000557168|TRAV30|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTCTCCTGAAAGTGCTTTCAGGCACCTTGTTGTGGCAGTTGACCTGGGTGAGAAGCCAACAACCAGTGCAGAGTCCTCAAGCCGTGATCCTCCGAGAAGGGGAAGATGCTGTCATCAACTGCAGTTCCTCCAAGGCTTTATATTCTGTACACTGGTACAGGCAGAAGCATGGTGAAGCACCCGTCTTCCTGATGATATTACTGAAGGGTGGAGAACAGAAGGGTCATGACAAAATATCTGCTTCATTTAATGAAAAAAAGCAGCAAAGCTCCCTGTACCTTACGGCCTCCCAGCTCAGTTACTCAGGAACCTACTTCTGCGGCACAGAGA +>525|TRAV19 ENST00000390447|TRAV19|5'UTR|TR|TRA|None|00 +CAGAAGCCTCACACAGCCCAGTAACTTTGCTAGTACCTCTTGAGTGCAAGGTGGAGAATTAAGATCTGGATTTGAGACGGAGCACGGAACATTTCACTCAGGGGAAGAGCTATGAAC +>526|TRDJ3 ENST00000390476|TRDJ3|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTCGGAACTGGCATCAAACTCTTCGTGGAGCCCC +>527|IGHV3-33 ENST00000390615|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCGTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATGGTATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>528|IGLV1-51 ENST00000390290|IGLV1-51|5'UTR|IG|IGL|None|00 +TGAGCGCAGAAGGCAGGACTCGGGACAATCTTCATC +>529|TRBV6-5 ENST00000390368|TRBV6-5|5'UTR|TR|TRB|None|00 +GAGAGTCCTGCTCCCCTTTCATCAATGCACAGATACAGAAGACCCCTCCGTCATGCAGCATCTGCC +>530|IGLV2-14 ENST00000390312|IGLV2-14|5'UTR|IG|IGL|None|00 +GCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACATCTCCACC +>531|TRGV1 ENST00000390348|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGATATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCTGACTGGGTCATCTGCTGAAATCACCTGTGATCTTCCTGGAGCAAGTACCTTATACATCCACTGGTACCTGCACCAGGAGGGGAAGGCCCCACAGTGTCTTCTGTACTATGAACCCTACTACTCCAGGGTTGTGCTGGAATCAGGAATCACTCCAGGAAAGTATGACACTGGAAGCACAAGGAGCAATTGGAATTTGAGACTGCAAAATCTAATTAAAAATGATTCTGGGTTCTATTACTGTGCCACCTGGGACAGG +>532|IGHV3OR16-10 ENST00000425181|IGHV3OR16-10|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGCTATATTAAAAGGTGTCCAGTGTGAGGTTCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACATCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGGCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTTCGCCAGGCTCCAGGAAAAGGTCTGGAGTGGGTATCAGCTATTGGTACTGGTGGTGGCACATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACATGGCTGTGTATTACTGTGCAAGAGA +>533|TRBV5-8 ENST00000631639|TRBV5-8|5'UTR|TR|TRB|None|00 +TGGCCACTGAGGAAAGGGAAGAGAATGTTGCCTGGGACAGGAAAATATAGAAAATGAAGGCCCAGAACTCACTCGGCTCTTCCCCAGGAAGACCAAGCCCTGAATCAGGTGCAGTGCCGCCTGGCCCACTGTGCC +>534|TRBV7-6 ENST00000633265|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGGCCTGACCCTGCC +>535|TRAV22 ENST00000390450|TRAV22|5'UTR|TR|TRA|None|00 +GGCTTTGTCGGGTGGAGCTGATTGGTTGCAGGAGCAGCAACAGTTCCAGAGCCAAGTCATGACACCGACCTCCCCAAGGTTTAGTTAAATATATCTTATGGTGAAAATGCCCGGAGCAAGAAGGCAAAGCATC +>536|TRAJ1 ENST00000390536|TRAJ1|J-REGION|TR|TRA|None|00 +GTATGAAAGTATTACCTCCCAGTTGCAATTTGGCAAAGGAACCAGAGTTTCCACTTCTCCCC +>537|IGKV2D-29 ENST00000491977|IGKV2D-29|5'UTR|IG|IGK|None|00 +GATCAGGACTTCTCAGTTCATCTTCTCACC +>538|TRBV11-3 ENST00000634111|TRBV11-3|5'UTR|TR|TRB|None|00 +AGTGACCCTGATCTGGCAAAGCTTCCATCCTGCCCTGACCCTGCC +>539|TRAV38-2DV8 ENST00000390465|TRAV38-2DV8|5'UTR|TR|TRA|None|00 +AGATCAGAAGAGGAGGCTTCTCACCCTGCAGCAGGGACCTGTGAGC +>540|TRAV27 ENST00000390457|TRAV27|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTCCTGAAATTCTCCGTGTCCATTCTTTGGATTCAGTTGGCATGGGTGAGCACCCAGCTGCTGGAGCAGAGCCCTCAGTTTCTAAGCATCCAAGAGGGAGAAAATCTCACTGTGTACTGCAACTCCTCAAGTGTTTTTTCCAGCTTACAATGGTACAGACAGGAGCCTGGGGAAGGTCCTGTCCTCCTGGTGACAGTAGTTACGGGTGGAGAAGTGAAGAAGCTGAAGAGACTAACCTTTCAGTTTGGTGATGCAAGAAAGGACAGTTCTCTCCACATCACTGCAGCCCAGACTGGTGATACAGGCCTCTACCTCTGTGCAGGAG +>541|IGKV1-16 ENST00000479981|IGKV1-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>542|TRBV15 ENST00000631835|TRBV15|5'UTR|TR|TRB|None|00 +ACTCCCACCTCTCAACCCAGGAATCAGAGCCTGAGACAGACAGATGCTTCATTCCTGTATGGGGTGGTATTCCTGCC +>543|TRBV10-1 ENST00000390364|TRBV10-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACGAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGAAATCACCCAGAGCCCAAGACACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGGCGTGTCACCAGACTTGGAACCACAACAATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCCATTACTCATATGGTGTTCACGACACTAACAAAGGAGAAGTCTCAGATGGCTACAGTGTCTCTAGATCAAACACAGAGGACCTCCCCCTCACTCTGGAGTCTGCTGCCTCCTCCCAGACATCTGTATATTTCTGCGCCAGCAGTGAGTC +>544|TRBV6-8 ENST00000632425|TRBV6-8|5'UTR|TR|TRB|None|00 +GAGAGTCCTGTTCCCCTTTTATCAATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>545|IGLV7-46 ENST00000390295|IGLV7-46|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCCCAGGCTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGGCTCCAGCACTGGAGCTGTCACCAGTGGTCATTATCCCTACTGGTTCCAGCAGAAGCCTGGCCAAGCCCCCAGGACACTGATTTATGATACAAGCAACAAACACTCCTGGACACCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACCCTTTTGGGTGCGCAGCCTGAGGATGAGGCTGAGTATTACTGCTTGCTCTCCTATAGTGGTGCTCGG +>546|TRAJ25 ENST00000390512|TRAJ25|J-REGION|TR|TRA|None|00 +CAGAAGGACAAGGCTTCTCCTTTATCTTTGGGAAGGGGACAAGGCTGCTTGTCAAGCCAA +>547|IGKV1-5 ENST00000496168|IGKV1-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAAATGTGACATCCAGATGACCCAGTCTCCTTCCACCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGAGTATTAGTAGCTGGTTGGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATAAGGCGTCTAGTTTAGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACCATCAGCAGCCTGCAGCCTGATGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTATTCT +>548|TRBJ2-7 ENST00000390419|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACTTCGGGCCGGGCACCAGGCTCACGGTCACAG +>549|TRBV25-1 ENST00000610439|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>550|TRAV38-1 ENST00000390464|TRAV38-1|5'UTR|TR|TRA|None|00 +AGC +>551|IGLV5-45 ENST00000626489|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>552|TRAJ6 ENST00000390531|TRAJ6|J-REGION|TR|TRA|None|00 +TGCATCAGGAGGAAGCTACATACCTACATTTGGAAGAGGAACCAGCCTTATTGTTCATCCGT +>553|TRAJ46 ENST00000390491|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAGAAAAGCAGCGGAGACAAGCTGACTTTTGGGACCGGGACTCGTTTAGCAGTTAGGCCCA +>554|IGHG2 ENST00000621803|IGHG2|C-REGION|IG|IGH|G2|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAATGA +>555|IGLC3 ENST00000390325|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAAAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>556|TRAV8-4 ENST00000390438|TRAV8-4|5'UTR|TR|TRA|None|00 +TTTTGAAACCCTTCAAAGGCAGAGACTTGTCCAGCCTAACCTGCCTGCTGCTCCTAGCTCCTGAGGCTCAGGGCCCTTGGCTTCTGTCCGCTCTGCTCAGGGCCCTCCAGCGTGGCCACTGCTCAGCC +>557|IGHV3-15 ENST00000632959|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACAGA +>558|TRAJ7 ENST00000390530|TRAJ7|J-REGION|TR|TRA|None|00 +TGACTATGGGAACAACAGACTCGCTTTTGGGAAGGGGAACCAAGTGGTGGTCATACCAA +>559|TRBV4-2 ENST00000390392|TRBV4-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGGCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAACTTTAAAGAACAGACTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGTGCCAGCAGCCAAGA +>560|TRBV6-7 ENST00000390373|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTGATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>561|IGKV3OR2-268 ENST00000421835|IGKV3OR2-268|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCACAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>562|TRBJ2-4 ENST00000390416|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGCCAAAAACATTCAGTACTTCGGCGCCGGGACCCGGCTCTCAGTGCTGG +>563|IGHV3-16 ENST00000631755|IGHV3-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGCCCGCAAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGTGGACTCCGTGAAGCGCCGATTCATCATCTCCAGAGACAATTCCAGGAACTCCCTGTATCTGCAAAAGAACAGACGGAGAGCCGAGGACATGGCTGTGTATTACTGTGTGAGA +>564|TRAV35 TENX_TRAV35|TRAV35|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTTGAACATTTATTAATAATCTTGTGGATGCAGCTGACATGGGTCAGTGGTCAACAGCTGAATCAGAGTCCTCAATCTATGTTTACCCAGGAAGGAGAAGATGTCTCCATGAACTGCACTTCTTCAAGCATATTTAACACCTGACTATGGTACAAGCAGGACCCTGGGGAAGGTCCTGTCCTCTTGATAGCCTTATATAAGGCTGGTGAATTGACCTCAAATGGAAGACTGACTGCTCAGTTTGGTATAACCAGAAAGGACAGCTTCCTGAATATCTCAGCATCCATACCTAGTGATGTAGGCATCTACTTCTGTGCTGGGCAG +>565|TRBV12-5 ENST00000621184|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>566|TRAV12-3 ENST00000390442|TRAV12-3|5'UTR|TR|TRA|None|00 +ATTATTTTTTTTTCGTGTTTAAGGTTTGAATCCTCAGTGAACCAGGGCAGAAAAGA +>567|IGHV4-31 ENST00000438142|IGHV4-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>568|IGLV7-46 ENST00000390295|IGLV7-46|5'UTR|IG|IGL|None|00 +TCTGGCACCAGGGGTCCCTTCCAATATCAGCACC +>569|TRAC ENST00000636320|TRAC|C-REGION|TR|TRA|None|00 +GGAGGAGGAAACAAACTCACCTTTGGGACAGGCACTCAGCTAAAAGTGGAACTCAATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>570|IGHV3-72 ENST00000433072|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGA +>571|TRAV38-2DV8 ENST00000390465|TRAV38-2DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCATGCCCTGGCTTCCTGTGGGCACTTGTGATCTCCACCTGTCTTGAATTTAGCATGGCTCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACCGTGACCCTGAGCTGCACATATGACACCAGTGAGAGTGATTATTATTTATTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACAGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGATGCCGCGATGTATTTCTGTGCTTATAGGAGCG +>572|IGLV11-55 ENST00000390286|IGLV11-55|5'UTR|IG|IGL|None|00 +GCTGTGTCCACT +>573|IGKV1-16 ENST00000479981|IGKV1-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGAGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAAGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>574|TRBV12-5 ENST00000621184|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGCACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>575|TRGV3 ENST00000390346|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCAGACTGGGTCATCTGCTGAAATCACTTGCGATCTTACTGTAACAAATACCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCACCGCAAGGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGAGACTGCAAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>576|IGLC7 ENST00000390331|IGLC7|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCGTAAGTGACTTCAACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGTGGGAGTGGAGACCACCAAACCCTCCAAACAAAGCAACAACAAGTATGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCGGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTGCAGAATGCTCT +>577|IGLV3-21 ENST00000390308|IGLV3-21|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGTTCTCCTCCTCGGCCTCCTCTCTCACTGCACAGGCTCTGTGACCTCCTATGTGCTGACTCAGCCACCCTCGGTGTCAGTGGCCCCAGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAGTGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCGTCTATGATGATAGCGACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACGGCCACCCTGACCATCAGCAGGGTCGAAGCCGGGGATGAGGCCGACTATTACTGTCAGGTGTGGGATAGTAGTAGTGATCATCCCACG +>578|IGHV3-43 ENST00000434710|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGAT +>579|IGKV1D-8 ENST00000628219|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGTCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGTTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>580|TRAV1-2 ENST00000390423|TRAV1-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGTTTTCCTTCTTTATGTTTCCATGAAGATGGGAGGCACTACAGGACAAAACATTGACCAGCCCACTGAGATGACAGCTACGGAAGGTGCCATTGTCCAGATCAACTGCACGTACCAGACATCTGGGTTCAACGGGCTGTTCTGGTACCAGCAACATGCTGGCGAAGCACCTACATTTCTGTCTTACAATGTTCTGGATGGTTTGGAGGAGAAAGGTCGTTTTTCTTCATTCCTTAGTCGGTCTAAAGGGTACAGTTACCTCCTTTTGAAGGAGCTCCAGATGAAAGACTCTGCCTCTTACCTCTGTGCT +>581|IGKV1-9 ENST00000633273|IGKV1-9|5'UTR|IG|IGK|None|00 +AGACTTCTTAATAGGCTGGTCACACCTGTGCAGGAGTCAGTCCCAGTCAGGACACAGC +>582|IGKV1D-16 ENST00000492446|IGKV1D-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGAGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>583|IGKV2-28 ENST00000482769|IGKV2-28|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>584|TRGV9 ENST00000444775|TRGV9|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTCACTGCTCCACACATCAACGCTGGCAGTCCTTGGGGCTCTGTGTGTATATGGTGCAGGTCACCTAGAGCAACCTCAAATTTCCAGTACTAAAACGCTGTCAAAAACAGCCCGCCTGGAATGTGTGGTGTCTGGAATAACAATTTCTGCAACATCTGTATATTGGTATCGAGAGAGACCTGGTGAAGTCATACAGTTCCTGGTGTCCATTTCATATGACGGCACTGTCAGAAAGGAATCCGGCATTCCGTCAGGCAAATTTGAGGTGGATAGGATACCTGAAACGTCTACATCCACTCTCACCATTCACAATGTAGAGAAACAGGACATAGCTACCTACTACTGTGCCTTGTGGGAGGTG +>585|TRGC1 ENST00000443402|TRGC1|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCAATTGCTGAAACAAAGCTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCTGATGTTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAAAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAGTTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCATCACAATGGATCCCAAAGACAATTGTTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACATGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>586|TRAC ENST00000616778|TRAC|C-REGION|TR|TRA|None|00 +GGAAGCTACATACCTACATTTGGAAGAGGAACCAGCCTTATTGTTCATCCGTATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>587|IGKV6D-41 ENST00000390271|IGKV6D-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCCCGTTGCAATTCCTGCGGCTTCTGCTCCTCTGGGTTCCAGCCTCCAGGGGTGATGTTGTGATGACACAGTCTCCAGCTTTCCTCTCTGTGACTCCAGGGGAGAAAGTCACCATCACCTGCCAGGCCAGTGAAGGCATTGGCAACTACTTATACTGGTACCAGCAGAAACCAGATCAAGCCCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCTTTACCATCAGTAGCCTGGAAGCTGAAGATGCTGCAACATATTACTGTCAGCAGGGCAATAAGCACCCT +>588|TRBJ2-1 ENST00000631600|TRBJ2-1|J-REGION|TR|TRB|None|00 +CTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAG +>589|TRAV8-6 ENST00000390443|TRAV8-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGCGTTCCAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCTGTGACCCAGCTTGACAGCCAAGTCCCTGTCTTTGAAGAAGCCCCTGTGGAGCTGAGGTGCAACTACTCATCGTCTGTTTCAGTGTATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTATTTATCAGGATCCACCCTGGTTGAAAGCATCAACGGTTTTGAGGCTGAATTTAACAAGAGTCAAACTTCCTTCCACTTGAGGAAACCCTCAGTCCATATAAGCGACACGGCTGAGTACTTCTGTGCTGTGAGTGA +>590|IGHM ENST00000622287|IGHM|C-REGION|IG|IGH|M|00 +AGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTACTGA +>591|TRAV12-3 ENST00000390442|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGGATCCTGGACCACTCAGTGTTCCAGAGGGAGCCATTGTTTCTCTCAACTGCACTTACAGCAACAGTGCTTTTCAATACTTCATGTGGTACAGACAGTATTCCAGAAAAGGCCCTGAGTTGCTGATGTACACATACTCCAGTGGTAACAAAGAAGATGGAAGGTTTACAGCACAGGTCGATAAATCCAGCAAGTATATCTCCTTGTTCATCAGAGACTCACAGCCCAGTGATTCAGCCACCTACCTCTGTGCAATGAGCG +>592|TRBJ1-2 ENST00000631745|TRBJ1-2|J-REGION|TR|TRB|None|00 +CTAACTATGGCTACACCTTCGGTTCGGGGACCAGGTTAACCGTTGTAG +>593|IGLV5-52 ENST00000390289|IGLV5-52|5'UTR|IG|IGL|None|00 +CCACC +>594|IGKV1-27 ENST00000498435|IGKV1-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGACTCCTGCTGCTCTGGCTCCCAGATACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTATCAGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAATCAGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCAAAAGTATAACAGTGCCCCT +>595|IGHD6-13 ENST00000632859|IGHD6-13|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCAGCTGGTAC +>596|IGHV6-1 ENST00000390593|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>597|TRBV5-1 ENST00000633384|TRBV5-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTGCTCTGTTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTAAAGGCTGGAGTCACTCAAACTCCAAGATATCTGATCAAAACGAGAGGACAGCAAGTGACACTGAGCTGCTCCCCTATCTCTGGGCATAGGAGTGTATCCTGGTACCAACAGACCCCAGGACAGGGCCTTCAGTTCCTCTTTGAATACTTCAGTGAGACACAGAGAAACAAAGGAAACTTCCCTGGTCGATTCTCAGGGCGCCAGTTCTCTAACTCTCGCTCTGAGATGAATGTGAGCACCTTGGAGCTGGGGGACTCGGCCCTTTATCTTTGCGCCAGCAGCTTGG +>598|TRAV24 ENST00000390453|TRAV24|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGAATCCTTTGGCAGCCCCATTACTAATCCTCTGGTTTCATCTTGACTGCGTGAGCAGCATACTGAACGTGGAACAAAGTCCTCAGTCACTGCATGTTCAGGAGGGAGACAGCACCAATTTCACCTGCAGCTTCCCTTCCAGCAATTTTTATGCCTTACACTGGTACAGATGGGAAACTGCAAAAAGCCCCGAGGCCTTGTTTGTAATGACTTTAAATGGGGATGAAAAGAAGAAAGGACGAATAAGTGCCACTCTTAATACCAAGGAGGGTTACAGCTATTTGTACATCAAAGGATCCCAGCCTGAAGACTCAGCCACATACCTCTGTGCCTTTA +>599|IGLV3-9 ENST00000390316|IGLV3-9|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGCTCTCCTTCTGAGCCTCCTTGCTCACTTTACAGGTTCTGTGGCCTCCTATGAGCTGACTCAGCCACTCTCAGTGTCAGTGGCCCTGGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAATGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCATCTATAGGGATAGCAACCGGCCCTCTGGGATCCCTGAGCGATTCTCTGGCTCCAACTCGGGGAACACGGCCACCCTGACCATCAGCAGAGCCCAAGCCGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGCAGCACTGCACACA +>600|IGHV3-72 ENST00000621503|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +GAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGAGAC +>601|TRAV3 ENST00000390425|TRAV3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCTCTGCACCCATCTCGATGCTTGCGATGCTCTTCACATTGAGTGGGCTGAGAGCTCAGTCAGTGGCTCAGCCGGAAGATCAGGTCAACGTTGCTGAAGGGAATCCTCTGACTGTGAAATGCACCTATTCAGTCTCTGGAAACCCTTATCTTTTTTGGTATGTTCAATACCCCAACCGAGGCCTCCAGTTCCTTCTGAAATACATCACAGGGGATAACCTGGTTAAAGGCAGCTATGGCTTTGAAGCTGAATTTAACAAGAGCCAAACCTCCTTCCACCTGAAGAAACCATCTGCCCTTGTGAGCGACTCCGCTTTGTACTTCTGTGCTGTGAGAGACA +>602|IGHV2-70 ENST00000632173|IGHV2-70|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCCCCACC +>603|IGHV3-74 ENST00000424969|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>604|TRBV17 ENST00000631663|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACGCTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>605|IGHV2-26 ENST00000632457|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATAC +>606|TRBV9 ENST00000390363|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>607|TRGJP1 ENST00000390339|TRGJP1|J-REGION|TR|TRG|None|00 +ATACCACTGGTTGGTTCAAGATATTTGCTGAAGGGACTAAGCTCATAGTAACTTCACCTG +>608|IGHV3-11 ENST00000634015|IGHV3-11|5'UTR|IG|IGH|None|00 +CTCCCTCTGCTGATAAAAACCAGCCGAGCCCAGACCCTGCAGCTCTGGGAGAAGAGCCCCAGCCCCAGAATTCCCAGGAGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>609|IGHV3-73 ENST00000390636|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGA +>610|IGKV1D-13 ENST00000611391|IGKV1D-13|5'UTR|IG|IGK|None|00 +GAGTCAGACCCACTCAGGACACAGC +>611|IGHV7-81 ENST00000390639|IGHV7-81|5'UTR|IG|IGH|None|00 +ACCCAACAACAACATCCCTCCTTGGGAGAATCCCCTAGAGCACAGCTCCTCACC +>612|IGHD6-19 ENST00000390574|IGHD6-19|D-REGION|IG|IGH|None|00 +GGGTATAGCAGTGGCTGGTAC +>613|TRGV8 ENST00000390343|TRGV8|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTTGGCTCTAGCTCTGCTTCTAGCTTTCCTGCCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACAAAGTCAGTCACCAGGCCAACTGGGTCATCAGCTGTAATCACTTGTGATCTTCCTGTAGAAAATGCCGTCTACACCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACAACTCCAGGGTTGTGTTGGAATCAGGAATCAGTCGAGAAAAGTATCATACTTATGCAAGCACAGGGAAGAGCCTTAAATTTATACTGGAAAATCTAATTGAACGTGACTCTGGGGTCTATTACTGTGCCACCTGGGATAGG +>614|TRBV13 ENST00000633796|TRBV13|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTTAGTCCTGACCTGCCTGACTCTGCCTGGAACACCAGGCTCCTCTGCCGTGTCATGCTTTGTCTCCTGGGAGCAGGTTCAGTGGCTGCTGGAGTCATCCAGTCCCCAAGACATCTGATCAAAGAAAAGAGGGAAACAGCCACTCTGAAATGCTATCCTATCCCTAGACACGACACTGTCTACTGGTACCAGCAGGGTCCAGGTCAGGACCCCCAGTTCCTCATTTCGTTTTATGAAAAGATGCAGAGCGATAAAGGAAGCATCCCTGATCGATTCTCAGCTCAACAGTTCAGTGACTATCATTCTGAACTGAACATGAGCTCCTTGGAGCTGGGGGACTCAGCCCTGTACTTCTGTGCCAGCAGCTTAGG +>615|TRBJ2-2P ENST00000633209|TRBJ2-2P|J-REGION|TR|TRB|None|00 +CTGAGAGGCGCTGCTGGGCGTCTGGGCGGAGGACTCCTGGTTCTGG +>616|TRDV3 ENST00000535880|TRDV3|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTACTGTGGGCTTTAGCTTTTTGTTTTTCTACAGGGGCACGCTGTGTGACAAAGTAACCCAGAGTTCCCCGGACCAGACGGTGGCGAGTGGCAGTGAGGTGGTACTGCTCTGCACTTACGACACTGTATATTCAAATCCAGATTTATTCTGGTACCGGATAAGGCCAGATTATTCCTTTCAGTTTGTCTTTTATGGGGATAACAGCAGATCAGAAGGTGCAGATTTTACTCAAGGACGGTTTTCTGTGAAACACATTCTGACCCAGAAAGCCTTTCACTTGGTGATCTCTCCAGTAAGGACTGAAGACAGTGCCACTTACTACTGTGCCTTTAG +>617|IGLV5-37 ENST00000628968|IGLV5-37|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTTCTTCTCTTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCCTCCTCCGCATCTCCTGGAGAATCCGCCAGACTCACCTGCACCTTGCCCAGTGACATCAATGTTGGTAGCTACAACATATACTGGTACCAGCAGAAGCCAGGGAGCCCTCCCAGGTATCTCCTGTACTACTACTCAGACTCAGATAAGGGCCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAGCCAATACAGGGATTTTACTCATCTCCGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCCAAGCAATGCTTCT +>618|IGLV2-23 ENST00000390306|IGLV2-23|5'UTR|IG|IGL|None|00 +TCTCTGAGCCCAGGCCCACGTGAGGGTGGGGTGAGGAGAGGAGCCCAGGATGCTGATTTTCATGGAGGCCCCGCCCTCCTCTGAGGCAAAGGGGATAAGACAGGGCTGGGGCAGGGCCAGTGCTGGGGTCACAAGAGGCAGCGCTCTCGGGACGTCTCCACC +>619|TRBC2 ENST00000637077|TRBC2|C-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGCAGCCCCTTCCCACTGTGCTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAGAGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGGTGAGTGGGGCTTGTCAACAGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCC +>620|TRGV10 ENST00000390341|TRGV10|5'UTR|TR|TRG|None|00 +ACTTTCCTGCCTTCTCCTTGGGTACACCGCCCCGAAGACAGGATGTCACTGCTGGAAGCATTTGCCTTCTCCTCCTGGGCTCCTGAGTTGCTGTCCGAACATTTCAGTCTAGCTGCGTGACCAAAATCATTCTTCAATGTTTCCCTCTTCTACTGTCAG +>621|TRAV1-1 ENST00000542354|TRAV1-1|5'UTR|TR|TRA|None|00 +CTTCTGCAGACTACAGTGGCTCAGGAACCGGGGATGCAGTGCCAGGCTCATGGTATCCTGCAGCAG +>622|TRGV3 ENST00000390346|TRGV3|5'UTR|TR|TRG|None|00 +CTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGTCTCAGGAAACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCGTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>623|IGHV4-28 ENST00000632719|IGHV4-28|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCTGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>624|IGLV2-14 ENST00000390312|IGLV2-14|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTCATATACAAGCAGCAGCACTCTCCACAGTG +>625|IGHJ3 ENST00000633896|IGHJ3|J-REGION|IG|IGH|None|00 +TGATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>626|TRBV5-4 ENST00000454561|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGAGACTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>627|IGHV4-34 ENST00000390616|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGA +>628|IGHA1 ENST00000633714|IGHA1|C-REGION|IG|IGH|A1|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTACTGA +>629|IGHV3-33 ENST00000631807|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGCAATAAATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>630|TRDV2 ENST00000390469|TRDV2|L-REGION+V-REGION|TR|TRD|None|00 +ATGCAGAGGATCTCCTCCCTCATCCATCTCTCTCTCTTCTGGGCAGGAGTCATGTCAGCCATTGAGTTGGTGCCTGAACACCAAACAGTGCCTGTGTCAATAGGGGTCCCTGCCACCCTCAGGTGCTCCATGAAAGGAGAAGCGATCGGTAACTACTATATCAACTGGTACAGGAAGACCCAAGGTAACACAATGACTTTCATATACCGAGAAAAGGACATCTATGGCCCTGGTTTCAAAGACAATTTCCAAGGTGACATTGATATTGCAAAGAACCTGGCTGTACTTAAGATACTTGCACCATCAGAGAGAGATGAAGGGTCTTACTACTGTGCCTGTGACACC +>631|TRGC2 ENST00000436911|TRGC2|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCGATTGCTGAAACAAAACTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCAGATATTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAGAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAATTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCACCACAGTGGATCCCAAATACAATTATTCAAAGGATGCAAATGATGTCATCACAATGGATCCCAAAGACAATTGGTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACACGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>632|IGKV1D-13 ENST00000611391|IGKV1D-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTTCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGCAGTGCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGATGCCTCCAGTTTGGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTTTAATAGTTACCCT +>633|IGKV3D-15 ENST00000417279|IGKV3D-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCATCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCATCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCTCC +>634|IGHD3OR15-3B ENST00000603935|IGHD3OR15-3B|D-REGION|IG|IGH|None|00 +GTATTATGATTTTTGGACTGGTTATTATACC +>635|TRAJ15 TENX_TRAJ15|TRAJ15|J-REGION|TR|TRA|None|00 +CCAACCAGGCAGGAACTGCTCTGATCTTTGGGAAGGGAACCACCTTATCAGTGAGTTCCA +>636|TRAV12-1 ENST00000390433|TRAV12-1|5'UTR|TR|TRA|None|00 +ATG +>637|IGHG2 ENST00000390545|IGHG2|C-REGION|IG|IGH|G2|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>638|IGKV1D-17 ENST00000483379|IGKV1D-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTAACATCCAGATGACCCAGTCTCCATCTGCCATGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGGCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGTCCCTAAGCACCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>639|TRDV3 ENST00000535880|TRDV3|5'UTR|TR|TRD|None|00 +TCTTTCATTAGAACCGTCAGATAGTCTCTGAGATCTTAGGAACCCTGTTTTGTTGTATATCCTCTGCCCTGATATGAAGAAAAG +>640|TRAJ24 ENST00000390513|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGACAGCTGGGGGAAATTCCAGTTTGGAGCAGGGACCCAGGTTGTGGTCACCCCAG +>641|IGKJ4 ENST00000390239|IGKJ4|J-REGION|IG|IGK|None|00 +CTCACTTTCGGCGGAGGGACCAAGGTGGAGATCAAAC +>642|IGHV3OR15-7 ENST00000558565|IGHV3OR15-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGTTCTCTGAGACTCTCATGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGAGCTGGGTCCGCCAGGCTCAAGGGAAAGGGCTAGAGTTGGTAGGTTTAATAAGAAACAAAGCTAACAGTTACACGACAGAATATGCTGCGTCTGTGAAAGGCAGACTTACCATCTCAAGAGAGGATTCAAAGAACACGCTGTATCTGCAAATGAGCAACCTGAAAACCGAGGACTTGGCCGTGTATTACTGTGCTAGAGA +>643|TRBV7-2 ENST00000634605|TRBV7-2|5'UTR|TR|TRB|None|00 +ACAGTGATCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>644|IGLV1-47 ENST00000390294|IGLV1-47|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCGGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATTATGTATACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCGGTCCGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAGTGGT +>645|IGHV1-69 ENST00000632882|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>646|IGLV2-11 ENST00000390314|IGLV2-11|5'UTR|IG|IGL|None|00 +TGCTGGGGTCTCAGGAGGCAGCACTCTCGGGACGTCTCCACC +>647|TRBV7-6 ENST00000633265|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCGTCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>648|TRAV10 ENST00000390432|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCATCTGACGACCTTCTTGGTGATTTTGTGGCTTTATTTTTATAGGGGGAATGGCAAAAACCAAGTGGAGCAGAGTCCTCAGTCCCTGATCATCCTGGAGGGAAAGAACTGCACTCTTCAATGCAATTATACAGTGAGCCCCTTCAGCAACTTAAGGTGGTATAAGCAAGATACGGGGAGAGGTCCTGTTTCCCTGACAATCATGACTTTCAGTGAGAACACAAAGTCGAACGGAAGATATACAGCAACTCTGGATGCAGACACAAAGCAAAGCTCTCTGCACATCACAGCCTCCCAGCTCAGCGATTCAGCCTCCTACATCTGTGTGGTGAGCG +>649|IGHG3 ENST00000632774|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGGTAAATGA +>650|TRAV36DV7 ENST00000390463|TRAV36DV7|5'UTR|TR|TRA|None|00 +ACTTGATAACTGAAGG +>651|TRBV18 ENST00000631559|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGAGTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>652|TRBV12-3 ENST00000633292|TRBV12-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCTTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCGAAGCATACAGATGCTGGAGTTATCCAGTCACCCCGCCATGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGCCACAACTCCCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>653|TRAV39 ENST00000390466|TRAV39|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAAGCTACTAGCAATGATTCTGTGGCTTCAACTAGACCGGTTAAGTGGAGAGCTGAAAGTGGAACAAAACCCTCTGTTCCTGAGCATGCAGGAGGGAAAAAACTATACCATCTACTGCAATTATTCAACCACTTCAGACAGACTGTATTGGTACAGGCAGGATCCTGGGAAAAGTCTGGAATCTCTGTTTGTGTTGCTATCAAATGGAGCAGTGAAGCAGGAGGGACGATTAATGGCCTCACTTGATACCAAAGCCCGTCTCAGCACCCTCCACATCACAGCTGCCGTGCATGACCTCTCTGCCACCTACTTCTGTGCCGTGGACA +>654|IGLJ3 ENST00000390324|IGLJ3|J-REGION|IG|IGL|None|00 +ATGAGCAGATGCCACCAGGACCACTGGTCCCAGCTTCCTCCTTCACAGCTGCAGTGGGGGCTGGGGCTAGGGGCATCCCAGGGAGGGTTTTTGTATGAGCCTGTGTCACAGTGTTGGGTGTTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>655|IGLV3-10 ENST00000390315|IGLV3-10|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTGCTCCCCCTCCTCACTTTCTGCACAGTCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAAACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGTCAGGCCAGGCCCCTGTGCTGGTCATCTATGAGGACAGCAAACGACCCTCCGGGATCCCTGAGAGATTCTCTGGCTCCAGCTCAGGGACAATGGCCACCTTGACTATCAGTGGGGCCCAGGTGGAGGATGAAGCTGACTACTACTGTTACTCAACAGACAGCAGTGGTAATCATAGCACA +>656|IGHV3-74 ENST00000633987|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>657|IGHV3-66 ENST00000390632|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGA +>658|IGLV2-8 ENST00000620395|IGLV2-8|5'UTR|IG|IGL|None|00 +TCTCTAAGCCCAGGCCCAAGTGAGGGTGGGGTGAGAAGAGGAGCTCAGG +>659|IGKV2D-24 ENST00000462693|IGKV2D-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>660|IGHD5OR15-5A ENST00000604642|IGHD5OR15-5A|D-REGION|IG|IGH|None|00 +GTGGATATAGTGTCTACGATTAC +>661|IGKV2D-28 ENST00000558026|IGKV2D-28|L-REGION+V-REGION|IG|IGK|None|00 +GATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCTCCCACA +>662|TRAV17 ENST00000390445|TRAV17|5'UTR|TR|TRA|None|00 +AGGACTGAGCTTGCCTGTGACTGGCTAGGGAGGAACCTGAGACTAGGGGACAGAAAGACTAGGGATTCACCCAGTAAAGAGAGCTCATCTGTGACTGAGGAGCCTTGCTCCATTTCAGGTCTTCTGTGATTTCAATAAGGAAGAAGA +>663|IGKV3D-11 ENST00000390277|IGKV3D-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGCCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCATCC +>664|IGHD ENST00000613640|IGHD|C-REGION|IG|IGH|D|00 +GCACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTATGTAACAGACCATGGCCCCATGAAA +>665|IGKV2D-26 ENST00000390268|IGKV2D-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCTTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGCAGAGATTGTGATGACCCAGACTCCACTCTCCTTGTCTATCACCCCTGGAGAGCAGGCCTCCATGTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTGATGGATACACCTATTTGTATTGGTTTCTGCAGAAAGCCAGGCCAGTCTCCACGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATTTTGGAGTTTATTACTGCATGCAAGATGCACAAGATCCT +>666|IGHJ2 ENST00000632178|IGHJ2|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>667|IGLV4-3 ENST00000390318|IGLV4-3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGTCTCCTTCTACCTACTGCCCTTCATTTTCTCCACAGGTCTCTGTGCTCTGCCTGTGCTGACTCAGCCCCCGTCTGCATCTGCCTTGCTGGGAGCCTCGATCAAGCTCACCTGCACCCTAAGCAGTGAGCACAGCACCTACACCATCGAATGGTATCAACAGAGACCAGGGAGGTCCCCCCAGTATATAATGAAGGTTAAGAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCCGATCGCTTCATGGGCTCCAGTTCTGGGGCTGACCGCTACCTCACCTTCTCCAACCTCCAGTCTGACGATGAGGCTGAGTATCACTGTGGAGAGAGCCACACGATTGATGGCCAAGTCGGT +>668|TRBV2 ENST00000455382|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCGCTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>669|TRAV21 ENST00000390449|TRAV21|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACCCTCTTGGGCCTGCTTATCCTTTGGCTGCAGCTGCAATGGGTGAGCAGCAAACAGGAGGTGACGCAGATTCCTGCAGCTCTGAGTGTCCCAGAAGGAGAAAACTTGGTTCTCAACTGCAGTTTCACTGATAGCGCTATTTACAACCTCCAGTGGTTTAGGCAGGACCCTGGGAAAGGTCTCACATCTCTGTTGCTTATTCAGTCAAGTCAGAGAGAGCAAACAAGTGGAAGACTTAATGCCTCGCTGGATAAATCATCAGGACGTAGTACTTTATACATTGCAGCTTCTCAGCCTGGTGACTCAGCCACCTACCTCTGTGCTGTGAGG +>670|TRGV9 ENST00000444775|TRGV9|5'UTR|TR|TRG|None|00 +AAAAAAATTCAAGTCAATCCATAGAAGTGGGTCGTGGAATTCCAGGCAGAAAGTGACTAAATGAAGATGGAAGGACAGGGAGGGGGTGGCCACATCACAGAGAACCTCTTATCCTAAGAACTCTGGACTTCATCTTCAGAGGCAAGGTAGAGAGAGCAAGGACTTTAGAGCAGGAAAAGGACCAGGTCAGTCTAGTGGCCATGGGGAAGGTGGGTGGGAGGGGCCGAGATGGGATGTATGGAGGTGCGTGAGGTGGAGGCAGTGGTGAGCCAGGAAATGTTTAGGACGTAGAATCCTCAGGAATTAGAGTGCGGTGAATTAGAGGGGAGAATTGAGGCTGATGCTCAAGCTCCTGGCTTGGGCAATGTGGGTAGTTATGTCATACAGGGAACTCGGAAGAAGATATGGTTTGGGGGAAGGGAATGAGTTCACTCTGGCTATGAGCAGACTTTGTTTGAGATCCCATGTCAGACGTACTTGAAAATGTCCAAGAGTTAGCTGGATATGGGTACAGACAGCTTTCGATTTAACTGAGGTCCGACTTAAGATTTTTTTTTACTTTATGATGGTGCAAAAGTGACACGCATTTGGTAGAAAACATAATTTGACCTTTGCTGTTTCCCCAGGACAGTGATATAAGGTTATGATACTCTCTTGCGATGCTGGGCAGTGGCAGTGAGCTGCAGCTCCCAGTGGGTAAATTAAGCATGGAAATCTGGAACACAGCAGCTTTTAAGGGATGCACTGGGGAGAGCAGTTTGTAAAAATACCTTGGGACGGATTAAATGTCTTGGCTTAGAGAAAGAACAACAGACAATAGGAAACTGTCATTGAGGAGAAGCCGGGATTCAGGAGATGTACATTATTCAGGTAGCTGAGGGAGGGGACAGGAACCTGAATCTTCAACAGAAGCAAACAAACTGGGATGGAGGGCCCAGCCTCATGAAGGTGACCAGAAGGACCCGGTGCTGCAGGCTGTGTGGGTAGCTGAGCAGAGCTAAGCGGCTTGACGGACCAACATCTCTCCAGCTGGTTGAAGACAAGCTCTCAGAAGACAATGCTGCATGTCACAGCCCCAGCAACCAACAACACCAGCCTGACAACTTGCTGGGGTGGCCGCCTTGTGGTCTGAGGTGGCCGTCTAAACTATGTGGTCTGATCTCAGGCTGCAGACCTTGCAGGACTGTCTTCACACAGACTGGAAGTGCTAACAGGTGGTGAGGACACCGCTTTACAACGATGCAGGGGGCCCCATGTCACCCTCACCCATGGGAAGTTTGACTTGGTGGACTCAGCCAAGCCACAGAGGTCTAACGCTTCTCTGCGGTGATTTCAGGCTGCCCTGGCAGAAAGCACAGTGCCTGCAGAC +>671|IGHV1-24 ENST00000633490|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>672|IGLV3-12 ENST00000390313|IGLV3-12|5'UTR|IG|IGL|None|00 +GCCTCAGCC +>673|TRAJ2 ENST00000390535|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGAACAATTGATAAACTCACATTTGGGAAAGGGACCCATGTATTCATTATATCTG +>674|TRAJ42 ENST00000390495|TRAJ42|J-REGION|TR|TRA|None|00 +TGAATTATGGAGGAAGCCAAGGAAATCTCATCTTTGGAAAAGGCACTAAACTCTCTGTTAAACCAA +>675|IGLV11-55 ENST00000390286|IGLV11-55|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCCTGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCGGCCCGTGCTGACTCAGCCGCCCTCCCTGTCTGCATCCCCGGGAGCAACAGCCAGACTCCCCTGCACCCTGAGCAGTGACCTCAGTGTTGGTGGTAAAAACATGTTCTGGTACCAGCAGAAGCTAGGGAGCTCTCCCAGGTTATTCCTGTATCACTACTCAGACTCAGACAAGCAGCTGGGACCTGGGGTCCCCAGTCGAGTCTCTGGCTCCAAGGAGACCTCAAGTAACACAGCGTTTTTGCTCATCTCTGGGCTCCAGCCTGAGGACGAGGCCGATTATTACTGCCAGGTGTACGAAAGTAGTGCTAATCACAGTGAGACAGATGAGGAAGTCGGACAAAAACCAAGGTTT +>676|TRBV7-4 ENST00000390369|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>677|TRBV7-9 ENST00000632021|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGGACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>678|IGHV3-38 ENST00000631785|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATATA +>679|IGLV5-48 ENST00000390293|IGLV5-48|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTTCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCAACTTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGACTCACCTGCACCTTGCGCAGTGGCATCAGTGTTGGTAGCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCAGGTATCTCCTGAACTACTACTCAGACTCAGATAAGCACCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGACCAATGCAGGGATTTTATTCATCTCTGGGCTC +>680|TRAJ58 ENST00000390481|TRAJ58|J-REGION|TR|TRA|None|00 +TTTAAGAAACCAGTGGCTCTAGGTTGACCTTTGGGGAAGGAACACAGCTCACAGTGAATCCTG +>681|TRBV5-8 ENST00000631639|TRBV5-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGACCCAGGCTCCTCTTCTGGGCACTGCTTTGTCTCCTCGGAACAGGCCCAGTGGAGGCTGGAGTCACACAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGCGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTACTGGTACCAACAGGCCCTGGGTCTGGGCCTCCAGTTCCTCCTTTGGTATGACGAGGGTGAAGAGAGAAACAGAGGAAACTTCCCTCCTAGATTTTCAGGTCGCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGAGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>682|TRAJ22 ENST00000390515|TRAJ22|J-REGION|TR|TRA|None|00 +TTTCTTCTGGTTCTGCAAGGCAACTGACCTTTGGATCTGGGACACAATTGACTGTTTTACCTG +>683|TRAJ30 ENST00000390507|TRAJ30|J-REGION|TR|TRA|None|00 +TGAACAGAGATGACAAGATCATCTTTGGAAAAGGGACACGACTTCATATTCTCCCCA +>684|IGLV1-50 ENST00000390291|IGLV1-50|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAGGAGGCAGCACTCAGGACAATCTCCAGC +>685|IGKV1D-33 ENST00000390265|IGKV1D-33|5'UTR|IG|IGK|None|00 +ATGTTCGCAGAGCACAGCCCCCTGCCCTGAAGACTTATTAATAGGCTGGTCGCACCCTGTGCAGGAGTCAGTCCCAACCAGGACACAGC +>686|TRBV6-6 ENST00000390371|TRBV6-6|5'UTR|TR|TRB|None|00 +CAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>687|TRBC2 ENST00000610416|TRBC2|C-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTCCTCCAGGCTGTGAGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCGAGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGGTGAGTGGGGCTTGTCAACAGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCC +>688|TRBJ2-7 ENST00000633660|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACGTCGGGCCGGGCACCAGGCTCACGGTCACAG +>689|IGLJ5 ENST00000390327|IGLJ5|J-REGION|IG|IGL|None|00 +CAGAGAGGGTTTTTGTATGAGCCTGTGTCACAGCACTGGGTGTTTGGTGAGGGGACCGAGCTGACCGTCCTA +>690|TRBV29-1 ENST00000422143|TRBV29-1|5'UTR|TR|TRB|None|00 +GAAGGAAAGATGAACTTGAGTTTCACTTCTTAGTGCCTTTTCTCAGGGGAGAGGCCATCACTTGAAG +>691|TRBV6-7 ENST00000631511|TRBV6-7|5'UTR|TR|TRB|None|00 +ATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>692|IGHV1-18 ENST00000633147|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>693|TRAJ59 ENST00000390480|TRAJ59|J-REGION|TR|TRA|None|00 +GGAAGGAAGGAAACAGGAAATTTACATTTGGAATGGGGACGCAAGTGAGAGTGA +>694|IGHD4-23 ENST00000437320|IGHD4-23|D-REGION|IG|IGH|None|00 +TGACTACGGTGGTAACTCC +>695|TRBV6-6 ENST00000633963|TRBV6-6|5'UTR|TR|TRB|None|00 +ATCAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>696|TRAJ16 ENST00000390521|TRAJ16|J-REGION|TR|TRA|None|00 +GGTTTTCAGATGGCCAGAAGCTGCTCTTTGCAAGGGGGACCATGTTAAAGGTGGATCTTA +>697|TRGV2 ENST00000426402|TRGV2|5'UTR|TR|TRG|None|00 +GGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCCCTCTGCTTGTGTCTCAGGAAGACCACCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGAACCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>698|TRAV17 ENST00000390445|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAAACTCTCCTGGGAGTGTCTTTGGTGATTCTATGGCTTCAACTGGCTAGGGTGAACAGTCAACAGGGAGAAGAGGATCCTCAGGCCTTGAGCATCCAGGAGGGTGAAAATGCCACCATGAACTGCAGTTACAAAACTAGTATAAACAATTTACAGTGGTATAGACAAAATTCAGGTAGAGGCCTTGTCCACCTAATTTTAATACGTTCAAATGAAAGAGAGAAACACAGTGGAAGATTAAGAGTCACGCTTGACACTTCCAAGAAAAGCAGTTCCTTGTTGATCACGGCTTCCCGGGCAGCAGACACTGCTTCTTACTTCTGTGCTACGGACG +>699|IGKV1D-12 ENST00000377032|IGKV1D-12|5'UTR|IG|IGK|None|00 +AGACCCACTCAGGACACAGC +>700|IGHV3-72 ENST00000633602|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGAGA +>701|IGKV4-1 ENST00000390243|IGKV4-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTTGCAGACCCAGGTCTTCATTTCTCTGTTGCTCTGGATCTCTGGTGCCTACGGGGACATCGTGATGACCCAGTCTCCAGACTCCCTGGCTGTGTCTCTGGGCGAGAGGGCCACCATCAACTGCAAGTCCAGCCAGAGTGTTTTATACAGCTCCAACAATAAGAACTACTTAGCTTGGTACCAGCAGAAACCAGGACAGCCTCCTAAGCTGCTCATTTACTGGGCATCTACCCGGGAATCCGGGGTCCCTGACCGATTCAGTGGCAGCGGGTCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGGCTGAAGATGTGGCAGTTTATTACTGTCAGCAATATTATAGTACTCCT +>702|IGHJ5 ENST00000488476|IGHJ5|J-REGION|IG|IGH|None|00 +AACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>703|IGLV1-44 ENST00000390297|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>704|IGLV1-47 ENST00000390294|IGLV1-47|5'UTR|IG|IGL|None|00 +GGGGAAGCTCAGCTTCAGCTGTGGTAGAGAAGACAGGATTCAGGACAATCTCCAGC +>705|IGHV4-31 ENST00000438142|IGHV4-31|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>706|TRDV2 ENST00000390469|TRDV2|5'UTR|TR|TRD|None|00 +ATTAGCAGGCAGCAGGCCCTGCGAGCCTCCTGTGATCAGCTAGATTTCTCTGGGGAATGAAACAGCTGCTGATAGGGACTGACTTCCTCAGTCACAAGTGTTTCACAAGTGTGTTGGTTCAGAGGAGGGACCAGGCAGAAGGTGGTTGAGAGGCAGAGCTGCCCCTGAGTGAGCC +>707|IGHV3-64 ENST00000631710|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGAGA +>708|IGLV3-1 ENST00000390319|IGLV3-1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGATCCCTCTCTTCCTCGGCGTCCTTGCTTACTGCACAGGATCCGTGGCCTCCTATGAGCTGACTCAGCCACCCTCAGTGTCCGTGTCCCCAGGACAGACAGCCAGCATCACCTGCTCTGGAGATAAATTGGGGGATAAATATGCTTGCTGGTATCAGCAGAAGCCAGGCCAGTCCCCTGTGCTGGTCATCTATCAAGATAGCAAGCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACAGCCACTCTGACCATCAGCGGGACCCAGGCTATGGATGAGGCTGACTATTACTGTCAGGCGTGGGACAGCAGCACTGCACACA +>709|TRAV13-2 ENST00000390439|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCAGGCATTCGAGCTTTATTTATGTACTTGTGGCTGCAGCTGGACTGGGTGAGCAGAGGAGAGAGTGTGGGGCTGCATCTTCCTACCCTGAGTGTCCAGGAGGGTGACAACTCTATTATCAACTGTGCTTATTCAAACAGCGCCTCAGACTACTTCATTTGGTACAAGCAAGAATCTGGAAAAGGTCCTCAATTCATTATAGACATTCGTTCAAATATGGACAAAAGGCAAGGCCAAAGAGTCACCGTTTTATTGAATAAGACAGTGAAACATCTCTCTCTGCAAATTGCAGCTACTCAACCTGGAGACTCAGCTGTCTACTTTTGTGCAGAGAATA +>710|TRAV12-2 ENST00000390437|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGAGTTTTACTAGTGATCCTGTGGCTTCAGTTGAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGAATTCTGGACCCCTCAGTGTTCCAGAGGGAGCCATTGCCTCTCTCAACTGCACTTACAGTGACCGAGGTTCCCAGTCCTTCTTCTGGTACAGACAATATTCTGGGAAAAGCCCTGAGTTGATAATGTTCATATACTCCAATGGTGACAAAGAAGATGGAAGGTTTACAGCACAGCTCAATAAAGCCAGCCAGTATGTTTCTCTGCTCATCAGAGACTCCCAGCCCAGTGATTCAGCCACCTACCTCTGTGCCGTGAACA +>711|TRDC ENST00000636101|TRDC|C-REGION|TR|TRD|None|00 +GAATCCGGCATGGCCCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACTGTGACCCTGAGTTGCACATATGACACCAGTGAGAATAATTATTATTTGTTCTGGTACAAGCAGCCTCCCAGCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACAGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGATGCCGCGATGTATTTCTGTGCTATAGGAGCGGTGGACACCGATAAACTCATCTTTGGAAAAGGAACCCGTGTGACTGTGGAACCAAGAAGTCAGCCTCATACCAAACCATCCGTTTTTGTCATGAAAAATGGAACAAATGTCGCTTGTCTGGTGAAGGAATTCTACCCCAAGGATATAAGAATAAATCTCGTGTCATCCAAGAAGATAACAGAGTTTGATCCTGCTATTGTCATCTCTCCCAGTGGGAAGTACAATGCTGTCAAGCTTGGTAAATATGAAGATTCAAATTCAGTGACATGTTCAGTTCAACACGACAATAAAACTGTGCACTCCACTGACTTTGAAGTGAAGACAGATTCTACAGATCACGTAAAACCAAAGGAAACTGAAAACACAAAGCAACCTTCAAAGAGCTGCCATAAACCCAAAGCCATAGTTCATACCGAGAAGGTGAACATGATGTCCCTCACAGTGCTTGGGCTACGAATGCTGTTTGCAAAGACTGTTGCCGTCAATTTTCTCTTGACTGCCAAGTTATTTTTCTTG +>712|TRBV6-6 ENST00000390371|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGACAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>713|IGHV3-7 ENST00000390598|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGA +>714|TRGV11 ENST00000390340|TRGV11|L-REGION+V-REGION|TR|TRG|None|00 +CTTGGGCAGTTGGAACAACCTGAAATATCTATTTCCAGACCAGCAAATAAGAGTGCCCACATATCTTGGAAGGCATCCATCCAAGGCTTTAGCAGTAAAATCATACACTGGTACTGGCAGAAACCAAACAAAGGCTTAGAATATTTATTACATGTCTTCTTGACAATCTCTGCTCAAGATTGCTCAGGTGGGAAGACTAAGAAACTTGAGGTAAGTAAAAATGCTCACACTTCCACTTCCACTTTGAAAATAAAGTTCTTAGAGAAAGAAGATGAGGTGGTGTACCACTGTGCCTGCTGGATTAGGCAC +>715|TRAJ48 ENST00000390489|TRAJ48|J-REGION|TR|TRA|None|00 +TATCTAACTTTGGAAATGAGAAATTAACCTTTGGGACTGGAACAAGACTCACCATCATACCCA +>716|TRAV14DV4 ENST00000390440|TRAV14DV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGTCACTTTCTAGCCTGCTGAAGGTGGTCACAGCTTCACTGTGGCTAGGACCTGGCATTGCCCAGAAGATAACTCAAACCCAACCAGGAATGTTCGTGCAGGAAAAGGAGGCTGTGACTCTGGACTGCACATATGACACCAGTGATCCAAGTTATGGTCTATTCTGGTACAAGCAGCCCAGCAGTGGGGAAATGATTTTTCTTATTTATCAGGGGTCTTATGACCAGCAAAATGCAACAGAAGGTCGCTACTCATTGAATTTCCAGAAGGCAAGAAAATCCGCCAACCTTGTCATCTCCGCTTCACAACTGGGGGACTCAGCAATGTACTTCTGTGCAATGAGAGAGGG +>717|TRBV11-2 TENX_TRBV11_2|TRBV11-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCGGCCCTCTGTCTCCTGGGAGGAAGCTGGAGTTGCCCAGTCTCCCAGATATAAGATTATAGAGAAAAGGCAGAGTGTGGCTTTTTGGTGCAATCCTATATCTGGCCATGCTACCCTTTACTGGTACCAGCAGATCCTGGGACAGGGCCCAAAGCTTCTGATTCAGTTTCAGAATAACGGTGTAGTGGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAACCTGCAAAGCTTGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGA +>718|TRBV9 ENST00000390363|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCACTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>719|IGHD ENST00000633698|IGHD|C-REGION|IG|IGH|D|00 +CACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTACCTGGCCATGACCCCCCTGATCCCTCAGAGCAAGGATGAGAACAGCGATGACTACACGACCTTTGATGATGTGGGCAGCCTGTGGACCACCCTGTCCACGTTTGTGGCCCTCTTCATCCTCACCCTCCTCTACAGCGGCATTGTCACTTTCATCAAGGTGAAGTAG +>720|TRAV26-1 ENST00000390455|TRAV26-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCTGGTGGCAAGAGTAACTGTGTTTCTGACCTTTGGAACTATAATTGATGCTAAGACCACCCAGCCCACCTCCATGGATTGCGCTGAAGGAAGAGCTGCAAACCTGCCTTGTAATCACTCTACCATCAGTGGAAATGAGTATGTGTATTGGTATCGACAGATTCACTCCCAGGGGCCACAGTATATCATTCATGGTCTAAAAAACAATGAAACCAATGAAATGGCCTCTCTGATCATCACAGAAGACAGAAAGTCCAGCACCTTGATCCTGCCCCACGCTACGCTGAGAGACACTGCTGTGTACTATTGCATCGTCAGAGTCG +>721|IGKV1D-42 ENST00000390278|IGKV1D-42|5'UTR|IG|IGK|None|00 +AGTCCCAGTCAGGACACAGC +>722|TRAJ36 ENST00000614481|TRAJ36|J-REGION|TR|TRA|None|00 +TCAAACTGGGGCAAACAACCTCTTCTTTGGGACTGGAACGAGACTCACCGTTATTCCC +>723|TRAJ32 ENST00000390505|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGTGGTGCTACAAACAAGCTCATCTTTGGAACTGGCACTCTGCTTGCTGTCCAGCCAA +>724|IGHV3-73 ENST00000622547|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +TCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACT +>725|TRAV5 ENST00000390427|TRAV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATTTGCTGGATTTTCGTTCCTGTTTTTGTGGCTGCAGCTGGACTGTATGAGTAGAGGAGAGGATGTGGAGCAGAGTCTTTTCCTGAGTGTCCGAGAGGGAGACAGCTCCGTTATAAACTGCACTTACACAGACAGCTCCTCCACCTACTTATACTGGTATAAGCAAGAACCTGGAGCAGGTCTCCAGTTGCTGACGTATATTTTTTCAAATATGGACATGAAACAAGACCAAAGACTCACTGTTCTATTGAATAAAAAGGATAAACATCTGTCTCTGCGCATTGCAGACACCCAGACTGGGGACTCAGCTATCTACTTCTGTGCAGAGAGTA +>726|IGHM ENST00000637539|IGHM|C-REGION|IG|IGH|M|00 +GGGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGAGGGGGAGGTGAGCGCCGACGAGGAGGGCTTTGAGAACCTGTGGGCCACCGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGTACCACCGTCACCTTGTTCAAGGTGAAA +>727|TRAJ3 ENST00000390534|TRAJ3|J-REGION|TR|TRA|None|00 +GGGGTACAGCAGTGCTTCCAAGATAATCTTTGGATCAGGGACCAGACTCAGCATCCGGCCAA +>728|TRAJ41 ENST00000390496|TRAJ41|J-REGION|TR|TRA|None|00 +GAACTCAAATTCCGGGTATGCACTCAACTTCGGCAAAGGCACCTCGCTGTTGGTCACACCCC +>729|TRBC2 ENST00000620987|TRBC2|C-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAACAGAGCCCCTACCAGAACCAGCAGTACGTCGGGCCGGGCACCAGGCTCACGGTCACAGAGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGGTGAGTGGGGCTTGTCAACAGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCC +>730|IGHA2 ENST00000622473|IGHA2|C-REGION|IG|IGH|A2|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTACTGA +>731|IGHV2-70 ENST00000632173|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATGCTTTGTTCCATGCTCCTGCTACTGACTGTCCCGTCTTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTACTGGAATGCGTGTGAGCTGGATCCGTCGGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATACTGCAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC diff --git a/lib/rust/vdj_ann_ref/vdj_refs_3.1/human/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_3.1/human/fasta/regions.fa new file mode 100644 index 0000000..c50b55f --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_3.1/human/fasta/regions.fa @@ -0,0 +1,1484 @@ +>1|IGHA1 ENST00000390547|IGHA1|C-REGION|IG|IGH|A1|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>2|IGHA1 ENST00000641837|IGHA1|C-REGION|IG|IGH|A1|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAACAGGGAGGGCCCCCAGTAC +>3|IGHA2 ENST00000390539|IGHA2|C-REGION|IG|IGH|A2|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGTAAACCCACCCACATCAATGTGTCTGTTGTCATGGCGGAGGCGGATGGCACCTGCTAC +>4|IGHA2 ENST00000497872|IGHA2|C-REGION|IG|IGH|A2|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGCTCTTGCTGTGTTGCAGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAAGAGGGAGGGCCCCCAGTAC +>5|IGHA2 ENST00000622473|IGHA2|C-REGION|IG|IGH|A2|00 +GCATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>6|IGHD ENST00000390556|IGHD|C-REGION|IG|IGH|D|00 +CACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTACCTGGCCATGACCCCCCTGATCCCTCAGAGCAAGGATGAGAACAGCGATGACTACACGACCTTTGATGATGTGGGCAGCCTGTGGACCACCCTGTCCACGTTTGTGGCCCTCTTCATCCTCACCCTCCTCTACAGCGGCATTGTCACTTTCATCAAGGTGAAG +>7|IGHD1-1 ENST00000454908|IGHD1-1|D-REGION|IG|IGH|None|00 +GGTACAACTGGAACGAC +>8|IGHD1-14 ENST00000451044|IGHD1-14|D-REGION|IG|IGH|None|00 +GGTATAACCGGAACCAC +>9|IGHD1-20 ENST00000450276|IGHD1-20|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACGAC +>10|IGHD1-26 ENST00000390567|IGHD1-26|D-REGION|IG|IGH|None|00 +GGTATAGTGGGAGCTACTAC +>11|IGHD1-7 ENST00000430425|IGHD1-7|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACTAC +>12|IGHD1/OR15-1A ENST00000605284|IGHD1/OR15-1A|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACAAC +>13|IGHD2-15 ENST00000390578|IGHD2-15|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTGGTGGTAGCTGCTACTCC +>14|IGHD2-2 ENST00000390591|IGHD2-2|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTAGTACCAGCTGCTATGCC +>15|IGHD2-21 ENST00000390572|IGHD2-21|D-REGION|IG|IGH|None|00 +AGCATATTGTGGTGGTGACTGCTATTCC +>16|IGHD2-8 ENST00000390585|IGHD2-8|D-REGION|IG|IGH|None|00 +AGGATATTGTACTAATGGTGTATGCTATACC +>17|IGHD2/OR15-2A ENST00000603077|IGHD2/OR15-2A|D-REGION|IG|IGH|None|00 +AGAATATTGTAATAGTACTACTTTCTATGCC +>18|IGHD3-10 ENST00000390583|IGHD3-10|D-REGION|IG|IGH|None|00 +GTATTACTATGGTTCGGGGAGTTATTA +>19|IGHD3-16 ENST00000390577|IGHD3-16|D-REGION|IG|IGH|None|00 +GTATTATGATTACGTTTGGGGGAGTTATCGTTATACC +>20|IGHD3-22 ENST00000390571|IGHD3-22|D-REGION|IG|IGH|None|00 +GTATTACTATGATAGTAGTGGTTATTACTAC +>21|IGHD3-3 ENST00000390590|IGHD3-3|D-REGION|IG|IGH|None|00 +GTATTACGATTTTTGGAGTGGTTATTATACC +>22|IGHD3-9 ENST00000390584|IGHD3-9|D-REGION|IG|IGH|None|00 +GTATTACGATATTTTGACTGGTTATTA +>23|IGHD3/OR15-3A ENST00000604950|IGHD3/OR15-3A|D-REGION|IG|IGH|None|00 +GTATTATGATTTTTGGACTGGTTATTATACC +>24|IGHD4-11 ENST00000431440|IGHD4-11|D-REGION|IG|IGH|None|00 +TGACTACAGTAACTAC +>25|IGHD4-17 ENST00000431870|IGHD4-17|D-REGION|IG|IGH|None|00 +TGACTACGGTGACTAC +>26|IGHD4-23 ENST00000437320|IGHD4-23|D-REGION|IG|IGH|None|00 +TGACTACGGTGGTAACTCC +>27|IGHD4/OR15-4A ENST00000603326|IGHD4/OR15-4A|D-REGION|IG|IGH|None|00 +TGACTATGGTGCTAACTAC +>28|IGHD5-12 ENST00000390581|IGHD5-12|D-REGION|IG|IGH|None|00 +GTGGATATAGTGGCTACGATTAC +>29|IGHD5-18 ENST00000390575|IGHD5-18|D-REGION|IG|IGH|None|00 +GTGGATACAGCTATGGTTAC +>30|IGHD5-24 ENST00000390569|IGHD5-24|D-REGION|IG|IGH|None|00 +GTAGAGATGGCTACAATTAC +>31|IGHD5/OR15-5A ENST00000604642|IGHD5/OR15-5A|D-REGION|IG|IGH|None|00 +GTGGATATAGTGTCTACGATTAC +>32|IGHD6-13 ENST00000390580|IGHD6-13|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCAGCTGGTAC +>33|IGHD6-19 ENST00000390574|IGHD6-19|D-REGION|IG|IGH|None|00 +GGGTATAGCAGTGGCTGGTAC +>34|IGHD6-25 ENST00000452198|IGHD6-25|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCGGCTAC +>35|IGHD6-6 ENST00000454691|IGHD6-6|D-REGION|IG|IGH|None|00 +GAGTATAGCAGCTCGTCC +>36|IGHD7-27 ENST00000439842|IGHD7-27|D-REGION|IG|IGH|None|00 +CTAACTGGGGA +>37|IGHE ENST00000390541|IGHE|C-REGION|IG|IGH|E|00 +GCCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>38|IGHE ENST00000641420|IGHE|C-REGION|IG|IGH|E|00 +GCCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGAGCTGGACGTGTGCGTGGAGGAGGCCGAGGGCGAGGCGCCGTGGACGTGGACCGGCCTCTGCATCTTCGCCGCACTCTTCCTGCTCAGCGTGAGCTACAGCGCCGCCATCACGCTCCTCATGGTGCAGCGGTTCCTCTCAGCCACGCGGCAGGGGAGGCCCCAGACCTCCCTCGACTACACCAACGTCCTCCAGCCCCACGCC +>39|IGHE ENST00000610670|IGHE|C-REGION|IG|IGH|E|00 +GCCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCGAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>40|IGHG1 ENST00000390542|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>41|IGHG1 ENST00000390548|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTACAGGAACATGATCGGACAGGGGGCC +>42|IGHG1 ENST00000390549|IGHG1|C-REGION|IG|IGH|G1|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>43|IGHG2 ENST00000390545|IGHG2|C-REGION|IG|IGH|G2|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>44|IGHG2 ENST00000641095|IGHG2|C-REGION|IG|IGH|G2|00 +GCCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACCACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCATCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATCAGGCAGGGGGCC +>45|IGHG3 ENST00000390551|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>46|IGHG3 ENST00000641136|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTATAGGAACATGATTGGGCAGGGGGCC +>47|IGHG4 ENST00000390543|IGHG4|C-REGION|IG|IGH|G4|00 +GCTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGGTAAA +>48|IGHG4 ENST00000641978|IGHG4|C-REGION|IG|IGH|G4|00 +GCTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATAAGGCAGGGGGCC +>49|IGHJ1 ENST00000390565|IGHJ1|J-REGION|IG|IGH|None|00 +GCTGAATACTTCCAGCACTGGGGCCAGGGCACCCTGGTCACCGTCTCCTCAG +>50|IGHJ2 ENST00000390564|IGHJ2|J-REGION|IG|IGH|None|00 +TACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>51|IGHJ2 ENST00000632178|IGHJ2|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>52|IGHJ3 ENST00000463911|IGHJ3|J-REGION|IG|IGH|None|00 +GATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>53|IGHJ3 ENST00000633896|IGHJ3|J-REGION|IG|IGH|None|00 +TGATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>54|IGHJ4 ENST00000461719|IGHJ4|J-REGION|IG|IGH|None|00 +TACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>55|IGHJ4 ENST00000631521|IGHJ4|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>56|IGHJ5 ENST00000488476|IGHJ5|J-REGION|IG|IGH|None|00 +AACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>57|IGHJ5 ENST00000633501|IGHJ5|J-REGION|IG|IGH|None|00 +ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>58|IGHJ6 ENST00000390560|IGHJ6|J-REGION|IG|IGH|None|00 +TACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>59|IGHJ6 ENST00000631705|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>60|IGHM ENST00000390559|IGHM|C-REGION|IG|IGH|M|00 +GGGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTAC +>61|IGHM ENST00000637539|IGHM|C-REGION|IG|IGH|M|00 +GGGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGAGGGGGAGGTGAGCGCCGACGAGGAGGGCTTTGAGAACCTGTGGGCCACCGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGTACCACCGTCACCTTGTTCAAGGTGAAA +>62|IGHV1-18 ENST00000390605|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>63|IGHV1-18 ENST00000390605|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGA +>64|IGHV1-18 ENST00000633147|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>65|IGHV1-18 ENST00000633147|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>66|IGHV1-2 ENST00000390594|IGHV1-2|5'UTR|IG|IGH|None|00 +GAGAGCATCACCCAGCAACCACATCTGTCCTCTAGAGAATCCCCTGAGAGCTCCGTTCCTCACC +>67|IGHV1-2 ENST00000390594|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCCACAGGAGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCGGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCTGGGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACATGGAGCTGAGCAGGCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>68|IGHV1-24 ENST00000390610|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>69|IGHV1-24 ENST00000390610|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACA +>70|IGHV1-24 ENST00000633490|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>71|IGHV1-24 ENST00000633490|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>72|IGHV1-3 ENST00000390595|IGHV1-3|5'UTR|IG|IGH|None|00 +CCACATCCCTCCTCAGAAGCCCCCAGAGCACAACGCCTCACC +>73|IGHV1-3 ENST00000390595|IGHV1-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTTTTGGTGGCAGCAGCCACAGGTGCCCACTCCCAGGTCCAGCTTGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGCATTGGGTGCGCCAGGCCCCCGGACAAAGGCTTGAGTGGATGGGATGGATCAACGCTGGCAATGGTAACACAAAATATTCACAGAAGTTCCAGGGCAGAGTCACCATTACCAGGGACACATCCGCGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAAGACACGGCTGTGTATTACTGTGCGAGAGA +>74|IGHV1-45 ENST00000390621|IGHV1-45|5'UTR|IG|IGH|None|00 +ATCACCCAACAACCACATCCCTCCTCTAGAGAATCCCCTGAAAGCACAGCTCCTCACC +>75|IGHV1-45 ENST00000390621|IGHV1-45|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGAATCCTCTTCTTGGTGGCAGCAGTCACAGATGCCTACTCCCAGATGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGACTGGGTCCTCAGTGAAGGTTTCCTGCAAGGCTTCCGGATACACCTTCACCTACCGCTACCTGCACTGGGTGCGACAGGCCCCCGGACAAGCGCTTGAGTGGATGGGATGGATCACACCTTTCAATGGTAACACCAACTACGCACAGAAATTCCAGGACAGAGTCACCATTACCAGGGACAGGTCTATGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACAGCCATGTATTACTGTGCAAGATA +>76|IGHV1-46 ENST00000390622|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>77|IGHV1-46 ENST00000390622|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>78|IGHV1-46 ENST00000632105|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>79|IGHV1-46 ENST00000632105|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>80|IGHV1-58 ENST00000390628|IGHV1-58|5'UTR|IG|IGH|None|00 +AGCATCATCCAGAAACCACATCCCTCCGCTAGAGAAGCCCCTGACGGCACAGTTCCTCACT +>81|IGHV1-58 ENST00000390628|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGAGGATCCTCTTCTTGGTGGGAGCAGCGACAGGTGCCCACTCCCAAATGCAGCTGGTGCAGTCTGGGCCTGAGGTGAAGAAGCCTGGGACCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATTCACCTTTACTAGCTCTGCTGTGCAGTGGGTGCGACAGGCTCGTGGACAACGCCTTGAGTGGATAGGATGGATCGTCGTTGGCAGTGGTAACACAAACTACGCACAGAAGTTCCAGGAAAGAGTCACCATTACCAGGGACATGTCCACAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCCGAGGACACGGCCGTGTATTACTGTGCGGCAGA +>82|IGHV1-69 ENST00000390633|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>83|IGHV1-69 ENST00000390633|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>84|IGHV1-69 ENST00000632882|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>85|IGHV1-69 ENST00000632882|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>86|IGHV1-69-2 ENST00000615784|IGHV1-69-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCCTCTTGGTGGCAGCAGCTACAGGCACCCACGCCGAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCTACAGTGAAAATCTCCTGCAAGGTTTCTGGATACACCTTCACCGACTACTACATGCACTGGGTGCAACAGGCCCCTGGAAAAGGGCTTGAGTGGATGGGACTTGTTGATCCTGAAGATGGTGAAACAATATACGCAGAGAAGTTCCAGGGCAGAGTCACCATAACCGCGGACACGTCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>87|IGHV1-69D ENST00000624687|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>88|IGHV1-69D ENST00000624687|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>89|IGHV1-69D ENST00000633446|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCAGATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>90|IGHV1-69D ENST00000633446|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTCCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>91|IGHV1/OR15-1 ENST00000604066|IGHV1/OR15-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACATCTTCACCGACTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGAGCTTGGGTGGATGGGACGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCAGAGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACACGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCACGTATTACTGTGCGAGAGA +>92|IGHV1/OR21-1 ENST00000622028|IGHV1/OR21-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGAATTGGAGGATCCTGTTTTTGGTGGTCATAGCTGCGGGTGCCCAGTCCCAGGTACAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCATCACCAGCTACTGTATGCACTGGGTGCACCAGGTCCATGCACAAGGGCTTGAGTGGATGGGATTGGTGTGCCCTAGTGATGGCAGCACAAGCTATGCACAGAAGTTCCAGGCCAGAGTCACCATAACCAGGGACACATCCATGAGCACAGCCTACATGGAGCTAAGCAGTCTGAGATCTGAGGACACGGCCATGTATTACTGTGTGAGAGA +>93|IGHV2-26 ENST00000390611|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>94|IGHV2-26 ENST00000390611|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATA +>95|IGHV2-26 ENST00000632457|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>96|IGHV2-26 ENST00000632457|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATAC +>97|IGHV2-5 ENST00000390597|IGHV2-5|5'UTR|IG|IGH|None|00 +AGTGACTCCTGTGCCCCACC +>98|IGHV2-5 ENST00000390597|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTCCACGCTCCTGCTGCTGACCATCCCTTCATGGGTCTTGTCCCAGATCACCTTGAAGGAGTCTGGTCCTACGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAGTGGGTGTGGGCTGGATCCGTCAGCCCCCAGGAAAGGCCCTGGAGTGGCTTGCACTCATTTATTGGGATGATGATAAGCGCTACAGCCCATCTCTGAAGAGCAGGCTCACCATCACCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACACAGAC +>99|IGHV2-70 ENST00000617374|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAGGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGTGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACTCATTGATTGGGATGATGATAAATACTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>100|IGHV2-70 ENST00000632173|IGHV2-70|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCCCCACC +>101|IGHV2-70 ENST00000632173|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATGCTTTGTTCCATGCTCCTGCTACTGACTGTCCCGTCTTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTACTGGAATGCGTGTGAGCTGGATCCGTCGGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATACTGCAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>102|IGHV2-70D ENST00000390634|IGHV2-70D|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCTCCACC +>103|IGHV2-70D ENST00000390634|IGHV2-70D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGCGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATTCTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>104|IGHV2/OR16-5 ENST00000567458|IGHV2/OR16-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACGTTTTGCTCCACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACTCTCTCTGGGTTCTCACTCAGCACTTCTGGAATGGGTATGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCTCACATTTTTTTGAATGACAAAAAATCCTACAGCACGTCTCTGAAGAACAGGCTCATCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCATGGAGAG +>105|IGHV3-11 ENST00000390601|IGHV3-11|5'UTR|IG|IGH|None|00 +CTCCCTCTGCTGATAAAAACCAGCCGAGCCCAGACCCTGCAGCTCTGGGAGAAGAGCCCCAGCCCCAGAATTCCCAGGAGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>106|IGHV3-11 ENST00000390601|IGHV3-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTATAAAAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCAAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTAGTAGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>107|IGHV3-13 ENST00000390602|IGHV3-13|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTGTATTCAGTGATCAGGACTGAACACACAGGACTCACC +>108|IGHV3-13 ENST00000390602|IGHV3-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATATTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACGACATGCACTGGGTCCGCCAAGCTACAGGAAAAGGTCTGGAGTGGGTCTCAGCTATTGGTACTGCTGGTGACCCATACTATCCAGGCTCCGTGAAGGGCCGATTCACCATCTCCAGAGAAAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGGGGACACGGCTGTGTATTACTGTGCAAGAGA +>109|IGHV3-15 ENST00000390603|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>110|IGHV3-15 ENST00000390603|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACA +>111|IGHV3-15 ENST00000632959|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>112|IGHV3-15 ENST00000632959|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACAGA +>113|IGHV3-16 ENST00000390604|IGHV3-16|5'UTR|IG|IGH|None|00 +AGCCCTGGGAGAGAAGCCCCAGCCCTGGGATTCTCAGGTGTTTCTATTGGGTCAACAGCAATAAACAAATTACC +>114|IGHV3-16 ENST00000390604|IGHV3-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGCCCGCAAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGTGGACTCCGTGAAGCGCCGATTCATCATCTCCAGAGACAATTCCAGGAACTCCCTGTATCTGCAAAAGAACAGACGGAGAGCCGAGGACATGGCTGTGTATTACTGTGTGAGA +>115|IGHV3-20 ENST00000390606|IGHV3-20|5'UTR|IG|IGH|None|00 +CCAGCCCTGAGATTCCCACGTGTTTCCATTCAGTGATCAGCACTGAACACAGAGGACTCGCC +>116|IGHV3-20 ENST00000390606|IGHV3-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGTGTGGTACGGCCTGGGGGGTCCCTGAGACTCTCCTTTGCAGCCTCTGGATTCACCTTTGATGATTATGGCATGAGCTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGAGTGGGTCTCTGGTATTAATTGGAATGGTGGTAGCACAGGTTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCCTTGTATCACTGTGCGAGAGA +>117|IGHV3-21 ENST00000390607|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>118|IGHV3-21 ENST00000390607|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>119|IGHV3-21 ENST00000632980|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>120|IGHV3-21 ENST00000632980|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>121|IGHV3-23 ENST00000390609|IGHV3-23|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCCAGCCCTGGGATTTTCAGGTGTTTTCATTTGGTGATCAGGACTGAACAGAGAGAACTCACC +>122|IGHV3-23 ENST00000390609|IGHV3-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGCTTTTTCTTGTGGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGCAGCTATGCCATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGCTATTAGTGGTAGTGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGGTTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTATATTACTGTGCGAAAGA +>123|IGHV3-30 ENST00000603660|IGHV3-30|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>124|IGHV3-30 ENST00000603660|IGHV3-30|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAAA +>125|IGHV3-33 ENST00000390615|IGHV3-33|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>126|IGHV3-33 ENST00000390615|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCGTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATGGTATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>127|IGHV3-33 ENST00000631807|IGHV3-33|5'UTR|IG|IGH|None|00 +CGAGCCCAGCACTGGAAGTCGCCGGTGTTTCCATTCGGTGATCATCACTGAACACAGAGGACTCACC +>128|IGHV3-33 ENST00000631807|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGCAATAAATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>129|IGHV3-35 ENST00000390617|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>130|IGHV3-35 ENST00000390617|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGA +>131|IGHV3-35 ENST00000632225|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>132|IGHV3-35 ENST00000632225|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGAAA +>133|IGHV3-38 ENST00000390618|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>134|IGHV3-38 ENST00000390618|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATAT +>135|IGHV3-38 ENST00000631785|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>136|IGHV3-38 ENST00000631785|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATATA +>137|IGHV3-43 ENST00000434710|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>138|IGHV3-43 ENST00000434710|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGAT +>139|IGHV3-43 ENST00000633040|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>140|IGHV3-43 ENST00000633040|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGATA +>141|IGHV3-48 ENST00000390624|IGHV3-48|5'UTR|IG|IGH|None|00 +AGCTCTCAGAGAGGTGCCTTAGCCCTGGATTCCAAGGCATTTCCACTTGGTGATCAGCACTGAACACAGAGGACTCACC +>142|IGHV3-48 ENST00000390624|IGHV3-48|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGTGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGTTATGAAATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTGGTAGTACCATATACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTTTATTACTGTGCGAGAGA +>143|IGHV3-49 ENST00000390625|IGHV3-49|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCGTGAGATTCCCAGGAGTTTCCACTTGGTGATCAGCACTGAACACAGACCACCAACC +>144|IGHV3-49 ENST00000390625|IGHV3-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTTAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAATGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCAGGGCGGTCCCTGAGACTCTCCTGTACAGCTTCTGGATTCACCTTTGGTGATTATGCTATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTAGGTTTCATTAGAAGCAAAGCTTATGGTGGGACAACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGCATCGCCTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACTAGAGA +>145|IGHV3-53 ENST00000390627|IGHV3-53|5'UTR|IG|IGH|None|00 +AATACCAATCTCCCCCAGGACACTTCATCTGCACGGAGCCCGGCCTCTCCTCAGATGTCCCACCCCAGAGCTTGCTATATAGTCGGGGACATGCAAATAGGGCCCTCCCTCTGCTGATGAAAACCAGCCCAGCTGACCCTGCAGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>146|IGHV3-53 ENST00000390627|IGHV3-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTTGGCTGAGCTGGGTTTTCCTTGTTGCTATTTCAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGACTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>147|IGHV3-64 ENST00000454421|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>148|IGHV3-64 ENST00000454421|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGA +>149|IGHV3-64 ENST00000631710|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>150|IGHV3-64 ENST00000631710|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGAGA +>151|IGHV3-64D ENST00000632099|IGHV3-64D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTCTGGCTGAGCTGGGTTCTCCTTGTTGCCATTTTAAAAGATGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTTCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATACTACGCAGACTCCGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAGCAGTCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGAAAGA +>152|IGHV3-66 ENST00000390632|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>153|IGHV3-66 ENST00000390632|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGA +>154|IGHV3-66 ENST00000632846|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>155|IGHV3-66 ENST00000632846|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>156|IGHV3-7 ENST00000390598|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>157|IGHV3-7 ENST00000390598|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGA +>158|IGHV3-7 ENST00000633988|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>159|IGHV3-7 ENST00000633988|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>160|IGHV3-72 ENST00000433072|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>161|IGHV3-72 ENST00000433072|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGA +>162|IGHV3-72 ENST00000633602|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>163|IGHV3-72 ENST00000633602|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGAGA +>164|IGHV3-73 ENST00000390636|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>165|IGHV3-73 ENST00000390636|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGA +>166|IGHV3-73 ENST00000631708|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>167|IGHV3-73 ENST00000631708|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGACA +>168|IGHV3-74 ENST00000424969|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>169|IGHV3-74 ENST00000424969|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>170|IGHV3-74 ENST00000633987|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>171|IGHV3-74 ENST00000633987|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>172|IGHV3/OR15-7 ENST00000558565|IGHV3/OR15-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGTTCTCTGAGACTCTCATGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGAGCTGGGTCCGCCAGGCTCAAGGGAAAGGGCTAGAGTTGGTAGGTTTAATAAGAAACAAAGCTAACAGTTACACGACAGAATATGCTGCGTCTGTGAAAGGCAGACTTACCATCTCAAGAGAGGATTCAAAGAACACGCTGTATCTGCAAATGAGCAACCTGAAAACCGAGGACTTGGCCGTGTATTACTGTGCTAGAGA +>173|IGHV3/OR16-10 ENST00000425181|IGHV3/OR16-10|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGCTATATTAAAAGGTGTCCAGTGTGAGGTTCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACATCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGGCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTTCGCCAGGCTCCAGGAAAAGGTCTGGAGTGGGTATCAGCTATTGGTACTGGTGGTGGCACATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACATGGCTGTGTATTACTGTGCAAGAGA +>174|IGHV3/OR16-12 ENST00000570121|IGHV3/OR16-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGAGCTCAGCTGGGTTTTCCTTGTTGCTATTTTACAAGGTGTCCACTGTGAGGTGCAGCTGGTAGAGTCTGGGAGAGGCTTGGCCCAGCCTGGGGGGTACCTAAAACTCTCCGGTGCAGCCTCTGGATTCACCGTCGGTAGCTGGTACATGAGCTGGATCCACCAGGCTCCAGGGAAGGGTCTGGAGTGGGTCTCATACATTAGTAGTAGTGGTTGTAGCACAAACTACGCAGACTCTGTGAAGGGCAGATTCACCATCTCCACAGACAACTCAAAGAACACGCTCTACCTGCAAATGAACAGCCTGAGAGTGGAGGACACGGCCGTGTATTACTGTGCAAGAGA +>175|IGHV3/OR16-13 ENST00000562905|IGHV3/OR16-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCAGACTCCATGAAGGGCCAATTCACCATCTCCAGAGACAATGCTAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACATGGCTGTGTATTACTGTACTAGAGA +>176|IGHV3/OR16-8 ENST00000565407|IGHV3/OR16-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAACTGGGTTTTCCTTGTTGCTATTATAAAAGGTGCCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTGTCCTGTCCAGCCTCTGGATTCACCTTCAGTAACCACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACATTAGTGGTGATAGTGGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGGGACAACGCCAATAACTCACCGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGA +>178|IGHV4-28 ENST00000390612|IGHV4-28|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCTGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>179|IGHV4-28 ENST00000390612|IGHV4-28|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTACAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGACACCCTGTCCCTCACCTGCGCTGTCTCTGGTTACTCCATCAGCAGTAGTAACTGGTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTACATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATGTCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGTGGACACGGCCGTGTATTACTGTGCGAGAAA +>180|IGHV4-30-2 ENST00000632151|IGHV4-30-2|5'UTR|IG|IGH|None|00 +ACTTTCTGAGAGTCCTGGACCTCCTGCACAAGAAC +>181|IGHV4-30-2 ENST00000632151|IGHV4-30-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>182|IGHV4-31 ENST00000438142|IGHV4-31|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>183|IGHV4-31 ENST00000438142|IGHV4-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>184|IGHV4-34 ENST00000390616|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>185|IGHV4-34 ENST00000390616|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGA +>186|IGHV4-34 ENST00000612474|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>187|IGHV4-34 ENST00000612474|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGAGG +>188|IGHV4-39 ENST00000390619|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>189|IGHV4-39 ENST00000390619|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGA +>190|IGHV4-39 ENST00000633618|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>191|IGHV4-39 ENST00000633618|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGACA +>192|IGHV4-4 ENST00000455737|IGHV4-4|5'UTR|IG|IGH|None|00 +AAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCATGGACCTCCTGCACAAGAAC +>193|IGHV4-4 ENST00000455737|IGHV4-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCTCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGGGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGTTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>194|IGHV4-59 ENST00000390629|IGHV4-59|5'UTR|IG|IGH|None|00 +TTTTCACCTCTCCATACAAAGGCACCACCCACATGCAAATCCTCACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>195|IGHV4-59 ENST00000390629|IGHV4-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACATCTGTGGTTCTTCCTTCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>196|IGHV4-61 ENST00000390630|IGHV4-61|5'UTR|IG|IGH|None|00 +ACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>197|IGHV4-61 ENST00000390630|IGHV4-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCGTCAGCAGTGGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>198|IGHV4/OR15-8 ENST00000557788|IGHV4/OR15-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTTCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGTTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGCTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCCCCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACAGGGCCGTGTATTACTGTGCGAGAGA +>199|IGHV5-10-1 ENST00000632950|IGHV5-10-1|5'UTR|IG|IGH|None|00 +AGTCTCCTTCACCACCCAGCTGGGATCTCAGGGCTTCCTTTTCTGTCCTCCTCCAGG +>200|IGHV5-10-1 ENST00000632950|IGHV5-10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAAGTGCAGCTGGTGCAGTCCGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAGGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCAGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGAGGATTGATCCTAGTGACTCTTATACCAACTACAGCCCGTCCTTCCAAGGCCACGTCACCATCTCAGCTGACAAGTCCATCAGCACTGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>201|IGHV5-51 ENST00000390626|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>202|IGHV5-51 ENST00000390626|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGA +>203|IGHV5-51 ENST00000620764|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>204|IGHV5-51 ENST00000620764|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>205|IGHV6-1 ENST00000390593|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>206|IGHV6-1 ENST00000390593|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>207|IGHV6-1 ENST00000633299|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>208|IGHV6-1 ENST00000633299|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>209|IGHV7-4-1 ENST00000631943|IGHV7-4-1|5'UTR|IG|IGH|None|00 +ACAACCACACCCCTCCTAAGAAGAAGCCCCTAGACCACAGCTCCACACC +>210|IGHV7-4-1 ENST00000631943|IGHV7-4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAATCTGGGTCTGAGTTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGAATTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACACCAACACTGGGAACCCAACGTATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCTTGGACACCTCTGTCAGCACGGCATATCTGCAGATCTGCAGCCTAAAGGCTGAGGACACTGCCGTGTATTACTGTGCGAGAGA +>211|IGHV7-81 ENST00000390639|IGHV7-81|5'UTR|IG|IGH|None|00 +ACCCAACAACAACATCCCTCCTTGGGAGAATCCCCTAGAGCACAGCTCCTCACC +>212|IGHV7-81 ENST00000390639|IGHV7-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTCTTCTTGGTGGCAGCAGCAACAGGTACCTACTCCCAGGTGCAGCTGGTGCAGTCTGGCCATGAGGTGAAGCAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACAGTTTCACCACCTATGGTATGAATTGGGTGCCACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGTTCAACACCTACACTGGGAACCCAACATATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCATGGACACCTCTGCCAGCACAGCATACCTGCAGATCAGCAGCCTAAAGGCTGAGGACATGGCCATGTATTACTGTGCGAGA +>213|IGKC ENST00000390237|IGKC|C-REGION|IG|IGK|None|00 +GAACTGTGGCTGCACCATCTGTCTTCATCTTCCCGCCATCTGATGAGCAGTTGAAATCTGGAACTGCCTCTGTTGTGTGCCTGCTGAATAACTTCTATCCCAGAGAGGCCAAAGTACAGTGGAAGGTGGATAACGCCCTCCAATCGGGTAACTCCCAGGAGAGTGTCACAGAGCAGGACAGCAAGGACAGCACCTACAGCCTCAGCAGCACCCTGACGCTGAGCAAAGCAGACTACGAGAAACACAAAGTCTACGCCTGCGAAGTCACCCATCAGGGCCTGAGCTCGCCCGTCACAAAGAGCTTCAACAGGGGAGAGTGT +>214|IGKJ1 ENST00000390242|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGCCAAGGGACCAAGGTGGAAATCAAAC +>215|IGKJ2 ENST00000390241|IGKJ2|J-REGION|IG|IGK|None|00 +TGTGCAGTTTTGGCCAGGGGACCAAGCTGGAGATCAAAC +>216|IGKJ3 ENST00000390240|IGKJ3|J-REGION|IG|IGK|None|00 +ATTCACTTTCGGCCCTGGGACCAAAGTGGATATCAAAC +>217|IGKJ4 ENST00000390239|IGKJ4|J-REGION|IG|IGK|None|00 +CTCACTTTCGGCGGAGGGACCAAGGTGGAGATCAAAC +>218|IGKJ5 ENST00000390238|IGKJ5|J-REGION|IG|IGK|None|00 +GATCACCTTCGGCCAAGGGACACGACTGGAGATTAAAC +>219|IGKV1-12 ENST00000480492|IGKV1-12|5'UTR|IG|IGK|None|00 +AGGCTGATCACACCCTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>220|IGKV1-12 ENST00000480492|IGKV1-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>221|IGKV1-16 ENST00000479981|IGKV1-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>222|IGKV1-16 ENST00000479981|IGKV1-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGAGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAAGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>223|IGKV1-17 ENST00000490686|IGKV1-17|5'UTR|IG|IGK|None|00 +AGGAATCAGTCCCACTCAGGACACAGC +>224|IGKV1-17 ENST00000490686|IGKV1-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGGTGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCGCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>225|IGKV1-27 ENST00000498435|IGKV1-27|5'UTR|IG|IGK|None|00 +GTGCAGAAGTCTCTCTCAGTCAGGACACAGC +>226|IGKV1-27 ENST00000498435|IGKV1-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGACTCCTGCTGCTCTGGCTCCCAGATACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTATCAGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAATCAGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCAAAAGTATAACAGTGCCCCT +>227|IGKV1-33 ENST00000473726|IGKV1-33|5'UTR|IG|IGK|None|00 +GTGCAGGAGTCAGTCCCAACCAGGACACAGC +>228|IGKV1-33 ENST00000473726|IGKV1-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>229|IGKV1-37 ENST00000465170|IGKV1-37|5'UTR|IG|IGK|None|00 +AGGCTGGTCACACCCCGTGCAGCAGTCAGTCCCAGTCAGGACACAGC +>230|IGKV1-37 ENST00000465170|IGKV1-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCT +>231|IGKV1-39 ENST00000498574|IGKV1-39|5'UTR|IG|IGK|None|00 +GGGCTGGTCGCACCCTGTGCAGGAGTCAGTCTCAGTCAGGACACAGC +>232|IGKV1-39 ENST00000498574|IGKV1-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCT +>233|IGKV1-5 ENST00000496168|IGKV1-5|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCCCTGAAGCCTTATTAATAGGCTGGTCACACTTTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>234|IGKV1-5 ENST00000496168|IGKV1-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAAATGTGACATCCAGATGACCCAGTCTCCTTCCACCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGAGTATTAGTAGCTGGTTGGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATAAGGCGTCTAGTTTAGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACCATCAGCAGCCTGCAGCCTGATGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTATTCT +>235|IGKV1-6 ENST00000464162|IGKV1-6|5'UTR|IG|IGK|None|00 +GCAGGAGTCAGACCCACTCAGGACACAGC +>236|IGKV1-6 ENST00000464162|IGKV1-6|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTTGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTACAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGCACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAAGATTACAATTACCCT +>237|IGKV1-8 ENST00000495489|IGKV1-8|5'UTR|IG|IGK|None|00 +AGGCTGGACACACTTCATGCAGGAGTCAGACCCTGTCAGGACACAGCATAGAC +>238|IGKV1-8 ENST00000495489|IGKV1-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATCCTCATTCTCTGCATCTACAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTACCCT +>239|IGKV1-9 ENST00000493819|IGKV1-9|5'UTR|IG|IGK|None|00 +AGACTTCTTAATAGGCTGGTCACACCTGTGCAGGAGTCAGTCCCAGTCAGGACACAGC +>240|IGKV1-9 ENST00000493819|IGKV1-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTTCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGCTTAATAGTTACCCT +>241|IGKV1/OR2-108 ENST00000453673|IGKV1/OR2-108|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCGAGGTGCCAGATGTGACATCCAGGTGACCCAGTCTCCATCTTCCCTGTCTGCGTCTGTAGGAGACAGAGTCACCATCACCTGCCGGGCAAGTCAGGGCATTAGCAATGGGTTATCCTGGTATCAGCAGAAACCAGGGCAAGCCCCTACGCTCCTGATCTATGCTGCATCCAGTTTGCAGTCGGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCTACAGGATTATACTACCCCATT +>242|IGKV1D-12 ENST00000377032|IGKV1D-12|5'UTR|IG|IGK|None|00 +AGACCCACTCAGGACACAGC +>243|IGKV1D-12 ENST00000377032|IGKV1D-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>244|IGKV1D-13 ENST00000611391|IGKV1D-13|5'UTR|IG|IGK|None|00 +GAGTCAGACCCACTCAGGACACAGC +>245|IGKV1D-13 ENST00000611391|IGKV1D-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTTCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGCAGTGCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGATGCCTCCAGTTTGGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTTTAATAGTTACCCT +>246|IGKV1D-16 ENST00000492446|IGKV1D-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>247|IGKV1D-16 ENST00000492446|IGKV1D-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGAGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>248|IGKV1D-17 ENST00000483379|IGKV1D-17|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGCTGCTGAGTTACTGAGATGAGCCAGCCCTGCAGCTGCGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCATAGCCTCCTGCCCTGAAGCCTTATTAATAGGCTGGACACACTTCATGGAGGAATCAGTCCCACTCAGGACACAGC +>249|IGKV1D-17 ENST00000483379|IGKV1D-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTAACATCCAGATGACCCAGTCTCCATCTGCCATGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGGCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGTCCCTAAGCACCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>250|IGKV1D-33 ENST00000390265|IGKV1D-33|5'UTR|IG|IGK|None|00 +ATGTTCGCAGAGCACAGCCCCCTGCCCTGAAGACTTATTAATAGGCTGGTCGCACCCTGTGCAGGAGTCAGTCCCAACCAGGACACAGC +>251|IGKV1D-33 ENST00000390265|IGKV1D-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>252|IGKV1D-37 ENST00000509129|IGKV1D-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCTCC +>253|IGKV1D-39 ENST00000448155|IGKV1D-39|5'UTR|IG|IGK|None|00 +GTCAGTCTCAGTCAGGACACAGC +>254|IGKV1D-39 ENST00000448155|IGKV1D-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCTCC +>255|IGKV1D-42 ENST00000390278|IGKV1D-42|5'UTR|IG|IGK|None|00 +AGTCCCAGTCAGGACACAGC +>256|IGKV1D-42 ENST00000390278|IGKV1D-42|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGTCAGATTTGACATCCAGATGACCCAGTCTCCATCTTTCCTGTCTGCATCTGTAGGAGACAGAGTCAGTATCATTTGCTGGGCAAGTGAGGGCATTAGCAGTAATTTAGCCTGGTATCTGCAGAAACCAGGGAAATCCCCTAAGCTCTTCCTCTATGATGCAAAAGATTTGCACCCTGGGGTCTCATCGAGGTTCAGTGGCAGGGGATCTGGGACGGATTTCACTCTCACCATCATCAGCCTGAAGCCTGAAGATTTTGCAGCTTATTACTGTAAACAGGACTTCAGTTACCCTCC +>257|IGKV1D-43 ENST00000468879|IGKV1D-43|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAACCAGCCCTGCAGCTGTGCCCAGCCTGCCTTGCCCCCTGCTAATTTGCATGTTCCCAGAGCACATCCTCCTACCCTGAAGACTTATTAATGCGCTGGTCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>258|IGKV1D-43 ENST00000468879|IGKV1D-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTGCCCGCTCAGCGCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATTCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCTGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGCAAAAGCCCCTAAGCTCTTCATCTATTATGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTACCCCT +>259|IGKV1D-8 ENST00000471857|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>260|IGKV1D-8 ENST00000471857|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>261|IGKV1D-8 ENST00000628219|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>262|IGKV1D-8 ENST00000628219|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGTCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGTTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>263|IGKV2-24 ENST00000484817|IGKV2-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>264|IGKV2-24 ENST00000484817|IGKV2-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCACCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGATTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCATGCAAGCTACACAATTTCCT +>265|IGKV2-28 ENST00000482769|IGKV2-28|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>266|IGKV2-28 ENST00000482769|IGKV2-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>267|IGKV2-30 ENST00000468494|IGKV2-30|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>268|IGKV2-30 ENST00000468494|IGKV2-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACCGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>270|IGKV2D-24 ENST00000462693|IGKV2D-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>271|IGKV2D-24 ENST00000462693|IGKV2D-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCGCCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTTCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGGTTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCACGCAAGCTACACAATTTCCT +>272|IGKV2D-26 ENST00000390268|IGKV2D-26|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACT +>273|IGKV2D-26 ENST00000390268|IGKV2D-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCTTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGCAGAGATTGTGATGACCCAGACTCCACTCTCCTTGTCTATCACCCCTGGAGAGCAGGCCTCCATGTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTGATGGATACACCTATTTGTATTGGTTTCTGCAGAAAGCCAGGCCAGTCTCCACGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATTTTGGAGTTTATTACTGCATGCAAGATGCACAAGATCCT +>274|IGKV2D-28 ENST00000453166|IGKV2D-28|5'UTR|IG|IGK|None|00 +TTGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>275|IGKV2D-28 ENST00000453166|IGKV2D-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>276|IGKV2D-29 ENST00000491977|IGKV2D-29|5'UTR|IG|IGK|None|00 +GATCAGGACTTCTCAGTTCATCTTCTCACC +>277|IGKV2D-29 ENST00000491977|IGKV2D-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGATACCTGGATCCAGTGCAGATATTGTGATGACCCAGACTCCACTCTCTCTGTCCGTCACCCCTGGACAGCCGGCCTCCATCTCCTGCAAGTCTAGTCAGAGCCTCCTGCATAGTGATGGAAAGACCTATTTGTATTGGTACCTGCAGAAGCCAGGCCAGCCTCCACAGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAAGTATACAGCTTCCT +>278|IGKV2D-30 ENST00000474213|IGKV2D-30|5'UTR|IG|IGK|None|00 +TGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>279|IGKV2D-30 ENST00000474213|IGKV2D-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACTGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>280|IGKV2D-40 ENST00000429992|IGKV2D-40|L-REGION+V-REGION|IG|IGK|None|00 +ATGCTCTGGGTCCCTGGATCCAGTGAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTC +>281|IGKV3-11 ENST00000483158|IGKV3-11|5'UTR|IG|IGK|None|00 +GTCAGAGCCCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>282|IGKV3-11 ENST00000483158|IGKV3-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAACAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCCT +>283|IGKV3-15 ENST00000390252|IGKV3-15|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>284|IGKV3-15 ENST00000390252|IGKV3-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGTATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCAGCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCT +>285|IGKV3-20 ENST00000492167|IGKV3-20|5'UTR|IG|IGK|None|00 +CCTGGGTCAGAGCTCTGGAGAAGAGCTGCTCAGTTAGGACCCAGAGGGAACC +>286|IGKV3-20 ENST00000492167|IGKV3-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGGCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>287|IGKV3-7 ENST00000390247|IGKV3-7|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCCCTGGGAAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>288|IGKV3-7 ENST00000390247|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCAGAGAAATTGTAATGACACAGTCTCCACCCACCCTGTCTTTGTCTCCAGGGGAAAGAGTCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAACCTGGTATCAGCAGAAACCTGGCCAGGCGCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTAGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCT +>289|IGKV3/OR2-268 ENST00000421835|IGKV3/OR2-268|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCACAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>290|IGKV3D-11 ENST00000390277|IGKV3D-11|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>291|IGKV3D-11 ENST00000390277|IGKV3D-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGCCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCATCC +>292|IGKV3D-15 ENST00000417279|IGKV3D-15|5'UTR|IG|IGK|None|00 +GGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>293|IGKV3D-15 ENST00000417279|IGKV3D-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCATCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCATCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCTCC +>294|IGKV3D-20 ENST00000390270|IGKV3D-20|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCCGCCCTGCAGTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>295|IGKV3D-20 ENST00000390270|IGKV3D-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCGGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCTGGCGCCCAGGCTCCTCATCTATGATGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>296|IGKV3D-7 ENST00000443397|IGKV3D-7|5'UTR|IG|IGK|None|00 +GAGGAACTGCTCAGTTAGGACCCAG +>297|IGKV3D-7 ENST00000443397|IGKV3D-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAACCATGGAAGCCCCAGCACAGCTTCTTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>298|IGKV4-1 ENST00000390243|IGKV4-1|5'UTR|IG|IGK|None|00 +TTTGGCTCTTGATTTACATTGGGTACTTTCACAACCCACTGCTCATGAAATTTGCTTTTGTACTCACTGGTTGTTTTTGCATAGGCCCCTCCAGGCCACGACCAGCTGTTTGGATTTTATAAACGGGCCGTTTGCATTGTGAACTGAGCTACAACAGGCAGGCAGGGGCAGCAAG +>299|IGKV4-1 ENST00000390243|IGKV4-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTTGCAGACCCAGGTCTTCATTTCTCTGTTGCTCTGGATCTCTGGTGCCTACGGGGACATCGTGATGACCCAGTCTCCAGACTCCCTGGCTGTGTCTCTGGGCGAGAGGGCCACCATCAACTGCAAGTCCAGCCAGAGTGTTTTATACAGCTCCAACAATAAGAACTACTTAGCTTGGTACCAGCAGAAACCAGGACAGCCTCCTAAGCTGCTCATTTACTGGGCATCTACCCGGGAATCCGGGGTCCCTGACCGATTCAGTGGCAGCGGGTCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGGCTGAAGATGTGGCAGTTTATTACTGTCAGCAATATTATAGTACTCCT +>300|IGKV5-2 ENST00000390244|IGKV5-2|5'UTR|IG|IGK|None|00 +ATAAAATCTGTGCTGTCAAACTGATTAGGAACTGACTACCACCTGCAGGTCAGGGCCAAGGTT +>301|IGKV5-2 ENST00000390244|IGKV5-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGGTCCCAGGTTCACCTCCTCAGCTTCCTCCTCCTTTGGATCTCTGATACCAGGGCAGAAACGACACTCACGCAGTCTCCAGCATTCATGTCAGCGACTCCAGGAGACAAAGTCAACATCTCCTGCAAAGCCAGCCAAGACATTGATGATGATATGAACTGGTACCAACAGAAACCAGGAGAAGCTGCTATTTTCATTATTCAAGAAGCTACTACTCTCGTTCCTGGAATCCCACCTCGATTCAGTGGCAGCGGGTATGGAACAGATTTTACCCTCACAATTAATAACATAGAATCTGAGGATGCTGCATATTACTTCTGTCTACAACATGATAATTTCCCT +>302|IGKV6-21 ENST00000390256|IGKV6-21|5'UTR|IG|IGK|None|00 +ATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>303|IGKV6-21 ENST00000390256|IGKV6-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTTGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCTTCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAACGTATTACTGTCATCAGAGTAGTAGTTTACCT +>304|IGKV6D-21 ENST00000436451|IGKV6D-21|5'UTR|IG|IGK|None|00 +GGTATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>305|IGKV6D-21 ENST00000436451|IGKV6D-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTCGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAGCGTATTACTGTCATCAGAGTAGTAGTTTACCT +>306|IGKV6D-41 ENST00000390271|IGKV6D-41|5'UTR|IG|IGK|None|00 +AGCAAAACTGAAGTCAAAACACTGAG +>307|IGKV6D-41 ENST00000390271|IGKV6D-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCCCGTTGCAATTCCTGCGGCTTCTGCTCCTCTGGGTTCCAGCCTCCAGGGGTGATGTTGTGATGACACAGTCTCCAGCTTTCCTCTCTGTGACTCCAGGGGAGAAAGTCACCATCACCTGCCAGGCCAGTGAAGGCATTGGCAACTACTTATACTGGTACCAGCAGAAACCAGATCAAGCCCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCTTTACCATCAGTAGCCTGGAAGCTGAAGATGCTGCAACATATTACTGTCAGCAGGGCAATAAGCACCCT +>308|IGLC1 ENST00000390321|IGLC1|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCCAACCCCACTGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTCCAAGCCAACAAGGCCACACTAGTGTGTCTGATCAGTGACTTCTACCCGGGAGCTGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCAAACCCTCCAAACAGAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>309|IGLC2 ENST00000390323|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTATCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>310|IGLC3 ENST00000390325|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAAAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>311|IGLC7 ENST00000390331|IGLC7|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCGTAAGTGACTTCAACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGTGGGAGTGGAGACCACCAAACCCTCCAAACAAAGCAACAACAAGTATGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCGGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTGCAGAATGCTCT +>312|IGLJ1 ENST00000390320|IGLJ1|J-REGION|IG|IGL|None|00 +TTATGTCTTCGGAACTGGGACCAAGGTCACCGTCCTAG +>313|IGLJ2 ENST00000390322|IGLJ2|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTCATGAGCAG +>314|IGLJ2 ENST00000390322|IGLJ2|J-REGION|IG|IGL|None|00 +TGTGGTATTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>315|IGLJ3 ENST00000390324|IGLJ3|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTC +>316|IGLJ3 ENST00000390324|IGLJ3|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>317|IGLJ4 ENST00000390326|IGLJ4|J-REGION|IG|IGL|None|00 +GTATTTGGTGGAGGAACCCAGCTGATCATTTTA +>318|IGLJ5 ENST00000390327|IGLJ5|J-REGION|IG|IGL|None|00 +CAGAGAGGGTTTTTGTATGAGCCTGTGTCACAGCACTGGGTGTTTGGTGAGGGGACCGAGCTGACCGTCCTA +>319|IGLJ6 ENST00000390328|IGLJ6|J-REGION|IG|IGL|None|00 +GGAGGGTTTGTGTGCAGGGTTATATCACAGTGTAATGTGTTCGGCAGTGGCACCAAGGTGACCGTCCTCG +>320|IGLJ7 ENST00000390330|IGLJ7|J-REGION|IG|IGL|None|00 +TCACTGTGTGCTGTGTTCGGAGGAGGCACCCAGCTGACCGTCCTCG +>321|IGLV1-36 ENST00000390301|IGLV1-36|5'UTR|IG|IGL|None|00 +GCTGCGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>322|IGLV1-36 ENST00000390301|IGLV1-36|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCCCCTCTCTTCCTCACCCTCATCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCGGTGTCTGAAGCCCCCAGGCAGAGGGTCACCATCTCCTGTTCTGGAAGCAGCTCCAACATCGGAAATAATGCTGTAAACTGGTACCAGCAGCTCCCAGGAAAGGCTCCCAAACTCCTCATCTATTATGATGATCTGCTGCCCTCAGGGGTCTCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>323|IGLV1-40 ENST00000390299|IGLV1-40|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAAGAGGCAGCACTCAGGACAATCTCCAGC +>324|IGLV1-40 ENST00000390299|IGLV1-40|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTCCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATCGGGGCAGGTTATGATGTACACTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCCAGTCCTATGACAGCAGCCTGAGTGGTTC +>325|IGLV1-44 ENST00000390297|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>326|IGLV1-44 ENST00000390297|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>327|IGLV1-44 ENST00000628287|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>328|IGLV1-44 ENST00000628287|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTC +>329|IGLV1-47 ENST00000390294|IGLV1-47|5'UTR|IG|IGL|None|00 +GGGGAAGCTCAGCTTCAGCTGTGGTAGAGAAGACAGGATTCAGGACAATCTCCAGC +>330|IGLV1-47 ENST00000390294|IGLV1-47|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCGGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATTATGTATACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCGGTCCGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAGTGGT +>331|IGLV1-50 ENST00000390291|IGLV1-50|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAGGAGGCAGCACTCAGGACAATCTCCAGC +>332|IGLV1-50 ENST00000390291|IGLV1-50|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTTCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATTGGGGCGGGTTATGTTGTACATTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCAATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGACTCCAGTCTGAGGATGAGGCTGATTATTACTGCAAAGCATGGGATAACAGCCTGAATGCT +>333|IGLV1-51 ENST00000390290|IGLV1-51|5'UTR|IG|IGL|None|00 +TGAGCGCAGAAGGCAGGACTCGGGACAATCTTCATC +>334|IGLV1-51 ENST00000390290|IGLV1-51|L-REGION+V-REGION|IG|IGL|None|00 +ATGACCTGCTCCCCTCTCCTCCTCACCCTTCTCATTCACTGCACAGGGTCCTGGGCCCAGTCTGTGTTGACGCAGCCGCCCTCAGTGTCTGCGGCCCCAGGACAGAAGGTCACCATCTCCTGCTCTGGAAGCAGCTCCAACATTGGGAATAATTATGTATCCTGGTACCAGCAGCTCCCAGGAACAGCCCCCAAACTCCTCATTTATGACAATAATAAGCGACCCTCAGGGATTCCTGACCGATTCTCTGGCTCCAAGTCTGGCACGTCAGCCACCCTGGGCATCACCGGACTCCAGACTGGGGACGAGGCCGATTATTACTGCGGAACATGGGATAGCAGCCTGAGTGCTGG +>335|IGLV10-54 ENST00000390287|IGLV10-54|5'UTR|IG|IGL|None|00 +GGGAATCTGCACC +>336|IGLV10-54 ENST00000390287|IGLV10-54|L-REGION+V-REGION|IG|IGL|None|00 +ATGCCCTGGGCTCTGCTCCTCCTGACCCTCCTCACTCACTCTGCAGTGTCAGTGGTCCAGGCAGGGCTGACTCAGCCACCCTCGGTGTCCAAGGGCTTGAGACAGACCGCCACACTCACCTGCACTGGGAACAGCAACATTGTTGGCAACCAAGGAGCAGCTTGGCTGCAGCAGCACCAGGGCCACCCTCCCAAACTCCTATCCTACAGGAATAACAACCGGCCCTCAGGGATCTCAGAGAGATTCTCTGCATCCAGGTCAGGAAACACAGCCTCCCTGACCATTACTGGACTCCAGCCTGAGGACGAGGCTGACTATTACTGCTCAGCATTGGACAGCAGCCTCAGTGCTC +>337|IGLV11-55 ENST00000390286|IGLV11-55|5'UTR|IG|IGL|None|00 +GCTGTGTCCACT +>338|IGLV11-55 ENST00000390286|IGLV11-55|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCCTGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCGGCCCGTGCTGACTCAGCCGCCCTCCCTGTCTGCATCCCCGGGAGCAACAGCCAGACTCCCCTGCACCCTGAGCAGTGACCTCAGTGTTGGTGGTAAAAACATGTTCTGGTACCAGCAGAAGCTAGGGAGCTCTCCCAGGTTATTCCTGTATCACTACTCAGACTCAGACAAGCAGCTGGGACCTGGGGTCCCCAGTCGAGTCTCTGGCTCCAAGGAGACCTCAAGTAACACAGCGTTTTTGCTCATCTCTGGGCTCCAGCCTGAGGACGAGGCCGATTATTACTGCCAGGTGTACGAAAGTAGTGCTAAT +>339|IGLV2-11 ENST00000390314|IGLV2-11|5'UTR|IG|IGL|None|00 +TGCTGGGGTCTCAGGAGGCAGCACTCTCGGGACGTCTCCACC +>340|IGLV2-11 ENST00000390314|IGLV2-11|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCAGCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCGCTCAGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGATGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCTGCTCATATGCAGGCAGCTACACTTTCCACA +>341|IGLV2-14 ENST00000390312|IGLV2-14|5'UTR|IG|IGL|None|00 +GCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACATCTCCACC +>342|IGLV2-14 ENST00000390312|IGLV2-14|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTCATATACAAGCAGCAGCACTCTCCACAGTG +>343|IGLV2-18 ENST00000390310|IGLV2-18|5'UTR|IG|IGL|None|00 +GAATATCTCCACC +>344|IGLV2-18 ENST00000390310|IGLV2-18|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCCCTCCGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTAGTTATAACCGTGTCTCCTGGTACCAGCAGCCCCCAGGCACAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGGTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTTATATACAAGCAGCAGCACTTTC +>345|IGLV2-23 ENST00000390306|IGLV2-23|5'UTR|IG|IGL|None|00 +TCTCTGAGCCCAGGCCCACGTGAGGGTGGGGTGAGGAGAGGAGCCCAGGATGCTGATTTTCATGGAGGCCCCGCCCTCCTCTGAGGCAAAGGGGATAAGACAGGGCTGGGGCAGGGCCAGTGCTGGGGTCACAAGAGGCAGCGCTCTCGGGACGTCTCCACC +>346|IGLV2-23 ENST00000390306|IGLV2-23|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACTCTCCTCACTCAGGACACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGGAGTTATAACCTTGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGGCAGTAAGCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACAATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCTGCTCATATGCAG +>347|IGLV2-33 ENST00000390302|IGLV2-33|5'UTR|IG|IGL|None|00 +GGCTAGAGGCAGGCCCGGTGCTGGGGTCTCAAGGCAGCGCTCTCGGGACATCTCCACC +>348|IGLV2-33 ENST00000390302|IGLV2-33|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAATCTGCCCTGACTCAGCCTCCTTTTGTGTCCGGGGCTCCTGGACAGTCGGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGGGATTATGATCATGTCTTCTGGTACCAAAAGCGTCTCAGCACTACCTCCAGACTCCTGATTTACAATGTCAATACTCGGCCTTCAGGGATCTCTGACCTCTTCTCAGGCTCCAAGTCTGGCAACATGGCTTCCCTGACCATCTCTGGGCTCAAGTCCGAGGTTGAGGCTAATTATCACTGCAGCTTATATTCAAGTAGTTACACTTTC +>349|IGLV2-8 ENST00000620395|IGLV2-8|5'UTR|IG|IGL|None|00 +TCTCTAAGCCCAGGCCCAAGTGAGGGTGGGGTGAGAAGAGGAGCTCAGGATGCAGATTTGCATGGAGGTCCCGCCCTTCTCTGAGGCAGAGGGGATAAGACAGGGCTGGGGGCAGGCCCAGTGCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACGTCACCACC +>350|IGLV2-8 ENST00000620395|IGLV2-8|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTCCCTCCGCGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCGTCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCAGCTCATATGCAGGCAGCAACAATTTC +>351|IGLV3-1 ENST00000390319|IGLV3-1|5'UTR|IG|IGL|None|00 +AAGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGAGGTGCCTCAGCC +>352|IGLV3-1 ENST00000390319|IGLV3-1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGATCCCTCTCTTCCTCGGCGTCCTTGCTTACTGCACAGGATCCGTGGCCTCCTATGAGCTGACTCAGCCACCCTCAGTGTCCGTGTCCCCAGGACAGACAGCCAGCATCACCTGCTCTGGAGATAAATTGGGGGATAAATATGCTTGCTGGTATCAGCAGAAGCCAGGCCAGTCCCCTGTGCTGGTCATCTATCAAGATAGCAAGCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACAGCCACTCTGACCATCAGCGGGACCCAGGCTATGGATGAGGCTGACTATTACTGTCAGGCGTGGGACAGCAGCACTGCACACA +>353|IGLV3-10 ENST00000390315|IGLV3-10|5'UTR|IG|IGL|None|00 +GTGGGCTCAGGAGGCAGAGCTCTGGGAATCTCACC +>354|IGLV3-10 ENST00000390315|IGLV3-10|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTGCTCCCCCTCCTCACTTTCTGCACAGTCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAAACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGTCAGGCCAGGCCCCTGTGCTGGTCATCTATGAGGACAGCAAACGACCCTCCGGGATCCCTGAGAGATTCTCTGGCTCCAGCTCAGGGACAATGGCCACCTTGACTATCAGTGGGGCCCAGGTGGAGGATGAAGCTGACTACTACTGTTACTCAACAGACAGCAGTGGTAATCATAG +>355|IGLV3-12 ENST00000390313|IGLV3-12|5'UTR|IG|IGL|None|00 +GCCTCAGCC +>356|IGLV3-12 ENST00000390313|IGLV3-12|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTCCTCAGCCTCCTCGCTCACTGCACAGGCTCTGCGACCTCCTATGAGCTGACTCAGCCACACTCAGTGTCAGTGGCCACAGCACAGATGGCCAGGATCACCTGTGGGGGAAACAACATTGGAAGTAAAGCTGTGCACTGGTACCAGCAAAAGCCAGGCCAGGACCCTGTGCTGGTCATCTATAGCGATAGCAACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACCCAGGGAACACCGCCACCCTAACCATCAGCAGGATCGAGGCTGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGTAGTAGTGATCATCC +>357|IGLV3-16 ENST00000390311|IGLV3-16|5'UTR|IG|IGL|None|00 +TCTGTGGGTCCAGGAGGCACAGCTCTGGGAATCTCACC +>358|IGLV3-16 ENST00000390311|IGLV3-16|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCTAGGACAGATGGCCAGGATCACCTGCTCTGGAGAAGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGTTCCCTGTGCTGGTGATATATAAAGACAGCGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAATAGTCACATTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCTATCAGCAGACAGCAGTGGTACTTATCC +>359|IGLV3-19 ENST00000390309|IGLV3-19|5'UTR|IG|IGL|None|00 +AGCTGTGGGCTCAGAAGCAGAGTTCTGGGGTGTCTCCACC +>360|IGLV3-19 ENST00000390309|IGLV3-19|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCTGGCTCACTCTCCTCACTCTTTGCATAGGTTCTGTGGTTTCTTCTGAGCTGACTCAGGACCCTGCTGTGTCTGTGGCCTTGGGACAGACAGTCAGGATCACATGCCAAGGAGACAGCCTCAGAAGCTATTATGCAAGCTGGTACCAGCAGAAGCCAGGACAGGCCCCTGTACTTGTCATCTATGGTAAAAACAACCGGCCCTCAGGGATCCCAGACCGATTCTCTGGCTCCAGCTCAGGAAACACAGCTTCCTTGACCATCACTGGGGCTCAGGCGGAAGATGAGGCTGACTATTACTGTAACTCCCGGGACAGCAGTG +>361|IGLV3-21 ENST00000390308|IGLV3-21|5'UTR|IG|IGL|None|00 +GCACAGAGGAGCTGTGCCCTGGAATGGGGCCTGTACCTGTCCAAGGCTTGTGCCGTCCCCTGTGGGAGATGAGAAGCGTCCCTGCATTGGGCTCTTGGGGACCCGTCTTGGACATGAATCTCCTCCAGCAGCAGCCTCTGACTCTGCTGATTTGCATCATGGGCCGCTCTCTCCAGCAAGGGGATAAGAGAGGCCTGGGAGGAACCTGCTCAGTCTGGGCCTAAGGAAGCAGCACTGGTGGTGCCTCAGCC +>362|IGLV3-21 ENST00000390308|IGLV3-21|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGTTCTCCTCCTCGGCCTCCTCTCTCACTGCACAGGCTCTGTGACCTCCTATGTGCTGACTCAGCCACCCTCGGTGTCAGTGGCCCCAGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAGTGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCGTCTATGATGATAGCGACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACGGCCACCCTGACCATCAGCAGGGTCGAAGCCGGGGATGAGGCCGACTATTACTGTCAGGTGTGGGATAGTAGTAGTGATCATCCCACG +>363|IGLV3-22 ENST00000390307|IGLV3-22|5'UTR|IG|IGL|None|00 +AAGAGAGGCCTGGGAAGCCCAGCTGTGCTGTGGGCTCAGGAGGCAGAGCTGTGGGTGTCTCACC +>364|IGLV3-22 ENST00000390307|IGLV3-22|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGGCCACACTCCTGCTCCCACTCCTCAACCTCTACACAGGCTCTGTTGCCTCCTATGAGCTGACACAGCTACCCTCGGTGTCAGTGTCCCCAGGACAGACAGCCAGGATCACCTGCTCTGGAGATGTACTGGGGGAAAATTATGCTGACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGAGTTGGTGATATACGAAGATAGTGAGCGGTACCCTGGAATCCCTGAACGATTCTCTGGGTCCACCTCAGGGAACACGACCACCCTGACCATCAGCAGGGTCCTGACCGAAGACGAGGCTGACTATTACTGTTTGTCTGGGGATGAGGACAATCCCTCA +>365|IGLV3-25 ENST00000390305|IGLV3-25|5'UTR|IG|IGL|None|00 +GCTGTGCTGTGGGTCCAGGAGGCAGAACTCTGGGTGTCTCACC +>366|IGLV3-25 ENST00000390305|IGLV3-25|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTACTTCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAGACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAGCAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATATATAAAGACAGTGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAACAGTCACGTTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCAATCAGCAGACAGCAGTG +>367|IGLV3-27 ENST00000390304|IGLV3-27|5'UTR|IG|IGL|None|00 +GCTGTAGGCTCAGGAGGCAGAGCTCTGAATGTCTCACC +>368|IGLV3-27 ENST00000390304|IGLV3-27|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCATTCTCTGCACAGTCTCTGTGGCCTCCTATGAGCTGACACAGCCATCCTCAGTGTCAGTGTCTCCGGGACAGACAGCCAGGATCACCTGCTCAGGAGATGTACTGGCAAAAAAATATGCTCGGTGGTTCCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATTTATAAAGACAGTGAGCGGCCCTCAGGGATCCCTGAGCGATTCTCCGGCTCCAGCTCAGGGACCACAGTCACCTTGACCATCAGCGGGGCCCAGGTTGAGGATGAGGCTGACTATTACTGTTACTCTGCGGCTGACAACAAT +>369|IGLV3-32 ENST00000390303|IGLV3-32|5'UTR|IG|IGL|None|00 +GCTGTGGACTCAGAGGCAGAGCTCTGGGGCATTTCCATT +>370|IGLV3-32 ENST00000390303|IGLV3-32|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCCCCTGCTCGTCCTCACTCTCTGCACAGGCTCCGTTATTTCCTCTGGGCCAACTCAGGTGCCTGCAGTGTCTGTGGCCTTGGGACAAATGGCCAGGATCACCTGCCAGGGAGACAGCATGGAAGGCTCTTATGAACACTGGTACCAGCAGAAGCCAGGCCAGGCCCCCGTGCTGGTCATCTATGATAGCAGTGACCGGCCCTCAAGGATCCCTGAGCGATTCTCTGGCTCCAAATCAGGCAACACAACCACCCTGACCATCACTGGGGCCCAGGCTGAGGATGAGGCTGATTATTACTATCAGTTGATAGACAACCATGCTACTCAACT +>371|IGLV3-9 ENST00000390316|IGLV3-9|5'UTR|IG|IGL|None|00 +CTTGACTCTGCTGATTTGCATCACAGGCTGCTCTCTTCAGCAAGGGGATAAGAGAGGGCTGGAAGGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGGGGTGCCGCAGCC +>372|IGLV3-9 ENST00000390316|IGLV3-9|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGCTCTCCTTCTGAGCCTCCTTGCTCACTTTACAGGTTCTGTGGCCTCCTATGAGCTGACTCAGCCACTCTCAGTGTCAGTGGCCCTGGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAATGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCATCTATAGGGATAGCAACCGGCCCTCTGGGATCCCTGAGCGATTCTCTGGCTCCAACTCGGGGAACACGGCCACCCTGACCATCAGCAGAGCCCAAGCCGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGCAGCACTGCACACA +>373|IGLV4-3 ENST00000390318|IGLV4-3|5'UTR|IG|IGL|None|00 +CTCGAATAGAGCTCTTGGAAGTCCCTCCAACC +>374|IGLV4-3 ENST00000390318|IGLV4-3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGTCTCCTTCTACCTACTGCCCTTCATTTTCTCCACAGGTCTCTGTGCTCTGCCTGTGCTGACTCAGCCCCCGTCTGCATCTGCCTTGCTGGGAGCCTCGATCAAGCTCACCTGCACCCTAAGCAGTGAGCACAGCACCTACACCATCGAATGGTATCAACAGAGACCAGGGAGGTCCCCCCAGTATATAATGAAGGTTAAGAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCCGATCGCTTCATGGGCTCCAGTTCTGGGGCTGACCGCTACCTCACCTTCTCCAACCTCCAGTCTGACGATGAGGCTGAGTATCACTGTGGAGAGAGCCACACGATTGATGGCCAAGTCGGT +>375|IGLV4-60 ENST00000390284|IGLV4-60|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCACTCCTCCTCCTCTTCCCTCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCCTGTGCTGACTCAATCATCCTCTGCCTCTGCTTCCCTGGGATCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGTAGCTACATCATCGCATGGCATCAGCAGCAGCCAGGGAAGGCCCCTCGGTACTTGATGAAGCTTGAAGGTAGTGGAAGCTACAACAAGGGGAGCGGAGTTCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGACCGCTACCTCACCATCTCCAACCTCCAGTTTGAGGATGAGGCTGATTATTACTGTGAGACCTGGGACAGTAACACTCA +>376|IGLV4-69 ENST00000390282|IGLV4-69|5'UTR|IG|IGL|None|00 +AGGGTGGGTAAGAAATACCTGCAACTGTCAGCCTCAGCAGAGCTCTGGGGAGTCTGCACC +>377|IGLV4-69 ENST00000390282|IGLV4-69|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCTTGGACCCCACTCCTCTTCCTCACCCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCTTGTGCTGACTCAATCGCCCTCTGCCTCTGCCTCCCTGGGAGCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGCAGCTACGCCATCGCATGGCATCAGCAGCAGCCAGAGAAGGGCCCTCGGTACTTGATGAAGCTTAACAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGAGCGCTACCTCACCATCTCCAGCCTCCAGTCTGAGGATGAGGCTGACTATTACTGTCAGACCTGGGGCACTGGCATTCA +>378|IGLV5-37 ENST00000390300|IGLV5-37|5'UTR|IG|IGL|None|00 +CCACC +>379|IGLV5-37 ENST00000390300|IGLV5-37|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTTCTTCTCTTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCCTCCTCCGCATCTCCTGGAGAATCCGCCAGACTCACCTGCACCTTGCCCAGTGACATCAATGTTGGTAGCTACAACATATACTGGTACCAGCAGAAGCCAGGGAGCCCTCCCAGGTATCTCCTGTACTACTACTCAGACTCAGATAAGGGCCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAGCCAATACAGGGATTTTACTCATCTCCGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCCAAGCAATGCTTCT +>380|IGLV5-39 ENST00000630493|IGLV5-39|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGCCTGTGCTGACTCAGCCAACCTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGATTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCTTCCCCGGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAACCAATGCAGGCCTTTTACTCATCTCTGGGCTCCAGTCTGAAGATGAGGCTGACTATTACTGTGCCATTTGGTACAGCAGCACTTCT +>381|IGLV5-45 ENST00000390296|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>382|IGLV5-45 ENST00000390296|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGTGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>383|IGLV5-45 ENST00000626489|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>384|IGLV5-45 ENST00000626489|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>385|IGLV5-48 ENST00000390293|IGLV5-48|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTTCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCAACTTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGACTCACCTGCACCTTGCGCAGTGGCATCAGTGTTGGTAGCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCAGGTATCTCCTGAACTACTACTCAGACTCAGATAAGCACCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGACCAATGCAGGGATTTTATTCATCTCTGGGCTC +>386|IGLV5-52 ENST00000390289|IGLV5-52|5'UTR|IG|IGL|None|00 +CCACC +>387|IGLV5-52 ENST00000390289|IGLV5-52|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCTTCTCCTTCTCGTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCATCTTCCCATTCTGCATCTTCTGGAGCATCAGTCAGACTCACCTGCATGCTGAGCAGTGGCTTCAGTGTTGGGGACTTCTGGATAAGGTGGTACCAACAAAAGCCAGGGAACCCTCCCCGGTATCTCCTGTACTACCACTCAGACTCCAATAAGGGCCAAGGCTCTGGAGTTCCCAGCCGCTTCTCTGGATCCAACGATGCATCAGCCAATGCAGGGATTCTGCGTATCTCTGGGCTCCAGCCTGAGGATGAGGCTGACTATTACTGTGGTACATGGCACAGCAACTCTAAGACTCA +>388|IGLV6-57 ENST00000390285|IGLV6-57|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCACTACTTCTCACCCTCCTCGCTCACTGCACAGGTTCTTGGGCCAATTTTATGCTGACTCAGCCCCACTCTGTGTCGGAGTCTCCGGGGAAGACGGTAACCATCTCCTGCACCGGCAGCAGTGGCAGCATTGCCAGCAACTATGTGCAGTGGTACCAGCAGCGCCCGGGCAGTGCCCCCACCACTGTGATCTATGAGGATAACCAAAGACCCTCTGGGGTCCCTGATCGGTTCTCTGGCTCCATCGACAGCTCCTCCAACTCTGCCTCCCTCACCATCTCTGGACTGAAGACTGAGGACGAGGCTGACTACTACTGTCAGTCTTATGATAGCAGCAATCA +>389|IGLV7-43 ENST00000390298|IGLV7-43|5'UTR|IG|IGL|None|00 +TCTGGCGCCAGGGGTCCCTTCCAATATCAGCACC +>390|IGLV7-43 ENST00000390298|IGLV7-43|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCTCAGACTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGCTTCCAGCACTGGAGCAGTCACCAGTGGTTACTATCCAAACTGGTTCCAGCAGAAACCTGGACAAGCACCCAGGGCACTGATTTATAGTACAAGCAACAAACACTCCTGGACCCCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACACTGTCAGGTGTGCAGCCTGAGGACGAGGCTGAGTATTACTGCCTGCTCTACTATGGTGGTGCTCAG +>391|IGLV7-46 ENST00000390295|IGLV7-46|5'UTR|IG|IGL|None|00 +TCTGGCACCAGGGGTCCCTTCCAATATCAGCACC +>392|IGLV7-46 ENST00000390295|IGLV7-46|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCCCAGGCTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGGCTCCAGCACTGGAGCTGTCACCAGTGGTCATTATCCCTACTGGTTCCAGCAGAAGCCTGGCCAAGCCCCCAGGACACTGATTTATGATACAAGCAACAAACACTCCTGGACACCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACCCTTTTGGGTGCGCAGCCTGAGGATGAGGCTGAGTATTACTGCTTGCTCTCCTATAGTGGTGCTCGG +>393|IGLV8-61 ENST00000390283|IGLV8-61|5'UTR|IG|IGL|None|00 +GAGGAAAACAAACCCCAGCTGGGAAGCCTGAGAACACTTAGCCTTC +>394|IGLV8-61 ENST00000390283|IGLV8-61|L-REGION+V-REGION|IG|IGL|None|00 +ATGAGTGTCCCCACCATGGCCTGGATGATGCTTCTCCTCGGACTCCTTGCTTATGGATCAGGAGTGGATTCTCAGACTGTGGTGACCCAGGAGCCATCGTTCTCAGTGTCCCCTGGAGGGACAGTCACACTCACTTGTGGCTTGAGCTCTGGCTCAGTCTCTACTAGTTACTACCCCAGCTGGTACCAGCAGACCCCAGGCCAGGCTCCACGCACGCTCATCTACAGCACAAACACTCGCTCTTCTGGGGTCCCTGATCGCTTCTCTGGCTCCATCCTTGGGAACAAAGCTGCCCTCACCATCACGGGGGCCCAGGCAGATGATGAATCTGATTATTACTGTGTGCTGTATATGGGTAGTGGCATTTC +>395|IGLV9-49 ENST00000427632|IGLV9-49|5'UTR|IG|IGL|None|00 +GAGAGACTGAAGAACCCAGCATTGCAGCAGCTCCACC +>396|IGLV9-49 ENST00000427632|IGLV9-49|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCTCTGCTCCTCACCCTCCTCAGTCTCCTCACAGGGTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCTGCATCAGCCTCCCTGGGAGCCTCGGTCACACTCACCTGCACCCTGAGCAGCGGCTACAGTAATTATAAAGTGGACTGGTACCAGCAGAGACCAGGGAAGGGCCCCCGGTTTGTGATGCGAGTGGGCACTGGTGGGATTGTGGGATCCAAGGGGGATGGCATCCCTGATCGCTTCTCAGTCTTGGGCTCAGGCCTGAATCGGTACCTGACCATCAAGAACATCCAGGAAGAGGATGAGAGTGACTACCACTGTGGGGCAGACCATGGCAGTGGGAGCAACTTCGTG +>397|TRAC ENST00000611116|TRAC|C-REGION|TR|TRA|None|00 +ATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>398|TRAJ1 ENST00000390536|TRAJ1|J-REGION|TR|TRA|None|00 +GTATGAAAGTATTACCTCCCAGTTGCAATTTGGCAAAGGAACCAGAGTTTCCACTTCTCCCC +>399|TRAJ10 ENST00000390527|TRAJ10|J-REGION|TR|TRA|None|00 +ATACTCACGGGAGGAGGAAACAAACTCACCTTTGGGACAGGCACTCAGCTAAAAGTGGAACTCA +>400|TRAJ11 ENST00000390526|TRAJ11|J-REGION|TR|TRA|None|00 +TGAATTCAGGATACAGCACCCTCACCTTTGGGAAGGGGACTATGCTTCTAGTCTCTCCAG +>401|TRAJ12 ENST00000390525|TRAJ12|J-REGION|TR|TRA|None|00 +GGATGGATAGCAGCTATAAATTGATCTTCGGGAGTGGGACCAGACTGCTGGTCAGGCCTG +>402|TRAJ13 ENST00000390524|TRAJ13|J-REGION|TR|TRA|None|00 +TGAATTCTGGGGGTTACCAGAAAGTTACCTTTGGAACTGGAACAAAGCTCCAAGTCATCCCAA +>403|TRAJ14 ENST00000390523|TRAJ14|J-REGION|TR|TRA|None|00 +ATTTATAGCACATTCATCTTTGGGAGTGGGACAAGATTATCAGTAAAACCTG +>404|TRAJ16 ENST00000390521|TRAJ16|J-REGION|TR|TRA|None|00 +GGTTTTCAGATGGCCAGAAGCTGCTCTTTGCAAGGGGGACCATGTTAAAGGTGGATCTTA +>405|TRAJ17 ENST00000390520|TRAJ17|J-REGION|TR|TRA|None|00 +TGATCAAAGCTGCAGGCAACAAGCTAACTTTTGGAGGAGGAACCAGGGTGCTAGTTAAACCAA +>406|TRAJ18 ENST00000390519|TRAJ18|J-REGION|TR|TRA|None|00 +CCGACAGAGGCTCAACCCTGGGGAGGCTATACTTTGGAAGAGGAACTCAGTTGACTGTCTGGCCTG +>407|TRAJ19 ENST00000390518|TRAJ19|J-REGION|TR|TRA|None|00 +GCTATCAAAGATTTTACAATTTCACCTTTGGAAAGGGATCCAAACATAATGTCACTCCAA +>408|TRAJ2 ENST00000390535|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGAACAATTGATAAACTCACATTTGGGAAAGGGACCCATGTATTCATTATATCTG +>409|TRAJ20 ENST00000390517|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTAACGACTACAAGCTCAGCTTTGGAGCCGGAACCACAGTAACTGTAAGAGCAA +>410|TRAJ21 ENST00000390516|TRAJ21|J-REGION|TR|TRA|None|00 +TACAACTTCAACAAATTTTACTTTGGATCTGGGACCAAACTCAATGTAAAACCAA +>411|TRAJ22 ENST00000390515|TRAJ22|J-REGION|TR|TRA|None|00 +TTTCTTCTGGTTCTGCAAGGCAACTGACCTTTGGATCTGGGACACAATTGACTGTTTTACCTG +>412|TRAJ23 ENST00000390514|TRAJ23|J-REGION|TR|TRA|None|00 +TGATTTATAACCAGGGAGGAAAGCTTATCTTCGGACAGGGAACGGAGTTATCTGTGAAACCCA +>413|TRAJ24 ENST00000390513|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGACAGCTGGGGGAAATTCCAGTTTGGAGCAGGGACCCAGGTTGTGGTCACCCCAG +>414|TRAJ25 ENST00000390512|TRAJ25|J-REGION|TR|TRA|None|00 +CAGAAGGACAAGGCTTCTCCTTTATCTTTGGGAAGGGGACAAGGCTGCTTGTCAAGCCAA +>415|TRAJ26 ENST00000390511|TRAJ26|J-REGION|TR|TRA|None|00 +GGGATAACTATGGTCAGAATTTTGTCTTTGGTCCCGGAACCAGATTGTCCGTGCTGCCCT +>416|TRAJ27 ENST00000390510|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATGCAGGCAAATCAACCTTTGGGGATGGGACTACGCTCACTGTGAAGCCAA +>417|TRAJ28 ENST00000390509|TRAJ28|J-REGION|TR|TRA|None|00 +CATACTCTGGGGCTGGGAGTTACCAACTCACTTTCGGGAAGGGGACCAAACTCTCGGTCATACCAA +>418|TRAJ29 ENST00000390508|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAACACACCTCTTGTCTTTGGAAAGGGCACAAGACTTTCTGTGATTGCAA +>419|TRAJ3 ENST00000390534|TRAJ3|J-REGION|TR|TRA|None|00 +GGGGTACAGCAGTGCTTCCAAGATAATCTTTGGATCAGGGACCAGACTCAGCATCCGGCCAA +>420|TRAJ30 ENST00000390507|TRAJ30|J-REGION|TR|TRA|None|00 +TGAACAGAGATGACAAGATCATCTTTGGAAAAGGGACACGACTTCATATTCTCCCCA +>421|TRAJ31 ENST00000390506|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAACAATGCCAGACTCATGTTTGGAGATGGAACTCAGCTGGTGGTGAAGCCCA +>422|TRAJ32 ENST00000390505|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGTGGTGCTACAAACAAGCTCATCTTTGGAACTGGCACTCTGCTTGCTGTCCAGCCAA +>423|TRAJ33 ENST00000390504|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTAATCTGGGGCGCTGGGACCAAGCTAATTATAAAGCCAG +>424|TRAJ34 ENST00000390503|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTATAACACCGACAAGCTCATCTTTGGGACTGGGACCAGATTACAAGTCTTTCCAA +>425|TRAJ35 ENST00000390502|TRAJ35|J-REGION|TR|TRA|None|00 +GATAGGCTTTGGGAATGTGCTGCATTGCGGGTCCGGCACTCAAGTGATTGTTTTACCAC +>426|TRAJ36 ENST00000614481|TRAJ36|J-REGION|TR|TRA|None|00 +TCAAACTGGGGCAAACAACCTCTTCTTTGGGACTGGAACGAGACTCACCGTTATTCCCT +>427|TRAJ37 ENST00000612375|TRAJ37|J-REGION|TR|TRA|None|00 +TGGCTCTAGCAACACAGGCAAACTAATCTTTGGGCAAGGGACAACTTTACAAGTAAAACCAG +>428|TRAJ38 ENST00000390499|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGCTGGCAACAACCGTAAGCTGATTTGGGGATTGGGAACAAGCCTGGCAGTAAATCCGA +>429|TRAJ39 ENST00000390498|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGCAACATGCTCACCTTTGGAGGGGGAACAAGGTTAATGGTCAAACCCC +>430|TRAJ4 ENST00000390533|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTTTCTGGTGGCTACAATAAGCTGATTTTTGGAGCAGGGACCAGGCTGGCTGTACACCCAT +>431|TRAJ40 ENST00000390497|TRAJ40|J-REGION|TR|TRA|None|00 +ACTACCTCAGGAACCTACAAATACATCTTTGGAACAGGCACCAGGCTGAAGGTTTTAGCAA +>432|TRAJ41 ENST00000390496|TRAJ41|J-REGION|TR|TRA|None|00 +GAACTCAAATTCCGGGTATGCACTCAACTTCGGCAAAGGCACCTCGCTGTTGGTCACACCCC +>433|TRAJ42 ENST00000390495|TRAJ42|J-REGION|TR|TRA|None|00 +TGAATTATGGAGGAAGCCAAGGAAATCTCATCTTTGGAAAAGGCACTAAACTCTCTGTTAAACCAA +>434|TRAJ43 ENST00000390494|TRAJ43|J-REGION|TR|TRA|None|00 +ACAATAACAATGACATGCGCTTTGGAGCAGGGACCAGACTGACAGTAAAACCAA +>435|TRAJ44 ENST00000390493|TRAJ44|J-REGION|TR|TRA|None|00 +TAAATACCGGCACTGCCAGTAAACTCACCTTTGGGACTGGAACAAGACTTCAGGTCACGCTCG +>436|TRAJ45 ENST00000390492|TRAJ45|J-REGION|TR|TRA|None|00 +TGTATTCAGGAGGAGGTGCTGACGGACTCACCTTTGGCAAAGGGACTCATCTAATCATCCAGCCCT +>437|TRAJ46 ENST00000390491|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAGAAAAGCAGCGGAGACAAGCTGACTTTTGGGACCGGGACTCGTTTAGCAGTTAGGCCCA +>438|TRAJ47 ENST00000390490|TRAJ47|J-REGION|TR|TRA|None|00 +TGGAATATGGAAACAAACTGGTCTTTGGCGCAGGAACCATTCTGAGAGTCAAGTCCT +>439|TRAJ48 ENST00000390489|TRAJ48|J-REGION|TR|TRA|None|00 +TATCTAACTTTGGAAATGAGAAATTAACCTTTGGGACTGGAACAAGACTCACCATCATACCCA +>440|TRAJ49 ENST00000390488|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACCGGTAACCAGTTCTATTTTGGGACAGGGACAAGTTTGACGGTCATTCCAA +>441|TRAJ5 ENST00000390532|TRAJ5|J-REGION|TR|TRA|None|00 +TGGACACGGGCAGGAGAGCACTTACTTTTGGGAGTGGAACAAGACTCCAAGTGCAACCAA +>442|TRAJ50 ENST00000390487|TRAJ50|J-REGION|TR|TRA|None|00 +TGAAAACCTCCTACGACAAGGTGATATTTGGGCCAGGGACAAGCTTATCAGTCATTCCAA +>443|TRAJ52 ENST00000390486|TRAJ52|J-REGION|TR|TRA|None|00 +CTAATGCTGGTGGTACTAGCTATGGAAAGCTGACATTTGGACAAGGGACCATCTTGACTGTCCATCCAA +>444|TRAJ53 ENST00000390485|TRAJ53|J-REGION|TR|TRA|None|00 +AGAATAGTGGAGGTAGCAACTATAAACTGACATTTGGAAAAGGAACTCTCTTAACCGTGAATCCAA +>445|TRAJ54 ENST00000390484|TRAJ54|J-REGION|TR|TRA|None|00 +TAATTCAGGGAGCCCAGAAGCTGGTATTTGGCCAAGGAACCAGGCTGACTATCAACCCAA +>446|TRAJ56 ENST00000390483|TRAJ56|J-REGION|TR|TRA|None|00 +TTATACTGGAGCCAATAGTAAGCTGACATTTGGAAAAGGAATAACTCTGAGTGTTAGACCAG +>447|TRAJ57 ENST00000390482|TRAJ57|J-REGION|TR|TRA|None|00 +TAACTCAGGGCGGATCTGAAAAGCTGGTCTTTGGAAAGGGAACGAAACTGACAGTAAACCCAT +>448|TRAJ58 ENST00000390481|TRAJ58|J-REGION|TR|TRA|None|00 +TTTAAGAAACCAGTGGCTCTAGGTTGACCTTTGGGGAAGGAACACAGCTCACAGTGAATCCTG +>449|TRAJ59 ENST00000390480|TRAJ59|J-REGION|TR|TRA|None|00 +GGAAGGAAGGAAACAGGAAATTTACATTTGGAATGGGGACGCAAGTGAGAGTGA +>450|TRAJ6 ENST00000390531|TRAJ6|J-REGION|TR|TRA|None|00 +TGCATCAGGAGGAAGCTACATACCTACATTTGGAAGAGGAACCAGCCTTATTGTTCATCCGT +>451|TRAJ61 ENST00000390479|TRAJ61|J-REGION|TR|TRA|None|00 +GGTACCGGGTTAATAGGAAACTGACATTTGGAGCCAACACTAGAGGAATCATGAAACTCA +>452|TRAJ7 ENST00000390530|TRAJ7|J-REGION|TR|TRA|None|00 +TGACTATGGGAACAACAGACTCGCTTTTGGGAAGGGGAACCAAGTGGTGGTCATACCAA +>453|TRAJ8 ENST00000390529|TRAJ8|J-REGION|TR|TRA|None|00 +TGAACACAGGCTTTCAGAAACTTGTATTTGGAACTGGCACCTGACTTCTGGTCAGTCCAA +>454|TRAJ9 ENST00000390528|TRAJ9|J-REGION|TR|TRA|None|00 +GGAAATACTGGAGGCTTCAAAACTATCTTTGGAGCAGGAACAAGACTATTTGTTAAAGCAA +>455|TRAV1-1 ENST00000542354|TRAV1-1|5'UTR|TR|TRA|None|00 +CTTCTGCAGACTACAGTGGCTCAGGAACCGGGGATGCAGTGCCAGGCTCATGGTATCCTGCAGCAG +>456|TRAV1-1 ENST00000542354|TRAV1-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGCTTTCCTTCTCTATGTTTCCATGAAGATGGGAGGCACTGCAGGACAAAGCCTTGAGCAGCCCTCTGAAGTGACAGCTGTGGAAGGAGCCATTGTCCAGATAAACTGCACGTACCAGACATCTGGGTTTTATGGGCTGTCCTGGTACCAGCAACATGATGGCGGAGCACCCACATTTCTTTCTTACAATGCTCTGGATGGTTTGGAGGAGACAGGTCGTTTTTCTTCATTCCTTAGTCGCTCTGATAGTTATGGTTACCTCCTTCTACAGGAGCTCCAGATGAAAGACTCTGCCTCTTACTTCTGCGCTGTGAGAGA +>457|TRAV1-2 ENST00000390423|TRAV1-2|5'UTR|TR|TRA|None|00 +CCCACATGAAGTGTCTACCTTCTGCAGACTCCAATGGCTCAGGAACTGGGAATGCAGTGCCAGGCTCGTGGTATCCTGCAGCAG +>458|TRAV1-2 ENST00000390423|TRAV1-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGTTTTCCTTCTTTATGTTTCCATGAAGATGGGAGGCACTACAGGACAAAACATTGACCAGCCCACTGAGATGACAGCTACGGAAGGTGCCATTGTCCAGATCAACTGCACGTACCAGACATCTGGGTTCAACGGGCTGTTCTGGTACCAGCAACATGCTGGCGAAGCACCTACATTTCTGTCTTACAATGTTCTGGATGGTTTGGAGGAGAAAGGTCGTTTTTCTTCATTCCTTAGTCGGTCTAAAGGGTACAGTTACCTCCTTTTGAAGGAGCTCCAGATGAAAGACTCTGCCTCTTACCTCTGTGCT +>459|TRAV10 ENST00000390432|TRAV10|5'UTR|TR|TRA|None|00 +AGTCAACTTCTGGGAGCAGATCTCTGCAGAATAAAA +>460|TRAV10 ENST00000390432|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCATCTGACGACCTTCTTGGTGATTTTGTGGCTTTATTTTTATAGGGGGAATGGCAAAAACCAAGTGGAGCAGAGTCCTCAGTCCCTGATCATCCTGGAGGGAAAGAACTGCACTCTTCAATGCAATTATACAGTGAGCCCCTTCAGCAACTTAAGGTGGTATAAGCAAGATACGGGGAGAGGTCCTGTTTCCCTGACAATCATGACTTTCAGTGAGAACACAAAGTCGAACGGAAGATATACAGCAACTCTGGATGCAGACACAAAGCAAAGCTCTCTGCACATCACAGCCTCCCAGCTCAGCGATTCAGCCTCCTACATCTGTGTGGTGAGCG +>461|TRAV12-1 ENST00000390433|TRAV12-1|5'UTR|TR|TRA|None|00 +ATG +>462|TRAV12-1 ENST00000390433|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGATATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACGGAAGGAGGTGGAGCAGGATCCTGGACCCTTCAATGTTCCAGAGGGAGCCACTGTCGCTTTCAACTGTACTTACAGCAACAGTGCTTCTCAGTCTTTCTTCTGGTACAGACAGGATTGCAGGAAAGAACCTAAGTTGCTGATGTCCGTATACTCCAGTGGTAATGAAGATGGAAGGTTTACAGCACAGCTCAATAGAGCCAGCCAGTATATTTCCCTGCTCATCAGAGACTCCAAGCTCAGTGATTCAGCCACCTACCTCTGTGTGGTGAACA +>463|TRAV12-2 ENST00000390437|TRAV12-2|5'UTR|TR|TRA|None|00 +AAAGCAGATTCTTTTTATGATTTTTAAAGTAGAAATATCCATTCTAGGTGCATTTTTTAAGGGTTTAAAATTTGAATCCTCAGTGAACCAGGGCAGAGAAGAATG +>464|TRAV12-2 ENST00000390437|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGAGTTTTACTAGTGATCCTGTGGCTTCAGTTGAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGAATTCTGGACCCCTCAGTGTTCCAGAGGGAGCCATTGCCTCTCTCAACTGCACTTACAGTGACCGAGGTTCCCAGTCCTTCTTCTGGTACAGACAATATTCTGGGAAAAGCCCTGAGTTGATAATGTTCATATACTCCAATGGTGACAAAGAAGATGGAAGGTTTACAGCACAGCTCAATAAAGCCAGCCAGTATGTTTCTCTGCTCATCAGAGACTCCCAGCCCAGTGATTCAGCCACCTACCTCTGTGCCGTGAACA +>465|TRAV12-3 ENST00000390442|TRAV12-3|5'UTR|TR|TRA|None|00 +ATTATTTTTTTTTCGTGTTTAAGGTTTGAATCCTCAGTGAACCAGGGCAGAAAAGA +>466|TRAV12-3 ENST00000390442|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGGATCCTGGACCACTCAGTGTTCCAGAGGGAGCCATTGTTTCTCTCAACTGCACTTACAGCAACAGTGCTTTTCAATACTTCATGTGGTACAGACAGTATTCCAGAAAAGGCCCTGAGTTGCTGATGTACACATACTCCAGTGGTAACAAAGAAGATGGAAGGTTTACAGCACAGGTCGATAAATCCAGCAAGTATATCTCCTTGTTCATCAGAGACTCACAGCCCAGTGATTCAGCCACCTACCTCTGTGCAATGAGCG +>467|TRAV13-1 ENST00000390436|TRAV13-1|5'UTR|TR|TRA|None|00 +GATCTTAATTGGGAAGAACAAGG +>468|TRAV13-1 ENST00000390436|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACATCCATTCGAGCTGTATTTATATTCCTGTGGCTGCAGCTGGACTTGGTGAATGGAGAGAATGTGGAGCAGCATCCTTCAACCCTGAGTGTCCAGGAGGGAGACAGCGCTGTTATCAAGTGTACTTATTCAGACAGTGCCTCAAACTACTTCCCTTGGTATAAGCAAGAACTTGGAAAAGGACCTCAGCTTATTATAGACATTCGTTCAAATGTGGGCGAAAAGAAAGACCAACGAATTGCTGTTACATTGAACAAGACAGCCAAACATTTCTCCCTGCACATCACAGAGACCCAACCTGAAGACTCGGCTGTCTACTTCTGTGCAGCAAGTA +>469|TRAV13-2 ENST00000390439|TRAV13-2|5'UTR|TR|TRA|None|00 +CGATGATGGAAGTAGCTCTTATGGCTGGAGATTGCAGGTTTATGACTGATCCTATTTGGGAAGAACAATG +>470|TRAV13-2 ENST00000390439|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCAGGCATTCGAGCTTTATTTATGTACTTGTGGCTGCAGCTGGACTGGGTGAGCAGAGGAGAGAGTGTGGGGCTGCATCTTCCTACCCTGAGTGTCCAGGAGGGTGACAACTCTATTATCAACTGTGCTTATTCAAACAGCGCCTCAGACTACTTCATTTGGTACAAGCAAGAATCTGGAAAAGGTCCTCAATTCATTATAGACATTCGTTCAAATATGGACAAAAGGCAAGGCCAAAGAGTCACCGTTTTATTGAATAAGACAGTGAAACATCTCTCTCTGCAAATTGCAGCTACTCAACCTGGAGACTCAGCTGTCTACTTTTGTGCAGAGAATA +>471|TRAV14/DV4 ENST00000390440|TRAV14/DV4|5'UTR|TR|TRA|None|00 +GCCAGGTTCACTTCACAGTACAGAGTCCTGAAAATAAAGAAGAAAATTTTTTTTTATCTAGAAAAAGAACCAAAC +>472|TRAV14/DV4 ENST00000390440|TRAV14/DV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGTCACTTTCTAGCCTGCTGAAGGTGGTCACAGCTTCACTGTGGCTAGGACCTGGCATTGCCCAGAAGATAACTCAAACCCAACCAGGAATGTTCGTGCAGGAAAAGGAGGCTGTGACTCTGGACTGCACATATGACACCAGTGATCCAAGTTATGGTCTATTCTGGTACAAGCAGCCCAGCAGTGGGGAAATGATTTTTCTTATTTATCAGGGGTCTTATGACCAGCAAAATGCAACAGAAGGTCGCTACTCATTGAATTTCCAGAAGGCAAGAAAATCCGCCAACCTTGTCATCTCCGCTTCACAACTGGGGGACTCAGCAATGTACTTCTGTGCAATGAGAGAGGG +>473|TRAV16 ENST00000390444|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCCCACCCTCATCTCAGTGCTTGTGATAATATTTATACTCAGAGGAACAAGAGCCCAGAGAGTGACTCAGCCCGAGAAGCTCCTCTCTGTCTTTAAAGGGGCCCCAGTGGAGCTGAAGTGCAACTATTCCTATTCTGGGAGTCCTGAACTCTTCTGGTATGTCCAGTACTCCAGACAACGCCTCCAGTTACTCTTGAGACACATCTCTAGAGAGAGCATCAAAGGCTTCACTGCTGACCTTAACAAAGGCGAGACATCTTTCCACCTGAAGAAACCATTTGCTCAAGAGGAAGACTCAGCCATGTATTACTGTGCTCTAAGTGG +>474|TRAV17 ENST00000390445|TRAV17|5'UTR|TR|TRA|None|00 +AGGACTGAGCTTGCCTGTGACTGGCTAGGGAGGAACCTGAGACTAGGGGACAGAAAGACTAGGGATTCACCCAGTAAAGAGAGCTCATCTGTGACTGAGGAGCCTTGCTCCATTTCAGGTCTTCTGTGATTTCAATAAGGAAGAAGA +>475|TRAV17 ENST00000390445|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAAACTCTCCTGGGAGTGTCTTTGGTGATTCTATGGCTTCAACTGGCTAGGGTGAACAGTCAACAGGGAGAAGAGGATCCTCAGGCCTTGAGCATCCAGGAGGGTGAAAATGCCACCATGAACTGCAGTTACAAAACTAGTATAAACAATTTACAGTGGTATAGACAAAATTCAGGTAGAGGCCTTGTCCACCTAATTTTAATACGTTCAAATGAAAGAGAGAAACACAGTGGAAGATTAAGAGTCACGCTTGACACTTCCAAGAAAAGCAGTTCCTTGTTGATCACGGCTTCCCGGGCAGCAGACACTGCTTCTTACTTCTGTGCTACGGACG +>476|TRAV18 ENST00000390446|TRAV18|5'UTR|TR|TRA|None|00 +GATTTTGTAGAAGATTCCGCCAAAGACTCAACAACATAAAGAAATATATATACCTTTCGGTTTGGATATCTCTCAACAAAACCTTCTACTGCTTCTCAGCCAGCC +>477|TRAV18 ENST00000390446|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGTCTGCTTCCTGCTCAGGACTTGTGATCTTGTTGATATTCAGAAGGACCAGTGGAGACTCGGTTACCCAGACAGAAGGCCCAGTTACCCTCCCTGAGAGGGCAGCTCTGACATTAAACTGCACTTATCAGTCCAGCTATTCAACTTTTCTATTCTGGTATGTCCAGTATCTAAACAAAGAGCCTGAGCTCCTCCTGAAAAGTTCAGAAAACCAGGAGACGGACAGCAGAGGTTTTCAGGCCAGTCCTATCAAGAGTGACAGTTCCTTCCACCTGGAGAAGCCCTCGGTGCAGCTGTCGGACTCTGCCGTGTACTACTGCGCTCTGAGAGA +>478|TRAV19 ENST00000390447|TRAV19|5'UTR|TR|TRA|None|00 +CAGAAGCCTCACACAGCCCAGTAACTTTGCTAGTACCTCTTGAGTGCAAGGTGGAGAATTAAGATCTGGATTTGAGACGGAGCACGGAACATTTCACTCAGGGGAAGAGCTATGAAC +>479|TRAV19 ENST00000390447|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGACTGCCAGCCTGTTGAGGGCAGTCATAGCCTCCATCTGTGTTGTATCCAGCATGGCTCAGAAGGTAACTCAAGCGCAGACTGAAATTTCTGTGGTGGAGAAGGAGGATGTGACCTTGGACTGTGTGTATGAAACCCGTGATACTACTTATTACTTATTCTGGTACAAGCAACCACCAAGTGGAGAATTGGTTTTCCTTATTCGTCGGAACTCTTTTGATGAGCAAAATGAAATAAGTGGTCGGTATTCTTGGAACTTCCAGAAATCCACCAGTTCCTTCAACTTCACCATCACAGCCTCACAAGTCGTGGACTCAGCAGTATACTTCTGTGCTCTGAGTGAGGC +>480|TRAV2 ENST00000390424|TRAV2|5'UTR|TR|TRA|None|00 +CATTTTGGCC +>481|TRAV2 ENST00000390424|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTGCAGAGCACTCTGGGGGCGGTGTGGCTAGGGCTTCTCCTCAACTCTCTCTGGAAGGTTGCAGAAAGCAAGGACCAAGTGTTTCAGCCTTCCACAGTGGCATCTTCAGAGGGAGCTGTGGTGGAAATCTTCTGTAATCACTCTGTGTCCAATGCTTACAACTTCTTCTGGTACCTTCACTTCCCGGGATGTGCACCAAGACTCCTTGTTAAAGGCTCAAAGCCTTCTCAGCAGGGACGATACAACATGACCTATGAACGGTTCTCTTCATCGCTGCTCATCCTCCAGGTGCGGGAGGCAGATGCTGCTGTTTACTACTGTGCTGTGGAGGA +>482|TRAV20 ENST00000390448|TRAV20|5'UTR|TR|TRA|None|00 +ACAGAAGTGGCGCCTCTGAGAAAAGAAGGTTGGAATTATCGTAATTTGTTTCTAGGCTGAGATACCAGC +>483|TRAV20 ENST00000390448|TRAV20|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAAATGTTGGAGTGTGCATTCATAGTCTTGTGGCTTCAGCTTGGCTGGTTGAGTGGAGAAGACCAGGTGACGCAGAGTCCCGAGGCCCTGAGACTCCAGGAGGGAGAGAGTAGCAGTCTCAACTGCAGTTACACAGTCAGCGGTTTAAGAGGGCTGTTCTGGTATAGGCAAGATCCTGGGAAAGGCCCTGAATTCCTCTTCACCCTGTATTCAGCTGGGGAAGAAAAGGAGAAAGAAAGGCTAAAAGCCACATTAACAAAGAAGGAAAGCTTTCTGCACATCACAGCCCCTAAACCTGAAGACTCAGCCACTTATCTCTGTGCTGTGCAGG +>484|TRAV21 ENST00000390449|TRAV21|5'UTR|TR|TRA|None|00 +AGAAGGA +>485|TRAV21 ENST00000390449|TRAV21|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACCCTCTTGGGCCTGCTTATCCTTTGGCTGCAGCTGCAATGGGTGAGCAGCAAACAGGAGGTGACGCAGATTCCTGCAGCTCTGAGTGTCCCAGAAGGAGAAAACTTGGTTCTCAACTGCAGTTTCACTGATAGCGCTATTTACAACCTCCAGTGGTTTAGGCAGGACCCTGGGAAAGGTCTCACATCTCTGTTGCTTATTCAGTCAAGTCAGAGAGAGCAAACAAGTGGAAGACTTAATGCCTCGCTGGATAAATCATCAGGACGTAGTACTTTATACATTGCAGCTTCTCAGCCTGGTGACTCAGCCACCTACCTCTGTGCTGTGAGG +>486|TRAV22 ENST00000390450|TRAV22|5'UTR|TR|TRA|None|00 +GGCTTTGTCGGGTGGAGCTGATTGGTTGCAGGAGCAGCAACAGTTCCAGAGCCAAGTCATGACACCGACCTCCCCAAGGTTTAGTTAAATATATCTTATGGTGAAAATGCCCGGAGCAAGAAGGCAAAGCATC +>487|TRAV22 ENST00000390450|TRAV22|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGATATTGGGAGCTCTGCTGGGGCTCTTGAGTGCCCAGGTTTGCTGTGTGAGAGGAATACAAGTGGAGCAGAGTCCTCCAGACCTGATTCTCCAGGAGGGAGCCAATTCCACGCTGCGGTGCAATTTTTCTGACTCTGTGAACAATTTGCAGTGGTTTCATCAAAACCCTTGGGGACAGCTCATCAACCTGTTTTACATTCCCTCAGGGACAAAACAGAATGGAAGATTAAGCGCCACGACTGTCGCTACGGAACGCTACAGCTTATTGTACATTTCCTCTTCCCAGACCACAGACTCAGGCGTTTATTTCTGTGCTGTGGAGC +>488|TRAV23/DV6 ENST00000390451|TRAV23/DV6|5'UTR|TR|TRA|None|00 +CTGGAAGACCACCTGGGCTGTCATTGAGCTCTGGTGCCAGGAGGA +>489|TRAV23/DV6 ENST00000390451|TRAV23/DV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCTTAGGAGCATCATTTTTAGTTCTGTGGCTTCAACTATGCTGGGTGAGTGGCCAACAGAAGGAGAAAAGTGACCAGCAGCAGGTGAAACAAAGTCCTCAATCTTTGATAGTCCAGAAAGGAGGGATTTCAATTATAAACTGTGCTTATGAGAACACTGCGTTTGACTACTTTCCATGGTACCAACAATTCCCTGGGAAAGGCCCTGCATTATTGATAGCCATACGTCCAGATGTGAGTGAAAAGAAAGAAGGAAGATTCACAATCTCCTTCAATAAAAGTGCCAAGCAGTTCTCATCGCATATCATGGATTCCCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGCA +>490|TRAV24 ENST00000390453|TRAV24|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGAATCCTTTGGCAGCCCCATTACTAATCCTCTGGTTTCATCTTGACTGCGTGAGCAGCATACTGAACGTGGAACAAAGTCCTCAGTCACTGCATGTTCAGGAGGGAGACAGCACCAATTTCACCTGCAGCTTCCCTTCCAGCAATTTTTATGCCTTACACTGGTACAGATGGGAAACTGCAAAAAGCCCCGAGGCCTTGTTTGTAATGACTTTAAATGGGGATGAAAAGAAGAAAGGACGAATAAGTGCCACTCTTAATACCAAGGAGGGTTACAGCTATTTGTACATCAAAGGATCCCAGCCTGAAGACTCAGCCACATACCTCTGTGCCTTTA +>491|TRAV25 ENST00000390454|TRAV25|5'UTR|TR|TRA|None|00 +ACTATTTCTATTGATCTGGAAGAAGCTTGTACCAGGCAACCCATTTAGGAGAAGTTGGATGAAGAGGGAGAGGGAG +>492|TRAV25 ENST00000390454|TRAV25|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTACTCATCACATCAATGTTGGTCTTATGGATGCAATTGTCACAGGTGAATGGACAACAGGTAATGCAAATTCCTCAGTACCAGCATGTACAAGAAGGAGAGGACTTCACCACGTACTGCAATTCCTCAACTACTTTAAGCAATATACAGTGGTATAAGCAAAGGCCTGGTGGACATCCCGTTTTTTTGATACAGTTAGTGAAGAGTGGAGAAGTGAAGAAGCAGAAAAGACTGACATTTCAGTTTGGAGAAGCAAAAAAGAACAGCTCCCTGCACATCACAGCCACCCAGACTACAGATGTAGGAACCTACTTCTGTGCAGGG +>493|TRAV26-1 ENST00000390455|TRAV26-1|5'UTR|TR|TRA|None|00 +AGGAACATGACTAAACCTGGGGAGGAAGACATAGAAAAGCAACTGCTCTATCATTGGCTGACAAGATCCTGACAACAACACAATGAGAGCTGCACTCCTTGCAAGTCTTTACTAGTAGCTGTTGCTTCTGTTCTCTGGAAATTCTTTAAACCTAGAATCAGACACAAAAACTGAACTCTGGGTCCACAATCCTCATTTGTCCTTGAAGT +>494|TRAV26-1 ENST00000390455|TRAV26-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCTGGTGGCAAGAGTAACTGTGTTTCTGACCTTTGGAACTATAATTGATGCTAAGACCACCCAGCCCACCTCCATGGATTGCGCTGAAGGAAGAGCTGCAAACCTGCCTTGTAATCACTCTACCATCAGTGGAAATGAGTATGTGTATTGGTATCGACAGATTCACTCCCAGGGGCCACAGTATATCATTCATGGTCTAAAAAACAATGAAACCAATGAAATGGCCTCTCTGATCATCACAGAAGACAGAAAGTCCAGCACCTTGATCCTGCCCCACGCTACGCTGAGAGACACTGCTGTGTACTATTGCATCGTCAGAGTCG +>495|TRAV26-2 ENST00000390460|TRAV26-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTTGGTGACAAGCATTACTGTACTCCTATCTTTGGGTATTATGGGTGATGCTAAGACCACACAGCCAAATTCAATGGAGAGTAACGAAGAAGAGCCTGTTCACTTGCCTTGTAACCACTCCACAATCAGTGGAACTGATTACATACATTGGTATCGACAGCTTCCCTCCCAGGGTCCAGAGTACGTGATTCATGGTCTTACAAGCAATGTGAACAACAGAATGGCCTCTCTGGCAATCGCTGAAGACAGAAAGTCCAGTACCTTGATCCTGCACCGTGCTACCTTGAGAGATGCTGCTGTGTACTACTGCATCCTGAGAGAC +>496|TRAV27 ENST00000390457|TRAV27|5'UTR|TR|TRA|None|00 +AAGCACTCTTCTAGCCCAGAGAAGTCTGTTCCAGGACGGGCTCTTTCAGGAGCAGCTAAAGTCAGGGGCCATGTCCACCATGTGATAGAAAGACAAG +>497|TRAV27 ENST00000390457|TRAV27|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTCCTGAAATTCTCCGTGTCCATTCTTTGGATTCAGTTGGCATGGGTGAGCACCCAGCTGCTGGAGCAGAGCCCTCAGTTTCTAAGCATCCAAGAGGGAGAAAATCTCACTGTGTACTGCAACTCCTCAAGTGTTTTTTCCAGCTTACAATGGTACAGACAGGAGCCTGGGGAAGGTCCTGTCCTCCTGGTGACAGTAGTTACGGGTGGAGAAGTGAAGAAGCTGAAGAGACTAACCTTTCAGTTTGGTGATGCAAGAAAGGACAGTTCTCTCCACATCACTGCAGCCCAGACTGGTGATACAGGCCTCTACCTCTGTGCAGGAG +>498|TRAV29/DV5 ENST00000390458|TRAV29/DV5|5'UTR|TR|TRA|None|00 +ATATGTAAAATGAAGGGTCTGTGGAAGGACATGAATAAAGCACAGGAGGTTGAAGTCAGATTTGCAGCTTTCTAGGCAGGAGATAAGACAATCTGCATCTTCACAGGAGGG +>499|TRAV29/DV5 ENST00000390458|TRAV29/DV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCATGCTCCTGGGGGCATCAGTGCTGATTCTGTGGCTTCAGCCAGACTGGGTAAACAGTCAACAGAAGAATGATGACCAGCAAGTTAAGCAAAATTCACCATCCCTGAGCGTCCAGGAAGGAAGAATTTCTATTCTGAACTGTGACTATACTAACAGCATGTTTGATTATTTCCTATGGTACAAAAAATACCCTGCTGAAGGTCCTACATTCCTGATATCTATAAGTTCCATTAAGGATAAAAATGAAGATGGAAGATTCACTGTTTTCTTAAACAAAAGTGCCAAGCACCTCTCTCTGCACATTGTGCCCTCCCAGCCTGGAGACTCTGCAGTGTACTTCTGTGCAGCAAGCG +>500|TRAV3 ENST00000390425|TRAV3|5'UTR|TR|TRA|None|00 +CCGGTGTCGGGAAGCACCAGTGCCCTGAGGAAGGGCCATTTCCAAAAGCCCTGTGCTGACACAGGGTTGCTGGTTCCTCTTCAAGAGCCCACTCTCTGGGGTGGGGCCATATCTCCAGCAGAGGTGGGCTGGAAAGGACCCCCCCAATCCCGCCCGCCGTGAGCTTAGCTGGAGCC +>501|TRAV3 ENST00000390425|TRAV3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCTCTGCACCCATCTCGATGCTTGCGATGCTCTTCACATTGAGTGGGCTGAGAGCTCAGTCAGTGGCTCAGCCGGAAGATCAGGTCAACGTTGCTGAAGGGAATCCTCTGACTGTGAAATGCACCTATTCAGTCTCTGGAAACCCTTATCTTTTTTGGTATGTTCAATACCCCAACCGAGGCCTCCAGTTCCTTCTGAAATACATCACAGGGGATAACCTGGTTAAAGGCAGCTATGGCTTTGAAGCTGAATTTAACAAGAGCCAAACCTCCTTCCACCTGAAGAAACCATCTGCCCTTGTGAGCGACTCCGCTTTGTACTTCTGTGCTGTGAGAGACA +>502|TRAV30 ENST00000557168|TRAV30|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTCTCCTGAAAGTGCTTTCAGGCACCTTGTTGTGGCAGTTGACCTGGGTGAGAAGCCAACAACCAGTGCAGAGTCCTCAAGCCGTGATCCTCCGAGAAGGGGAAGATGCTGTCATCAACTGCAGTTCCTCCAAGGCTTTATATTCTGTACACTGGTACAGGCAGAAGCATGGTGAAGCACCCGTCTTCCTGATGATATTACTGAAGGGTGGAGAACAGAAGGGTCATGACAAAATATCTGCTTCATTTAATGAAAAAAAGCAGCAAAGCTCCCTGTACCTTACGGCCTCCCAGCTCAGTTACTCAGGAACCTACTTCTGCGGCACAGAGA +>503|TRAV34 ENST00000390461|TRAV34|5'UTR|TR|TRA|None|00 +AATAGCTAAGGG +>504|TRAV34 ENST00000390461|TRAV34|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTGTTCTGCAAGTACTCCTAGGGATATTGGGGTTCCAAGCAGCCTGGGTCAGTAGCCAAGAACTGGAGCAGAGTCCTCAGTCCTTGATCGTCCAAGAGGGAAAGAATCTCACCATAAACTGCACGTCATCAAAGACGTTATATGGCTTATACTGGTATAAGCAAAAGTATGGTGAAGGTCTTATCTTCTTGATGATGCTACAGAAAGGTGGGGAAGAGAAAAGTCATGAAAAGATAACTGCCAAGTTGGATGAGAAAAAGCAGCAAAGTTCCCTGCATATCACAGCCTCCCAGCCCAGCCATGCAGGCATCTACCTCTGTGGAGCAGACA +>505|TRAV35 ENST00000390462|TRAV35|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTTGAACATTTATTAATAATCTTGTGGATGCAGCTGACATGGGTCAGTGGTCAACAGCTGAATCAGAGTCCTCAATCTATGTTTACCCAGGAAGGAGAAGATGTCTCCATGAACTGCACTTCTTCAAGCATATTTAACACCTGACTATGGTACAAGCAGGACCCTGGGGAAGGTCCTGTCCTCTTGATAGCCTTATATAAGGCTGGTGAATTGACCTCAAATGGAAGACTGACTGCTCAGTTTGGTATAACCAGAAAGGACAGCTTCCTGAATATCTCAGCATCCATACCTAGTGATGTAGGCATCTACTTCTGTGCTGGGCAG +>506|TRAV36/DV7 ENST00000390463|TRAV36/DV7|5'UTR|TR|TRA|None|00 +ACTTGATAACTGAAGG +>507|TRAV36/DV7 ENST00000390463|TRAV36/DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAGTGTCCACAGGCTTTACTAGCTATCTTTTGGCTTCTACTGAGCTGGGTGAGCAGTGAAGACAAGGTGGTACAAAGCCCTCTATCTCTGGTTGTCCACGAGGGAGACACCGTAACTCTCAATTGCAGTTATGAAGTGACTAACTTTCGAAGCCTACTATGGTACAAGCAGGAAAAGAAAGCTCCCACATTTCTATTTATGCTAACTTCAAGTGGAATTGAAAAGAAGTCAGGAAGACTAAGTAGCATATTAGATAAGAAAGAACTTTTCAGCATCCTGAACATCACAGCCACCCAGACCGGAGACTCGGCCATCTACCTCTGTGCTGTGGAGG +>508|TRAV38-1 ENST00000390464|TRAV38-1|5'UTR|TR|TRA|None|00 +AGC +>509|TRAV38-1 ENST00000390464|TRAV38-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACACGAGTTAGCTTGCTGTGGGCAGTCGTGGTCTCCACCTGTCTTGAATCCGGCATGGCCCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACTGTGACCCTGAGTTGCACATATGACACCAGTGAGAATAATTATTATTTGTTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACGGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGACACTGCGATGTATTTCTGTGCTTTCATGAAGCA +>510|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|5'UTR|TR|TRA|None|00 +AGATCAGAAGAGGAGGCTTCTCACCCTGCAGCAGGGACCTGTGAGC +>511|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCATGCCCTGGCTTCCTGTGGGCACTTGTGATCTCCACCTGTCTTGAATTTAGCATGGCTCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACCGTGACCCTGAGCTGCACATATGACACCAGTGAGAGTGATTATTATTTATTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACAGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGATGCCGCGATGTATTTCTGTGCTTATAGGAGCG +>512|TRAV39 ENST00000390466|TRAV39|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAAGCTACTAGCAATGATTCTGTGGCTTCAACTAGACCGGTTAAGTGGAGAGCTGAAAGTGGAACAAAACCCTCTGTTCCTGAGCATGCAGGAGGGAAAAAACTATACCATCTACTGCAATTATTCAACCACTTCAGACAGACTGTATTGGTACAGGCAGGATCCTGGGAAAAGTCTGGAATCTCTGTTTGTGTTGCTATCAAATGGAGCAGTGAAGCAGGAGGGACGATTAATGGCCTCACTTGATACCAAAGCCCGTCTCAGCACCCTCCACATCACAGCTGCCGTGCATGACCTCTCTGCCACCTACTTCTGTGCCGTGGACA +>513|TRAV4 ENST00000390426|TRAV4|5'UTR|TR|TRA|None|00 +CTGGGCTCATTGCAGCTCAGACACAGCAAAAGAGCCTAGAACCTGGGTCCTAGTTTGCACCTAGAAT +>514|TRAV4 ENST00000390426|TRAV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCAAGTGGCGAGAGTGATCGTGTTCCTGACCCTGAGTACTTTGAGCCTTGCTAAGACCACCCAGCCCATCTCCATGGACTCATATGAAGGACAAGAAGTGAACATAACCTGTAGCCACAACAACATTGCTACAAATGATTATATCACGTGGTACCAACAGTTTCCCAGCCAAGGACCACGATTTATTATTCAAGGATACAAGACAAAAGTTACAAACGAAGTGGCCTCCCTGTTTATCCCTGCCGACAGAAAGTCCAGCACTCTGAGCCTGCCCCGGGTTTCCCTGAGCGACACTGCTGTGTACTACTGCCTCGTGGGTGACA +>515|TRAV40 ENST00000390467|TRAV40|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCCTCTCTGGACTTTCTAATTCTGATCTTAATGTTTGGAGGAACCAGCAGCAATTCAGTCAAGCAGACGGGCCAAATAACCGTCTCGGAGGGAGCATCTGTGACTATGAACTGCACATACACATCCACGGGGTACCCTACCCTTTTCTGGTATGTGGAATACCCCAGCAAACCTCTGCAGCTTCTTCAGAGAGAGACAATGGAAAACAGCAAAAACTTCGGAGGCGGAAATATTAAAGACAAAAACTCCCCCATTGTGAAATATTCAGTCCAGGTATCAGACTCAGCCGTGTACTACTGTCTTCTGGGAGA +>516|TRAV41 ENST00000390468|TRAV41|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTGAAGATCCGGCAATTTTTGTTGGCTATTTTGTGGCTTCAGCTAAGCTGTGTAAGTGCCGCCAAAAATGAAGTGGAGCAGAGTCCTCAGAACCTGACTGCCCAGGAAGGAGAATTTATCACAATCAACTGCAGTTACTCGGTAGGAATAAGTGCCTTACACTGGCTGCAACAGCATCCAGGAGGAGGCATTGTTTCCTTGTTTATGCTGAGCTCAGGGAAGAAGAAGCATGGAAGATTAATTGCCACAATAAACATACAGGAAAAGCACAGCTCCCTGCACATCACAGCCTCCCATCCCAGAGACTCTGCCGTCTACATCTGTGCTGTCAGA +>517|TRAV5 ENST00000390427|TRAV5|5'UTR|TR|TRA|None|00 +GTGGGGAGAACA +>518|TRAV5 ENST00000390427|TRAV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATTTGCTGGATTTTCGTTCCTGTTTTTGTGGCTGCAGCTGGACTGTATGAGTAGAGGAGAGGATGTGGAGCAGAGTCTTTTCCTGAGTGTCCGAGAGGGAGACAGCTCCGTTATAAACTGCACTTACACAGACAGCTCCTCCACCTACTTATACTGGTATAAGCAAGAACCTGGAGCAGGTCTCCAGTTGCTGACGTATATTTTTTCAAATATGGACATGAAACAAGACCAAAGACTCACTGTTCTATTGAATAAAAAGGATAAACATCTGTCTCTGCGCATTGCAGACACCCAGACTGGGGACTCAGCTATCTACTTCTGTGCAGAGAGTA +>519|TRAV6 ENST00000390428|TRAV6|5'UTR|TR|TRA|None|00 +AAACAGA +>520|TRAV6 ENST00000390428|TRAV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTTTGGCTGAGAAGCCTGGGTCTACATTTCAGGCCACATTTGGGGAGACGAATGGAGTCATTCCTGGGAGGTGTTTTGCTGATTTTGTGGCTTCAAGTGGACTGGGTGAAGAGCCAAAAGATAGAACAGAATTCCGAGGCTCTGAACATTCAGGAGGGTAAAACGGCCACCCTGACCTGCAACTATACAAACTATTCTCCAGCATACTTACAGTGGTACCGACAAGATCCAGGAAGAGGCCCTGTTTTCTTGCTACTCATACGTGAAAATGAGAAAGAAAAAAGGAAAGAAAGACTGAAGGTCACCTTTGATACCACCCTTAAACAGAGTTTGTTTCATATCACAGCCTCCCAGCCTGCAGACTCAGCTACCTACCTCTGTGCTCTAGACA +>521|TRAV7 ENST00000390429|TRAV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGATGCGGAGACCTGTCCTAATTATATTTTGTCTATGTCTTGGCTGGGCAAATGGAGAAAACCAGGTGGAGCACAGCCCTCATTTTCTGGGACCCCAGCAGGGAGACGTTGCCTCCATGAGCTGCACGTACTCTGTCAGTCGTTTTAACAATTTGCAGTGGTACAGGCAAAATACAGGGATGGGTCCCAAACACCTATTATCCATGTATTCAGCTGGATATGAGAAGCAGAAAGGAAGACTAAATGCTACATTACTGAAGAATGGAAGCAGCTTGTACATTACAGCCGTGCAGCCTGAAGATTCAGCCACCTATTTCTGTGCTGTAGATG +>522|TRAV8-1 ENST00000390430|TRAV8-1|5'UTR|TR|TRA|None|00 +CCAAAACAAGAGACTTGCCTAGCCCAACCTTCCTCACGCTCGCTATTCTCAAGACCTGGGTTCCAGCCACTTTCCTACTGGCCCCGAGGAGAATTTCCAAAGAGACGCCTGCAGTGTTTCCACAGCTCAGCC +>523|TRAV8-1 ENST00000390430|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGTTGCTCATACCAGTGCTGGGGATGATTTTTGCCCTGAGAGATGCCAGAGCCCAGTCTGTGAGCCAGCATAACCACCACGTAATTCTCTCTGAAGCAGCCTCACTGGAGTTGGGATGCAACTATTCCTATGGTGGAACTGTTAATCTCTTCTGGTATGTCCAGTACCCTGGTCAACACCTTCAGCTTCTCCTCAAGTACTTTTCAGGGGATCCACTGGTTAAAGGCATCAAGGGCTTTGAGGCTGAATTTATAAAGAGTAAATTCTCCTTTAATCTGAGGAAACCCTCTGTGCAGTGGAGTGACACAGCTGAGTACTTCTGTGCCGTGAATGC +>524|TRAV8-2 ENST00000390434|TRAV8-2|5'UTR|TR|TRA|None|00 +GGCTGATGTAGCTCACTGATGTCTGTGTAGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGACTCCTTAAGAGAAAGCCTTTCTGTTTTGGAAACTTTTCAAAGCCAGGGACTTGTCCAGCCCAACCTCCCCATTGCTCCTAGCTCCCGAGGCTCAGGACCCCTGGCTTCTGTCCTCCCTGCTCAGGGTCCTGCAGCGTTGCCTCTGCTCAGCC +>525|TRAV8-2 ENST00000390434|TRAV8-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGACAGCCACGTCTCTGTCTCTGAAGGAACCCCGGTGCTGCTGAGGTGCAACTACTCATCTTCTTATTCACCGTCTCTCTTCTGGTATGTGCAACACCCCAACAAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGTTGTGAGTGA +>526|TRAV8-3 ENST00000390435|TRAV8-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGAGCTTATCCCACTGCTGGGGATACATTTTGTCCTGAGAACTGCCAGAGCCCAGTCAGTGACCCAGCCTGACATCCACATCACTGTCTCTGAAGGAGCCTCACTGGAGTTGAGATGTAACTATTCCTATGGGGCAACACCTTATCTCTTCTGGTATGTCCAGTCCCCCGGCCAAGGCCTCCAGCTGCTCCTGAAGTACTTTTCAGGAGACACTCTGGTTCAAGGCATTAAAGGCTTTGAGGCTGAATTTAAGAGGAGTCAATCTTCCTTCAATCTGAGGAAACCCTCTGTGCATTGGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGC +>527|TRAV8-4 ENST00000390438|TRAV8-4|5'UTR|TR|TRA|None|00 +TTTTGAAACCCTTCAAAGGCAGAGACTTGTCCAGCCTAACCTGCCTGCTGCTCCTAGCTCCTGAGGCTCAGGGCCCTTGGCTTCTGTCCGCTCTGCTCAGGGCCCTCCAGCGTGGCCACTGCTCAGCC +>528|TRAV8-4 ENST00000390438|TRAV8-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGGCAGCCACGTCTCTGTCTCTGAAGGAGCCCTGGTTCTGCTGAGGTGCAACTACTCATCGTCTGTTCCACCATATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGCTGTGAGTGA +>529|TRAV8-6 ENST00000390443|TRAV8-6|5'UTR|TR|TRA|None|00 +GTAGCTCGTTGATGTCTGTGTGGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGGCTCCTTAAGGGAAAGCCTCTTTCTGTTTCTGAAACTTTTCAAAGCCAGGGACTTGTCCAATCCAACCTCCTCACAGTTCCTAGCTCCTGAGGCTCAGCGCCCTTGGCTTCTGTCCGCCCAGCTTAAGGTCCTGCAGCATTGCCACTGCTCAGCC +>530|TRAV8-6 ENST00000390443|TRAV8-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGCGTTCCAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCTGTGACCCAGCTTGACAGCCAAGTCCCTGTCTTTGAAGAAGCCCCTGTGGAGCTGAGGTGCAACTACTCATCGTCTGTTTCAGTGTATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTATTTATCAGGATCCACCCTGGTTGAAAGCATCAACGGTTTTGAGGCTGAATTTAACAAGAGTCAAACTTCCTTCCACTTGAGGAAACCCTCAGTCCATATAAGCGACACGGCTGAGTACTTCTGTGCTGTGAGTGA +>531|TRAV8-7 ENST00000390456|TRAV8-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCTTAGTGGTCATTCTGCTGCTTGGAATGTTCTTCACACTGAGTAAAACCCAGTCGGTGACCCAGCTTGATGGCCACATCACTGTCTCTGAAGAAGCCCCTCTGGAACTGAAGTGCAACTATTCCTATAGTGGAGTTCCTTCTCTCTTCTGGTATGTCCAATACTCTAGCCAAAGCCTCCAGCTTCTCCTCAAAGACCTAACAAAGGCCACCCAGGTTAAAGGCATCAGAGGTTTTGAGGCTGAATTTAAGAAGAGCGAAACCTCCTTCTACCTGAGGAAACCATCAACCCATGTGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGACAGGAG +>532|TRAV9-1 ENST00000390431|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATTCTTCTCCAGGACCAGCGATTGCACTATTCTTAATGTTTGGGGGAATCAATGGAGATTCAGTGGTCCAGACAGAAGGCCAAGTGCTCCCCTCTGAAGGGGATTCCCTGATTGTGAACTGCTCCTATGAAACCACACAGTACCCTTCCCTTTTTTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCACCTGAAAGCCATGAAGGCCAATGACAAGGGAAGGAACAAAGGTTTTGAAGCCATGTACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGACTCAGTTCAAGAGTCAGACTCCGCTGTGTACTTCTGTGCTCTGAGTGA +>533|TRAV9-2 ENST00000390441|TRAV9-2|5'UTR|TR|TRA|None|00 +CACTGTGATTTCTTCATGTTAAGGATCAAGACCATTATTTGGGTAACACACTAAAG +>534|TRAV9-2 ENST00000390441|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGGCTTAGTATCTCTGATACTCTTACTGCTTGGAAGAACCCGTGGAGATTCAGTGACCCAGATGGAAGGGCCAGTGACTCTCTCAGAAGAGGCCTTCCTGACTATAAACTGCACGTACACAGCCACAGGATACCCTTCCCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCTACAGCTCCTCCTGAAAGCCACGAAGGCTGATGACAAGGGAAGCAACAAAGGTTTTGAAGCCACATACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGGCTCAGTTCAAGTGTCAGACTCAGCGGTGTACTTCTGTGCTCTGAGTGA +>535|TRBC1 ENST00000633705|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>536|TRBC1 ENST00000632136|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>537|TRBC2 ENST00000466254|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>538|TRBC2 ENST00000622053|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>539|TRBD1 ENST00000631435|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>540|TRBJ1-1 ENST00000634213|TRBJ1-1|J-REGION|TR|TRB|None|00 +TGAACACTGAAGCTTTCTTTGGACAAGGCACCAGACTCACAGTTGTAG +>541|TRBJ1-2 ENST00000631745|TRBJ1-2|J-REGION|TR|TRB|None|00 +CTAACTATGGCTACACCTTCGGTTCGGGGACCAGGTTAACCGTTGTAG +>542|TRBJ1-3 ENST00000633780|TRBJ1-3|J-REGION|TR|TRB|None|00 +CTCTGGAAACACCATATATTTTGGAGAGGGAAGTTGGCTCACTGTTGTAG +>543|TRBJ1-4 ENST00000632041|TRBJ1-4|J-REGION|TR|TRB|None|00 +CAACTAATGAAAAACTGTTTTTTGGCAGTGGAACCCAGCTCTCTGTCTTGG +>544|TRBJ1-5 ENST00000634000|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAGCAATCAGCCCCAGCATTTTGGTGATGGGACTCGACTCTCCATCCTAG +>545|TRBJ1-6 ENST00000632228|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAACGGGACCAGGCTCACTGTGACAG +>546|TRBJ1-6 ENST00000633713|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAATGGGACCAGGCTCACTGTGACAG +>547|TRBJ2-1 ENST00000390412|TRBJ2-1|J-REGION|TR|TRB|None|00 +CTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAG +>548|TRBJ2-2 ENST00000390413|TRBJ2-2|J-REGION|TR|TRB|None|00 +CGAACACCGGGGAGCTGTTTTTTGGAGAAGGCTCTAGGCTGACCGTACTGG +>549|TRBJ2-2P ENST00000390414|TRBJ2-2P|J-REGION|TR|TRB|None|00 +CTGAGAGGCGCTGCTGGGCGTCTGGGCGGAGGACTCCTGGTTCTGG +>550|TRBJ2-3 ENST00000390415|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCG +>551|TRBJ2-4 ENST00000390416|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGCCAAAAACATTCAGTACTTCGGCGCCGGGACCCGGCTCTCAGTGCTGG +>552|TRBJ2-5 ENST00000390417|TRBJ2-5|J-REGION|TR|TRB|None|00 +ACCAAGAGACCCAGTACTTCGGGCCAGGCACGCGGCTCCTGGTGCTCG +>553|TRBJ2-6 ENST00000390418|TRBJ2-6|J-REGION|TR|TRB|None|00 +CTCTGGGGCCAACGTCCTGACTTTCGGGGCCGGCAGCAGGCTGACCGTGCTGG +>554|TRBJ2-7 ENST00000390419|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACTTCGGGCCGGGCACCAGGCTCACGGTCACAG +>555|TRBJ2-7 ENST00000633660|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACGTCGGGCCGGGCACCAGGCTCACGGTCACAG +>556|TRBV10-1 ENST00000390364|TRBV10-1|5'UTR|TR|TRB|None|00 +ACTGAGAGCCCAACTTCAGTCTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>557|TRBV10-1 ENST00000390364|TRBV10-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACGAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGAAATCACCCAGAGCCCAAGACACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGGCGTGTCACCAGACTTGGAACCACAACAATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCCATTACTCATATGGTGTTCACGACACTAACAAAGGAGAAGTCTCAGATGGCTACAGTGTCTCTAGATCAAACACAGAGGACCTCCCCCTCACTCTGGAGTCTGCTGCCTCCTCCCAGACATCTGTATATTTCTGCGCCAGCAGTGAGTC +>558|TRBV10-2 ENST00000426318|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>559|TRBV10-2 ENST00000426318|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTACGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>560|TRBV10-2 ENST00000633575|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>561|TRBV10-2 ENST00000633575|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTATGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>562|TRBV10-3 ENST00000611462|TRBV10-3|5'UTR|TR|TRB|None|00 +ATGAGATCCTGGCCTGGACCTGAA +>563|TRBV10-3 ENST00000611462|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCACCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>564|TRBV10-3 ENST00000631471|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCATCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>565|TRBV11-1 ENST00000390367|TRBV11-1|5'UTR|TR|TRB|None|00 +CCTGCCCTGACCCTGCC +>566|TRBV11-1 ENST00000390367|TRBV11-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCACCAGGCTTCTCTGCTGGATGGCCCTCTGTCTCCTGGGGGCAGAACTCTCAGAAGCTGAAGTTGCCCAGTCCCCCAGATATAAGATTACAGAGAAAAGCCAGGCTGTGGCTTTTTGGTGTGATCCTATTTCTGGCCATGCTACCCTTTACTGGTACCGGCAGATCCTGGGACAGGGCCCGGAGCTTCTGGTTCAATTTCAGGATGAGAGTGTAGTAGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>567|TRBV11-3 ENST00000611787|TRBV11-3|5'UTR|TR|TRB|None|00 +AGTGACCCTGATCTGGCAAAGCTTCCATCCTGCCCTGACCCTGCC +>568|TRBV11-3 ENST00000611787|TRBV11-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGGCTCCTCTGCTGGGTGGCCTTCTGTCTCCTGGTGGAAGAACTCATAGAAGCTGGAGTGGTTCAGTCTCCCAGATATAAGATTATAGAGAAAAAACAGCCTGTGGCTTTTTGGTGCAATCCTATTTCTGGCCACAATACCCTTTACTGGTACCTGCAGAACTTGGGACAGGGCCCGGAGCTTCTGATTCGATATGAGAATGAGGAAGCAGTAGACGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGA +>569|TRBV12-3 ENST00000620569|TRBV12-3|5'UTR|TR|TRB|None|00 +TTCTTTGCTCATGCTCACAGAGGGCCTGGTCTAGAATATTCCACATCTGCTCTCACTCTGCC +>570|TRBV12-3 ENST00000620569|TRBV12-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCTTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCGAAGCATACAGATGCTGGAGTTATCCAGTCACCCCGCCATGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGCCACAACTCCCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>571|TRBV12-4 ENST00000617347|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>572|TRBV12-4 ENST00000617347|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>573|TRBV12-4 ENST00000631824|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>574|TRBV12-4 ENST00000631824|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>575|TRBV12-5 ENST00000621184|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>576|TRBV12-5 ENST00000621184|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGCACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>577|TRBV12-5 ENST00000632829|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>578|TRBV12-5 ENST00000632829|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGGACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>579|TRBV13 ENST00000614171|TRBV13|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTTAGTCCTGACCTGCCTGACTCTGCCTGGAACACCAGGCTCCTCTGCCGTGTCATGCTTTGTCTCCTGGGAGCAGGTTCAGTGGCTGCTGGAGTCATCCAGTCCCCAAGACATCTGATCAAAGAAAAGAGGGAAACAGCCACTCTGAAATGCTATCCTATCCCTAGACACGACACTGTCTACTGGTACCAGCAGGGTCCAGGTCAGGACCCCCAGTTCCTCATTTCGTTTTATGAAAAGATGCAGAGCGATAAAGGAAGCATCCCTGATCGATTCTCAGCTCAACAGTTCAGTGACTATCATTCTGAACTGAACATGAGCTCCTTGGAGCTGGGGGACTCAGCCCTGTACTTCTGTGCCAGCAGCTTAGG +>580|TRBV14 ENST00000617639|TRBV14|5'UTR|TR|TRB|None|00 +CCTTTTTCTCATGCTTGTAAGCTCCTTCATCTGGAAATGTGATTTACCTGGGTCCTGCC +>581|TRBV14 ENST00000617639|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGTTTCCAGGCTTCTCAGTTTAGTGTCCCTTTGTCTCCTGGGAGCAAAGCACATAGAAGCTGGAGTTACTCAGTTCCCCAGCCACAGCGTAATAGAGAAGGGCCAGACTGTGACTCTGAGATGTGACCCAATTTCTGGACATGATAATCTTTATTGGTATCGACGTGTTATGGGAAAAGAAATAAAATTTCTGTTACATTTTGTGAAAGAGTCTAAACAGGATGAGTCCGGTATGCCCAACAATCGATTCTTAGCTGAAAGGACTGGAGGGACGTATTCTACTCTGAAGGTGCAGCCTGCAGAACTGGAGGATTCTGGAGTTTATTTCTGTGCCAGCAGCCAAGA +>582|TRBV15 ENST00000616518|TRBV15|5'UTR|TR|TRB|None|00 +ACTCCCACCTCTCAACCCAGGAATCAGAGCCTGAGACAGACAGATGCTTCATTCCTGTATGGGGTGGTATTCCTGCC +>583|TRBV15 ENST00000616518|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTCCTGGGCTTCTCCACTGGATGGCCCTTTGTCTCCTTGGAACAGGTCATGGGGATGCCATGGTCATCCAGAACCCAAGATACCAGGTTACCCAGTTTGGAAAGCCAGTGACCCTGAGTTGTTCTCAGACTTTGAACCATAACGTCATGTACTGGTACCAGCAGAAGTCAAGTCAGGCCCCAAAGCTGCTGTTCCACTACTATGACAAAGATTTTAACAATGAAGCAGACACCCCTGATAACTTCCAATCCAGGAGGCCGAACACTTCTTTCTGCTTTCTTGACATCCGCTCACCAGGCCTGGGGGACGCAGCCATGTACCTGTGTGCCACCAGCAGAGA +>584|TRBV16 ENST00000620773|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCCAATATTCACCTGCATCACAATCCTTTGTCTGCTGGCTGCAGGTTCTCCTGGTGAAGAAGTCGCCCAGACTCCAAAACATCTTGTCAGAGGGGAAGGACAGAAAGCAAAATTATATTGTGCCCCAATAAAAGGACACAGTTATGTTTTTTGGTACCAACAGGTCCTGAAAAACGAGTTCAAGTTCTTGATTTCCTTCCAGAATGAAAATGTCTTTGATGAAACAGGTATGCCCAAGGAAAGATTTTCAGCTAAGTGCCTCCCAAATTCACCCTGTAGCCTTGAGATCCAGGCTACGAAGCTTGAGGATTCAGCAGTGTATTTTTGTGCCAGCAGCCAATC +>585|TRBV17 ENST00000619103|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACACTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>586|TRBV17 ENST00000631663|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACGCTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>587|TRBV18 ENST00000611520|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>588|TRBV18 ENST00000611520|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGACTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>589|TRBV18 ENST00000631559|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>590|TRBV18 ENST00000631559|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGAGTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>591|TRBV19 ENST00000390393|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>592|TRBV19 ENST00000390393|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTCTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>593|TRBV19 ENST00000632638|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>594|TRBV19 ENST00000632638|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTTTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>595|TRBV2 ENST00000455382|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>596|TRBV2 ENST00000455382|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCGCTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>597|TRBV2 ENST00000632828|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>598|TRBV2 ENST00000632828|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCACTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>599|TRBV20-1 ENST00000390394|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>600|TRBV20-1 ENST00000390394|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>601|TRBV20-1 ENST00000633466|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>602|TRBV20-1 ENST00000633466|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCTGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>603|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|5'UTR|TR|TRB|None|00 +GATCAGTCATCCCTCCTCGCTGGTGA +>604|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTAGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAACATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGCTCCGGAAACAGAGCCTCATGCTGATGGCAACTTCCAATGAGGGCTCCGAGGTCACATACGAGCAAGGCGTCAAGAAGGACAAGTTTCCCATCAACCATCCAAACCTGACCTTCTCCGCTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGA +>605|TRBV21-1 ENST00000453262|TRBV21-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGCCTCAGACTTCTCTGCTGTGTGGCCATTTCTTTCTGGGGAGCCAGGCTCCACGGACACCAAGGTCACCCAGAGACCTAGACTTCTGGCCAAAGCAAGTGAACAGAAAGCAAAGATGGATTGTGTTCCTATAAAAGCACATAGTTATGTTTACTGGTATCGTAAGAAGCTGGAAGAAGAGCTCAAGTTTTTGGTTTACTTTCAGAACGAAGAACTTATTCAGAAAGCAGAAATAATCAATGAGCGATTTTTAGCCCAATGCTCCAAAAACTCATCCTGTACCTTGGAGATCCAGTCCACGGAGTCAGGGGACACAGCACTGTATTTCTGTGCCAGCAGCAAAGC +>606|TRBV21-1 ENST00000633477|TRBV21-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGCCTCAGACTTCTCTGCTGTGTGGCCATTTCTTTCTGGGGAGCCAGGCTCCACGGACACCAAGGTCACCCAGAGACCTAGACTTCTGGTCAAAGCAAGTGAACAGAAAGCAAAGATGGATTGTGTTCCTATAAAAGCACATAGTTATGTTTACTGGTATCGTAAGAAGCTGGAAGAAGAGCTCAAGTTTTTGGTTTACTTTCAGAATGAAGAACTTATTCAGAAAGCAGAAATAATCAATGAGCGATTTTTAGCCCAATGCTCCAAAAACTCATCCTGTACCTTGGAGATCCAGTCCACGGAGTCAGGGGACACAGCACTGTATTTCTGTGCCAGCAGCAAAGC +>607|TRBV23-1 ENST00000390396|TRBV23-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCGGCTGTGCAGCCCTGTGTCTCCTGGCAGCAGACTCTTTTCATGCCAAAGTCACACAGACTCCAGGACATTTGGTCAAAGGAAAAGGACAGAAAACAAAGATGGATTGTACCCCCGAAAAAGGACATACTTTTGTTTATTGGTATCAACAGAATCAGAATAAAGAGTTTATGCTTTTGATTTCCTTTCAGAATGAACAAGTTCTTCAAGAAACGGAGATGCACAAGAAGCGATTCTCATCTCAATGCCCCAAGAACGCACCCTGCAGCCTGGCAATCCTGTCCTCAGAACCGGGAGACACGGCACTGTATCTCTGCGCCAGCAGTCAATC +>608|TRBV24-1 ENST00000390397|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>609|TRBV24-1 ENST00000390397|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACAGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>610|TRBV24-1 ENST00000633092|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>611|TRBV24-1 ENST00000633092|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACGGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>612|TRBV25-1 ENST00000610439|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>613|TRBV25-1 ENST00000610439|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>614|TRBV25-1 ENST00000390398|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>615|TRBV25-1 ENST00000390398|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>616|TRBV27 ENST00000390399|TRBV27|5'UTR|TR|TRB|None|00 +ACCTGGAGCCCCCAGAACTGGCAGACACCTGCCTGATGCTGCC +>617|TRBV27 ENST00000390399|TRBV27|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCCAGCTCCTTGGCTATGTGGTCCTTTGCCTTCTAGGAGCAGGCCCCCTGGAAGCCCAAGTGACCCAGAACCCAAGATACCTCATCACAGTGACTGGAAAGAAGTTAACAGTGACTTGTTCTCAGAATATGAACCATGAGTATATGTCCTGGTATCGACAAGACCCAGGGCTGGGCTTAAGGCAGATCTACTATTCAATGAATGTTGAGGTGACTGATAAGGGAGATGTTCCTGAAGGGTACAAAGTCTCTCGAAAAGAGAAGAGGAATTTCCCCCTGATCCTGGAGTCGCCCAGCCCCAACCAGACCTCTCTGTACTTCTGTGCCAGCAGTTTATC +>618|TRBV28 ENST00000390400|TRBV28|5'UTR|TR|TRB|None|00 +ATTCTTTCTTCAAAGCAGCC +>619|TRBV28 ENST00000390400|TRBV28|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTATG +>620|TRBV29-1 ENST00000422143|TRBV29-1|5'UTR|TR|TRB|None|00 +GAAGGAAAGATGAACTTGAGTTTCACTTCTTAGTGCCTTTTCTCAGGGGAGAGGCCATCACTTGAAG +>621|TRBV29-1 ENST00000422143|TRBV29-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGAGTCTTCTGCTCCTTCTCCTGGGACTAGGCTCTGTGTTCAGTGCTGTCATCTCTCAAAAGCCAAGCAGGGATATCTGTCAACGTGGAACCTCCCTGACGATCCAGTGTCAAGTCGATAGCCAAGTCACCATGATGTTCTGGTACCGTCAGCAACCTGGACAGAGCCTGACACTGATCGCAACTGCAAATCAGGGCTCTGAGGCCACATATGAGAGTGGATTTGTCATTGACAAGTTTCCCATCAGCCGCCCAAACCTAACATTCTCAACTCTGACTGTGAGCAACATGAGCCCTGAAGACAGCAGCATATATCTCTGCAGCGTTGAAGA +>622|TRBV3-1 ENST00000390387|TRBV3-1|5'UTR|TR|TRB|None|00 +AGACCAGAATCCTGCCCTGGGCCTTGCCTGGTCTGCCTCACTCTGCC +>623|TRBV3-1 ENST00000390387|TRBV3-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTCCTCTGCTGTGTGGTCTTCTGCCTCCTCCAAGCAGGTCCCTTGGACACAGCTGTTTCCCAGACTCCAAAATACCTGGTCACACAGATGGGAAACGACAAGTCCATTAAATGTGAACAAAATCTGGGCCATGATACTATGTATTGGTATAAACAGGACTCTAAGAAATTTCTGAAGATAATGTTTAGCTACAATAATAAGGAGCTCATTATAAATGAAACAGTTCCAAATCGCTTCTCACCTAAATCTCCAGACAAAGCTCACTTAAATCTTCACATCAATTCCCTGGAGCTTGGTGACTCTGCTGTGTATTTCTGTGCCAGCAGCCAAGA +>624|TRBV30 ENST00000417977|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>625|TRBV30 ENST00000417977|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTTCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>626|TRBV30 ENST00000631690|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>627|TRBV30 ENST00000631690|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTCCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>628|TRBV4-1 ENST00000390357|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>629|TRBV4-1 ENST00000390357|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>630|TRBV4-1 ENST00000632713|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>631|TRBV4-1 ENST00000632713|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCGAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>632|TRBV4-2 ENST00000390392|TRBV4-2|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>633|TRBV4-2 ENST00000390392|TRBV4-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGGCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAACTTTAAAGAACAGACTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGTGCCAGCAGCCAAGA +>634|TRBV4-3 ENST00000631427|TRBV4-3|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>635|TRBV4-3 ENST00000631427|TRBV4-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGTCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAGTCTTGAAGAACGGGTTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>636|TRBV5-1 ENST00000390381|TRBV5-1|5'UTR|TR|TRB|None|00 +CTCAGAGGACCAGTATCCCTCACAGGGTGACACCTGACCAGCTCTGTCCCACCTGGCCATGGGCTCCAGGTACCTCTGATGGGAAGACCTTTGTCTCTTGGGAACAAGTGAATCCTTGGCACAGGCCCAGTGGATTCTGCTGTGCAGAACAGAGAGCAGTGGACCTCAGGAGGCCTGCAAGGGGAGGACATAGGACAGTGACATCACAGTATGCCCCTCCCACCAGGAAAAGCAAGGCTGAGAATTTAGCTCTTTCCCAGGAGGACCAAGCCCTGAGCACAGACACAGTGCTGCCTGCCCCTTTGTGCC +>637|TRBV5-1 ENST00000390381|TRBV5-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTGCTCTGTTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTAAAGGCTGGAGTCACTCAAACTCCAAGATATCTGATCAAAACGAGAGGACAGCAAGTGACACTGAGCTGCTCCCCTATCTCTGGGCATAGGAGTGTATCCTGGTACCAACAGACCCCAGGACAGGGCCTTCAGTTCCTCTTTGAATACTTCAGTGAGACACAGAGAAACAAAGGAAACTTCCCTGGTCGATTCTCAGGGCGCCAGTTCTCTAACTCTCGCTCTGAGATGAATGTGAGCACCTTGGAGCTGGGGGACTCGGCCCTTTATCTTTGCGCCAGCAGCTTGG +>638|TRBV5-3 ENST00000390362|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTATTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>639|TRBV5-3 ENST00000634123|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTGTTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>640|TRBV5-4 ENST00000454561|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACACAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGCCCCACTGTGCC +>641|TRBV5-4 ENST00000454561|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGAGACTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>642|TRBV5-4 ENST00000633696|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACTCAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGGCCCACTGTGCC +>643|TRBV5-4 ENST00000633696|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATGATAGCTCTGAGCTGAATGTGAATGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>644|TRBV5-5 ENST00000390372|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>645|TRBV5-5 ENST00000390372|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>646|TRBV5-5 ENST00000632187|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>647|TRBV5-5 ENST00000632187|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGTAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>648|TRBV5-6 ENST00000390375|TRBV5-6|5'UTR|TR|TRB|None|00 +AAGCCCTGAATCAGATGCAGTGCTTCCTGTCCCTCTGTGCC +>649|TRBV5-6 ENST00000390375|TRBV5-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGCACTGCTTTGTCTCCTGGGAGCAGGCTTAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTAAGTCTGGGCATGACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGGAGGAAGAGAGACAGAGAGGCAACTTCCCTGATCGATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>650|TRBV5-7 ENST00000390378|TRBV5-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGTGCTGCTTTGTCCCCTAGGAGAAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCACGTGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTCCTCGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCAATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTAGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>651|TRBV5-8 ENST00000631639|TRBV5-8|5'UTR|TR|TRB|None|00 +TGGCCACTGAGGAAAGGGAAGAGAATGTTGCCTGGGACAGGAAAATATAGAAAATGAAGGCCCAGAACTCACTCGGCTCTTCCCCAGGAAGACCAAGCCCTGAATCAGGTGCAGTGCCGCCTGGCCCACTGTGCC +>652|TRBV5-8 ENST00000631639|TRBV5-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGACCCAGGCTCCTCTTCTGGGCACTGCTTTGTCTCCTCGGAACAGGCCCAGTGGAGGCTGGAGTCACACAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGCGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTACTGGTACCAACAGGCCCTGGGTCTGGGCCTCCAGTTCCTCCTTTGGTATGACGAGGGTGAAGAGAGAAACAGAGGAAACTTCCCTCCTAGATTTTCAGGTCGCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGAGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>653|TRBV6-1 ENST00000390353|TRBV6-1|5'UTR|TR|TRB|None|00 +GTTCCCCTATCACCGATGCACAGACCCAGAAGACCCCTCCATCCTGTAGCACCTGCC +>654|TRBV6-1 ENST00000390353|TRBV6-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAAGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTCCATGTACTGGTATCGACAAGACCCAGGCATGGGACTGAGGCTGATTTATTACTCAGCTTCTGAGGGTACCACTGACAAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATTAAACAAACGGGAGTTCTCGCTCAGGCTGGAGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTGAAGC +>655|TRBV6-2 ENST00000632016|TRBV6-2|5'UTR|TR|TRB|None|00 +TCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>656|TRBV6-2 ENST00000632016|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>657|TRBV6-2 ENST00000634383|TRBV6-2|5'UTR|TR|TRB|None|00 +AGAATGACGCCCTTGAAAGACGTGTTCCCTTTTCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>658|TRBV6-2 ENST00000634383|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>659|TRBV6-4 ENST00000390360|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>660|TRBV6-4 ENST00000390360|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGACTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGAGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>661|TRBV6-4 ENST00000633472|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>662|TRBV6-4 ENST00000633472|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGATTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGCGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>663|TRBV6-5 ENST00000390368|TRBV6-5|5'UTR|TR|TRB|None|00 +GAGAGTCCTGCTCCCCTTTCATCAATGCACAGATACAGAAGACCCCTCCGTCATGCAGCATCTGCC +>664|TRBV6-5 ENST00000390368|TRBV6-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGCCTCCTGTGCTGTGCAGCCTTGTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGAATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGCTGGTATCACTGACCAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGCTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>665|TRBV6-6 ENST00000390371|TRBV6-6|5'UTR|TR|TRB|None|00 +CAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>666|TRBV6-6 ENST00000390371|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGACAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>667|TRBV6-6 ENST00000633963|TRBV6-6|5'UTR|TR|TRB|None|00 +ATCAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>668|TRBV6-6 ENST00000633963|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGATAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGTATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>669|TRBV6-7 ENST00000390373|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTGATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>670|TRBV6-7 ENST00000631511|TRBV6-7|5'UTR|TR|TRB|None|00 +ATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>671|TRBV6-7 ENST00000631511|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTTATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>672|TRBV6-8 ENST00000390376|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCCGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>673|TRBV6-8 ENST00000632425|TRBV6-8|5'UTR|TR|TRB|None|00 +GAGAGTCCTGTTCCCCTTTTATCAATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>674|TRBV6-8 ENST00000632425|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCGGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>675|TRBV6-9 ENST00000634093|TRBV6-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACTTGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCGCATTCATTACTCAGTTGCTGCTGGTATCACTGACAAAGGAGAAGTCCCCGATGGCTACAATGTATCCAGATCAAACACAGAGGATTTCCCGCTCAGGCTGGAGTCAGCTGCTCCCTCCCAGACATCTGTATACTTCTGTGCCAGCAGTTATTC +>676|TRBV7-1 ENST00000547918|TRBV7-1|5'UTR|TR|TRB|None|00 +CTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>677|TRBV7-1 ENST00000547918|TRBV7-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGCTCCTCTGCTGGGCAGCCATATGTCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGTCCCTGAGACACAAGGTAGCAAAGAAGGGAAAGGATGTAGCTCTCAGATATGATCCAATTTCAGGTCATAATGCCCTTTATTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTCCAATTTACTTCCAAGGCAAGGATGCAGCAGACAAATCGGGGCTTCCCCGTGATCGGTTCTCTGCACAGAGGTCTGAGGGATCCATCTCCACTCTGAAGTTCCAGCGCACACAGCAGGGGGACTTGGCTGTGTATCTCTGTGCCAGCAGCTCAGC +>678|TRBV7-2 ENST00000631392|TRBV7-2|5'UTR|TR|TRB|None|00 +CCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>679|TRBV7-2 ENST00000631392|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>680|TRBV7-2 ENST00000634605|TRBV7-2|5'UTR|TR|TRB|None|00 +ACAGTGATCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>681|TRBV7-2 ENST00000634605|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>682|TRBV7-3 ENST00000390361|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>683|TRBV7-3 ENST00000390361|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAAGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAAAGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCCGCGTATCTCCGTGCCAGCAGCTTAAC +>684|TRBV7-3 ENST00000631882|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>685|TRBV7-3 ENST00000631882|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAATATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAACGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCGGGGGGACTCAGCCGTGTATCTCTGTGCCAGCAGCTTAAC +>686|TRBV7-4 ENST00000390369|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>687|TRBV7-4 ENST00000633313|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGTGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>688|TRBV7-6 ENST00000390374|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGTCCTGACCCTGCC +>689|TRBV7-6 ENST00000390374|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>690|TRBV7-6 ENST00000633265|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGGCCTGACCCTGCC +>691|TRBV7-6 ENST00000633265|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCGTCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>692|TRBV7-7 ENST00000390377|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>693|TRBV7-8 ENST00000632560|TRBV7-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCTAGGTACAAAGTCGCAAAGAGAGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTTTTGGTACCAACAGGCCCTGGGGCAGGGGCCAGAGTTTCTGACTTATTTCCAGAATGAAGCTCAACTAGACAAATCGGGGCTGCCCAGTGATCGCTTCTTTGCAGAAAGGCCTGAGGGATCCGTCTCCACTCTGAAGATCCAGCGCACACAGCAGGAGGACTCCGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>694|TRBV7-9 ENST00000612787|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGAACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>695|TRBV7-9 ENST00000632021|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGGACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>696|TRBV9 ENST00000390363|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>697|TRBV9 ENST00000390363|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCACTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>698|TRBV9 ENST00000633328|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>699|TRBV9 ENST00000633328|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCAGTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>700|TRDC ENST00000390477|TRDC|C-REGION|TR|TRD|None|00 +GAAGTCAGCCTCATACCAAACCATCCGTTTTTGTCATGAAAAATGGAACAAATGTCGCTTGTCTGGTGAAGGAATTCTACCCCAAGGATATAAGAATAAATCTCGTGTCATCCAAGAAGATAACAGAGTTTGATCCTGCTATTGTCATCTCTCCCAGTGGGAAGTACAATGCTGTCAAGCTTGGTAAATATGAAGATTCAAATTCAGTGACATGTTCAGTTCAACACGACAATAAAACTGTGCACTCCACTGACTTTGAAGTGAAGACAGATTCTACAGATCACGTAAAACCAAAGGAAACTGAAAACACAAAGCAACCTTCAAAGAGCTGCCATAAACCCAAAGCCATAGTTCATACCGAGAAGGTGAACATGATGTCCCTCACAGTGCTTGGGCTACGAATGCTGTTTGCAAAGACTGTTGCCGTCAATTTTCTCTTGACTGCCAAGTTATTTTTCTTG +>701|TRDD1 ENST00000415118|TRDD1|D-REGION|TR|TRD|None|00 +GAAATAGT +>702|TRDD2 ENST00000434970|TRDD2|D-REGION|TR|TRD|None|00 +CCTTCCTAC +>703|TRDD3 ENST00000448914|TRDD3|D-REGION|TR|TRD|None|00 +ACTGGGGGATACG +>704|TRDJ1 ENST00000390473|TRDJ1|J-REGION|TR|TRD|None|00 +ACACCGATAAACTCATCTTTGGAAAAGGAACCCGTGTGACTGTGGAACCAA +>705|TRDJ2 ENST00000390475|TRDJ2|J-REGION|TR|TRD|None|00 +CTTTGACAGCACAACTCTTCTTTGGAAAGGGAACACAACTCATCGTGGAACCAG +>706|TRDJ3 ENST00000390476|TRDJ3|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTCGGAACTGGCATCAAACTCTTCGTGGAGCCCC +>707|TRDJ4 ENST00000390474|TRDJ4|J-REGION|TR|TRD|None|00 +CCAGACCCCTGATCTTTGGCAAAGGAACCTATCTGGAGGTACAACAAC +>708|TRDV1 ENST00000390452|TRDV1|5'UTR|TR|TRD|None|00 +CAAAGAGCTACATGCCAC +>709|TRDV1 ENST00000390452|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTGTTCTCCAGCCTGCTGTGTGTATTTGTGGCCTTCAGCTACTCTGGATCAAGTGTGGCCCAGAAGGTTACTCAAGCCCAGTCATCAGTATCCATGCCAGTGAGGAAAGCAGTCACCCTGAACTGCCTGTATGAAACAAGTTGGTGGTCATATTATATTTTTTGGTACAAGCAACTTCCCAGCAAAGAGATGATTTTCCTTATTCGCCAGGGTTCTGATGAACAGAATGCAAAAAGTGGTCGCTATTCTGTCAACTTCAAGAAAGCAGCGAAATCCGTCGCCTTAACCATTTCAGCCTTACAGCTAGAAGATTCAGCAAAGTACTTTTGTGCTCTTGGGGAACT +>710|TRDV2 ENST00000390469|TRDV2|5'UTR|TR|TRD|None|00 +ATTAGCAGGCAGCAGGCCCTGCGAGCCTCCTGTGATCAGCTAGATTTCTCTGGGGAATGAAACAGCTGCTGATAGGGACTGACTTCCTCAGTCACAAGTGTTTCACAAGTGTGTTGGTTCAGAGGAGGGACCAGGCAGAAGGTGGTTGAGAGGCAGAGCTGCCCCTGAGTGAGCC +>711|TRDV2 ENST00000390469|TRDV2|L-REGION+V-REGION|TR|TRD|None|00 +ATGCAGAGGATCTCCTCCCTCATCCATCTCTCTCTCTTCTGGGCAGGAGTCATGTCAGCCATTGAGTTGGTGCCTGAACACCAAACAGTGCCTGTGTCAATAGGGGTCCCTGCCACCCTCAGGTGCTCCATGAAAGGAGAAGCGATCGGTAACTACTATATCAACTGGTACAGGAAGACCCAAGGTAACACAATGACTTTCATATACCGAGAAAAGGACATCTATGGCCCTGGTTTCAAAGACAATTTCCAAGGTGACATTGATATTGCAAAGAACCTGGCTGTACTTAAGATACTTGCACCATCAGAGAGAGATGAAGGGTCTTACTACTGTGCCTGTGACACC +>712|TRDV3 ENST00000535880|TRDV3|5'UTR|TR|TRD|None|00 +TCTTTCATTAGAACCGTCAGATAGTCTCTGAGATCTTAGGAACCCTGTTTTGTTGTATATCCTCTGCCCTGATATGAAGAAAAG +>713|TRDV3 ENST00000535880|TRDV3|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTACTGTGGGCTTTAGCTTTTTGTTTTTCTACAGGGGCACGCTGTGTGACAAAGTAACCCAGAGTTCCCCGGACCAGACGGTGGCGAGTGGCAGTGAGGTGGTACTGCTCTGCACTTACGACACTGTATATTCAAATCCAGATTTATTCTGGTACCGGATAAGGCCAGATTATTCCTTTCAGTTTGTCTTTTATGGGGATAACAGCAGATCAGAAGGTGCAGATTTTACTCAAGGACGGTTTTCTGTGAAACACATTCTGACCCAGAAAGCCTTTCACTTGGTGATCTCTCCAGTAAGGACTGAAGACAGTGCCACTTACTACTGTGCCTTTAG +>714|TRGC1 ENST00000443402|TRGC1|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCAATTGCTGAAACAAAGCTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCTGATGTTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAAAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAGTTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCATCACAATGGATCCCAAAGACAATTGTTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACATGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>715|TRGC2 ENST00000436911|TRGC2|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCGATTGCTGAAACAAAACTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCAGATATTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAGAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAATTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCACCACAGTGGATCCCAAATACAATTATTCAAAGGATGCAAATGATGTCATCACAATGGATCCCAAAGACAATTGGTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACACGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>716|TRGJ1 ENST00000390337|TRGJ1|J-REGION|TR|TRG|None|00 +GAATTATTATAAGAAACTCTTTGGCAGTGGAACAACACTTGTTGTCACAG +>717|TRGJP ENST00000390338|TRGJP|J-REGION|TR|TRG|None|00 +GGGCAAGAGTTGGGCAAAAAAATCAAGGTATTTGGTCCCGGAACAAAGCTTATCATTACAG +>718|TRGJP1 ENST00000390339|TRGJP1|J-REGION|TR|TRG|None|00 +ATACCACTGGTTGGTTCAAGATATTTGCTGAAGGGACTAAGCTCATAGTAACTTCACCTG +>719|TRGJP2 ENST00000390334|TRGJP2|J-REGION|TR|TRG|None|00 +ATAGTAGTGATTGGATCAAGACGTTTGCAAAAGGGACTAGGCTCATAGTAACTTCGCCTG +>720|TRGV1 ENST00000390348|TRGV1|5'UTR|TR|TRG|None|00 +TACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>721|TRGV1 ENST00000390348|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGATATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCTGACTGGGTCATCTGCTGAAATCACCTGTGATCTTCCTGGAGCAAGTACCTTATACATCCACTGGTACCTGCACCAGGAGGGGAAGGCCCCACAGTGTCTTCTGTACTATGAACCCTACTACTCCAGGGTTGTGCTGGAATCAGGAATCACTCCAGGAAAGTATGACACTGGAAGCACAAGGAGCAATTGGAATTTGAGACTGCAAAATCTAATTAAAAATGATTCTGGGTTCTATTACTGTGCCACCTGGGACAGG +>722|TRGV10 ENST00000390341|TRGV10|5'UTR|TR|TRG|None|00 +ACTTTCCTGCCTTCTCCTTGGGTACACCGCCCCGAAGACAGGATGTCACTGCTGGAAGCATTTGCCTTCTCCTCCTGGGCTCCTGAGTTGCTGTCCGAACATTTCAGTCTAGCTGCGTGACCAAAATCATTCTTCAATGTTTCCCTCTTCTACTGTCAG +>723|TRGV10 ENST00000390341|TRGV10|L-REGION+V-REGION|TR|TRG|None|00 +ATGTTCATTGGAAATTCTCCTCTTTTACTTACAGTTGGACTTGGATTATCAAAAGTGGAGCAGTTCCAGCTATCCATTTCCACGGAAGTCAAGAAAAGTATTGACATACCTTGCAAGATATCGAGCACAAGGTTTGAAACAGATGTCATTCACTGGTACCGGCAGAAACCAAATCAGGCTTTGGAGCACCTGATCTATATTGTCTCAACAAAATCCGCAGCTCGACGCAGCATGGGTAAGACAAGCAACAAAGTGGAGGCAAGAAAGAATTCTCAAACTCTCACTTCAATCCTTACCATCAAGTCCGTAGAGAAAGAAGACATGGCCGTTTACTACTGTGCTGCGTGGGATTA +>724|TRGV2 ENST00000426402|TRGV2|5'UTR|TR|TRG|None|00 +GGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCCCTCTGCTTGTGTCTCAGGAAGACCACCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGAACCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>725|TRGV2 ENST00000426402|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTAACGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCAGTACTATGACTCCTACAACTCCAAGGTTGTGTTGGAATCAGGAGTCAGTCCAGGGAAGTATTATACTTACGCAAGCACAAGGAACAACTTGAGATTGATACTGCGAAATCTAATTGAAAATGACTTTGGGGTCTATTACTGTGCCACCTGGGACGGG +>726|TRGV3 ENST00000390346|TRGV3|5'UTR|TR|TRG|None|00 +CTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGTCTCAGGAAACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCGTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>727|TRGV3 ENST00000390346|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCAGACTGGGTCATCTGCTGAAATCACTTGCGATCTTACTGTAACAAATACCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCACCGCAAGGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGAGACTGCAAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>728|TRGV4 ENST00000390345|TRGV4|5'UTR|TR|TRG|None|00 +GGCCTGAGCTCTCCTGGCCCCTGGCTCTCTTCTGCAGAGGGCCTGCTCTCAGCTGCCACAAGAGGGCGCCGGAGAACGGACCTGAGCAAGAGAGGCAGGAGCTCCTCTGCAGGTCCTCCCAGGCACCAATCCTTCTGGGAGGGAGGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCTCTCTGCTTGTGTCTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCTCAGAGAGGAAGGC +>729|TRGV4 ENST00000390345|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTACCGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACACCTCCAGCGTTGTGTTGGAATCAGGAATCAGCCCAGGGAAGTATGATACTTACGGAAGCACAAGGAAGAACTTGAGAATGATACTGCGAAATCTTATTGAAAATGACTCTGGAGTCTATTACTGTGCCACCTGGGATGGG +>730|TRGV5 ENST00000390344|TRGV5|5'UTR|TR|TRG|None|00 +TTCTGGGAGGAAGGCTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGACTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCGGAGTTTTAAGAGGATCTTCTGCTCCTCCTCATCTGGTCCCTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>731|TRGV5 ENST00000390344|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGGGAACGAAGTCAGTCACGAGGCCGACTAGGTCATCTGCTGAAATCACTTGTGACCTTACTGTAATAAATGCCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCAACTCAAAGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGATACTACGAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>732|TRGV8 ENST00000390343|TRGV8|5'UTR|TR|TRG|None|00 +CTACTGTCTTCTGTGTTAGGGATCACTTCCTTGTTGAGTGGGACCTGAGTTTTGAGAGGGTCTTCTGCTCCTCTTCGTCTGGTCCCTTACTTCCAAGACCCCAGAGAGGAAGGC +>733|TRGV8 ENST00000390343|TRGV8|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTTGGCTCTAGCTCTGCTTCTAGCTTTCCTGCCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACAAAGTCAGTCACCAGGCCAACTGGGTCATCAGCTGTAATCACTTGTGATCTTCCTGTAGAAAATGCCGTCTACACCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACAACTCCAGGGTTGTGTTGGAATCAGGAATCAGTCGAGAAAAGTATCATACTTATGCAAGCACAGGGAAGAGCCTTAAATTTATACTGGAAAATCTAATTGAACGTGACTCTGGGGTCTATTACTGTGCCACCTGGGATAGG +>734|TRGV9 ENST00000444775|TRGV9|5'UTR|TR|TRG|None|00 +AAAAAAATTCAAGTCAATCCATAGAAGTGGGTCGTGGAATTCCAGGCAGAAAGTGACTAAATGAAGATGGAAGGACAGGGAGGGGGTGGCCACATCACAGAGAACCTCTTATCCTAAGAACTCTGGACTTCATCTTCAGAGGCAAGGTAGAGAGAGCAAGGACTTTAGAGCAGGAAAAGGACCAGGTCAGTCTAGTGGCCATGGGGAAGGTGGGTGGGAGGGGCCGAGATGGGATGTATGGAGGTGCGTGAGGTGGAGGCAGTGGTGAGCCAGGAAATGTTTAGGACGTAGAATCCTCAGGAATTAGAGTGCGGTGAATTAGAGGGGAGAATTGAGGCTGATGCTCAAGCTCCTGGCTTGGGCAATGTGGGTAGTTATGTCATACAGGGAACTCGGAAGAAGATATGGTTTGGGGGAAGGGAATGAGTTCACTCTGGCTATGAGCAGACTTTGTTTGAGATCCCATGTCAGACGTACTTGAAAATGTCCAAGAGTTAGCTGGATATGGGTACAGACAGCTTTCGATTTAACTGAGGTCCGACTTAAGATTTTTTTTTACTTTATGATGGTGCAAAAGTGACACGCATTTGGTAGAAAACATAATTTGACCTTTGCTGTTTCCCCAGGACAGTGATATAAGGTTATGATACTCTCTTGCGATGCTGGGCAGTGGCAGTGAGCTGCAGCTCCCAGTGGGTAAATTAAGCATGGAAATCTGGAACACAGCAGCTTTTAAGGGATGCACTGGGGAGAGCAGTTTGTAAAAATACCTTGGGACGGATTAAATGTCTTGGCTTAGAGAAAGAACAACAGACAATAGGAAACTGTCATTGAGGAGAAGCCGGGATTCAGGAGATGTACATTATTCAGGTAGCTGAGGGAGGGGACAGGAACCTGAATCTTCAACAGAAGCAAACAAACTGGGATGGAGGGCCCAGCCTCATGAAGGTGACCAGAAGGACCCGGTGCTGCAGGCTGTGTGGGTAGCTGAGCAGAGCTAAGCGGCTTGACGGACCAACATCTCTCCAGCTGGTTGAAGACAAGCTCTCAGAAGACAATGCTGCATGTCACAGCCCCAGCAACCAACAACACCAGCCTGACAACTTGCTGGGGTGGCCGCCTTGTGGTCTGAGGTGGCCGTCTAAACTATGTGGTCTGATCTCAGGCTGCAGACCTTGCAGGACTGTCTTCACACAGACTGGAAGTGCTAACAGGTGGTGAGGACACCGCTTTACAACGATGCAGGGGGCCCCATGTCACCCTCACCCATGGGAAGTTTGACTTGGTGGACTCAGCCAAGCCACAGAGGTCTAACGCTTCTCTGCGGTGATTTCAGGCTGCCCTGGCAGAAAGCACAGTGCCTGCAGAC +>735|TRGV9 ENST00000444775|TRGV9|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTCACTGCTCCACACATCAACGCTGGCAGTCCTTGGGGCTCTGTGTGTATATGGTGCAGGTCACCTAGAGCAACCTCAAATTTCCAGTACTAAAACGCTGTCAAAAACAGCCCGCCTGGAATGTGTGGTGTCTGGAATAACAATTTCTGCAACATCTGTATATTGGTATCGAGAGAGACCTGGTGAAGTCATACAGTTCCTGGTGTCCATTTCATATGACGGCACTGTCAGAAAGGAATCCGGCATTCCGTCAGGCAAATTTGAGGTGGATAGGATACCTGAAACGTCTACATCCACTCTCACCATTCACAATGTAGAGAAACAGGACATAGCTACCTACTACTGTGCCTTGTGGGAGGTG +>736|TRBD2 GRCh38-release94|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTAGCGGGAGGG +>737|TRAJ15 GRCh38-release94|TRAJ15|J-REGION|TR|TRA|None|00 +CCAACCAGGCAGGAACTGCTCTGATCTTTGGGAAGGGAACCACCTTATCAGTGAGTTCCA +>738|IGLV6-57 GRCh38-release94|IGLV6-57|5'UTR|IG|IGL|None|00 +TCTGAGGATACGCGTGACAGATAAGAAGGGCTGGTGGGATCAGTCCTGGTGGTAGCTCAGGAAGCAGAGCCTGGAGCATCTCCACT +>739|TRBV11-2 GRCh38-release94|TRBV11-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCGGCCCTCTGTCTCCTGGGAGCAGAACTCACAGAAGCTGGAGTTGCCCAGTCTCCCAGATATAAGATTATAGAGAAAAGGCAGAGTGTGGCTTTTTGGTGCAATCCTATATCTGGCCATGCTACCCTTTACTGGTACCAGCAGATCCTGGGACAGGGCCCAAAGCTTCTGATTCAGTTTCAGAATAACGGTGTAGTGGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAACCTGCAAAGCTTGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGC +>740|IGKV2-18 GRCh38-release94|IGKV2-18|L-REGION+V-REGION|IG|IGK|None|00 +ATGCTTTGGGTTCCTGGATCCAGTGGAGATATTGTGATGACCCAGACTCCACCCTCCCTGCCCGTCAACCCTGGAGAGCCGGCCTCCATCTCTTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATATACCTATTTGCATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATTTATAGGGTTTCCAATCATCTTTCTGGGGTCCCAGACAGGTTTAGTGGCAGTGGGTCAGGTAGTGATTTCACACTGAAAATCAGCTGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTACACAGTTTCCTAACAC +>741|TRGV11 AC244625.2|TRGV11|L-REGION+V-REGION|TR|TRG|None|00 +ATGCCACTGGTAGTAGCTGTTATCTTCTTCTCCCTCTGGGTTTTTGCACTTGGGCAGTTGGAACAACCTGAAATATCTATTTCCAGACCAGCAAATAAGAGTGCCCACATATCTTGGAAGGCATCCATCCAAGGCTTTAGCAGTAAAATCATACACTGGTACTGGCAGAAACCAAACAAAGGCTTAGAATATTTATTACATGTCTTCTTGACAATCTCTGCTCAAGATTGCTCAGGTGGGAAGACTAAGAAACTTGAGGTAAGTAAAAATGCTCACACTTCCACTTCCACTTTGAAAATAAAGTTCTTAGAGAAAGAAGATGAGGTGGTGTACCACTGTGCCTGCTGGATTAGGCAC +>742|IGHV1-8 AC_000146.1|IGHV1-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAAGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCAGTTATGATATCAACTGGGTGCGACAGGCCACTGGACAAGGGCTTGAGTGGATGGGATGGATGAACCCTAACAGTGGTAACACAGGCTATGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGAACACCTCCATAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGG +>743|TRBV20-1 GRCh38-release94|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>744|TRBV7-7 GRCh38-release94|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATTCTGTTTCCACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC diff --git a/lib/rust/vdj_ann_ref/vdj_refs_3.1/mouse/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_3.1/mouse/fasta/regions.fa new file mode 100644 index 0000000..cce00b9 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_3.1/mouse/fasta/regions.fa @@ -0,0 +1,1284 @@ +>1|IGHA ENSMUST00000178282|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGGTAAACCCACCAATGTCAGCGTGTCTGTGATCATGTCAGAGGGAGATGGCATCTGCTAC +>2|IGHA ENSMUST00000194738|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGAACGTCAAGAGCCACTTTCCTATGTGCTACTGGACCAGTCAGAAGACATCCTGGAGGAAGAGGCCCCAGGTGCCAGCCTGTGGCCCACCACTGTGACCTTCCTCACCCTCTTCCTACTGAGCTTGTTCTACAGCACAGCACTCACTGTTACAACTGTTCGAGGCCCGTTTGGCAGCAAAGAGGTCCCCCAGTAC +>3|IGHD ENSMUST00000192250|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGATGCTACCACCTCCTGCCTGAGTCAGACGGTCCTTCCAGGAGACCTGATGGTCCTGCCCTTGCC +>4|IGHD ENSMUST00000194162|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGCATAGTCAACACCATCCAACACTCGTGTATCATGGATGAGCAAAGTGACAGCTACATGGACTTAGAGGAGGAGAACGGCCTGTGGCCCACAATGTGCACCTTCGTGGCCCTCTTCCTGCTCACACTGCTCTACAGTGGCTTCGTCACCTTCATCAAGGTGAAG +>5|IGHD1-1 ENSMUST00000103439|IGHD1-1|D-REGION|IG|IGH|None|00 +TTTATTACTACGGTAGTAGCTAC +>6|IGHD2-3 ENSMUST00000177839|IGHD2-3|D-REGION|IG|IGH|None|00 +TCTATGATGGTTACTAC +>7|IGHD2-4 ENSMUST00000179560|IGHD2-4|D-REGION|IG|IGH|None|00 +TCTACTATGATTACGAC +>8|IGHD2-5 ENSMUST00000178549|IGHD2-5|D-REGION|IG|IGH|None|00 +CCTACTATAGTAACTAC +>9|IGHD2-7 ENSMUST00000177965|IGHD2-7|D-REGION|IG|IGH|None|00 +TCTACTATGGTTACGAC +>10|IGHD2-8 ENSMUST00000180001|IGHD2-8|D-REGION|IG|IGH|None|00 +TCTACTATGGTAACTAC +>11|IGHD3-1 ENSMUST00000180266|IGHD3-1|D-REGION|IG|IGH|None|00 +GGCACAGCTCGGGCTAC +>12|IGHD3-2 ENSMUST00000179883|IGHD3-2|D-REGION|IG|IGH|None|00 +AGACAGCTCAGGCTAC +>13|IGHD4-1 ENSMUST00000179520|IGHD4-1|D-REGION|IG|IGH|None|00 +CTAACTGGGAC +>14|IGHD5-2 ENSMUST00000179166|IGHD5-2|D-REGION|IG|IGH|None|00 +GAATACCTAC +>15|IGHD5-5 ENSMUST00000178815|IGHD5-5|D-REGION|IG|IGH|None|00 +GACTACCTAC +>16|IGHD5-7 ENSMUST00000178483|IGHD5-7|D-REGION|IG|IGH|None|00 +AGGCAGCTAGCCTCTGCAGTGCCACAACC +>17|IGHD5-8 ENSMUST00000178909|IGHD5-8|D-REGION|IG|IGH|None|00 +AGACAGCTAGCCTCTGCAGTGCCACAACC +>18|IGHE ENSMUST00000137336|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGGTAACACCTCCCTCCATCCCTCC +>19|IGHE ENSMUST00000223335|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGAGCTAGACCTCCAGGACCTATGTATTGAAGAGGTGGAGGGCGAGGAGCTGGAAGAGCTGTGGACCAGTATTTGTGTCTTCATCACCCTGTTCCTGCTCAGTGTGAGCTATGGGGCCACTGTCACCGTCCTCAAGGTGAAGTGGGTCTTCTCCACACCGATGCAGGATACACCCCAGACCTTCCAAGACTATGCCAACATCTTCCAGACCAGGGCA +>20|IGHG1 ENSMUST00000103420|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGTAAA +>21|IGHG1 ENSMUST00000194304|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGGCTGCAACTGGACGAGACCTGTGCTGAGGCCCAGGACGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGTGTGTGCTACAGCGCTGCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCGGTGGTGGAGCTGAAGCAGACACTGGTTCCTGAATACAAGAACATGATTGGGCAAGCACCC +>22|IGHG2B ENSMUST00000103418|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>23|IGHG2B ENSMUST00000192188|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGGCTAGACCTGGATGATATCTGTGCTGAGGCCAAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCAGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>24|IGHG2C ENSMUST00000103416|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGGCTAGACCTGGATGATGTCTGTACTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACAACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGTTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCTGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>25|IGHG2C ENSMUST00000195192|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGTAAA +>26|IGHG3 ENSMUST00000103423|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGGTAAA +>27|IGHG3 ENSMUST00000223179|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGAGCTGGAACTGAATGAGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>28|IGHJ1 ENSMUST00000103430|IGHJ1|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATGTCTGGGGCACAGGGACCACGGTCACCGTCTCCTCAG +>29|IGHJ2 ENSMUST00000192746|IGHJ2|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAAGGCACCACTCTCACAGTCTCCTCAG +>30|IGHJ3 ENSMUST00000103428|IGHJ3|J-REGION|IG|IGH|None|00 +CCTGGTTTGCTTACTGGGGCCAAGGGACTCTGGTCACTGTCTCTGCAG +>31|IGHJ4 ENSMUST00000103427|IGHJ4|J-REGION|IG|IGH|None|00 +ATTACTATGCTATGGACTACTGGGGTCAAGGAACCTCAGTCACCGTCTCCTCAG +>32|IGHM ENSMUST00000103426|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGGTAAACCCACACTGTACAATGTCTCCCTGATCATGTCTGACACAGGCGGCACCTGCTAT +>33|IGHM ENSMUST00000177715|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGAGGGGGAGGTGAATGCTGAGGAGGAAGGCTTTGAGAACCTGTGGACCACTGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGCACCACCGTCACCCTGTTCAAGGTGAAA +>34|IGHV1-11 ENSMUST00000191801|IGHV1-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCCAGATCACCCTCTTTCTGGTGGCAGCAATTACATGTGCCTACTCCCAGATCCAGCTGCAACAGTCAGGAGCTGAGCTGGCGAGTCCTGGGGCATCAGTGACACTGTCCTGCAAGGCTTCTGGCTACACATTTACTGACCATATTATGAATTGGGTAAAAAAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAGGATTTATCCAGTAAGTGGTGAAACTAACTACAATCAAAAGTTCATGGGCAAGGCCACATTCTCTGTAGACCGGTCCTCCAGCACAGTGTACATGGTGTTGAACAGCCTGACATCTGAGGACCCTGCTGTCTATTACTGTGGAAGG +>35|IGHV1-12 ENSMUST00000109711|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>36|IGHV1-12 ENSMUST00000109711|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>37|IGHV1-12 ENSMUST00000195469|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>38|IGHV1-12 ENSMUST00000195469|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGCTTATCTACAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTTACCAGTTACAATATGCACTGGGTAAAGCAGACACCTAGACAGGGCCTGGAATGGATTGGAGCTATTTATCCAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>39|IGHV1-15 ENSMUST00000192077|IGHV1-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAATTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGACGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGGGTGAAGCAGACACCTGTGCATGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTGGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCATACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>41|IGHV1-18 ENSMUST00000194350|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCCTCTTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATACCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGGACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTATCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACACTGCAGTCTATTACTGTGCAAGA +>42|IGHV1-19 ENSMUST00000193855|IGHV1-19|5'UTR|IG|IGH|None|00 +AACAACACATGTCCAATGTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>43|IGHV1-19 ENSMUST00000193855|IGHV1-19|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGTAAGGCTTCTGGATACACATTCACTGACTACTATATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGTTATTAATCCTTACAACGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTTGACAAGTCCTCCAGCACAGCCTACATGGAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>44|IGHV1-20 ENSMUST00000194968|IGHV1-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGCAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGATTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGATGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCGGAGCCTGACATCTGAGGACTCTGCAGTCTATTATTGTGCAAGA +>45|IGHV1-22 ENSMUST00000103507|IGHV1-22|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGAAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTAACCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAAACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCGGAGGATTCTGCAGTCTATTACTGTGCAAGA +>46|IGHV1-23 ENSMUST00000194625|IGHV1-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGTGTGAAGCAGACACCTGTGCACGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTTGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>47|IGHV1-24 ENSMUST00000191861|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCGGCTGCAGCAGTCTGGACCTAAGGTAGTGAATGCTGGGGCTTCCGTGAAGCTGTCCTGCAAGTCTTCTGGTTACTCATTCAGTAGATACAAAATGGAATGTGTGAAACAGAGCCATGGAAAGAGCCTTGAGTGGATTGAACATATTAATCTTTTCAAAGGTGTTACTAACTACAATGGAAAGTTCAAAAGCAAGGCCACATTGACTGTAGACATATCCTCTAGCACAGCCTATATGGAGCTTAGCAGATTGACATCTGAAGACTCAGAGGTATATTACTGTGCAAGA +>48|IGHV1-26 ENSMUST00000103510|IGHV1-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAATCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATACACGTTCACTGACTACTACATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>49|IGHV1-31 ENSMUST00000195735|IGHV1-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTATCTGGATCTTTCTCTTCCTTCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAGAGCCATGGAAATATCCTCGATTGGATTGGATATATTTATCCTTACAATGGTGTTTCTAGCTACAACCAGAAATTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCTAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>50|IGHV1-34 ENSMUST00000103512|IGHV1-34|5'UTR|IG|IGH|None|00 +GTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>51|IGHV1-34 ENSMUST00000103512|IGHV1-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGTTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTTATCCTAACAATGGTGGTAATGGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>52|IGHV1-36 ENSMUST00000191862|IGHV1-36|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGCCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATTCACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACTTGTTTATCCTTACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGGAGCTAAACAGCCTGACTTCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>53|IGHV1-37 ENSMUST00000193950|IGHV1-37|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGTAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCTGAGCCTGACATCTGAGGACTTTGCAGTCTATTATTGTGCAAGA +>54|IGHV1-39 ENSMUST00000103515|IGHV1-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTCTCAGGAACTGCAGGTGTCCACTCTGAGTTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGCGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGACTACAACATGAACTGGGTGAAGCAGAGCAATGGAAAGAGCCTTGAGTGGATTGGAGTAATTAATCCTAACTATGGTACTACTAGCTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACCAATCTTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>55|IGHV1-4 ENSMUST00000103493|IGHV1-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTTCCTGTTGTCAGTAACTTCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAGACCTGGTGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACACGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTGAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>56|IGHV1-42 ENSMUST00000191868|IGHV1-42|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAACTGGATCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGAACTGGGTGAAGCAAAGTCCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTACCTACAACCAGAAGTTCAAGGCCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>57|IGHV1-43 ENSMUST00000195417|IGHV1-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCAAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAAAGTTCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTAACTGTAGACAAGTCATCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCTGTCTATTACTGTGCAAGA +>58|IGHV1-47 ENSMUST00000194865|IGHV1-47|5'UTR|IG|IGH|None|00 +ATAAGATCAGTCTTCTCTATAATCACTGAGTGCAGAGGACCTCACA +>59|IGHV1-47 ENSMUST00000194865|IGHV1-47|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCGTGGATCTCTATCATCCTCTTCCTAGTGGCAACAGCTATAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTAGTGAAGCCTGGAGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACTACCTATCCTATAGAGTGGATGAAGCAGAATCATGGAAAGAGCCTAGAGTGGATTGGAAATTTTCATCCTTACAATGATGATACTAAGTACAATGAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGAAAAATCCTCTAGCACAGTCTACTTGGAGCTCAGCCGATTAACATCTGATGACTCTGCTGTTTATTACTGTGCAAGG +>60|IGHV1-49 ENSMUST00000192724|IGHV1-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGGTCTTTCTCTTCCTCCTGTCAGGAACTGCAGGAGTCCACTCACAGCGTGAGCTGCAGCAGTCTGGAGCTGAGTTGGTGAGACCTGGGTCCTCAGTGAAGTTGTCCTGCAAGGATTCTTACTTTGCCTTCATGGCCAGTGCTATGCACTGGGTGAAGCAAAGACCTGGACATGGCCTGGAATGGATAGGATCTTTTACTATGTACAGTGATGCTACTGAGTACAGTGAAAACTTCAAGGGCAAGGCCACATTGACTGCAAACACATCCTCGAGCACAGCCTACATGGAACTCAGCAGCCTCACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>61|IGHV1-5 ENSMUST00000191803|IGHV1-5|5'UTR|IG|IGH|None|00 +GATCAGTATCCTCTTCACAGTCACTGAAAACATTGACTCTAATC +>62|IGHV1-5 ENSMUST00000191803|IGHV1-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTAACTGGATACTTCCTTTTATTCTGTCGGTAACTTCAGGGGTCTACTCAGAGGTTCAGCTCCAGCAGTCTGGGACTGTGCTGGCAAGGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGACTTCTGGCTACACATTTACCAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATAGGGGCTATTTATCCTGGAAATAGTGATACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCAAACTGACTGCAGTCACATCCGCCAGCACTGCCTACATGGAGCTCAGCAGCCTGACAAATGAGGACTCTGCGGTCTATTACTGTACAAGA +>63|IGHV1-50 ENSMUST00000103521|IGHV1-50|5'UTR|IG|IGH|None|00 +CTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCGCC +>64|IGHV1-50 ENSMUST00000103521|IGHV1-50|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCTCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGCTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>65|IGHV1-52 ENSMUST00000192554|IGHV1-52|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCATTGGGTGAAGCAGAGGCCTATACAAGGCCTTGAATGGATTGGTAACATTGACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>66|IGHV1-53 ENSMUST00000103523|IGHV1-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGACTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAAATATTAATCCTAGCAATGGTGGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>67|IGHV1-54 ENSMUST00000103525|IGHV1-54|5'UTR|IG|IGH|None|00 +AGTCCCTGAACACACTGACTCTCACC +>68|IGHV1-54 ENSMUST00000103525|IGHV1-54|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCAGAGTCTTTATCTTTCTCCTATCAGTAACTGCAGGTGTTCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGATACGCCTTCACTAATTACTTGATAGAGTGGGTAAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGTGATTAATCCTGGAAGTGGTGGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCAACACTGACTGCAGACAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>69|IGHV1-55 ENSMUST00000103526|IGHV1-55|5'UTR|IG|IGH|None|00 +CACCACACAAAAAAGCATAAGATCACTGTTCTCTCTACAGTTACTAAGCACACAGGATCTCACC +>70|IGHV1-55 ENSMUST00000103526|IGHV1-55|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCATTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATAACCTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAGATATTTATCCTGGTAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>71|IGHV1-56 ENSMUST00000194071|IGHV1-56|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGTTGGGTCTTTCTTTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTCCTGGCTATACCTTCACCAGCCACTGGATGCAGTGGGTAAGACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>72|IGHV1-58 ENSMUST00000103529|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGATCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTCCAGCTTCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGTCCTCAGTGAAGATGTCCTGCAAGACTTCTGGATATACATTCACAAGCTACGGTATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTGGAATGGATTGGATATATTTATATTGGAAATGGTTATACTGAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTTCAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAATCTATTTCTGTGCAAGA +>73|IGHV1-59 ENSMUST00000195359|IGHV1-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATTGTCCTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGACTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTAAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGTGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>74|IGHV1-61 ENSMUST00000103531|IGHV1-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGGATTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAATGGATTGGTAACATTTACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>75|IGHV1-62-1 ENSMUST00000103503|IGHV1-62-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACAGAGTTGGGTCTTACTCTTCCTCCTGTCAGAAACTGCAGGTGTCCACTGCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACAGCAGAGAACTCTGCAATCTATCTGTGCAAGG +>76|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|5'UTR|IG|IGH|None|00 +GAACACACTGACTCAAACC +>77|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>78|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>79|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTTCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCAGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>80|IGHV1-63 ENSMUST00000103534|IGHV1-63|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCGGGGTCTTTATCTTTCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACCTTCACTAACTACTGGATAGGTTGGGCAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGATATTTACCCTGGAGGTGGTTATACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGTTCAGCAGCCTGACATCTGAGGACTCTGCCATCTATTACTGTGCAAGA +>81|IGHV1-64 ENSMUST00000103535|IGHV1-64|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACAGTTCTCTCTACAGTTACTGAGCACACAGGACCTCACA +>82|IGHV1-64 ENSMUST00000103535|IGHV1-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTATATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTAAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACTTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAATGATTCATCCTAATAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>83|IGHV1-66 ENSMUST00000103537|IGHV1-66|5'UTR|IG|IGH|None|00 +ATGATCAGTGTCCTCTCTACACAGTCCCTGACGACACTGACTCTAACC +>84|IGHV1-66 ENSMUST00000103537|IGHV1-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACAGCTTCACAAGCTACTATATACACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGTGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACGGCAGACACATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTAACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>85|IGHV1-69 ENSMUST00000199933|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGATGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGTCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>86|IGHV1-7 ENSMUST00000103496|IGHV1-7|5'UTR|IG|IGH|None|00 +GCATCCTCTCCACAGACACTGAAAACTCTGACTCAAC +>87|IGHV1-7 ENSMUST00000103496|IGHV1-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTCCCTGTTGTCAGTAATAGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAAACCTGGGGCCTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTGAGCAGCCTGACATATGAGGACTCTGCAGTCTATTACTGTGCAAGA +>88|IGHV1-71 ENSMUST00000196690|IGHV1-71|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>89|IGHV1-72 ENSMUST00000103541|IGHV1-72|5'UTR|IG|IGH|None|00 +AGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>90|IGHV1-72 ENSMUST00000103541|IGHV1-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>91|IGHV1-74 ENSMUST00000196587|IGHV1-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGCCAAGGCCTTGAGTGGATTGGAAGGATTCATCCTTCTGATAGTGATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAATA +>92|IGHV1-75 ENSMUST00000103544|IGHV1-75|5'UTR|IG|IGH|None|00 +CCTGACGACACTGACTCTAACC +>93|IGHV1-75 ENSMUST00000103544|IGHV1-75|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTACAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTTTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTTACTGTAGACAAATCCTCCAGCACAGCCTACATGTTGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>94|IGHV1-76 ENSMUST00000197537|IGHV1-76|5'UTR|IG|IGH|None|00 +CGACACTGATTCTAACC +>95|IGHV1-76 ENSMUST00000197537|IGHV1-76|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTGTCAGGTCCAGCTGAAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACTTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGCAAGGATTTATCCTGGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGAAAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCTGTCTATTTCTGTGCAAGA +>96|IGHV1-77 ENSMUST00000198777|IGHV1-77|5'UTR|IG|IGH|None|00 +AAACAACCTATGATCAGTGTCCTCTCCACAGTCTCTGAACACCCTTACTCAAACC +>97|IGHV1-77 ENSMUST00000198777|IGHV1-77|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTCCAGCTGAAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAAGATTGGTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>98|IGHV1-78 ENSMUST00000199373|IGHV1-78|5'UTR|IG|IGH|None|00 +GTCCCTGAACACACTGACTGTAACA +>99|IGHV1-78 ENSMUST00000199373|IGHV1-78|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTCTCTCTTCTTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGTTCAGCTGCAACAGTCTGACGCTGAGTTGGTGAAACCTGGAGCTTCAGTGAAGATATCCTGCAAGGTTTCTGGCTACACCTTCACTGACCATACTATTCACTGGATGAAGCAGAGGCCTGAACAGGGCCTGGAATGGATTGGATATATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>100|IGHV1-80 ENSMUST00000103547|IGHV1-80|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTTGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAAGCTTCTGGCTACGCATTCAGTAGCTACTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACAGATTTATCCTGGAGATGGTGATACTAACTACAACGGAAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>101|IGHV1-81 ENSMUST00000103548|IGHV1-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGATCTTTCTCTTCATCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGGCGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTATGGTATAAGCTGGGTGAAGCAGAGAACTGGACAGGGCCTTGAGTGGATTGGAGAGATTTATCCTAGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCGTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>102|IGHV1-82 ENSMUST00000196991|IGHV1-82|5'UTR|IG|IGH|None|00 +CTTCTCCACAGTCCCAGAACACACTCACTCTAACC +>103|IGHV1-82 ENSMUST00000196991|IGHV1-82|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTGTATCTTTCTCTTCCTCCTGTCAGTAACTGAAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAGGCTTCTGGCTACGCATTCAGTAGCTCCTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACGGATTTATCCTGGAGATGGAGATACTAACTACAATGGGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTACTTCTGTGCAAGA +>104|IGHV1-84 ENSMUST00000103551|IGHV1-84|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTTTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGATCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGCGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>105|IGHV1-85 ENSMUST00000103552|IGHV1-85|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTACGATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCGTACATGGAGCTCCACAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>106|IGHV1-9 ENSMUST00000193893|IGHV1-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGACCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGATGAAGCCTGGGGCCTCAGTGAAGCTTTCCTGCAAGGCTACTGGCTACACATTCACTGGCTACTGGATAGAGTGGGTAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGAGATTTTACCTGGAAGTGGTAGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACATTCACTGCAGATACATCCTCCAACACAGCCTACATGCAACTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>107|IGHV10-1 ENSMUST00000103492|IGHV10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGCTGTTGGGGCTGAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGGTCATTGAAACTCTCATGTGCAGCCTCTGGATTCAGCTTCAATACCTACGCCATGAACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAATAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCAGAAAGCATGCTCTATCTGCAAATGAACAACTTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGACA +>108|IGHV10-3 ENSMUST00000103495|IGHV10-3|5'UTR|IG|IGH|None|00 +GACAATATAACATTGAAC +>109|IGHV10-3 ENSMUST00000103495|IGHV10-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGTGTTGGGGCTTAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGATCATTGAAACTCTCATGTGCCGCCTCTGGTTTCACCTTCAATACCTATGCCATGCACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAGTAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCACAAAGCATGCTCTATCTGCAAATGAACAACCTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGAGA +>110|IGHV11-1 ENSMUST00000103466|IGHV11-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGAAGGCTTGGTGCCACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGCTTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCTGAGGACACAGCCACGTATTTCTGTATGAGATA +>111|IGHV11-2 ENSMUST00000103468|IGHV11-2|5'UTR|IG|IGH|None|00 +ATGCAAATAGGGCCTCTTTCTACTCATGAAACGCAGACCAACCTATCCTTGCAGTTCAGACAGAGGAGCTTGGCTCTGGTTCCCAAGACCTCTTACTCACTTCTCAAC +>112|IGHV11-2 ENSMUST00000103468|IGHV11-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGGAGGCTTGGTGCAACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGATTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCGGAGGACACAGCCACGTATTTCTGTATGAGATA +>113|IGHV12-3 ENSMUST00000103485|IGHV12-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGCTGGGATTTGTGTGCCTGGTGACAGTCCTTCCTGGTAGCCTGTCTCAGATGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCCTCACAGTCACTCTTCCTTACCTGCTCTATTACTGGTTTCCCCATCACCAGTGGTTACTACTGGATCTGGATCCGTCAGTCACCTGGGAAACCCCTAGAATGGATGGGGTACATCACTCATAGTGGGGAAACTTTCTACAACCCATCTCTCCAGAGCCCCATCTCCATTACTAGAGAAACGTCAAAGAACCAGTTCTTCCTCCAATTGAACTCTGTGACCACAGAGGACACAGCCATGTATTACTGTGCAGGAGACAG +>114|IGHV13-2 ENSMUST00000125484|IGHV13-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGACTGAGCTGGGTATTTCTTGTGGCTCTTTTGAACGGTGTCCAGTGTCAGGTGCAGCTTGTAGAGACCGGGGGAGGCTTGGTGAGGCCTGGAAATTCTCTGAAACTCTCCTGTGTTACCTCGGGATTCACTTTCAGTAACTACCGGATGCACTGGCTTCGCCAGCCTCCAGGGAAGAGGCTGGAGTGGATTGCTGTAATTACAGTCAAATCTGATAATTATGGAGCAAATTATGCAGAGTCTGTGAAAGGCAGATTCGCCATTTCAAGAGATGATTCAAAAAGCAGTGTCTACCTAGAGATGAACAGATTAAGAGAGGAAGACACTGCCACTTATTTTTGTAGTAGACA +>115|IGHV14-1 ENSMUST00000103463|IGHV14-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGATACTGAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATGACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>116|IGHV14-2 ENSMUST00000103467|IGHV14-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGATCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAAGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGACTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGAAACTAAATATGCCCCGAAATTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTGCTAGA +>117|IGHV14-3 ENSMUST00000103469|IGHV14-3|5'UTR|IG|IGH|None|00 +ATATGAGCCCTATATTCTCTACAGACACTGAATCTCAAGGTCCTTACA +>118|IGHV14-3 ENSMUST00000103469|IGHV14-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATTCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGTGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAAACACCTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGCGAATGGTAATACTAAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATAACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCATCTATTACTGTGCTAGA +>119|IGHV14-4 ENSMUST00000195706|IGHV14-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTATAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTTAACATTAAAGACGACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGATGGATTGATCCTGAGAATGGTGATACTGAATATGCCTCGAAGTTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>120|IGHV15-2 ENSMUST00000195337|IGHV15-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGATCACTCTCCATCTGCTGGCAGCAGCTACAGGTATCCAATCCCAGGTTCACCTACAACAGTCTGGTTCTGAACTGAGGAGTCCTGGGTCTTCAGTAAAGCTGTCATGCAAGGATTTTGATTCAGAAGTCTTCCCTATTGCTTATATGAGTTGGGTAAGGCAGAAGCCTGGGCATGGATTTGAATGGATTGGAGGCATACTCCCAAGTATTGGTAGAACAATCTATGGAGAGAAGTTTGAGGACAAAGCCACATTGGATGCAGACACACTGTCCAACACAGCCTACTTGGAGCTCAACAGTCTGACATCCGAGGACTCTGCTATCTACTACTGTGCAAGG +>121|IGHV16-1 ENSMUST00000195641|IGHV16-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTTAGTTGGGCTTTCCTTGTTATTTTAAAAGGCATACAGGGTGAGGTGCAGCTGGTGGAATCTGGAGGCAGCTTGGGACAGCCTGGAGGGTCCACTAAACTCTCTTGTGAAGAAGCATCTGGATTCACTTTCAGTGATCATTGGATGGACTGGTTTCGCCAAGCCCCAGGCATGAGGCTAGAATGGTTAGCAAATACAAACCATGATGAGAGTGGAAAAGGCTATGCAGAGTCTGTGAAAGACAGATTCTCCATCTCCAGAGACAATTCTGAGAACTTATTGTATCTACAAATGAACAGTCTGAGAAACGAAGACACGGCTCTGTATTATTGTGCCAGAGA +>122|IGHV2-2 ENSMUST00000103443|IGHV2-2|5'UTR|IG|IGH|None|00 +GC +>123|IGHV2-2 ENSMUST00000103443|IGHV2-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCTTGGGGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCAGCTTTCATATCCAGACTGAGCATCAGCAAGGACAATTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACAGCCATATATTACTGTGCCAGAAA +>124|IGHV2-3 ENSMUST00000178229|IGHV2-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCACTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCAGGGTTCTCATTAACCAGCTATGGTGTAAGCTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGACGGGAGCACAAATTATCATTCAGCTCTCATATCCAGACTGAGCATCAGCAAGGATAACTCCAAGAGCCAAGTTTTCTTAAAACTGAACAGTCTGCAAACTGATGACACAGCCACGTACTACTGTGCCAA +>125|IGHV2-4 ENSMUST00000103447|IGHV2-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCTGCTTTCATATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>126|IGHV2-5 ENSMUST00000195707|IGHV2-5|5'UTR|IG|IGH|None|00 +ATCCTTGCTCATTGTTTCCTTTTATCCTTTCAGAAACCTCCCCCAATGCAAAGCAGCCCTCAGGCAGAGGATAAAAGCCCACACAAAGCTGAGAAGCCCCATCCTCTTCTCATAGAGCCTCCATCAGAGC +>127|IGHV2-5 ENSMUST00000195707|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATAACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGAGGTGGAAGCACAGACTACAATGCAGCTTTCATGTCCAGACTGAGCATCACCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>128|IGHV2-6 ENSMUST00000179657|IGHV2-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTTCTCTGCCTGGTGACTTTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACCGTCTCAGGGTTCTCATTAACCAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGTAGTGATATGGAGTGATGGAAGCACAACCTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTCCAAACTGATGACACAGCCATGTACTACTGTGCCAGACA +>129|IGHV2-6-8 ENSMUST00000192911|IGHV2-6-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTATCCTTTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGTTGGAAGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAGTGA +>130|IGHV2-7 ENSMUST00000103456|IGHV2-7|5'UTR|IG|IGH|None|00 +AGAGC +>131|IGHV2-7 ENSMUST00000103456|IGHV2-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTCCTCTGCCTGGTGACCTTTCCAAGCTGTGTCCTGTCACAAGTGCAGATGAAGGAGTCAGGACCTGACCTTGTGCAGCCATCACAGACTCTGTCTCTCACCTGCACTGTCTCTGGGTTCTCATTAAGTAGCTATGGTGTACATTGGTTTCGCAAGCCTCCGAGAAAGGGATTGGAATGGTTGGGAGGAATATGGTCTGGTGGAAGCATATACTATACTCCAGCTCTCAGTTCCCGACTGAGTGTCAGCAGGGACACCTCTAAGAGCCAAGTTTTCTTTAAAATGAGCAGTCTGCAAAGTGAAGACACGGCTGTGTACCACTGTGCCAGATA +>132|IGHV2-9 ENSMUST00000103451|IGHV2-9|5'UTR|IG|IGH|None|00 +CCCCATCAGAGC +>133|IGHV2-9 ENSMUST00000103451|IGHV2-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGTTCCTCTGCCTGGTTGCATTTCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACTTGCACTGTCTCTGGGTTTTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGGTGGAAGCACAAATTATAATTCAGCTCTCATGTCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAAACA +>134|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|5'UTR|IG|IGH|None|00 +ATAGAGCCTCCATCAGAGC +>135|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTGCCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGCTATAAGCTGGGTTCGCCAGCCACCAGGAAAGGGTCTGGAGTGGCTTGGAGTAATATGGACTGGTGGAGGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGTCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCAGGTACTACTGTGCCAGAAA +>136|IGHV3-1 ENSMUST00000103478|IGHV3-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGCGTGCTGATTCTTTTGTGGCTGTTCACAGCCTTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCATGGTGAAACCTTCTCAGTCACTTTCCCTCACCTGCACTGTCACTGGCTACTCCATCACCAGTGGTTATGACTGGCACTGGATCCGACATTTTCCAGGAAACAAACTGGAGTGGATGGGCTACATAAGCTACAGTGGTAGCACTAACTACAACCCATCCCTCAAAAGTCGAATCTCCATCACTCATGACACATCTAAGAACCATTTCTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>137|IGHV3-3 ENSMUST00000191693|IGHV3-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAATGTTGAGTGTTCTGTACCTGTTGTCAGCCCTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTAGCCTGGTGAGACCTTCTCAGACACTCTCCCTTACCTGCACTGTTACTGGCTTCTCCATCAACAGTGATTGTTACTGGATCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTACATCGGGTACACATTCTACAGTGGTATCACTTACTACAACCCATCTCTTGAAAGTCGAACGTACATAACGCGTGACACATCTAAGAACCAGTTCTCACTGAAGTTGAGTTCTGTGACTACTGAGGACACAGCCACTTACTACTGTGCGAGAGA +>138|IGHV3-4 ENSMUST00000193408|IGHV3-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGTTGATTCTTGTGTACCTGTTGACAGCCCTTCCTGGTATCTTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGCCCTGGTGAAGCCTTCTCAGACAGTGTCCCTCACCTGCACTGTCACTGGCTACTCTATCACTAATGGTAATCACTGGTGGAACTGGATCCGGCAGGTTTCAGGAAGCAAACTGGAGTGGATAGGGTACATAAGCTCCAGTGGTAGCACTGACAGCAATCCATCTCTCAAAAGTCGAATCTCCATCACTAGAGACACTTCCAAGAACCAGTTATTCCTGCAGTTGAACTCTGTGACTACTGAAGATATAGCCACATATTACTGTGCAAGAGA +>139|IGHV3-5 ENSMUST00000195619|IGHV3-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAATGTTCACTCTTCTGTACCTGTTGACAGTCGTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCTTCTCAGACAGTGTTCCTCACCTGCACTGTCACTGGCATTTCCATCACCACTGGAAATTACAGGTGGAGCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTGGATAGGGTACATATACTACAGTGGTACCATTACCTACAATCCATCTCTCACAAGTCGAACCACCATCACTAGAGACACTCCCAAGAACCAGTTCTTCCTGGAAATGAACTCTTTGACTGCTGAGGACACAGCCACATACTACTGTGCACGAGA +>140|IGHV3-6 ENSMUST00000195124|IGHV3-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAGTGTTGAGTCTGTTGTACCTGTTGACAGCCATTCCTGGTATCCTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGGCCTCGTGAAACCTTCTCAGTCTCTGTCTCTCACCTGCTCTGTCACTGGCTACTCCATCACCAGTGGTTATTACTGGAACTGGATCCGGCAGTTTCCAGGAAACAAACTGGAATGGATGGGCTACATAAGCTACGATGGTAGCAATAACTACAACCCATCTCTCAAAAATCGAATCTCCATCACTCGTGACACATCTAAGAACCAGTTTTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>141|IGHV3-8 ENSMUST00000103483|IGHV3-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGTGTTAAGTCTTCTGTACCTGTTGACAGCCCTTCCGGGTATCCTGTCAGAGGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGCAAAACCTTCTCAGACTCTGTCCCTCACCTGTTCTGTCACTGGCTACTCCATCACCAGTGATTACTGGAACTGGATCCGGAAATTCCCAGGGAATAAACTTGAGTACATGGGGTACATAAGCTACAGTGGTAGCACTTACTACAATCCATCTCTCAAAAGTCGAATCTCCATAACTCGAGACACATCCAAGAACCAGTATTACCTGCAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGATACACAGTGTGGAGTCTTCAGTGTAGGCCCAGACATAAACCTCCTTGTA +>142|IGHV4-1 ENSMUST00000103464|IGHV4-1|5'UTR|IG|IGH|None|00 +GAAGCAAAGGGGATCAGCCCGAGATTCTCATTCAGTGATCAACACTGAACACACATCCCTTACC +>143|IGHV4-1 ENSMUST00000103464|IGHV4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTTTGGGCTGATTTTTTTTATTGTTGCTCTTTTAAAAGGGGTCCAGTGTGAGGTGAAGCTTCTCCAGTCTGGAGGTGGCCTGGTGCAGCCTGGAGGATCCCTGAAACTCTCCTGTGCAGCCTCAGGAATCGATTTTAGTAGATACTGGATGAGTTGGGTTCGGCGGGCTCCAGGGAAAGGACTAGAATGGATTGGAGAAATTAATCCAGATAGCAGTACAATAAACTATGCACCATCTCTAAAGGATAAATTCATCATCTCCAGAGACAACGCCAAAAATACGCTGTACCTGCAAATGAGCAAAGTGAGATCTGAGGACACAGCCCTTTATTACTGTGCAAGACC +>144|IGHV5-12 ENSMUST00000103450|IGHV5-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTGGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATTACATGTATTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAATGGTGGTGGTAGCACCTATTATCCAGACACTGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCCGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>145|IGHV5-12-4 ENSMUST00000195381|IGHV5-12-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCATATTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTCGTGGAGTCTGGGGGAGGTTTAGTGAAGCCTGGACAGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACTATTACATGTCTTGGGTTCACCAGACTCCGGAGAAGAGGCTGGAGTGGGTTGCATACATTAGTAGTAGTGGTGTTAGCACCTATTATCCAGACAATGTAAAGGGCCGATTCGCCATCTCCAGAGACAATGCCAAGAACACCCTTTACCTGCAAATGACCAGTCTGAAGTCAGAGGACACGGCCTTGTATTACTGTGCAAGAGG +>146|IGHV5-15 ENSMUST00000192877|IGHV5-15|5'UTR|IG|IGH|None|00 +CACTCATC +>147|IGHV5-15 ENSMUST00000192877|IGHV5-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCAGGCTCAGCTTACTTATTTTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTACGGAATGGCGTGGGTTCGACAGGCTCCAAGGAAGGGGCCTGAGTGGGTAGCATTCATTAGTAATTTGGCATATAGTATCTACTATGCAGACACTGTGACGGGCCGATTCACCATCTCTAGAGAGAATGCCAAGAACACCCTGTACCTGGAAATGAGCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGACA +>148|IGHV5-16 ENSMUST00000193652|IGHV5-16|5'UTR|IG|IGH|None|00 +ATCAGGACTGAACACAGACCAGTCACC +>149|IGHV5-16 ENSMUST00000193652|IGHV5-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTCAGGCTCAGCTCAGTTTTTCTTGTTCTTATTTTAAAAGGAGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGAGGGAGGCTTAGTGCAGCCTGGAAGTTCCATGAAACTCTCCTGCACAGCCTCTGGATTCACTTTCAGTGACTATTACATGGCTTGGGTCCGCCAGGTTCCAGAAAAGGGTCTAGAATGGGTTGCAAACATTAATTATGATGGTAGTAGCACCTACTATCTGGACTCCTTGAAGAGCCGTTTCATCATCTCGAGAGACAATGCAAAGAACATTCTATACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCACGTATTACTGTGCAAGAGA +>150|IGHV5-17 ENSMUST00000103459|IGHV5-17|5'UTR|IG|IGH|None|00 +TGGATTCCCAGGTCCTCACATTCAGTGATCAGCACTGAACACAGACCACTCACC +>151|IGHV5-17 ENSMUST00000103459|IGHV5-17|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTCCAGGCTCAATTTAGTTTTCCTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATGGAATGCACTGGGTTCGTCAGGCTCCAGAGAAGGGGCTGGAGTGGGTTGCATACATTAGTAGTGGCAGTAGTACCATCTACTATGCAGACACAGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTTCCTGCAAATGACCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGG +>152|IGHV5-2 ENSMUST00000195468|IGHV5-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCGGGCTCAGCTTGGTTTTCCTTGTCCTTATTTTAAAAAGTGTACAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGAGTCCCTGAAACTCTCCTGTGAATCCAATGAATACGAATTCCCTTCCCATGACATGTCTTGGGTCCGCAAGACTCCGGAGAAGAGGCTGGAGTTGGTCGCAGCCATTAATAGTGATGGTGGTAGCACCTACTATCCAGACACCATGGAGAGACGATTCATCATCTCCAGAGACAATACCAAGAAGACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACAGCCTTGTATTACTGTGCAAGACA +>153|IGHV5-4 ENSMUST00000103444|IGHV5-4|5'UTR|IG|IGH|None|00 +TGACAGAGGAGGCCGGTCCTGGATTCGAGTTCCTCACATTCAGTGATGAGCACTGAACACGGACCCCTCACC +>154|IGHV5-4 ENSMUST00000103444|IGHV5-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCGGAAAAGAGGCTGGAGTGGGTCGCAACCATTAGTGATGGTGGTAGTTACACCTACTATCCAGACAATGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACAACCTGTACCTGCAAATGAGCCATCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGAGA +>155|IGHV5-6 ENSMUST00000103446|IGHV5-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGACTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGGCATGTCTTGGGTTCGCCAGACTCCAGACAAGAGGCTGGAGTGGGTCGCAACCATTAGTAGTGGTGGTAGTTACACCTACTATCCAGACAGTGTGAAGGGGCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>156|IGHV5-9 ENSMUST00000103448|IGHV5-9|5'UTR|IG|IGH|None|00 +GGAGGCAGGTCCTAGATTTGAGTTCCTCACATTCAGTGATCAGCACTGAACACGGAACCCTCACC +>157|IGHV5-9 ENSMUST00000103448|IGHV5-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTTGGGCTGAGCTTGATTTTCCTTGTCCTAATTTTAAAAGGTGTCCAGTGTGAAGTGATGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATACCATGTCTTGGGTTCGCCAGACTCCGGAGAAGAGGCTGGAGTGGGTCGCAACCATTAGTGGTGGTGGTGGTAACACCTACTATCCAGACAGTGTGAAGGGTCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACGGCCTTGTATTACTGTGCAAGACA +>158|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|5'UTR|IG|IGH|None|00 +CTGGAATTGATTCCTAGTTCCTCACGTTCAGTG +>159|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGTACTGAACACAGACCCCTCACCATGAACTTCGGGCTCAGATTGATTTTCCTTGTCCTTACTTTAAAAGGTGTCCAGTGTGACGTGAAGCTGGTGGAGTCTGGGGAAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAGTGGTGGTGATTACATCTACTATGCAGACACTGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAGGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTACAAGAGA +>160|IGHV6-3 ENSMUST00000103486|IGHV6-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGAGACTGAGCTGTGCTTTTATTATTGTTCTTTTAAAAGGGGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTCAGTAACTACTGGATGAACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTCAAATTAGATTGAAATCTGATAATTATGCAACACATTATGCGGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAACTTAAGGGCTGAAGACACTGGAATTTATTACTGCACAGG +>161|IGHV6-4 ENSMUST00000191918|IGHV6-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGAACTGAGCTGTGTTTTCATTGTTGTTCTCTTAAAAGGTGTCCAGAGTGATGTGAACCTGGAAGTGTCTGGAGGAGGCTTAGTTAAACCTGGAGGATCCATGCAACTCTTTTGTGTAGCCTCTGGATTTACTTTTGTAGATGGCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGTCTTGAGTGGGTTGCTGAAATTGCAAACAAAGCTAATAATTATGCAACATATTATCCCGAGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTTCAAAAGTAGTGTCTACCTGCATATGAACAGCTTAAGAGCCGAAGATACAGGCATTTATTACTGTACAAGG +>162|IGHV6-5 ENSMUST00000193936|IGHV6-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGGAACTGAACTGTGTTTTCATTGTTGTCCTCTTAAAAGGTGTCCAGAGTGAAGTGAAAATTGAGGAGTCAGGAGGAGGCTTGGTCCAACCTGGAGGATCCATGAAACTCTCTTGTGCAGCCTCTGGATTCACTTTCAGTGATTACAGGATGGACTGGGTCCACCACTCTACAGAGAATGGGTTGGAGTGGGTTGCTGAAATTAGAAACAAAGCTAGTAATTATGCAACATATTATGTGGAGTCTGTGAATGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGATACTGGCATTTATTACTGTACAAGG +>163|IGHV6-6 ENSMUST00000103489|IGHV6-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAACTGTGTATTCATAGTTTTTCTCTTAAAAGGTGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCTTGTGCTGCCTCTGGATTCACTTTTAGTGACGCCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTGAAATTAGAAACAAAGCTAATAATCATGCAACATACTATGCTGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGACACTGGCATTTATTACTGTACCAGG +>164|IGHV6-7 ENSMUST00000193397|IGHV6-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAGCTGTGTATTCATTTTTTTTCTCTTAAAAGGTGTCCAGTGTGAGGAGAAGCTGGATGAGTCTGGAGGAGGCTTGGTGCAACCTGGGAGGTCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTTACTAACTCCTGGATGAACTGGTTCTGCCAGTCTCCAGAGAAAGGACTGGAGTGGGTAGCACAAATTAAAAGCAAACCTTATAATTATGAAACATATTATTCAGATTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTATACCTGCAAATGAACAACTTAAGAGCTGAAGACACGGGCATCTATTACTGTACATGG +>165|IGHV7-1 ENSMUST00000103474|IGHV7-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGTTAAACTGGGTTTTTCTTTTAACACTTTTACATGGTATCCAGTGTGAGGTGAAGCTGGTGGAATCTGGAGGAGGCTTGGTACAGTCTGGGCGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCAGTGATTTCTACATGGAGTGGGTCCGCCAAGCTCCAGGGAAGGGACTGGAGTGGATTGCTGCAAGTAGAAACAAAGCTAATGATTATACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCATCGTCTCCAGAGACACTTCCCAAAGCATCCTCTACCTTCAGATGAATGCCCTGAGAGCTGAGGACACTGCCATTTATTACTGTGCAAGAGATGCA +>166|IGHV7-2 ENSMUST00000193133|IGHV7-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGTTTAACATCATTATCTTCACAGTAACACCTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGAAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCACTGATTTCTACATGAACTGGGTCTGCCAGCCTCCAAGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGACTACAGTGCATCTATGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAACACACTGAGAACTGAGGACAGTGCCACTTATTACTGTGCAAGAGATACA +>167|IGHV7-3 ENSMUST00000103461|IGHV7-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGCTGAACTGGATTTTCCTTGTAACACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGTCTCTCCTGTGCAGCTTCTGGATTCACCTTCACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAATGCCCTGAGAGCTGAGGACAGTGCCACTTATTACTGTGCAAGATATA +>168|IGHV7-4 ENSMUST00000192499|IGHV7-4|5'UTR|IG|IGH|None|00 +ATGAACCTAGTCTTGATTTCCCCAGCCTTCAGTTCCCAGATTCAGTGATCAGCCTTGAACACAGACCTGTCACC +>169|IGHV7-4 ENSMUST00000192499|IGHV7-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGGTGAACTGGATTCTACTTGTAGCACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGATGGAATCTGGAGGAGGCTTGGTACAGCCTGGGGCTTCTCTGAGACTCTCCTGTGCAGCTTCTGGATTCACCTTTACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACCTGAGTGGTTGGCTTTGATTAGAAACAAAGCTAATGGTTACACAACAGAGTATACTGCATCTGTTAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAACATCCTCTATCTTCAAATGAACACCCTGAGGGCTGAGGACAGTGCCACTTATTACTGTGTAAAAGCTGTA +>170|IGHV8-11 ENSMUST00000103536|IGHV8-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGCTACTGATTGTTCCTGCATATGTCCTCTCCCAGATTACTCAGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTAGGCTGGATTCATCAGCCTTCAGGGAATGGTCTGGAGTGGCTGGCACACATTTGGTGGAATGATAATAAGTACTATAACACAGCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCGCCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>171|IGHV8-12 ENSMUST00000199266|IGHV8-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTGCTGCTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGTCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGAAAGGGTCTGGAGTGGCTGGCACACATTTACTGGGATGATGACAAGCGCTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAGAAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAAGAG +>173|IGHV8-2 ENSMUST00000195037|IGHV8-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGACTTACATTCTCATTCCTGCTGCTGCTGCCTGTCCCTGCATATGTCCTATCTCAGGTTACTCTGAAAGTGTCTGGCCCTGGGATATTGCAGCCATCACAGACTCTCAGCCTGGCCTGTACTTTCTCTGGGATTTCACTGAGTACTTCTGGTATGGGTTTGAGCTGGCTTCGTAAGCCCTCAGGGAAGGCTTTAGAGTGGCTGGCAAGCATTTGGAATAATGATAACTACTACAACCCATCTTTGAAGAGCCGGCTCACAATCTCCAAGGAGACCTCCAACTACCAAGTATTCCTTAAACTCACCAGTGTGGACACTGCAGATTCTGCCACATACTACGGTGCTTGGAGAGA +>174|IGHV8-4 ENSMUST00000192298|IGHV8-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTATGTCTTCATTCCTGCTGCTGGTTGTCCCTATATATGTTCTGTCCCAGATTACTCTGAAACAGTCTGGCCCTGGGATAGTGCAGCCATCCCAGCCCGTCAGACTTACTTGCACTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATAGGTGTAACCTGGATTCGTCAGCCCTCAGGGAAGGGTCTGGAGTGGCTGGCAACCATTTGGTGGGATGATGATAACCGCTACAACCCATCTCTAAAGAGCAGGCTCGCAGTCTCCAAAGACACCTCCAACAACCAAGCATTCCTGAATATCATCACTGTGGAAACTGCAGATACTGCCATATACTACTGTGCT +>175|IGHV8-5 ENSMUST00000194257|IGHV8-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCTTGCTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTAATATGGGTATAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTAGAGTGGCTGGCACACATTTGGTGGAATGATGATAAGTACTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCAAATAG +>176|IGHV8-6 ENSMUST00000193145|IGHV8-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCGCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGTACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGATCTGGAGTGGCTGGCACACATTTATTGGGATGATGACAAGCACTATAACCCATCCTTGAAGAGCCAGCTCAGAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGTAGATACTGCCACATACTACTGTGCTCGA +>177|IGHV8-8 ENSMUST00000192591|IGHV8-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGTTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTTTGGTATGGGTGTAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTGGTGGGATGATGATAAGTACTATAACCCAGCCCTGAAGAGTCGGCTCACAATCTCCAAGGATACCTCCAAAAACCAGGTATTCCTCAAGATCGCCAATGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>178|IGHV8-9 ENSMUST00000197803|IGHV8-9|5'UTR|IG|IGH|None|00 +CAGAC +>179|IGHV8-9 ENSMUST00000197803|IGHV8-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCCCAGACCCTCAGTCTGACCTGTTCTTTCTCTGTGTTTTCACTGAGCACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTATTGGGATGAGGACAAGCACTATAAACCATCCTTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGCAGATACTGCCACATACTACTCTGCTCGAAGAG +>180|IGHV9-1 ENSMUST00000195884|IGHV9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATAGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCATGATATACACCGACACTGGAGAGCCAACATATGCTGAAGAGTTCAAGGGACGGTTTGCCTTCTCTTTGGAGACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGTAAGA +>181|IGHV9-2 ENSMUST00000103472|IGHV9-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATGGCAGCTGCCCAAAGGGCTCAAGCACAGATCCAGTTCGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGTGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCTGGATAAACACCTACTCTGGAGAGCCAACATATGCTGACGACTTCAAGGGACGGTTTGCCTTTTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>182|IGHV9-3 ENSMUST00000103473|IGHV9-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGTTGGCTGTGGAACTTGCTATTCCTGATGGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTACAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACCTATGGAATGAGCTGGGTGAAACAGGCTCCAGGAAAGGGTTTAAAGTGGATGGGCTGGATAAACACCTACTCTGGAGTGCCAACATATGCTGATGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>183|IGHV9-4 ENSMUST00000194159|IGHV9-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCTGTGGAACTTGCTATTTCTCATGGCAGCAGCTCAAAGTATCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACTGCTGGAATGCAGTGGGTGCAAAAGATGCCAGGAAAGGGTTTTAAGTGGATTGGCTGGATAAACACCCACTCTGGAGAGCCAAAATATGCAGAAGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTACAGATAAGCAACCTCAAAAATGAGGACACGGCTACGTATTTCTGTGCGAGA +>184|IGKC ENSMUST00000103410|IGKC|C-REGION|IG|IGK|None|00 +GGGCTGATGCTGCACCAACTGTATCCATCTTCCCACCATCCAGTGAGCAGTTAACATCTGGAGGTGCCTCAGTCGTGTGCTTCTTGAACAACTTCTACCCCAAAGACATCAATGTCAAGTGGAAGATTGATGGCAGTGAACGACAAAATGGCGTCCTGAACAGTTGGACTGATCAGGACAGCAAAGACAGCACCTACAGCATGAGCAGCACCCTCACGTTGACCAAGGACGAGTATGAACGACATAACAGCTATACCTGTGAGGCCACTCACAAGACATCAACTTCACCCATTGTCAAGAGCTTCAACAGGAATGAGTGT +>185|IGKJ1 ENSMUST00000103405|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGTGGAGGCACCAAGCTGGAAATCAAAC +>186|IGKJ2 ENSMUST00000198234|IGKJ2|J-REGION|IG|IGK|None|00 +TGTACACGTTCGGAGGGGGGACCAAGCTGGAAATAAAAC +>187|IGKJ3 ENSMUST00000199487|IGKJ3|J-REGION|IG|IGK|None|00 +AATCACATTCAGTGATGGGACCAGACTGGAAATAAAAC +>188|IGKJ4 ENSMUST00000103408|IGKJ4|J-REGION|IG|IGK|None|00 +ATTCACGTTCGGCTCGGGGACAAAGTTGGAAATAAAAC +>189|IGKJ5 ENSMUST00000199459|IGKJ5|J-REGION|IG|IGK|None|00 +GCTCACGTTCGGTGCTGGGACCAAGCTGGAGCTGAAAC +>190|IGKV1-110 ENSMUST00000103321|IGKV1-110|5'UTR|IG|IGK|None|00 +GATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>191|IGKV1-110 ENSMUST00000103321|IGKV1-110|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCCTTGTACACAGTAATGGAAACACCTATTTACATTGGTACCTGCAGAAGCCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTTCTGCTCTCAAAGTACACATGTTCCTCC +>192|IGKV1-117 ENSMUST00000103317|IGKV1-117|5'UTR|IG|IGK|None|00 +ACTGATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>193|IGKV1-117 ENSMUST00000103317|IGKV1-117|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTTTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCATTGTACATAGTAATGGAAACACCTATTTAGAATGGTACCTGCAGAAACCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTACTGCTTTCAAGGTTCACATGTTCCTCC +>194|IGKV1-122 ENSMUST00000103314|IGKV1-122|5'UTR|IG|IGK|None|00 +GTCTCCTCAGGCTCCCTCCTCAAA +>195|IGKV1-122 ENSMUST00000103314|IGKV1-122|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGCTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGGTCTAGTCAGAGCCTTGAAAACAGTAATGGAAACACCTATTTGAACTGGTACCTCCAGAAACCAGGCCAGTCTCCACAGCTCCTGATCTACAGGGTTTCCAACCGATTTTCTGGGGTCCTAGACAGGTTCAGTGGTAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTTCTGCCTCCAAGTTACACATGTCCCTCC +>196|IGKV1-131 ENSMUST00000103306|IGKV1-131|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGCTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTACATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCGCCTATTCTATCTGGTATCCAAACTGGACCCTGGCATCCCTGACAGTTTCAGTGGCAGTGGATCAGAGACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCCTGCAAGGTACACATTTTCCTCT +>197|IGKV1-132 ENSMUST00000103305|IGKV1-132|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGTTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTGTCTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCACCTAATGTATCAGGTGTCCAAACTGGACCCTGGCATCCCTGACAGGTTCAGTGGCAGTGGATCAGAAACAGATTTTACACTTAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCTTGCAAGGTACATATTATCCTCA +>198|IGKV1-133 ENSMUST00000103304|IGKV1-133|5'UTR|IG|IGK|None|00 +TATTTCCTCAAA +>199|IGKV1-133 ENSMUST00000103304|IGKV1-133|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAAACCTATTTGAATTGGTTATTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGAACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCGTGCAAGGTACACATTTTCCTCA +>200|IGKV1-135 ENSMUST00000103303|IGKV1-135|5'UTR|IG|IGK|None|00 +ACTGATCACTCTCCTATGTTCATTTCCTCAAA +>201|IGKV1-135 ENSMUST00000103303|IGKV1-135|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCGGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTAGATAGTGATGGAAAGACATATTTGAATTGGTTGTTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTGGCAAGGTACACATTTTCCTCA +>202|IGKV1-35 ENSMUST00000197820|IGKV1-35|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCACTCCATATTTATATTGTTGCTTTGGATTGTGGGAATCAGTGGTGACGTTGTGATGACCCAGACTCCACTCACTTTATCAGCTACCATTGGACAATCAGCCTCCGTCTCTTGCAGGTCAAGTCAGAGTCTCTTACATAGTAATGGAAACACATACTTGAATTGGTTTGTACAAAGGCCAGGCCCATCTCCACAGCTTCTAATTTATGGGGTGTTTGAACAGGAATCTGGGGTTCCTGACAGGTTCAGTGGCAGTGGGTCTGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCATGCAAGCTACCTATGAACCTCC +>203|IGKV1-88 ENSMUST00000103336|IGKV1-88|L-REGION+V-REGION|IG|IGK|None|00 +ATGAATTTGCCTGTTCATCTCTTGGTGCTTCTGTTGTTCTGGATTCCTGCTTCCAGAGGTGATGTTGTGGTGACTCAAACTCCACTCTCCCTGCCTGTCAGCTTTGGAGATCAAGTTTCTATCTCTTGCAGGTCTAGTCAGAGTCTTGCAAACAGTTATGGGAACACCTATTTGTCTTGGTACCTGCACAAGCCTGGCCAGTCTCCACAGCTCCTCATCTATGGGATTTCCAACAGATTTTCTGGGGTGCCAGACAGGTTCAGTGGCAGTGGTTCAGGGACAGATTTCACACTCAAGATCAGCACAATAAAGCCTGAGGACTTGGGAATGTATTACTGCTTACAAGGTACACATCAGCCTCC +>204|IGKV1-99 ENSMUST00000168090|IGKV1-99|5'UTR|IG|IGK|None|00 +GGCGCCTCATCAAA +>205|IGKV1-99 ENSMUST00000168090|IGKV1-99|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGCTGCCTGTTCTGCTAGTGGTGCTGCTATTGTTCACGAGTCCAGCCTCAAGCAGTGATGTTGTTCTGACCCAAACTCCACTCTCTCTGCCTGTCAATATTGGAGATCAAGCCTCTATCTCTTGCAAGTCTACTAAGAGTCTTCTGAATAGTGATGGATTCACTTATTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTAATATATTTGGTTTCTAATCGATTTTCTGGAGTTCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTTCCAGAGTAACTATCTTCCTCT +>206|IGKV10-94 ENSMUST00000103330|IGKV10-94|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGTGCAAGTCAGGGCATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAAGTTTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGACAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>207|IGKV10-95 ENSMUST00000198735|IGKV10-95|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTTTGTTTTCAAGGTACCAGATATGATATCCAGATGACACAGACTACTTCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTGAGGACATTAGCACTTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAGGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGGCAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>208|IGKV10-96 ENSMUST00000103328|IGKV10-96|5'UTR|IG|IGK|None|00 +CTCAGCCTGGAC +>209|IGKV10-96 ENSMUST00000103328|IGKV10-96|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTCAGGACATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTACTACACATCAAGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGAACAGATTATTCTCTCACCATTAGCAACCTGGAGCAAGAAGATATTGCCACTTACTTTTGCCAACAGGGTAATACGCTTCCTCC +>210|IGKV11-125 ENSMUST00000197406|IGKV11-125|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACACGAGGGCCCCTGCTGAGTTCCTTGGGTTCCTGTTGCTCTGGTTTTTAGGTGCCAGATGTGATGTCCAGATGATTCAGTCTCCATCCTCCCTGTCTGCATCTTTGGGAGACATAGTCACCATGACTTGCCAGGCAAGTCAGGGCACTAGCATTAATTTAAACTGGTTTCAGCAAAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGGTGCAAGCAACTTGGAAGATGGGGTCCCATCAAGGTTCAGTGGCAGTAGATATGGGACAGATTTCACTCTCACCATCAGCAGCCTGGAGGATGAAGATATGGCAACTTATTTCTGTCTACAGCATAGTTATCTCCCTCC +>211|IGKV12-38 ENSMUST00000198880|IGKV12-38|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAACTCCTGGGGTTGCTGCTGCTGTGGCTTACAGACGCAGGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTGGCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAACATTTACTACAGTTTAGCATGGTATCAGCAGAAGCAAGGGAAATCTCCTCAGCTCCTGATCTATAATGCAAACAGCTTGGAAGATGGTGTCCCATCGAGGTTCAGTGGCAGTGGATCTGGGACACAGTATTCTATGAAGATCAACAGCATGCAGCCTGAAGATACCGCAACTTATTTCTGTAAACAGGCTTATGACGTTCCTCC +>212|IGKV12-41 ENSMUST00000103369|IGKV12-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCTCACTCAGGTCCTGGCGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGGGAATATTCACAATTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGAACACAATATTCTCTCAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGAGTACTCCTCC +>213|IGKV12-44 ENSMUST00000103367|IGKV12-44|5'UTR|IG|IGK|None|00 +ATAGTCAGGTCACACCCTGTGCTGTAATCAGCATCACACTGAAAACACACAGAC +>214|IGKV12-44 ENSMUST00000103367|IGKV12-44|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGAAGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTTTTCTCTGAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATCATTATGGTACTCCTCC +>215|IGKV12-46 ENSMUST00000103365|IGKV12-46|5'UTR|IG|IGK|None|00 +GAGTCAGCCTCACACTGATCACACACAGAC +>216|IGKV12-46 ENSMUST00000103365|IGKV12-46|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGATGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGTATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTAATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATGCTGCAACAAACTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTATTCCCTCAAGATCAACAGCCTGCAGTCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGGGTACTCCTCC +>217|IGKV12-89 ENSMUST00000199143|IGKV12-89|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGTGTACCCACTCAGCTCCTGTTGCTGTGGCTTACAGTTGTCAGATGTGACATCCAGATGACTCAGTCTCCAGCTTCACTGTCTGCATCTGTGGGAGAAACTGTCACCATCACATGTGGAGCAAGTGAGAATATTTACGGTGCTTTAAATTGGTATCAGCGGAAACAGGGAAAATCTCCTCAGCTCCTGATCTATGGTGCAACCAACTTGGCAGATGGCATGTCATCGAGGTTCAGTGGCAGTGGATCTGGTAGACAGTATTCTCTCAAGATCAGTAGCCTGCATCCTGACGATGTTGCAACGTATTACTGTCAAAATGTGTTAAGTACTCCTCC +>218|IGKV12-98 ENSMUST00000196839|IGKV12-98|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACATGCTCACTCAGCTCCTGGGATTACTGCTGCTCTGGTTTGCAGGTGGTAAATGTGACATTCAGATGACCCAGTCTCCTGCCTCCCAGTCTGCATCTCTGGGAGAAAGTGTCACCATCACATGCCTGGCAAGTCAGACCATTGGTACATGGTTAGCATGGTATCAGCAGAAACCAGGGAAATCTCCTCAGCTCCTGATTTATGCTGCAACCAGCTTGGCAGATGGGGTCCCATCAAGGTTCAGTGGTAGTGGATCTGGCACAAAATTTTCTTTCAAGATCAGCAGCCTACAGGCTGAAGATTTTGTAAGTTATTACTGTCAACAACTTTACAGTACTCCTCT +>219|IGKV13-84 ENSMUST00000103339|IGKV13-84|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTACTGCTGTTTGGAATCCCAGGCATGATATGTGACATCCAGATGACACAATCTTCATCCTCCTTTTCTGTATCTCTAGGAGACAGAGTCACCATTACTTGCAAGGCAAGTGAGGACATATATAATCGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>220|IGKV13-85 ENSMUST00000114212|IGKV13-85|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTCCTGCTGTTCAGAATCACAGGCATAATATGTGACATCCAGATGACACAATCTTCATCCTACTTGTCTGTATCTCTAGGAGGCAGAGTCACCATTACTTGCAAGGCAAGTGACCACATTAATAATTGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>221|IGKV14-100 ENSMUST00000199510|IGKV14-100|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCTTGCTCAGTTTCTTGCATTCTTGTTGCTTTGGTTTCCAGGTGCAAGATGTGACATCCTGATGACCCAATCTCCATCCTCCATGTCTGTATCTCTGGGAGACACAGTCAGCATCACTTGCCATGCAAGTCAGGGCATTAGCAGTAATATAGGGTGGTTGCAGCAGAAACCAGGGAAATCATTTAAGGGCCTGATCTATCATGGAACCAACTTGGAAGATGGAGTTCCATCAAGGTTCAGTGGCAGTGGATCTGGAGCAGATTATTCTCTCACCATCAGCAGCCTGGAATCTGAAGATTTTGCAGACTATTACTGTGTACAGTATGCTCAGTTTCCTCC +>222|IGKV14-111 ENSMUST00000103320|IGKV14-111|5'UTR|IG|IGK|None|00 +CAGCCAGGACTCAGC +>223|IGKV14-111 ENSMUST00000103320|IGKV14-111|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGACCCCTGCTCAGTTTCTTGGAATCTTGTTGCTCTGGTTTCCAGGTATCAAATGTGACATCAAGATGACCCAGTCTCCATCTTCCATGTATGCATCTCTAGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAATAGCTATTTAAGCTGGTTCCAGCAGAAACCAGGGAAATCTCCTAAGACCCTGATCTATCGTGCAAACAGATTGGTAGATGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTCACCATCAGCAGCCTGGAGTATGAAGATATGGGAATTTATTATTGTCTACAGTATGATGAGTTTCCTCC +>224|IGKV14-126 ENSMUST00000103310|IGKV14-126|5'UTR|IG|IGK|None|00 +TCAGC +>225|IGKV14-126 ENSMUST00000103310|IGKV14-126|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCCCCTGCTCAGTTTTTTGGGATCTTGTTGCTCTGGTTTCCAGGTATCAGATGTGACATCAAGATGACCCAGTCTCCATCCTCCATGTATGCATCGCTGGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAAAAGCTATTTAAGCTGGTACCAGCAGAAACCATGGAAATCTCCTAAGACCCTGATCTATTATGCAACAAGCTTGGCAGATGGGGTCCCATCAAGATTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTAACCATCAGCAGCCTGGAGTCTGACGATACAGCAACTTATTACTGTCTACAGCATGGTGAGAGCCCTCC +>226|IGKV14-130 ENSMUST00000196006|IGKV14-130|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGTTTCTTGGGATCTTGTTGCTCTGGTTCCCAGGTGCCAGATGTGAAATCCAGATGACCCAGTCTCCATCCTCTATGTCTGCATCTCTGGGAGACAGAATAACCATCACTTGCCAGGCAACTCAAGACATTGTTAAGAATTTAAACTGGTATCAGCAGAAACCAGGGAAACCCCCTTCATTCCTGATCTATTATGCAACTGAACTGGCAGAAGGGGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGACTATTCTCTGACAATCAGCAACCTGGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGTTTTATGAGTTTCCTCC +>227|IGKV15-103 ENSMUST00000103324|IGKV15-103|5'UTR|IG|IGK|None|00 +TCACTCTCAGTGAGGATACACCATCAGC +>228|IGKV15-103 ENSMUST00000103324|IGKV15-103|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCTTGCTGAGCTCCTGGGGCTGCTGCTGTTCTGCTTTTTAGGTGTGAGATGTGACATCCAGATGAACCAGTCTCCATCCAGTCTGTCTGCATCCCTTGGAGACACAATTACCATCACTTGCCATGCCAGTCAGAACATTAATGTTTGGTTAAGCTGGTACCAGCAGAAACCAGGAAATATTCCTAAACTATTGATCTATAAGGCTTCCAACTTGCACACAGGCGTCCCATCAAGGTTTAGTGGCAGTGGATCTGGAACAGGTTTCACATTAACCATCAGCAGCCTGCAGCCTGAAGACATTGCCACTTACTACTGTCAACAGGGTCAAAGTTATCCTCT +>229|IGKV16-104 ENSMUST00000103323|IGKV16-104|5'UTR|IG|IGK|None|00 +AATCAGTTCCTGCCAGGACACAGTTTAGAT +>230|IGKV16-104 ENSMUST00000103323|IGKV16-104|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCCAGGTTCAGGTTCTGGGGCTCCTTCTGCTCTGGATATCAGGTGCCCAGTGTGATGTCCAGATAACCCAGTCTCCATCTTATCTTGCTGCATCTCCTGGAGAAACCATTACTATTAATTGCAGGGCAAGTAAGAGCATTAGCAAATATTTAGCCTGGTATCAAGAGAAACCTGGGAAAACTAATAAGCTTCTTATCTACTCTGGATCCACTTTGCAATCTGGAATTCCATCAAGGTTCAGTGGCAGTGGATCTGGTACAGATTTCACTCTCACCATCAGTAGCCTGGAGCCTGAAGATTTTGCAATGTATTACTGTCAACAGCATAATGAATACCCGTAC +>231|IGKV17-121 ENSMUST00000197515|IGKV17-121|5'UTR|IG|IGK|None|00 +AAGGCC +>232|IGKV17-121 ENSMUST00000197515|IGKV17-121|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGTTCTCACTAGCTCTTCTCCTCAGTCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCATGGCTATAGGAGAAAAAGTCACCATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGTACAGATTTTGTTTTTACAATTGAAAACATGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACTTGCCTCT +>233|IGKV17-127 ENSMUST00000200586|IGKV17-127|5'UTR|IG|IGK|None|00 +AAGGCC +>234|IGKV17-127 ENSMUST00000200586|IGKV17-127|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGCTCTCACTAGCTCCTCTCCTCAGCCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCGTGGCTACAGGAGAAAAAGTCACTATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGCACAGATTTTGTTTTTACAATTGAAAACACGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACATGCCTCT +>235|IGKV18-36 ENSMUST00000200160|IGKV18-36|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACTCCAGCTTCATTTCTTTGCCTCCTTTTACTGTGGACCACGGCTGTCACTGGAGAAACAACACAGGCTCCAGCTTCTCTGAGTTTTTCTCTTGGTGAAACAGCAACACTGTCATGCAGGTCCAGTGAGAGTGTTGGCAGCTACTTAGCCTGGTACCAGCAGAAAGCAGAGCAAGTTCCCCGGCTCCTTATCCATAGTGCCTCCACTAGGGCCGGTGGTGTCCCAGTCCGGTTCAGTGGCACTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGTCTAGAACCTGAAGATGCTGCAGTTTACTACTGTCAACCTTTCAAAAGTTGGTCATA +>236|IGKV19-93 ENSMUST00000196863|IGKV19-93|5'UTR|IG|IGK|None|00 +AGGAGACGTTGTAGAA +>237|IGKV19-93 ENSMUST00000196863|IGKV19-93|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGACCGTCTATTCAGTTCCTGGGGCTCTTGTTGTTCTGGCTTCATGGTGCTCAGTGTGACATCCAGATGACACAGTCTCCATCCTCACTGTCTGCATCTCTGGGAGGCAAAGTCACCATCACTTGCAAGGCAAGCCAAGACATTAACAAGTATATAGCTTGGTACCAACACAAGCCTGGAAAAGGTCCTAGGCTGCTCATACATTACACATCTACATTACAGCCAGGCATCCCATCAAGGTTCAGTGGAAGTGGGTCTGGGAGAGATTATTCCTTCAGCATCAGCAACCTGGAGCCTGAAGATATTGCAACTTATTATTGTCTACAGTATGATAATCTTCTACC +>238|IGKV2-109 ENSMUST00000103322|IGKV2-109|5'UTR|IG|IGK|None|00 +CAAGTTCGCAGA +>239|IGKV2-109 ENSMUST00000103322|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCATTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAAGCCAGGCCAGTCTCCTCAGCTCCTGATTTATCAGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTAGCAGTGGGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTGCTCAAAATCTAGAACTTCCTCC +>240|IGKV2-112 ENSMUST00000103318|IGKV2-112|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCTCTCTTCAGTTCCTGGGGGTGCTTATGTTCTGGATCTCTGGAGTCAGTGGGGATATTGTGATAACCCAGGATGAACTCTCCAATCCTGTCACTTCTGGAGAATCAGTTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTATATAAGGATGGGAAGACATACTTGAATTGGTTTCTGCAGAGACCAGGACAATCTCCTCAGCTCCTGATCTATTTGATGTCCACCCGTGCATCAGGAGTCTCAGACCGGTTTAGTGGCAGTGGGTCAGGAACAGATTTCACCCTGGAAATCAGTAGAGTGAAGGCTGAGGATGTGGGTGTGTATTACTGTCAACAACTTGTAGAGTATCCTC +>241|IGKV2-137 ENSMUST00000103302|IGKV2-137|5'UTR|IG|IGK|None|00 +GGCTACTTTTCACACAGCTGCACCAAGCAGGGGATTTGCATATTGCTCCCTTGGGAGGATCTCTCCTGCAGGTCCAAGACAAAAGCTAGCCTCCATTTCTGTCTTGACTACTCAAGACTTTTTGTATCAAGTTCTCAGA +>242|IGKV2-137 ENSMUST00000103302|IGKV2-137|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCCTAGCTGAGTTCCTGGGGCTGCTTGTGCTCTGGATCCCTGGAGCCATTGGGGATATTGTGATGACTCAGGCTGCACCCTCTGTACCTGTCACTCCTGGAGAGTCAGTATCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTGCATAGTAATGGCAACACTTACTTGTATTGGTTCCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACTGCTTTCACACTGAGAATCAGTAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTATGCAACATCTAGAATATCCTTT +>243|IGKV20-101-2 ENSMUST00000200406|IGKV20-101-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGCTCTAGTTCAGCTCCTAGGGATGCTGATGCTCTGGCTCCAAGGCATGAGCTGTAATATCCAGGTGATCCAGTCACCATTTCTGTCTGCATCTGTGGGAGAGAGGGTCACAATCAGCTGCAAGACACATCAGCATATTAACAGTTCCATAGCCTGGTACCAGCAAAAAGTTGGAAAAGCTCCCATACTCCTGATAAGAGATGCAAGTTTTTCTCTAACAGACACCCCATCAAGGTTCACTGGGAATGGATTTGGCACAGATTTCACACTCAGCATCAGCAGTATGCAGTCTCAAGATGGTGCCACATATTTCTGCCAGCAGCATTTTCACTATTAC +>244|IGKV3-1 ENSMUST00000103404|IGKV3-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTCACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGAGCCACCATCTCCTGCAGAGCCAGTGAAAGTGTTGAATATTATGGCACAAGTTTAATGCAGTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACGTAGAATCTGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTGTGGAGGAGGATGATATTGCAATGTATTTCTGTCAGCAAAGTAGGAAGGTTCCTTC +>245|IGKV3-10 ENSMUST00000196940|IGKV3-10|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTAACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTGATCCTGTGGAGGCTGATGATGCTGCAACCTATTACTGTCAGCAAAATAATGAGGATCCTCC +>246|IGKV3-12 ENSMUST00000103396|IGKV3-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGTTATGGGTACTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCAAAAGTGTCAGTACATCTGGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCACAGTAGGGAGCTTCCTCC +>247|IGKV3-2 ENSMUST00000103403|IGKV3-2|5'UTR|IG|IGK|None|00 +TCTCTTCCAGTTCTCAGAG +>248|IGKV3-2 ENSMUST00000103403|IGKV3-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGAAAGACACACTCCTGCTATGGGTCCTGCTTCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAGAGCCAGCGAAAGTGTTGATAATTATGGCATTAGTTTTATGAACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCAAGGATCCGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTATGGAGGAGGATGATACTGCAATGTATTTCTGTCAGCAAAGTAAGGAGGTTCCTCC +>249|IGKV3-3 ENSMUST00000103402|IGKV3-3|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGAGCCACTATCTTCTGCAGAGCCAGCCAGAGTGTCGATTATAATGGAATTAGTTATATGCACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAAGATGCTGCAACCTATTACTGTCAGCAAAGTATTGAGGATCCTCC +>250|IGKV3-4 ENSMUST00000103401|IGKV3-4|5'UTR|IG|IGK|None|00 +G +>251|IGKV3-4 ENSMUST00000103401|IGKV3-4|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACAATCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAAGGCCAGCCAAAGTGTTGATTATGATGGTGATAGTTATATGAACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAATCTAGAATCTGGGATCCCAGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>252|IGKV3-5 ENSMUST00000103400|IGKV3-5|5'UTR|IG|IGK|None|00 +ATCCTCTCTTCCAGCTCTCAGAG +>253|IGKV3-5 ENSMUST00000103400|IGKV3-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTAATCCTGTGGAGGCTGATGATGTTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>254|IGKV3-7 ENSMUST00000197560|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCCAAAGTGTCAGTACATCTAGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCAAGTATGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATACTGCAACATATTACTGTCAGCACAGTTGGGAGATTCCTCC +>255|IGKV3-9 ENSMUST00000103398|IGKV3-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACCCACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGGGCCACCATATCCTGCCAAGCCAGCGAAAGTGTCAGTTTTGCTGGTACAAGTTTAATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGAGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGAGTCAGACTTCACTCTCACCATCGATCCTGTGGAGGAAGATGATGCTGCAATGTATTACTGTATGCAAAGTATGGAAGATCCTCC +>256|IGKV4-50 ENSMUST00000103363|IGKV4-50|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTATCTCAGTTGTAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGAAGGTCACCATGAGCTGCAGGGCCAGCTCAAGTGTAAATTACATGTACTGGTACCAGCAGAAGTCAGATGCCTCCCCCAAACTATGGATTTATTACACATCCAACCTGGCTCCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGAACTCTTATTCTCTCACAATCAGCAGCATGGAGGGTGAAGATGCTGCCACTTATTACTGCCAGCAGTTTACTAGTTCCCCATCCA +>257|IGKV4-51 ENSMUST00000103345|IGKV4-51|5'UTR|IG|IGK|None|00 +GCAGGAATTAGCCAGGGACTAAAATTCAAAGACACA +>258|IGKV4-51 ENSMUST00000103345|IGKV4-51|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCATTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCCCCCAAACTCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGGCTGGGATCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAAATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>259|IGKV4-53 ENSMUST00000198328|IGKV4-53|5'UTR|IG|IGK|None|00 +AAAAACACA +>260|IGKV4-53 ENSMUST00000198328|IGKV4-53|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCATGTGCAGATTTTCAGCTTCATGCTAATCAGTGTCACAGTCATATTGTCCAGTGGAGAAATTGTGCTCACCCAGTCTCCAGCACTCATGGCTGCATCTCCAGGGGAGAAGGTCACCATCACCTGCAGTGTCAGCTCAAGTATAAGTTCCAGCAACTTGCACTGGTACCAGCAGAAGTCAGAAACCTCCCCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGTCAACAGTGGAGTAGTTACCCACTCA +>261|IGKV4-54 ENSMUST00000199437|IGKV4-54|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACAGGTACCAGCAGAAGCCAGGATCCTCACCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAATATCATAGTTACCCACCCA +>262|IGKV4-55 ENSMUST00000103359|IGKV4-55|5'UTR|IG|IGK|None|00 +AGCTAGGGACCAAAGTTCAAAGACAAA +>263|IGKV4-55 ENSMUST00000103359|IGKV4-55|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCCTGATTTATGACACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTTACCCACCCA +>264|IGKV4-57 ENSMUST00000103357|IGKV4-57|L-REGION+V-REGION|IG|IGK|None|00 +ATGCATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATAACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTTCCAGCAGAAGCCAGGCACTTCTCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAAAGGAGTAGTTACCCACCCA +>265|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|5'UTR|IG|IGK|None|00 +AAATTCAAATACACA +>266|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCTGGTGCAGATTTTCAGCTTCTTGCTAATCAGTGCCTCAGTTGCAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGGGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGTGCCTCCCCCAAACTCTGGATTTATAGCACATCCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCACTCA +>267|IGKV4-58 ENSMUST00000197448|IGKV4-58|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCAGTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGCAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGCGCTTCCCCCAAACCCTTGATTCATAGGACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCGTGGAGGCTGAAGATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>268|IGKV4-59 ENSMUST00000103354|IGKV4-59|5'UTR|IG|IGK|None|00 +AAAATTCAAAGACAAA +>269|IGKV4-59 ENSMUST00000103354|IGKV4-59|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATATCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>270|IGKV4-61 ENSMUST00000199160|IGKV4-61|5'UTR|IG|IGK|None|00 +ATTAGCTAGGGACCAAAATTCAAAGACAGA +>271|IGKV4-61 ENSMUST00000199160|IGKV4-61|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATATCCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATCGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTATCATAGTTACCCACCCA +>272|IGKV4-62 ENSMUST00000198345|IGKV4-62|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGCCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGCTCCTCCCCCAGACTCTGGATTTATGACACATCCAACCTGGTTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTAGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCATCCA +>273|IGKV4-63 ENSMUST00000196595|IGKV4-63|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGAGAAAATGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAAGCACCTCCCCCAAACTCTGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCAGGTCGCTTCAGTGGCAGTGGGTCTGGAAACTCTTACTCTCTCACGATCAGCAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTTTTCAGGGGAGTGGGTACCCACTCA +>274|IGKV4-68 ENSMUST00000103350|IGKV4-68|5'UTR|IG|IGK|None|00 +AGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>275|IGKV4-68 ENSMUST00000103350|IGKV4-68|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATGAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCACTCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAAGATCCTCCCCCAAACCCTGGATTTATCTCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>276|IGKV4-69 ENSMUST00000103349|IGKV4-69|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTTAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTCTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCGCCCAAACCCTGGATTTATGACACATCCAACCTGGCTTCTGGATTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCATAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>277|IGKV4-70 ENSMUST00000103348|IGKV4-70|5'UTR|IG|IGK|None|00 +AATTAGCTAGGGACCAAAATTCAAAGACAAA +>278|IGKV4-70 ENSMUST00000103348|IGKV4-70|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTATAAGTTACATGCACTGGTACCAGCAGAAGCCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>279|IGKV4-71 ENSMUST00000196201|IGKV4-71|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTATTCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCTGGATTTATTTAACATTCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCTCAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>280|IGKV4-72 ENSMUST00000103346|IGKV4-72|5'UTR|IG|IGK|None|00 +TACTTATGAGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>281|IGKV4-72 ENSMUST00000103346|IGKV4-72|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTGTTCTCTCCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACAATGACTTGCAGGGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATGCCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGAGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>282|IGKV4-74 ENSMUST00000103344|IGKV4-74|5'UTR|IG|IGK|None|00 +GCAGTAATTAGCTAGGGACCAAAATTCAAAGGAAAA +>283|IGKV4-74 ENSMUST00000103344|IGKV4-74|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAACGGGTCACCATGACCTGCACTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCACCAGTATCATCGTTCCCCACCCA +>284|IGKV4-78 ENSMUST00000103343|IGKV4-78|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCATGACCTGCAGTGCCAGATCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTTTTACTGCCAGCAGTACAGTGGTTACCCATCCA +>285|IGKV4-79 ENSMUST00000103342|IGKV4-79|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCTTGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCTCTTATTTCTGCCATCAGTGGAGTAGTTACCCACCCC +>286|IGKV4-80 ENSMUST00000103341|IGKV4-80|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGGAGATCACCCTAACCTGCAGTGCCAGCTCGAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACTTCTCCCAAACTCTTGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTTCTCGCTTCAGTGGCAGTGGGTCTGGGACCTTTTATTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCGATTATTACTGCCATCAGTGGAGTAGTTATCCA +>287|IGKV4-81 ENSMUST00000197966|IGKV4-81|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGTTAATCAGTGTCTCAGTCATAATGTCCAGAGGAGAAAATGTGCTGACCCAGTCTCCAGCAATCATGGCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCTAGTAACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCTACCAAATTCTGGATTTATAGGACATCCAACCTGGCTTCAGAAGTCCCAGCTCCCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTTACAATCAGCAGCGTGGAGGCCGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTGGTTACCCACCCA +>288|IGKV4-86 ENSMUST00000200454|IGKV4-86|5'UTR|IG|IGK|None|00 +CACTAATTAGCCAGAGACCAAAATCCAAATACACA +>289|IGKV4-86 ENSMUST00000200454|IGKV4-86|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACTTTCGGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTGTCCAGAGGAGAAATTGTGCTCACTCAGTCTCCAGCCATCACAGCTGCATCTCTGGGGCAAAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAACCATGGATTTATGAAATATCCAAACTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCATTTATTACTGCCAGCAGTGGAATTATCCTCTTA +>290|IGKV4-90 ENSMUST00000103334|IGKV4-90|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTCATATTGACCAATGGAGAAATTTTGCTCACCCAGTCTCCAGCAATCATAGCTGCATCTCCTGGGGAGAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGAACTGGTACCAGCAGAAACCAGGATCCTCCCCCAAAATATGGATTTATGGTATATCCAACCTGGCTTCTGGAGTTCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACATCTTTCTCTTTCACAATCAACAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTCAGCAAAGGAGTAGTTACCCACCCA +>291|IGKV4-91 ENSMUST00000103333|IGKV4-91|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGATGCAGATTATCAGCTTGCTGCTAATCAGTGTCACAGTCATAGTGTCTAATGGAGAAATTGTGCTCACCCAGTCTCCAACCACCATGGCTGCATCTCCCGGGGAGAAGATCACTATCACCTGCAGTGCCAGCTCAAGTATAAGTTCCAATTACTTGCATTGGTATCAGCAGAAGCCAGGATTCTCCCCTAAACTCTTGATTTATAGGACATCCAATCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATTGGCACCATGGAGGCTGAAGATGTTGCCACTTACTACTGCCAGCAGGGTAGTAGTATACCACGCA +>292|IGKV4-92 ENSMUST00000103332|IGKV4-92|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATATGTGGGTGCAGATTTTCAGCTTACTGCTAATCTGTGTCACAGTGTCAAAGGGAGAAATGGTTCTCACCCAGTCTCCAGTATCCATAACTGCATCTCGAGGGGAGAAGGTCACCATCACCTGCCGTGCCAGCTCAAGTATAAGTTCCAATTACTTACACTGGTACCAGCAGAAGCCAGGATCCTCCCCTAAACTTTTGATTTATAGGACATCCATCCTGGCATCTGGAGTCCTAGACAGCTTCAGTGGCAGTGGGTCTGAGAGCTCTTACACTCTGACAATCAGCTGCATGCAGGACGAAGTTGCTGCCACTTACTATTGTCAGCAGGGGAGTAGTAGCCCACCA +>293|IGKV5-37 ENSMUST00000103372|IGKV5-37|5'UTR|IG|IGK|None|00 +GAAAGCTTAAAG +>294|IGKV5-37 ENSMUST00000103372|IGKV5-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATTCACACCTCATATCCTTGGACTTCTGCTTTTCTGGATTTCAGCCTCCACAGGTGACATCCTGCTGACCCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGAAACAGTCAGTCTTTCCTGTAGGGCCAGCCAGAGTATTTACAAGAACCTACACTGGTATCAACAGAAATCACATCGGTCTCCAAGGCTTCTCATCAAGTATGCTTCTGATTCCATCTCTGGGATCCCCTCCAGGTTCACTGGCAGTGGATCAGGGACAGATTACACTCTCAGTATCAACAGTGTGAAGCCCGAAGATGAAGGAATATATTACTGTCTTCAAGGTTACAGCACACCTTC +>295|IGKV5-39 ENSMUST00000197290|IGKV5-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCACTTCTCAGCTCCTTGGACTTTTGCTTTTCTGGACTTCAGCCTCCAGATGTGACATTGTGATGACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCTCTCTTTCCTGCAGGGCCAGCCAGAGTATTAGCGACTACTTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAATATGCTTCCCAATCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGTCAGATTTCACTCTCAGTATCAACAGTGTGGAACCTGAAGATGTTGGAGTGTATTACTGTCAAAATGGTCACAGCTTTCCTCC +>296|IGKV5-43 ENSMUST00000103368|IGKV5-43|5'UTR|IG|IGK|None|00 +ATGAGCCACACAAACTCAGGGAAAGCTCGAAG +>297|IGKV5-43 ENSMUST00000103368|IGKV5-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATACTTGGACTTATGCTTTTTTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGCGTCAGTCTTTCCTGCAGGGCCAGCCAAAGTATTAGCAACAACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>298|IGKV5-45 ENSMUST00000103366|IGKV5-45|5'UTR|IG|IGK|None|00 +TGTGTCATGATCCACACAAACTCAGGGAAAGCTCGAAG +>299|IGKV5-45 ENSMUST00000103366|IGKV5-45|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATTCTTGGACTTATGCTTTTCTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCAGTCTTTCCTGCAGGGCCAGTCAAAGTATTAGCAACTACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>300|IGKV5-48 ENSMUST00000103364|IGKV5-48|5'UTR|IG|IGK|None|00 +GGAAAGTTTGAAG +>301|IGKV5-48 ENSMUST00000103364|IGKV5-48|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCCACACCTCAGTTCCTTGTATTTTTGCTTTTCTGGATTCCAGCCTCCAGAGGTGACATCTTGCTGACTCAGTCTCCAGCCATCCTGTCTGTGAGTCCAGGAGAAAGAGTCAGTTTCTCCTGCAGGGCCAGTCAGAGCATTGGCACAAGCATACACTGGTATCAGCAAAGAACAAATGGTTCTCCAAGGCTTCTCATAAAGTATGCTTCTGAGTCTATCTCTGGGATCCCTTCCAGGTTTAGTGGCAGTGGATCAGGGACAGATTTTACTCTTAGCATCAACAGTGTGGAGTCTGAAGATATTGCAGATTATTACTGTCAACAAAGTAATAGCTGGCCAAC +>302|IGKV6-13 ENSMUST00000198184|IGKV6-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGCTTCAAGATGGAGTCTCATACTCAGGCCTTTGTATTCGCGTTTCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCAATCGGTACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATATGCAGTCTGAAGACCTGGCAGATTATTTCTGCCAGCAATATAGCAGCTATCCTCT +>303|IGKV6-14 ENSMUST00000103394|IGKV6-14|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTCTTTGTATTCGTGTTGCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTTCGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAGTCTCCTAAAGCACTGATTTACTTGGCATCCAACCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAATCTGAAGACCTGGCAGATTATTTCTGTCTGCAACATTGGAATTATCCTCT +>304|IGKV6-15 ENSMUST00000103393|IGKV6-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGACTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCGTCACCTGCAAGGCCAGTCAGAATGTGGGTACTAATGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAAGCACTGATTTACTCGGCATCCTACCGGTACAGTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATGTGCAGTCTGAAGACTTGGCAGAGTATTTCTGTCAGCAATATAACAGCTATCCTCT +>305|IGKV6-17 ENSMUST00000103391|IGKV6-17|5'UTR|IG|IGK|None|00 +GAAATGCATCACACCAGCATGGGCATCAAA +>306|IGKV6-17 ENSMUST00000103391|IGKV6-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGTCTTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCTACCGGTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATCTGGGACGGATTTCACTTTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAACATTATAGTACTCCTCC +>307|IGKV6-20 ENSMUST00000103388|IGKV6-20|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>308|IGKV6-20 ENSMUST00000103388|IGKV6-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACACTGGGGTCCCCGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGAGTTACAGCTATCCTCC +>309|IGKV6-23 ENSMUST00000103386|IGKV6-23|5'UTR|IG|IGK|None|00 +TCAGACCAGCATGGGCATCAAG +>310|IGKV6-23 ENSMUST00000103386|IGKV6-23|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACACATTCTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGAAGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAGTCTGAAGACTTGGCAGATTATTTCTGTCAGCAATATAGCAGCTATCCTCT +>311|IGKV6-25 ENSMUST00000103383|IGKV6-25|5'UTR|IG|IGK|None|00 +TATGAAATGCATCGCACCAGCATGGGCATCAAG +>312|IGKV6-25 ENSMUST00000103383|IGKV6-25|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGCATTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAAAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTATACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCACTTTATTACTGTCAGCAACATTATAGCACTCCTCC +>313|IGKV6-29 ENSMUST00000197371|IGKV6-29|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>314|IGKV6-29 ENSMUST00000197371|IGKV6-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACCCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTCTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGGGTTACAGCTATCTTCC +>315|IGKV6-32 ENSMUST00000103377|IGKV6-32|5'UTR|IG|IGK|None|00 +GGCAGGCAAGGGCATCAAG +>316|IGKV6-32 ENSMUST00000103377|IGKV6-32|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTCACAGACCCAGGTCTTCGTATTTCTACTGCTCTGTGTGTCTGGTGCTCATGGGAGTATTGTGATGACCCAGACTCCCAAATTCCTGCTTGTATCAGCAGGAGACAGGGTTACCATAACCTGCAAGGCCAGTCAGAGTGTGAGTAATGATGTAGCTTGGTACCAACAGAAGCCAGGGCAGTCTCCTAAACTGCTGATATACTATGCATCCAATCGCTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATATGGGACGGATTTCACTTTCACCATCAGCACTGTGCAGGCTGAAGACCTGGCAGTTTATTTCTGTCAGCAGGATTATAGCTCTCCTCC +>317|IGKV7-33 ENSMUST00000197429|IGKV7-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTACTCATGTCCCTGCTGCTCTGCATGTCTGGTGCCTGTGCAGACATTGTGATGACTCAGTCTCCAACTTTCCTTGCTGTGACAGCAAGTAAGAAGGTCACCATTAGTTGCACGGCCAGTGAGAGCCTTTATTCAAGCAAACACAAGGTGCACTACTTGGCTTGGTACCAGAAGAAACCAGAGCAATCTCCTAAACTGCTGATATACGGGGCATCCAACCGATACATTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTGACCATCAGCAGTGTACAGGTTGAAGACCTCACACATTATTACTGTGCACAGTTTTACAGCTATCCTCT +>318|IGKV8-16 ENSMUST00000195945|IGKV8-16|5'UTR|IG|IGK|None|00 +GGCAGGGGAGCAAT +>319|IGKV8-16 ENSMUST00000195945|IGKV8-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCAGAGACCCATGTCCTCATATTTTTGCTGCTATGGGTGTCTGGTGCTTGTGGGGAAATTGTGTTGACCCAGTCTATACCATCCCTGACTGTGTCAGCAGGAGAGAGGGTCACTATCAGCTGCAAATCCAATCAGAATCTTTTATGGAGTGGAAACCAAAGGTACTGTTTGGTCTGGCACCAGTGGAAACCAGGGCAAACTCCTACACCGTTGATCACCTGGACATCTGATAGGTACTCTGGAGTCCCTGATCGTTTCATAGGCAGTGGATCTGTGACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGATGTGGCAGTTTATTTCTGTCAGCAGCATTTACACATTCCTCC +>320|IGKV8-18 ENSMUST00000103390|IGKV8-18|5'UTR|IG|IGK|None|00 +CATCAGTCAGGCAGGGGGGAGAAAG +>321|IGKV8-18 ENSMUST00000103390|IGKV8-18|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGATGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAATAACTACTTATCCTGGTACCAGCAGAAACAAGGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGATTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAGCACAATCATGGCAGCTTTCTCCCCC +>322|IGKV8-19 ENSMUST00000196599|IGKV8-19|5'UTR|IG|IGK|None|00 +GCAAG +>323|IGKV8-19 ENSMUST00000196599|IGKV8-19|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATGTCCCTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGACTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGACCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATTATAGTTATCCTCC +>324|IGKV8-21 ENSMUST00000103387|IGKV8-21|5'UTR|IG|IGK|None|00 +AGACAGGCAGTGGGAGCAAG +>325|IGKV8-21 ENSMUST00000103387|IGKV8-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATATTGCTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTGGCTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAATCCAGTCAGAGTCTGCTCAACAGTAGAACCCGAAAGAACTACTTGGCTTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGCAAGCAATCTTATAATCTTCC +>326|IGKV8-24 ENSMUST00000103384|IGKV8-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCAGGTCCTCATGTTTCTTCTGCTCTGGGTATCTGGTGCCTGTGCAGACATTGTGATGACACAGTCTCCATCCTCCCTGGCTATGTCAGTAGGACAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTAAATAGTAGCAATCAAAAGAACTATTTGGCCTGGTACCAGCAGAAACCAGGACAGTCTCCTAAACTTCTGGTATACTTTGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACAGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGATTACTTCTGTCAGCAACATTATAGCACTCCTCC +>327|IGKV8-26 ENSMUST00000103382|IGKV8-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGAACCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAAGAACTACTTGTCCTGGTACCAGCAGAAACAAAGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGGTTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAACACAATCATGGCAGCTTTCTCCCCCC +>328|IGKV8-27 ENSMUST00000197272|IGKV8-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCTTCCTCTCCCTGCTGCTCTGGGTATCTGGTACCTGTGGGAACATTATGATGACACAGTCGCCATCATCTCTGGCTGTGTCTGCAGGAGAAAAGGTCACTATGAGCTGTAAGTCCAGTCAAAGTGTTTTATACAGTTCAAATCAGAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGTGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTTACTCTTACCATCAGCAGTGTACAAGCTGAAGACCTGGCAGTTTATTACTGTCATCAATACCTCTCCTCG +>329|IGKV8-28 ENSMUST00000197525|IGKV8-28|5'UTR|IG|IGK|None|00 +GCAAG +>330|IGKV8-28 ENSMUST00000197525|IGKV8-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATCTCCTTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGAGTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACGGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACCGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATCATAGTTATCCTCC +>331|IGKV8-30 ENSMUST00000103378|IGKV8-30|5'UTR|IG|IGK|None|00 +AAG +>332|IGKV8-30 ENSMUST00000103378|IGKV8-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATGTTACTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTAGCTGTGTCAGTTGGAGAGAAGGTTACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTATATAGTAGCAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATTTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGAAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAATATTATAGCTATCCTCC +>333|IGKV8-34 ENSMUST00000196959|IGKV8-34|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTCCTCATGTTGCTGCTGCTATCGGTATCTGGTACCTGTGGAGACATTTTGATGACCCAGTCTCCATCCTCCCTGACTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTAGCTAGTGGCAACCAAAATAACTACTTGGCCTGGCACCAGCAGAAACCAGGACGATCTCCTAAAATGCTGATAATTTGGGCATCCACTAGGGTATCTGGAGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACGGATTTCACTCTGACCATCAACAGTGTGCAGGCTGAAGATCTGGCTGTTTATTACTGTCAGCAGTCCTACAGCGCTCCTAC +>334|IGKV9-120 ENSMUST00000103316|IGKV9-120|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCACAGATTTTTGGCTTCTTGTTGCTCTTGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGACATTGGTAGTAGCTTAAACTGGCTTCAGCAGGAACCAGATGGAACTATTAAACGCCTGATCTACGCCACATCCAGTTTAGATTCTGGTGTCCCCAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGTAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>335|IGKV9-123 ENSMUST00000103313|IGKV9-123|5'UTR|IG|IGK|None|00 +TTGTCATTGCATTCAGAACTCAGC +>336|IGKV9-123 ENSMUST00000103313|IGKV9-123|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATCAGGGCTCCTGCTCAGTTTCTTGGCATCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGATTCAGTCTCCATCGTCCATGTTTGCCTCTCTGGGAGACAGAGTCAGTCTCTCTTGTCGGGCTAGTCAGGGCATTAGAGGTAATTTAGACTGGTATCAGCAGAAACCAGGTGGAACTATTAAACTCCTGATCTACTCCACATCCAATTTAAATTCTGGTGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTAGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGCGTAATGCGTATCCTCT +>337|IGKV9-124 ENSMUST00000196768|IGKV9-124|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTTCCTGCTCACGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGAAATTAGTGGTTACTTAAGCTGGCTTCAGCAGAAACCAGATGGAACTATTAAACGCCTGATCTACGCCGCATCCACTTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTATCCTCC +>338|IGKV9-129 ENSMUST00000200578|IGKV9-129|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGCCGGGCAAGTCAGGACATTCATGGTTATTTAAACTTGTTTCAGCAGAAACCAGGTGAAACTATTAAACACCTGATCTATGAAACATCCAATTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCATTATCGGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>339|IGLC1 ENSMUST00000200568|IGLC1|C-REGION|IG|IGL|None|00 +GCCAGCCCAAGTCTTCGCCATCAGTCACCCTGTTTCCACCTTCCTCTGAAGAGCTCGAGACTAACAAGGCCACACTGGTGTGTACGATCACTGATTTCTACCCAGGTGTGGTGACAGTGGACTGGAAGGTAGATGGTACCCCTGTCACTCAGGGTATGGAGACAACCCAGCCTTCCAAACAGAGCAACAACAAGTACATGGCTAGCAGCTACCTGACCCTGACAGCAAGAGCATGGGAAAGGCATAGCAGTTACAGCTGCCAGGTCACTCATGAAGGTCACACTGTGGAGAAGAGTTTGTCCCGTGCTGACTGTTCC +>340|IGLC2 ENSMUST00000198182|IGLC2|C-REGION|IG|IGL|None|00 +GGTCAGCCCAAGTCCACTCCCACTCTCACCGTGTTTCCACCTTCCTCTGAGGAGCTCAAGGAAAACAAAGCCACACTGGTGTGTCTGATTTCCAACTTTTCCCCGAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGGCAACAAGTTCATGGCCAGCAGCTTCCTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGTCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>341|IGLC3 ENSMUST00000200235|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACACTCACCATGTTTCCACCTTCCCCTGAGGAGCTCCAGGAAAACAAAGCCACACTCGTGTGTCTGATTTCCAATTTTTCCCCAAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGACAACAAGTACATGGCCAGCAGCTTCTTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGCCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>342|IGLC4 ENSMUST00000197046|IGLC4|C-REGION|IG|IGL|None|00 +GCCAACCCAAGGCTACACCCTCAGTTAATCTGTTCCCACCTTCCTCTGAAGAGCTCAAGACTAAAAAGGCCACACTGGTGTGTATGATCACTGAGTTCTACGCAGCTGCTGTGAGAGTGGCCTGGAAGGCAGATGGTACCCCTTTCACTCAGGGTGTAGAGACTACCCAGCCTCCCAAACAGAGGGACAACATGGCTAGCAGTTACCTGCTCTTCACAGCAGAAGCGTGGGAATCTCATAGCAGTTACAGCTGCCATGTCACTCATGAAGGGAACACTGTGGAGAAGAGTTTGTCCCGTGCTGAGTGTTCCTAG +>343|IGLJ1 ENSMUST00000199490|IGLJ1|J-REGION|IG|IGL|None|00 +CTGGGTGTTCGGTGGAGGAACCAAACTGACTGTCCTAG +>344|IGLJ2 ENSMUST00000197969|IGLJ2|J-REGION|IG|IGL|None|00 +TTATGTTTTCGGCGGTGGAACCAAGGTCACTGTCCTAG +>345|IGLJ3 ENSMUST00000200211|IGLJ3|J-REGION|IG|IGL|None|00 +GTTTATTTTCGGCAGTGGAACCAAGGTCACTGTCCTAG +>346|IGLJ3PSEUDOGENE ENSMUST00000200074|IGLJ3PSEUDOGENE|J-REGION|IG|IGL|None|00 +AGGTTCTTTTTCCTCAAATGGCCTATTGTATGCAGGAG +>347|IGLJ4 ENSMUST00000198313|IGLJ4|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGAGGTGGAACCAGATTGACTGTCCTAGATGA +>348|IGLV1 ENSMUST00000103746|IGLV1|5'UTR|IG|IGL|None|00 +GCTGACCAATATTGAAAAGAATAGACCTGGTTTGTGAATT +>349|IGLV1 ENSMUST00000103746|IGLV1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATTTCACTTATACTCTCTCTCCTGGCTCTCAGCTCAGGGGCCATTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGAAACAGTCACACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAACAACCGAGCTCCAGGTGTTCCTGCCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGAGGCAATATATTTCTGTGCTCTATGGTACAGCAACCATTTC +>350|IGLV2 ENSMUST00000197518|IGLV2|5'UTR|IG|IGL|None|00 +CTTGGTTTGTGAATT +>351|IGLV2 ENSMUST00000197518|IGLV2|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTTCACTTATACTCTCTCTCCTGGCTCTCTGCTCAGGAGCCAGTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGGAACAGTCATACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAGCAACCGAGCTCCAGGTGTTCCTGTCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGATGCAATGTATTTCTGTGCTCTATGGTACAGCACCCATTTC +>352|IGLV3 ENSMUST00000103751|IGLV3|5'UTR|IG|IGL|None|00 +GTACCTGCATT +>353|IGLV3 ENSMUST00000103751|IGLV3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTCTTCTTCTTTGTTCTTCATTGCTCAGGTTCTTTCTCCCAACTTGTGCTCACTCAGTCATCTTCAGCCTCTTTCTCCCTGGGAGCCTCAGCAAAACTCACGTGCACCTTGAGTAGTCAGCACAGTACGTACACCATTGAATGGTATCAGCAACAGCCACTCAAGCCTCCTAAGTATGTGATGGAGCTTAAGAAAGATGGAAGCCACAGCACAGGTGATGGGATTCCTGATCGCTTCTCTGGATCCAGCTCTGGTGCTGATCGCTACCTTAGCATTTCCAACATCCAGCCTGAAGATGAAGCAATATACATCTGTGGTGTGGGTGATACAATTAAGGAACAATTTGTGTAAC +>354|TRAC ENSMUST00000198398|TRAC|C-REGION|TR|TRA|None|00 +ACATCCAGAACCCAGAACCTGCTGTGTACCAGTTAAAAGATCCTCGGTCTCAGGACAGCACCCTCTGCCTGTTCACCGACTTTGACTCCCAAATCAATGTGCCGAAAACCATGGAATCTGGAACGTTCATCACTGACAAAACTGTGCTGGACATGAAAGCTATGGATTCCAAGAGCAATGGGGCCATTGCCTGGAGCAACCAGACAAGCTTCACCTGCCAAGATATCTTCAAAGAGACCAACGCCACCTACCCCAGTTCAGACGTTCCCTGTGATGCCACGTTGACTGAGAAAAGCTTTGAAACAGATATGAACCTAAACTTTCAAAACCTGTCAGTTATGGGACTCCGAATCCTCCTGCTGAAAGTAGCCGGATTTAACCTGCTCATGACGCTGAGGCTGTGGTCCAGT +>355|TRAJ11 ENSMUST00000103730|TRAJ11|J-REGION|TR|TRA|None|00 +TGACTCGGGATACAACAAACTCACTTTTGGAAAGGGCACGGTGCTTCTAGTCTCTCCAG +>356|TRAJ12 ENSMUST00000103729|TRAJ12|J-REGION|TR|TRA|None|00 +GGGACTGGAGGCTATAAAGTGGTCTTTGGAAGTGGGACTCGATTGCTGGTAAGCCCTG +>357|TRAJ13 ENSMUST00000103728|TRAJ13|J-REGION|TR|TRA|None|00 +CAAATTCTGGGACTTACCAGAGGTTTGGAACTGGGACAAAACTCCAAGTCGTTCCAA +>358|TRAJ15 ENSMUST00000103726|TRAJ15|J-REGION|TR|TRA|None|00 +CCTACCAGGGAGGCAGAGCTCTGATATTTGGAACAGGAACCACGGTATCAGTCAGCCCCA +>359|TRAJ16 ENSMUST00000103725|TRAJ16|J-REGION|TR|TRA|None|00 +GCAACTTCAAGTGGCCAGAAGCTGGTTTTTGGCCAGGGGACCATATTAAAGGTGTACCTGC +>360|TRAJ17 ENSMUST00000103724|TRAJ17|J-REGION|TR|TRA|None|00 +TGACTAACAGTGCAGGGAACAAGCTAACTTTTGGAATCGGAACCAGGGTGCTGGTCAGGCCAG +>361|TRAJ18 ENSMUST00000103723|TRAJ18|J-REGION|TR|TRA|None|00 +TAGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTTGGAGCTGGGACTCAGCTGATTGTCATACCTG +>362|TRAJ19 ENSMUST00000103722|TRAJ19|J-REGION|TR|TRA|None|00 +ATCTATCGAGGTTTTCATAAGTTCAGCTCTGGAATAGAATCCAAGCATAATGTAAGTCCTA +>363|TRAJ2 ENSMUST00000103738|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGACTAAGTGGTAAATTAACATTCGGGGAAGGGACCCAAGTGACGGTAATATCTG +>364|TRAJ20 ENSMUST00000103721|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTGGTAACTACAAGCTCGGTGTTGAGTCAGTAACCATGATGTCTGTAAGAGCAGG +>365|TRAJ21 ENSMUST00000103720|TRAJ21|J-REGION|TR|TRA|None|00 +TGTCTAATTACAACGTGCTTTACTTCGGATCTGGCACCAAACTCACTGTAGAGCCAA +>366|TRAJ22 ENSMUST00000103719|TRAJ22|J-REGION|TR|TRA|None|00 +CATCTTCTGGCAGCTGGCAACTCATCTTTGGATCTGGAACCCAACTGACAGTTATGCCTG +>367|TRAJ23 ENSMUST00000103718|TRAJ23|J-REGION|TR|TRA|None|00 +TGAATTATAACCAGGGGAAGCTTATCTTTGGACAGGGAACCAAGTTATCTATCAAGCCCA +>368|TRAJ24 ENSMUST00000103717|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGCCAGTTTGGGGAAACTGCAGTTTGGAACAGGAACCCAGGTTGTGGTGACCCCAG +>369|TRAJ25 ENSMUST00000103716|TRAJ25|J-REGION|TR|TRA|None|00 +GAAGGACAAAAGTCTCCTCTGTCTTTGGGACAGGGAGAAGGCTGCTGGTGAAGCCAA +>370|TRAJ26 ENSMUST00000103715|TRAJ26|J-REGION|TR|TRA|None|00 +GAAATAACTATGCCCAGGGATTAACCTTCGGTCTTGGCACCAGAGTATCTGTGTTTCCCT +>371|TRAJ27 ENSMUST00000103714|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATACAGGCAAATTAACCTTTGGGGATGGGACCGTGCTCACAGTGAAGCCAA +>372|TRAJ28 ENSMUST00000103713|TRAJ28|J-REGION|TR|TRA|None|00 +TCTACCAGGCACTGGGAGTAACAGGCTCACTTTTGGGAAAGGCACCAAATTCTCACTCATCCCGA +>373|TRAJ29 ENSMUST00000103712|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAGCAGGGAGCTTGTCTTAGGAAGGGAAGCAAGGCTTTCTATGATTGAAA +>374|TRAJ3 ENSMUST00000103737|TRAJ3|J-REGION|TR|TRA|None|00 +GGAATTCAGCTATAGCTCTAAACTAATCTTTGGAGCTGAAACCAAACTCAGAAATCCACCATATAC +>375|TRAJ30 ENSMUST00000103711|TRAJ30|J-REGION|TR|TRA|None|00 +TGACACAAATGCTTACAAAGTCATCTTTGGAAAAGGGACACATCTTCATGTTCTCCCTA +>376|TRAJ31 ENSMUST00000103710|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAGCAATAACAGAATCTTCTTTGGTGATGGGACGCAGCTGGTGGTGAAGCCCA +>377|TRAJ32 ENSMUST00000103709|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGGAGCAGTGGCAACAAGCTCATCTTTGGAATTGGGACTCTGCTTTCTGTCAAGCCAA +>378|TRAJ33 ENSMUST00000103708|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTGATCTGGGGCTCTGGGACCAAGCTAATTATAAAGCCAG +>379|TRAJ34 ENSMUST00000103707|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTCCAATACCAACAAAGTCGTCTTTGGAACAGGGACCAGATTACAAGTATTACCAA +>380|TRAJ35 ENSMUST00000103706|TRAJ35|J-REGION|TR|TRA|None|00 +GCAGACAGGCTTTGCAAGTGCGCTGACATTTGGATCTGGCACAAAAGTCATTCCATGTCTACCAT +>381|TRAJ37 ENSMUST00000103705|TRAJ37|J-REGION|TR|TRA|None|00 +TAACAGGCAATACCGGAAAACTCATCTTTGGACTGGGGACAACTTTACAAGTGCAACCAG +>382|TRAJ38 ENSMUST00000103704|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGTTGGTGACAACAGTAAGCTGATTTGGGGCTTGGGGACAAGTCTGGTAGTAAATCCAA +>383|TRAJ39 ENSMUST00000103703|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGTGCCAAGCTCACATTCGGAGGGGGAACAAGGTTAACGGTCAGACCCG +>384|TRAJ4 ENSMUST00000103736|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTATCTGGTAGCTTCAATAAGTTGACCTTTGGAGCAGGGACCAGACTGGCTGTGTGCCCAT +>385|TRAJ40 ENSMUST00000103702|TRAJ40|J-REGION|TR|TRA|None|00 +GTTAATACAGGAAACTACAAATACGTCTTTGGAGCAGGTACCAGACTGAAGGTTATAGCAC +>386|TRAJ41 ENSMUST00000103701|TRAJ41|J-REGION|TR|TRA|None|00 +GGTCTCAAACACTAGCTCCATGTTGGCAGAAGCACCTCATTATTGGTCACACCCG +>387|TRAJ42 ENSMUST00000103700|TRAJ42|J-REGION|TR|TRA|None|00 +AATTCTGGAGGAAGCAATGCAAAGCTAACCTTCGGGAAAGGCACTAAACTCTCTGTTAAATCAA +>388|TRAJ43 ENSMUST00000103699|TRAJ43|J-REGION|TR|TRA|None|00 +GCAATAACAACAATGCCCCACGATTTGGAGCGGGAACCAAATTATCAGTAAAACCAA +>389|TRAJ44 ENSMUST00000103698|TRAJ44|J-REGION|TR|TRA|None|00 +GTTACTGGCAGTGGTGGAAAACTCACTTTGGGGGCTGGAACAAGACTTCAGGTCAACCTTG +>390|TRAJ45 ENSMUST00000103697|TRAJ45|J-REGION|TR|TRA|None|00 +TGAATACAGAAGGTGCAGATAGACTCACCTTTGGGAAAGGAACTCAGCTGATCATCCAGCCCT +>391|TRAJ46 ENSMUST00000103696|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAAGACAGCAGTGTAGACATGCTGGCTTTGGGGATGGGGATGAACTTGGAGTGAGCACAAA +>392|TRAJ47 ENSMUST00000197949|TRAJ47|J-REGION|TR|TRA|None|00 +TGGACTATGCAAACAAGATGATCTTTGGCTTGGGAACCATTTTGAGAGTCAGACCTC +>393|TRAJ48 ENSMUST00000200046|TRAJ48|J-REGION|TR|TRA|None|00 +GCCAACTATGGAAATGAGAAAATAACTTTTGGGGCTGGAACCAAACTCACCATTAAACCCA +>394|TRAJ49 ENSMUST00000199452|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACGGGTTACCAGAACTTCTATTTTGGGAAAGGAACAAGTTTGACTGTCATTCCAAGTA +>395|TRAJ5 ENSMUST00000103735|TRAJ5|J-REGION|TR|TRA|None|00 +GGGGACACAGGTTGTGGGGCAGCTCACTTTCGGGAGGGGGACAAGACTCCAAGTTTATGCAA +>396|TRAJ50 ENSMUST00000103693|TRAJ50|J-REGION|TR|TRA|None|00 +TAGCATCCTCCTCCTTCAGCAAGCTGGTGTTTGGGCAGGGGACATCCTTATCAGTCGTTCCAA +>397|TRAJ52 ENSMUST00000103691|TRAJ52|J-REGION|TR|TRA|None|00 +CTAACACTGGAGCTAACACTGGAAAGCTCACGTTTGGACACGGCACCATCCTTAGGGTCCATCCAA +>398|TRAJ53 ENSMUST00000103690|TRAJ53|J-REGION|TR|TRA|None|00 +GGAACAGTGGAGGCAGCAATTACAAACTGACATTTGGGAAAGGAACTCTCTTAACTGTGACTCCAA +>399|TRAJ56 ENSMUST00000103689|TRAJ56|J-REGION|TR|TRA|None|00 +TGGCTACTGGAGGCAATAATAAGCTGACTTTTGGTCAAGGAACCGTTCTGAGTGTTATACCAG +>400|TRAJ57 ENSMUST00000196977|TRAJ57|J-REGION|TR|TRA|None|00 +TGAATCAAGGAGGGTCTGCGAAGCTCATCTTTGGGGAGGGGACAAAGCTGACAGTGAGCTCAT +>401|TRAJ58 ENSMUST00000103687|TRAJ58|J-REGION|TR|TRA|None|00 +TGCAGCAAGGCACTGGGTCTAAGCTGTCATTTGGGAAGGGGGCAAAGCTCACAGTGAGTCCAG +>402|TRAJ59 ENSMUST00000197589|TRAJ59|J-REGION|TR|TRA|None|00 +CTACTAAAAAGAGAAGATAAAGCTACCTTTGCAACTGGAGGGTATGAAGCTGAGGAAGACCT +>403|TRAJ6 ENSMUST00000103734|TRAJ6|J-REGION|TR|TRA|None|00 +AACCTCAGGAGGAAACTACAAACCTACGTTTGGGAAAGGGACCAGCCTCGTGGTTCATCCAT +>404|TRAJ7 ENSMUST00000103733|TRAJ7|J-REGION|TR|TRA|None|00 +GGACTACAGCAACAACAGACTTACTTTGGGGAAGGGAACCCAGGTGGTGGTGTTACCAA +>405|TRAJ9 ENSMUST00000103731|TRAJ9|J-REGION|TR|TRA|None|00 +AGCAACATGGGCTACAAACTTACCTTCGGGACAGGAACAAGCTTGTTGGTTGATCCAA +>406|TRAV1 ENSMUST00000103567|TRAV1|5'UTR|TR|TRA|None|00 +GCTCAGGAGCTGGGGACTCAGTGTCAGGCTGGTGGTGTC +>407|TRAV1 ENSMUST00000103567|TRAV1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGCAGATGTGGGGGTTTGTTCTCTATCTCTTCCTGACGGTGGGAGGTGCTGCAGGACAGGGTGTGGAGCAGCCTGCCAAATTGATGTCTGTGGAGGGAACCTTTGCTCGGGTCAACTGCACATACAGCACCTCAGGGTTCAACGGGTTATCCTGGTACCAGCAACGTGAAGGCCAAGCCCCTGTATTTCTTTCTTATGTTGTTTTGGATGGTTTGAAGGACAGTGGGCATTTCTCCACTTTCCTGAGCCGCTCGAATGGGTACAGTTACCTGCTTCTGACAGAGCTCCAGATCAAAGACTCTGCCTCATACCTCTGTGCTGTGAGGGA +>408|TRAV10 ENSMUST00000103583|TRAV10|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>409|TRAV10 ENSMUST00000103583|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTATGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACATGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCTTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>410|TRAV10D ENSMUST00000103646|TRAV10D|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>411|TRAV10D ENSMUST00000103646|TRAV10D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>412|TRAV10N ENSMUST00000103612|TRAV10N|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAAAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTACAGTTTTATTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>413|TRAV11 ENSMUST00000103585|TRAV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGCG +>414|TRAV11D ENSMUST00000103648|TRAV11D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGC +>415|TRAV12-1 ENSMUST00000200115|TRAV12-1|5'UTR|TR|TRA|None|00 +GTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCT +>416|TRAV12-1 ENSMUST00000200115|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTCCTCAGTTCTCGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACCGAGGGGTTGCCTGTGAAGCTGAACTGCACCTATCAGACTACTTATTTAACTATTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTCAGGTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>417|TRAV12-2 ENSMUST00000180972|TRAV12-2|5'UTR|TR|TRA|None|00 +GTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>418|TRAV12-2 ENSMUST00000180972|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAACAATGGAGACTCTGTGACCCAGACAGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGAGTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTTTTGAAGAGCTTCACAGACAACAAGAGGCCCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTTTGAGTGA +>419|TRAV12-3 ENSMUST00000103657|TRAV12-3|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTTTGAGGAGATCCTGCAGTAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCTATGAAC +>420|TRAV12-3 ENSMUST00000103657|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGGCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGAGATGGAGACTCAGTGACCCAGAAGGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATGCTTTCCTTTTCTGGTATGTGCACTATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>421|TRAV12D-1 ENSMUST00000181360|TRAV12D-1|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>422|TRAV12D-1 ENSMUST00000181360|TRAV12D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTGCTTACTCAGATGTTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTAAACTACTCCTGCGGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>423|TRAV12D-2 ENSMUST00000197007|TRAV12D-2|5'UTR|TR|TRA|None|00 +GAGACTGTGCAGACAGAGGCCCTTGTCTGTGAGTGAGGAGTGTGAGGAGATTCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAGGGACCAAGTGTCATTTCTTCCATGAAC +>424|TRAV12D-2 ENSMUST00000197007|TRAV12D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAGCAATGGAGACTCAGTGACCCAGACAGAAGGCCTGGTCACTCTCACCAAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCTACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTTCTGTGCTTTGAGTGA +>425|TRAV12D-3 ENSMUST00000177703|TRAV12D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>426|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|5'UTR|TR|TRA|None|00 +CTGAAC +>427|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>428|TRAV13-1 ENSMUST00000103651|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGAGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCATAGTGGGAGACTGACATCCACTACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>429|TRAV13-2 ENSMUST00000103658|TRAV13-2|5'UTR|TR|TRA|None|00 +TGACACAACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCATCCACACAAGCACC +>430|TRAV13-2 ENSMUST00000103658|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGTTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACATCCTGGGGGAAGACTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAACGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATAGATC +>431|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>432|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCGGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>433|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|5'UTR|TR|TRA|None|00 +CCACCCTGACACCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>434|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>435|TRAV13D-2 ENSMUST00000197954|TRAV13D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCAGCTGCAGTGGTTTTACCAAAGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAGGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTATAGATC +>436|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>437|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAATGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>438|TRAV13D-4 ENSMUST00000196079|TRAV13D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACACAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATGGAAC +>439|TRAV13N-1 ENSMUST00000198359|TRAV13N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCATCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>440|TRAV13N-3 ENSMUST00000179580|TRAV13N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAACGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>441|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|5'UTR|TR|TRA|None|00 +GACTGGTTGCAGAAGAAGGAGGGGACACTTCAACAGCCACCCTGACACCACAGCCCAGGAGCTGGTTACTTGCTTCTGTCTCCAGCAGCTACACAAGCACC +>442|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>443|TRAV14-1 ENSMUST00000198297|TRAV14-1|5'UTR|TR|TRA|None|00 +CACCTGAGTTTCCCCCAAGCTTCAGTCTAGGAGGA +>444|TRAV14-1 ENSMUST00000198297|TRAV14-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATTCTGACAGCATCATTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGAAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGGAACCACAGTTCTGACCTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAACAGTTCCCTGGGGAAGGCCCTGCACTTCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAACCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCATAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>445|TRAV14-2 ENSMUST00000179267|TRAV14-2|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAAGAGGA +>446|TRAV14-2 ENSMUST00000179267|TRAV14-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACCATCAGTTCCCTGGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGTTCTCCTTGCACATCGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>447|TRAV14-3 ENSMUST00000103589|TRAV14-3|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAGGAGAA +>448|TRAV14-3 ENSMUST00000103589|TRAV14-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCATTTTTACTTCTAGGCCTTCACCTATCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTAAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCCACTTACTTCTGTGCAGCAAGTG +>449|TRAV14D-1 ENSMUST00000181038|TRAV14D-1|5'UTR|TR|TRA|None|00 +GTGGGAGACAAAAGGTCACCTGAGTTCCCTTCAAGCTTCAGTCTAGGAGGA +>450|TRAV14D-1 ENSMUST00000181038|TRAV14D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCAACGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCACTCCTGATATCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>451|TRAV14D-2 ENSMUST00000196802|TRAV14D-2|5'UTR|TR|TRA|None|00 +GGAGCCTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGGCCACCTGAGTTCCCCCAAGCTTCAGTCTAGGAGGA +>452|TRAV14D-2 ENSMUST00000196802|TRAV14D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACTGGCAGTTCCCTAGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>453|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|5'UTR|TR|TRA|None|00 +CTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGACCACAGAGTTTCTCCCAAGCTTCAGTCTAGGAGGA +>454|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTTCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGTCCCGCTCTCCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATTGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>455|TRAV14N-3 ENSMUST00000103652|TRAV14N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATTGTTTTTACTTCTAGGTCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTTCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAATCTCTCCTTGCACATCAAAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>456|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|5'UTR|TR|TRA|None|00 +GCTGAGGCAGAGCAGACACACTCATGCAGAGGACAGTGTGTCAC +>457|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCCAGAAAGTGATTCAGGTCTGGTCAACAACAAGCAGGCAGGAGGGCGAAAAACTCACACTGGACTGTTCATATAAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTGCTTATTCGACAAATGCCTTCTACTATTGCAATAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACGCAAATCCATCAGCCTTGTCATTTCAACCTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>458|TRAV15-2-DV6-2 ENSMUST00000103660|TRAV15-2-DV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGGACATGTGTCACATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGTCAACAGGCAGCAGTCAGTGGGGAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTCCTACCTTATTCTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGATACTCAGAACCAGAGGAGCGGCCACTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>459|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|5'UTR|TR|TRA|None|00 +GCACTTAGACACTGATCTCTGAGCTGAGGCAGAGCAGACACACTC +>460|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGACAGTGTGTCACATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>461|TRAV15D-2-DV6D-2 ENSMUST00000199800|TRAV15D-2-DV6D-2|5'UTR|TR|TRA|None|00 +GAGCTGAGGCAGAGCAGACACACTCATGCAGAGGGACATGTGTCAC +>462|TRAV15D-2-DV6D-2 ENSMUST00000199800|TRAV15D-2-DV6D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGCCAACAGGCAGCAGTCAGTGGGGAGAAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTTCTACCGTATTTTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGACACTCAGAACCAGAGGAGCGGCCGCTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>463|TRAV15N-1 ENSMUST00000197433|TRAV15N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>464|TRAV16 ENSMUST00000103667|TRAV16|5'UTR|TR|TRA|None|00 +CACAAAGTATAGATTAAGATCTGGTTGAGAGAGGACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>465|TRAV16 ENSMUST00000103667|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGCTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGAAGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACTGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>466|TRAV16D-DV11 ENSMUST00000103606|TRAV16D-DV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCTCCATTTTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCAGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCGGCAGTATATTTCTGTGCTATGAGAGAGGG +>467|TRAV16N ENSMUST00000199280|TRAV16N|5'UTR|TR|TRA|None|00 +ATAGATTAAGATCTGGTTGAGAGAGAACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>468|TRAV16N ENSMUST00000199280|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>469|TRAV17 ENSMUST00000103672|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGTTCCCAGTGACCATTCTGCTGCTCAGCGCGTTCTTCTCACTGAGAGGAAACAGTGCCCAGTCCGTGGACCAGCCTGATGCTCATGTCACGCTCTCTGAAGGAGCCTCCCTGGAGCTCAGATGCAGTTATTCATACAGTGCAGCACCTTACCTCTTCTGGTACGTGCAGTATCCTGGCCAGAGCCTCCAGTTTCTCCTCAAATACATCACAGGAGACACCGTTGTTAAAGGCACCAAGGGCTTTGAGGCCGAGTTTAGGAAGAGTAACTCCTCTTTCAACCTGAAGAAATCCCCAGCCCATTGGAGCGACTCAGCCAAGTACTTCTGTGCACTGGAGGG +>470|TRAV18 ENSMUST00000103673|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGAAACTCTCTGTGTTGCTCCTTTGGAATCAAGTGGCCCGTGTGGCCACTCAACGGCTGGAGCAGAGTCCTCGGTTTCTGAGTATCCAGGAGGGGCAAGATTTCACTGCACGCTGCAGCTCCTCAACCACCTTCCCCCAACTTTACTGGTACCGACAGGTCCCCAGGGAAGGTCCTGTCATCCTGGTGACATTGGTCAAGAGTGGAGAGGTAAAGGAGCAGAGGAGGATGACTGCTAAGTTTGGTGAAGCAAGAAAGAACAGCTCCCTATTCATCGCCAGAGCTCAGCCTGGAGACGCAGGCATCTACTTCTGTACAGGAA +>471|TRAV19 ENSMUST00000103674|TRAV19|5'UTR|TR|TRA|None|00 +AAAGGGAATAAAGTCAGGACAGGAAGATGAAATCTGAGTTGCAGTTCCCTGAGTAGAAGGAGAGACAACTCAAAGCTTCAGAGAAGAC +>472|TRAV19 ENSMUST00000103674|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGACTGGCTTCCTGAAGGCCTTGCTGTTGGTTCTGTGCCTGCGGCCAGAATGGGTAAAGAGTCAACAGAAGACTAGTGGCCAGCAAGTTAAACAAAGCTCTCCATCGCTGACTGTTCAAGAGGGAGGGATATCGATCCTGAATTGTGACTACGAGAATGATATGTTTGACTATTTTGCCTGGTACAAAAAATACCCTGACAACAGCCCCACACTCCTGATATCCGTACGCTCAAATGTGGATAAGAGGGAAGACGGAAGACTCACAGTTTTCTTGAACAAAAGCGGCAAACACTTCTCACTGCACATCACAGCCTCCCAGCCTGAAGACACAGCAGTGTACCTCTGCGCAGCAGGTG +>473|TRAV2 ENSMUST00000196939|TRAV2|5'UTR|TR|TRA|None|00 +CAGTGGCTTCTGAGTCTCCTCCTTGGTTCGTATTCTGGTCTAAGCTCAGATTCAGCAAAGAATCTGGAATCTGGGCCTGTGCTTACAAAGAGAAT +>474|TRAV2 ENSMUST00000196939|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCAGGTGGCAAAAGTGACTGTGCTCCTGATCTTGGTCTCATGGAGCCTTGCCAAGACCACCCAGCCCCCCTCCATGGAGGCCTATGAAGGGCAAGAAGTGAACGTGTCCTGCAGCCATACAAACATTGCTACAAGCGAGTACATCTACTGGTACCGACAGGTTCCCCACCAGGGACCACAGTTTATCATTCAAGGATATAAGGACTATGTGGTAAATGAAGTGGCATCTCTGTTTATCTCTGCTGACCGGAAGCTCAGCACTCTGAGCCTGCCCTGGGTTTCCCTGAGAGATGCTGCTGTGTATTACTGCATTGTGACTGACA +>475|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|5'UTR|TR|TRA|None|00 +ACAGATCTGAGCTCATCCATTTGCTCTTAACT +>476|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGATGTGTGAGTGGAATTGCCATTCTCCTGGCTTTGGGTATTGCGGGTGATGCTAAGACTACACAACCAGATTCAATGGAAAGTACTGAAGGAGAAACGGTGCACTTGCCTTGTAGCCACGCCACAATCAGTGGAAACGAGTACATCTATTGGTACCGACAGGTTCCTCTTCAGGGTCCAGAATATGTGACTCACGGTCTACAACAAAATACAACCAATAGTATGGCTTTCCTGGCTATTGCCTCTGACAGAAAGTCAAGCACCTTGATCCTGCCTCATGTCAGCCTGAGAGACGCGGCTGTGTACCACTGTATCCTGAGAGTAG +>477|TRAV23 ENSMUST00000199137|TRAV23|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGCACTGGCAATGATACTGAGGCTTCAGCTAGACTGGTTATGTGGAGAGAAGACAGTGCAGCAAACCCCTCCGTTTCTCGGCTCCTGGGAAGGAAGAAACAGCACTATCCTCTGCAGTTATTCAAGATCCGCTACAGACAGCCTGCTCTGGTATAGACAAGATCTGGGGGAAAGCCTGGAGTTTCTGTTTGCATTGCTGTCAAATGGAGCAGTGAAGAGAGATAGAAGATTAACAGCCTCACTTGATCAGAAAGCTCGCCTCAGCGCCCTGCACTTCTCCCCTGCACTTCTCCGGACTCCAGCACAGCCACTCTGCCATCTACTTCTGTGCCCTGGGCA +>478|TRAV3-1 ENSMUST00000103569|TRAV3-1|5'UTR|TR|TRA|None|00 +GGCATCTTGTCTGGCTGAAGGCCACAGTCCAGAGGGAGAGCA +>479|TRAV3-1 ENSMUST00000103569|TRAV3-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTGCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCATTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTCCTGGTACAAGCAAGAGGCGGGGGCAGGTCTTCAGTTGCTTATGAGTGTCCTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>480|TRAV3-3 ENSMUST00000181768|TRAV3-3|5'UTR|TR|TRA|None|00 +GAAGATGCCTCAGTGCTGTGGAGGTGATCACAGAGGCATCTTGTCTGGCTGAAGGTCAGAGTCTGGAGGGAGAGCA +>481|TRAV3-3 ENSMUST00000181768|TRAV3-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCACCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAAGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGCGTACTTCTGCGCAGTCAGTG +>482|TRAV3-4 ENSMUST00000103670|TRAV3-4|5'UTR|TR|TRA|None|00 +CAGTAGCCTTCTGTGCAGACAGGTGAAGTAGCCTCAGTGCTGTGGAGAACAGAGGAGGTGAGCTGATCACAGAGGCATCTTGTCTGGCTGAAGGCCAGAGTCTGGAGGGAGAGCA +>483|TRAV3-4 ENSMUST00000103670|TRAV3-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACAGTGGCTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGTTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCTTTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTACTGGTACAAGCAAGAGCCAGGGGCAGGTCTTCAGTTGCTTATGAGTGTCTTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCTGTGTACTTCTGCGCAGTCAGTG +>484|TRAV3D-3 ENSMUST00000196023|TRAV3D-3|5'UTR|TR|TRA|None|00 +ACACAGCTGAAGATGCCTCCGTGTTGTGGAGGTGATCACAGAGGCATCCTGTCTGGCTAAAGGTCAGAGTCTGGAGGGAGCGCA +>485|TRAV3D-3 ENSMUST00000196023|TRAV3D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCATCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAGGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACAACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>486|TRAV4-2 ENSMUST00000103637|TRAV4-2|5'UTR|TR|TRA|None|00 +CCCTGCTGACTGTTGGAAATCAGCAGCTTGACAGGGTCA +>487|TRAV4-2 ENSMUST00000103637|TRAV4-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAGCCCGGGAACTGTGCTGGGGCTGCTGTTGGTGCCGCTATGCTGGGTAAGAGGAATGCCGGTGGAACAGAATCCTCCAGCCCTGAGTCTTTATGAAGGAGCTGAGTCTGGTCTGAGATGCAATTTTTCTACCACCATGAAAGGTGTCCAGTGGTTTCAACAAAATCACAGAGGCAGACTTATCACTCTGTTTTACCTGGCTCAAGGAACAAAGGAGAATGGAAGGTTAAAGTCAACATTCAATTCTAAGGAGCGCTACAGCACCCTGCACATCAAGGATGCACAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGTTGAGG +>488|TRAV4-3 ENSMUST00000103655|TRAV4-3|5'UTR|TR|TRA|None|00 +AGTCTGTAAGCACAAGTGTGTCTGGGCATAAGACACCCTTCAGAGCTGGAGAGAAGACAACCAGCGATTGGACAGGGGCC +>489|TRAV4-3 ENSMUST00000103655|TRAV4-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAACAAAGTCCCTCAGCGCTGAGTCTCCAAGAAGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCCGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATCAATCTTTTTTACCTGGTTCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTCGATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>490|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|5'UTR|TR|TRA|None|00 +GAGAAGACAACCAGCGATTGGACAGGGGCC +>491|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGGCTGTGCAGTGGTTCCAACAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAACATTCAATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>492|TRAV4D-3 ENSMUST00000103592|TRAV4D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAGCAAAGTCCCTCAGCGCTGAGTCTCCAAGAGGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCTGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATGAATCTTTTTTACCTGGTGCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTTGATTCTAAGGAGAGCTACAGCACCCTGCACATTAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>493|TRAV4D-4 ENSMUST00000103600|TRAV4D-4|5'UTR|TR|TRA|None|00 +ATCCCAGCGATTGGACAGGGGCC +>494|TRAV4D-4 ENSMUST00000103600|TRAV4D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACTACCACCATGAGGGCTGTGCAGTGGTTCCGAAAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>495|TRAV5-1 ENSMUST00000103570|TRAV5-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGCTATTCATGCTTTATTTATTTTCTTCTGGCTACAGATGGACTGGAAGAGCCAAGGTGAGCAGGTGGAACAGCTCCCTTCCTCCCTGATTGTCCAGGAGGGAGCCAGTGTTCTGATCAACTGCTCCTACACAGACAGTGCCTCTGTCTACTTCCCTTGGTATAAGCAAGAGCCTGGGAAGCGTCTTCAGTTCATCATAGACATCCGTTCAAATATGGAAAGAAAGCAGACTCAAAGACTCACCCTTTTATTTGATAAGAAAACCAAACACCTTTCCCTGCACATTACAGCCACTCAGCCTGGAGACTCAGCCATCTACTTCTGCTCAGCAAGTA +>496|TRAV5-4 ENSMUST00000103664|TRAV5-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGCGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCAGTTATGAAGACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGATCCAAGAACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>497|TRAV5D-4 ENSMUST00000179701|TRAV5D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGTGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCACTTATGAGAACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGACCCAAGGACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>498|TRAV6-1 ENSMUST00000103571|TRAV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGCTTTAGTGACTGTGATGCTGTTTGTGTTTGGGAGGACCCATGGAGACTCAGTAACCCAGATGCAAGGTCAAGTGACCCTCTCAGAAGACGACTTCCTATTTATAAACTGTACTTATTCAACCACATGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAACAAGGGAATCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACAACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCTGCTGTGTACTACTGTGTTCTGGGTGA +>499|TRAV6-2 ENSMUST00000198058|TRAV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACACTTCTCCAGCTTTAGTGACTGTGATGCTGCTGTTCATGCTTGAGAGGACACATGGAAATTCAGTGACCCAGATGCAAGGTCAAGTGACCCTTTCAGAAGAGGAGTTTCTATTTATAAACTGTACCTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAATAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>500|TRAV6-3 ENSMUST00000180549|TRAV6-3|5'UTR|TR|TRA|None|00 +ATCATTTCTTCATGTGAAGAGTTGAGAGCATCACTCTGGTGACACTGAAG +>501|TRAV6-3 ENSMUST00000180549|TRAV6-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGAGA +>502|TRAV6-4 ENSMUST00000180711|TRAV6-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCAGCACTCTACACTGAAC +>503|TRAV6-4 ENSMUST00000180711|TRAV6-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTAACTGTGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACATACCCAACTCTTTTGTGGTATGTCCAATATCTTGGACAAGGTCCACAGCTCCTTCTGAAAGTGACAACTGCCAACAATAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>504|TRAV6-5 ENSMUST00000181210|TRAV6-5|5'UTR|TR|TRA|None|00 +AAAATATTTGTATTCACACACTCCAGTGGCTCAGAAA +>505|TRAV6-5 ENSMUST00000181210|TRAV6-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>506|TRAV6-6 ENSMUST00000103584|TRAV6-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTTGGAAGGACCCACGGAGATTCCGTGACTCAAACAGAAGGCCCAGTGACCGTCTCAGAAAGCGAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGCTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>507|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|5'UTR|TR|TRA|None|00 +AC +>508|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTAAGAATCATGAACACTGTCGAGATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGGCCACAGCTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCTTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>509|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|5'UTR|TR|TRA|None|00 +ACACTGAAG +>510|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGTGA +>511|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCATCACTCTACACTGAAC +>512|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTGACTGCGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACGTACCCAACTCTTTTCTGGTATGTCCAATATCCTGGACAAGGTCCACAGCTCCTTCTGAAAGTCACAACTGCCAACAACAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACCTCCTTCCACTTACAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>513|TRAV6D-5 ENSMUST00000180687|TRAV6D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGGATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCGGTGACTCAGACAAAAGGTCCAGTGACATTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACGTATGATAAAGGGACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>514|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|5'UTR|TR|TRA|None|00 +CTGTCGAGATGGGTCTAAAG +>515|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>516|TRAV6N-5 ENSMUST00000103611|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>517|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|5'UTR|TR|TRA|None|00 +ACTTTCTAGATGACACTAAAG +>518|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTGGGAAGGACCCATGGAGATTCCGTGACTCAAACAGAAGGCCAAGTGACTGTCTCAGAAAGCAAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGGTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGCGCTCTGAGTGA +>519|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|5'UTR|TR|TRA|None|00 +CTGTCGAG +>520|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>521|TRAV7-1 ENSMUST00000198019|TRAV7-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTCCTTGTGTGTTTCACTAGTGGTCCTGTGGCTTCAGCTACACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTAATTCTCAGTATTTCTGGTGGTACAGACAGCATTCTGGGGAAGGCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGACAAGAAGGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTATCCCTGCACATCAAAGACTCCCAACCCAGTGACTCTGCTCTCTACTTCTGTGCAGTGAGCA +>522|TRAV7-2 ENSMUST00000103636|TRAV7-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGC +>523|TRAV7-3 ENSMUST00000177622|TRAV7-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAACTTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAGGAAGAGAGA +>524|TRAV7-3 ENSMUST00000177622|TRAV7-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>525|TRAV7-4 ENSMUST00000181728|TRAV7-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>526|TRAV7-4 ENSMUST00000181728|TRAV7-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCAATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>527|TRAV7-5 ENSMUST00000200609|TRAV7-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGCAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACGTTCAGTGATGGTACTTCTAACAACTTCAGGTGGTACAGACAGCATTCTGCGAAAGGCCTTGAGGTGCTAGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGATTTACAGCTCACCTCAATAGAGCCAACTTGCATGTTTCCCTACACATCAGAGAACCACAACCCAGTGACTCTGCTGTCTACCTCTGTGCAGTGAGCA +>528|TRAV7-6 ENSMUST00000103641|TRAV7-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>529|TRAV7-6 ENSMUST00000103641|TRAV7-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGGTCTCCCTCAACTGCAGTTTCAGCGACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCAAAGCACTAATATCCATCTTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAAAGACTCCCAGCCCAGTGACTCCGCTGTCTACCTCTGTGCAGTGAGCA +>530|TRAV7D-2 ENSMUST00000200127|TRAV7D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGCA +>531|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAAATTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAAGAAGAGAGA +>532|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCGCTACACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>533|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>534|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTTACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>535|TRAV7D-5 ENSMUST00000197128|TRAV7D-5|5'UTR|TR|TRA|None|00 +ATG +>536|TRAV7D-5 ENSMUST00000197128|TRAV7D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGAAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTTCTTCTGACAACTTCAGGTGGTACAGACAGCATTCTGGGAAAGGCCTTGAGGTGCTGGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGTTTTACAGCTCACCTCAATAGAGCCAGCCTGCATGTTTTCCTACACATCAGAGAGCCGCAACCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>537|TRAV7N-4 ENSMUST00000103609|TRAV7N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAAGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTATTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAAGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGTTAGTGAGCA +>538|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>539|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGTCCTCCCTCAACTGCACTTTCAGCAACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCGAAGCACTAATATCCATATTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCCGTCTACCTCTGTGCAGTGAGCA +>540|TRAV8-1 ENSMUST00000103643|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGTTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATTCGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>541|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|5'UTR|TR|TRA|None|00 +AAACCAACCACCTTGAACAGGCCTGGAGCTGTATCTCTTGCGATCTGATCTTCATAGGGAAGA +>542|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGATGGTGTCACTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATCTGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCGAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>543|TRAV8D-2 ENSMUST00000198439|TRAV8D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCGAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTATACAACTGTTGTACACTGGTACAGGCAAGACTCAGGCAGAGGCCCTGCCCTGATAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTAAGAGCCACCCTTGACACCTCCAGCCAAAGTAGCTCTCTGTCCATCACTGCTGCTCAGTGTGAAGACACTGCTGTGTACTTCTGTGCTACAGATG +>544|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|5'UTR|TR|TRA|None|00 +CTGTCCTAGGAACCAGGTTCCACTTCAGGGTGCAGCACAGCCTTTCCTGTGACATCAATAAAGCAAGAAAA +>545|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCAAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTACACAACTGTTGTTCAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTCAGAGCCACCCTTGACACTTCCAGCCAGAGCAGCTCCCTGTCCATCACTGGTACTCTAGCTACAGACACTGCTGTGTACTTCTGTGCTACTGATG +>546|TRAV9-1 ENSMUST00000103581|TRAV9-1|5'UTR|TR|TRA|None|00 +TCTTTCCTGCACGAGCCAGGTTTTTCCAGAAAGGCACCAGAGCTGTTTCCAGTGTGCAGCC +>547|TRAV9-1 ENSMUST00000103581|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCATGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCGAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>548|TRAV9-2 ENSMUST00000103654|TRAV9-2|5'UTR|TR|TRA|None|00 +TTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCCTACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCTTTTCCAAGGCTCAGCC +>549|TRAV9-2 ENSMUST00000103654|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCTGCTGTGTACTTCTGTGTTTTGAGCG +>550|TRAV9-4 ENSMUST00000103662|TRAV9-4|5'UTR|TR|TRA|None|00 +TGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>551|TRAV9-4 ENSMUST00000103662|TRAV9-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCACTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACGCCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCATCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>552|TRAV9D-1 ENSMUST00000178426|TRAV9D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCGTGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCAAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>553|TRAV9D-2 ENSMUST00000199746|TRAV9D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTCCTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGTTCTGAGCG +>554|TRAV9D-3 ENSMUST00000178252|TRAV9D-3|5'UTR|TR|TRA|None|00 +ATCTCATCCCTCTTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGTTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCTGCTTTCCTGCCTGTCCTGTTCCAGAGTTTCTCCACAACAGAGCTGCAGCCTTCTCAAGGCTCAGTC +>555|TRAV9D-3 ENSMUST00000178252|TRAV9D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTCTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTTTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATCCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTGGGCTGTGTACTTCTGTGCTGTGAGCA +>556|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>557|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>558|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>559|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAACAGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>560|TRBC1 ENSMUST00000192856|TRBC1|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGCAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGGATTACCTCAGCATCCTATCAACAAGGGGTCTTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAAGCCACCCTGTATGCTGTGCTTGTCAGTACACTGGTGGTGATGGCTATGGTCAAAAGAAAGAATTCA +>561|TRBC2 ENSMUST00000103299|TRBC2|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGAAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGAATCACTTCAGCATCCTATCATCAGGGGGTTCTGTCTGCAACCATCCTCTATGAGATCCTACTGGGGAAGGCCACCCTATATGCTGTGCTGGTCAGTGGCCTGGTGCTGATGGCCATGGTCAAGAAAAAAAATTCC +>562|TRBD1 ENSMUST00000178537|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>563|TRBD2 ENSMUST00000178862|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTGGGGGGGC +>564|TRBJ1-1 ENSMUST00000103284|TRBJ1-1|J-REGION|TR|TRB|None|00 +CAAACACAGAAGTCTTCTTTGGTAAAGGAACCAGACTCACAGTTGTAG +>565|TRBJ1-2 ENSMUST00000103285|TRBJ1-2|J-REGION|TR|TRB|None|00 +CAAACTCCGACTACACCTTCGGCTCAGGGACCAGGCTTTTGGTAATAG +>566|TRBJ1-3 ENSMUST00000192366|TRBJ1-3|J-REGION|TR|TRB|None|00 +TTCTGGAAATACGCTCTATTTTGGAGAAGGAAGCCGGCTCATTGTTGTAG +>567|TRBJ1-4 ENSMUST00000103287|TRBJ1-4|J-REGION|TR|TRB|None|00 +TTTCCAACGAAAGATTATTTTTCGGTCATGGAACCAAGCTGTCTGTCCTGG +>568|TRBJ1-5 ENSMUST00000103288|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAACAACCAGGCTCCGCTTTTTGGAGAGGGGACTCGACTCTCTGTTCTAG +>569|TRBJ1-6 ENSMUST00000103289|TRBJ1-6|J-REGION|TR|TRB|None|00 +TTCCTATAATTCGCCCCTCTACTTTGCGGCAGGCACCCGGCTCACTGTGACAG +>570|TRBJ1-7 ENSMUST00000193061|TRBJ1-7|J-REGION|TR|TRB|None|00 +CCTGTGTTGGATGACCATGGTCTTGGAAAGGAACTTAGGTATAAGA +>571|TRBJ2-1 ENSMUST00000103293|TRBJ2-1|J-REGION|TR|TRB|None|00 +TAACTATGCTGAGCAGTTCTTCGGACCAGGGACACGACTCACCGTCCTAG +>572|TRBJ2-2 ENSMUST00000103294|TRBJ2-2|J-REGION|TR|TRB|None|00 +CAAACACCGGGCAGCTCTACTTTGGTGAAGGCTCAAAGCTGACAGTGCTGG +>573|TRBJ2-3 ENSMUST00000103295|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGTGCAGAAACGCTGTATTTTGGCTCAGGAACCAGACTGACTGTTCTCG +>574|TRBJ2-4 ENSMUST00000103296|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGTCAAAACACCTTGTACTTTGGTGCGGGCACCCGACTATCGGTGCTAG +>575|TRBJ2-5 ENSMUST00000103297|TRBJ2-5|J-REGION|TR|TRB|None|00 +AACCAAGACACCCAGTACTTTGGGCCAGGCACTCGGCTCCTCGTGTTAG +>576|TRBJ2-7 ENSMUST00000103298|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTATGAACAGTACTTCGGTCCCGGCACCAGGCTCACGGTTTTAG +>577|TRBV1 ENSMUST00000103262|TRBV1|5'UTR|TR|TRB|None|00 +GGATTCTCTTCTCTTGCCTGATGCCCTGCATGCCCCACAGAGATAGAGAGAACCTGAGGTCTCAGAG +>578|TRBV1 ENSMUST00000103262|TRBV1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGCAGTTTTGCATTCTGTGCCTCTGTGTACTCATGGCTTCTGTGGCTACAGACCCCACAGTGACTTTGCTGGAGCAAAACCCAAGGTGGCGTCTGGTACCACGTGGTCAAGCTGTGAACCTACGCTGCATCTTGAAGAATTCCCAGTATCCCTGGATGAGCTGGTATCAGCAGGATCTCCAAAAGCAACTACAGTGGCTGTTCACTCTGCGGAGTCCTGGGGACAAAGAGGTCAAATCTCTTCCCGGTGCTGATTACCTGGCCACACGGGTCACTGATACGGAGCTGAGGCTGCAAGTGGCCAACATGAGCCAGGGCAGAACCTTGTACTGCACCTGCAGTGCAGA +>579|TRBV10 ENSMUST00000103265|TRBV10|5'UTR|TR|TRB|None|00 +TCTGATAGCTGCAGTAGGTAGGGCTTATTTGCCCTGCCTTGACCCAACT +>580|TRBV10 ENSMUST00000103265|TRBV10|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGTAGGCTCCTAAGCTGTGTGGCCTTCTGCCTCTTGGGAATAGGCCCTTTGGAGACGGCTGTTTTCCAGACTCCAAACTATCATGTCACACAGGTGGGAAATGAAGTGTCTTTCAATTGTAAGCAAACTCTGGGCCACGATACTATGTATTGGTACAAGCAAGACTCTAAGAAATTGCTGAAGATTATGTTTAGCTACAATAATAAGCAACTCATTGTAAACGAAACAGTTCCAAGGCGCTTCTCACCTCAGTCTTCAGATAAAGCTCATTTGAATCTTCGAATCAAGTCTGTAGAGCCGGAGGACTCTGCTGTGTATCTCTGTGCCAGCAGCTAAGA +>581|TRBV12-1 ENSMUST00000103267|TRBV12-1|5'UTR|TR|TRB|None|00 +GCATCCTGAGAAGAAGC +>582|TRBV12-1 ENSMUST00000103267|TRBV12-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGTCCTCGCTGATTCTGCCTGGGGCATCACCCTGCTATCTTGGGTTACTGTCTTTCTCTTGGGAACAAGTTCAGCAGATTCTGGGGTTGTCCAGTCTCCAAGACACATAATCAAAGAAAAGGGAGGAAGGTCCGTTCTGACGTGTATTCCCATCTCTGGACATAGCAATGTGGTCTGGTACCAGCAGACTCTGGGGAAGGAATTAAAGTTCCTTATTCAGCATTATGAAAAGGTGGAGAGAGACAAAGGATTCCTACCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAAATGAACATGAGTGCCTTGGAACTGGAGGACTCTGCTATGTACTTCTGTGCCAGCTCTCTC +>583|TRBV12-2 ENSMUST00000103269|TRBV12-2|5'UTR|TR|TRB|None|00 +CCTGAGAGGAAGC +>584|TRBV12-2 ENSMUST00000103269|TRBV12-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAGTTCAGCAAATTCTGGGGTTGTCCAGTCTCCAAGATACATAATCAAAGGAAAGGGAGAAAGGTCCATTCTAAAATGTATTCCCATCTCTGGACATCTCTCTGTGGCCTGGTATCAACAGACTCAGGGGCAGGAACTAAAGTTCTTCATTCAGCATTATGATAAAATGGAGAGAGATAAAGGAAACCTGCCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAGATGAACATGAGTGCCTTGGAGCTAGAGGACTCTGCCGTGTACTTCTGTGCCAGCTCTCTC +>585|TRBV13-1 ENSMUST00000194399|TRBV13-1|5'UTR|TR|TRB|None|00 +AACATACAAGAGCCTGACTTGGTCGCGAG +>586|TRBV13-1 ENSMUST00000194399|TRBV13-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTTCTGGTCTTGAGCCTCCTGTGTACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCTAGAAACAAGGTGACAGTAACAGGAGGAAACGTGACATTGAGCTGTCGCCAGACTAATAGCCACAACTACATGTACTGGTATCGGCAGGACACTGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGCTGGCAACCTTCAAATAGGAGATGTCCCTGATGGGTACAAGGCCACCAGAACAACGCAAGAAGACTTCTTCCTCCTGCTGGAATTGGCTTCTCCCTCTCAGACATCTTTGTACTTCTGTGCCAGCAGTGATG +>587|TRBV13-2 ENSMUST00000103270|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>588|TRBV13-3 ENSMUST00000103271|TRBV13-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGACTCTTCTTTGTGGTTTTGATTCTCCTGTGTGCAAAACACATGGAGGCTGCAGTCACCCAAAGTCCAAGAAGCAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTCACCAGACTAATAACCATGACTATATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTACTCATATGTCGCTGACAGCACGGAGAAAGGAGATATCCCTGATGGGTACAAGGCCTCCAGACCAAGCCAAGAGAATTTCTCTCTCATTCTGGAGTTGGCTTCCCTTTCTCAGACAGCTGTATATTTCTGTGCCAGCAGTGATG +>589|TRBV14 ENSMUST00000103272|TRBV14|5'UTR|TR|TRB|None|00 +CCTCCTCTGCCCTCAATCTGCC +>590|TRBV14 ENSMUST00000103272|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTTCTTGGCTGGGCAGTGTTCTGTCTCCTTGACACAGTACTGTCTGAAGCTGGAGTCACCCAGTCTCCCAGATATGCAGTCCTACAGGAAGGGCAAGCTGTTTCCTTTTGGTGTGACCCTATTTCTGGACATGATACCCTTTACTGGTATCAGCAGCCCAGAGACCAGGGGCCCCAGCTTCTAGTTTACTTTCGGGATGAGGCTGTTATAGATAATTCACAGTTGCCCTCGGATCGATTTTCTGCTGTGAGGCCTAAAGGAACTAACTCCACTCTCAAGATCCAGTCTGCAAAGCAGGGCGACACAGCCACCTATCTCTGTGCCAGCAGTTTCT +>591|TRBV15 ENSMUST00000103273|TRBV15|5'UTR|TR|TRB|None|00 +GTCACATCAGTGCTCATCCCACT +>592|TRBV15 ENSMUST00000103273|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCATCCAGACCCTCTGTTGTGTGATCTTTTATGTTCTGATAGCAAATCACACAGATGCTGGAGTTACCCAGACACCCAGACATGAGGTGGCAGAGAAAGGACAAACAATAATCCTGAAGTGTGAGCCAGTTTCAGGCCACAATGACCTTTTCTGGTACAGACAGACCAAGATACAGGGACTAGAGTTGCTGAGCTACTTCCGCAGCAAGTCTCTTATGGAAGATGGTGGGGCTTTCAAGGATCGATTCAAAGCTGAGATGCTAAATTCATCCTTCTCCACTCTGAAGATTCAACCTACAGAACCCAAGGACTCAGCTGTGTATCTGTGTGCCAGCAGTTTAGC +>593|TRBV16 ENSMUST00000103274|TRBV16|5'UTR|TR|TRB|None|00 +TCTCGTGCTTACGTGGAGTTTCTATGAGTGAAGCCACTGCCTCATCTTGCC +>594|TRBV16 ENSMUST00000103274|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCCCCAGGCTCCTTTTCTGTCTGGTTCTTTGCTTCTTGAGAGCAGAACCAACAAATGCTGGTGTCATCCAAACACCTAGGCACAAGGTGACAGGGAAGGGACAAGAAGCAACTCTGTGGTGTGAGCCAATTTCAGGACATAGTGCTGTTTTCTGGTACAGACAGACCATTGTGCAGGGCCTGGAGTTCCTGACTTACTTTCGAAATCAAGCTCCTATAGATGATTCAGGGATGCCCAAGGAACGATTCTCAGCTCAGATGCCCAATCAGTCGCACTCAACTCTGAAGATCCAGAGCACGCAACCCCAGGACTCAGCGGTGTATCTTTGTGCAAGCAGCTTAGA +>595|TRBV17 ENSMUST00000103275|TRBV17|5'UTR|TR|TRB|None|00 +CAAATATTCCTTTCCTGTTCTGGACCATCC +>596|TRBV17 ENSMUST00000103275|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATCCTAGACTTCTTTGCTGTGTGATCTTCTGTCTTCTTGCAGCCACTTTTGTGGATACTACGGTTAAGCAGAACCCAAGATACAAGCTTGCAAGAGTTGGAAAACCAGTGAATTTGATCTGTTCTCAGACTATGAATCATGATACCATGTACTGGTACCAAAAGAAGCCAAACCAAGCACCAAAGCTTCTTCTTTTCTACTATGATAAGATTTTGAACAGGGAAGCTGACACTTTTGAGAAGTTCCAATCCAGTCGGCCTAACAATTCTTTCTGCTCTCTCTACATTGGCTCTGCAGGCCTAGAGTATTCTGCCATGTACCTCTGTGCTAGCAGTAGAGA +>597|TRBV19 ENSMUST00000103276|TRBV19|5'UTR|TR|TRB|None|00 +CCCCTCTTCTCAGAACTGGTGCAGATGCTTGGAGCCAGTGTCTGGCTCTCTGGTCTCCCTCTCCTTCTGCCACACCAGGAAGCTCCTTTTGAACATCTCAAGAGTCTTCCTACCATTCTAGTCATCATAGTTAGCCAGGTGGAGCCCCTGCATAGCGCGTCTCCTTGTTTCTCTTTTAACTAATGCCCAGAGCCAAAGAAAGTCCCTCCAAACT +>598|TRBV19 ENSMUST00000103276|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAACAAGTGGGTTTTCTGCTGGGTAACCCTTTGTCTCCTTACTGTAGAGACCACACATGGTGATGGTGGCATCATTACTCAGACACCCAAATTCCTGATTGGTCAGGAAGGGCAAAAACTGACCTTGAAATGTCAACAGAATTTCAATCATGATACAATGTACTGGTACCGACAGGATTCAGGGAAAGGATTGAGACTGATCTACTATTCAATAACTGAAAACGATCTTCAAAAAGGCGATCTATCTGAAGGCTATGATGCGTCTCGAGAGAAGAAGTCATCTTTTTCTCTCACTGTGACATCTGCCCAGAAGAACGAGATGGCCGTTTTTCTCTGTGCCAGCAGTATAG +>599|TRBV2 ENSMUST00000103263|TRBV2|5'UTR|TR|TRB|None|00 +GCACAAGAAACTGTCTGAGGAGACCCAAGAGGTAGCTGGGTATGGTCTAGGTCTGGGAGCCTATGCCCTGACAAGCATGAAGGGCAAAGAGGAAGTGTGAGCTGAAACCATCTACACAACAGGGAGCATCCAAGCAAAGCATTTTACAGGTCAGCAAAAGGCACCCAGACAGCCAGGATCCAAAGAGAAAGAGATCCTATCCTGTGTGACACTGCT +>600|TRBV2 ENSMUST00000103263|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCATTTTCCTCAGTTGCCTGGCCGTTTGTCTCCTGGTGGCAGGTCCAGTCGACCCGAAAATTATCCAGAAACCAAAATATCTGGTGGCAGTCACAGGGAGCGAAAAAATCCTGATATGCGAACAGTATCTAGGCCACAATGCTATGTATTGGTATAGACAAAGTGCTAAGAAGCCTCTAGAGTTCATGTTTTCCTACAGCTATCAAAAACTTATGGACAATCAGACTGCCTCAAGTCGCTTCCAACCTCAAAGTTCAAAGAAAAACCATTTAGACCTTCAGATCACAGCTCTAAAGCCTGATGACTCGGCCACATACTTCTGTGCCAGCAGCCAAGA +>601|TRBV20 ENSMUST00000103277|TRBV20|L-REGION+V-REGION|TR|TRB|None|00 +ATGTTACTGCTTCTATTACTTCTGGGGCCTGGCTGTGGGCTTGGAGCACTCGTCTATCAATATCCCAGAAGAACCATCTGTAAGAGTGGAACTTCCATGAGGATGGAGTGTCAAGCTGTGGGTTTTCAGGCAACTTCTGTAGCTTGGTATCGTCAATCGCCTCAAAAGACATTTGAACTGATAGCACTTTCTACTGTGAACTCAGCAATCAAATATGAACAAAATTTTACCCAGGAAAAATTTCCCATCAGTCATCCCAACTTATCCTTTTCATCTATGACAGTTTTAAATGCATATCTTGAAGACAGAGGCTTATATCTCTGTGGTGCTAGGGA +>602|TRBV21 ENSMUST00000195087|TRBV21|5'UTR|TR|TRB|None|00 +AGACAGCTAGCTGATCAGCACTCTCTATGAATCAACCATGCACTGCAAACTTTTCTACTGTGTGCCCTTTTATTCTGGACATCAAGCTCC +>604|TRBV23 ENSMUST00000193997|TRBV23|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTGCACGGCTCATTTGCTATGTAGCACTTTGCCTCCTGGGGGCAGGCTCTTTTGATGCTGCAGTTACACAGAAGCCAAGATATTTGATCAAAATGAAAGGCCAGGAAGCAGAGATGAAATGTATCCCTGAAAAGGGGCACACTGCTGTTTTCTGGTATCAACAAAAGCAGAGCAAAGAATTAAAGTTCCTGATTTACTTTCAGAATCAACAGCCTCTTGATCAAATAGACATGGTCAAGGAGAGATTCTCAGCTGTGTGCCCCTCCAGCTCACTCTGCAGCCTGGGAATCAGAACGTGCGAAGCAGAAGACTCAGCACTGTACTTGTGCTCCAGCAGTCAATC +>605|TRBV26 ENSMUST00000193064|TRBV26|5'UTR|TR|TRB|None|00 +TTTCGTACTTCTAAGCCACC +>606|TRBV26 ENSMUST00000193064|TRBV26|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCTACAAGGCTCCTCTGTTACACAGTACTTTGTCTCCTGGGTGCAAGAATTTTGAATTCAAAAGTCATTCAGACTCCAAGATATCTGGTGAAAGGGCAAGGACAAAAAGCAAAGATGAGGTGTATCCCTGAAAAGGGACATCCAGTTGTATTCTGGTATCAACAAAATAAGAACAATGAGTTTAAATTTTTGATTAACTTTCAGAATCAAGAAGTTCTTCAGCAAATAGACATGACTGAAAAACGATTCTCTGCTGAGTGTCCTTCAAACTCACCTTGCAGCCTAGAAATTCAGTCCTCTGAGGCAGGAGACTCAGCACTGTACCTCTGTGCCAGCAGTCTGTC +>607|TRBV29 ENSMUST00000103281|TRBV29|5'UTR|TR|TRB|None|00 +AAAACCACC +>608|TRBV29 ENSMUST00000103281|TRBV29|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAGTTAGGCTCATCTCTGCTGTGGTGCTGTGTTTCCTAGGAACAGGCCTTGTGGACATGAAAGTAACCCAGATGCCAAGATACCTGATCAAAAGAATGGGAGAGAATGTTTTGCTGGAATGTGGACAGGACATGAGCCATGAAACAATGTACTGGTATCGACAAGACCCTGGTCTGGGGCTACAGCTGATTTATATCTCATACGATGTTGATAGTAACAGCGAAGGAGACATCCCTAAAGGATACAGGGTCTCACGGAAGAAGCGGGAGCATTTCTCCCTGATTCTGGATTCTGCTAAAACAAACCAGACATCTGTGTACTTCTGTGCTAGCAGTTTATC +>609|TRBV3 ENSMUST00000103264|TRBV3|5'UTR|TR|TRB|None|00 +GTCAGACCTTGCCTATGGGACCATAGGATGCTAGCATACCCCTCCTGTTTCTGATGTGCAGTCAGTCAAGCTAGGAGAAACTACATTCCTGCCGTGACCCTACT +>610|TRBV3 ENSMUST00000103264|TRBV3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTTCTAGGTTGGATAATTTTTAGTTTCTTGGAAGCAGGACACACAGGACCCAAAGTCTTACAGATCCCAAGTCATCAAATAATAGATATGGGGCAGATGGTGACCCTCAATTGTGACCCAGTTTCTAATCACCTATATTTTTATTGGTATAAACAGATTTTAGGACAGCAGATGGAGTTTCTGGTTAATTTCTACAATGGTAAAGTCATGGAGAAGTCTAAACTGTTTAAGGATCAGTTTTCAGTTGAAAGACCAGATGGTTCATATTTCACTCTGAAAATCCAACCCACAGCACTGGAGGACTCAGCTGTGTACTTCTGTGCCAGCAGCTTAGCCACA +>611|TRBV30 ENSMUST00000191646|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGACATTCCTGCTACTTCTTTGGAGCCAAGGTTCTGTATTCAGTGTCCTCCTCTACCAAAAGCCAAACAGGGACATCTGTCAAAGTGGCACTTCACTGAAAATCCAGTGTGTGGCTGACAGTCAAGTTGTTTCGATGTTTTGGTACCAACAGTTCCAGGAACAGAGCTTGATGCTCATGGCAACTGCAAATGAAGGCTCTGAAGCCACATACGAGAGTGGATTCACCAAGGACAAGTTTCCAATCAGCCGGCCAAACCTAACATTCTCAACGTTGACAGTGAACAATGCAAGGCCTGGAGACAGCAGTATCTATTTCTGTAGTTCTAGAGA +>612|TRBV31 ENSMUST00000193003|TRBV31|5'UTR|TR|TRB|None|00 +GGAGGGGCCTGTGCATCTCTGGCTTAGAAAAGGAAGTACAAGTGCAGAGTAGACAAGCCTAGACAAAGACCATCTTGAACT +>613|TRBV31 ENSMUST00000193003|TRBV31|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGTACTCTCTCCTTGCCTTTCTCCTGGGCATGTTCTTGGGTGTTAGTGCTCAGACTATCCATCAATGGCCAGTTGCCGAGATCAAGGCTGTGGGCAGCCCACTGTCTCTGGGGTGTACCATAAAGGGGAAATCAAGCCCTAACCTCTACTGGTACTGGCAGGCCACAGGAGGCACCCTCCAGCAACTCTTCTACTCTATTACTGTTGGCCAGGTAGAGTCGGTGGTGCAACTGAACCTCTCAGCTTCCAGGCCGAAGGACGACCAATTCATCCTAAGCACGGAGAAGCTGCTTCTCAGCCACTCTGGCTTCTACCTCTGTGCCTGGAGTCT +>614|TRBV5 ENSMUST00000103266|TRBV5|5'UTR|TR|TRB|None|00 +AATACCCGTCTGGAGCCTGATTCCACC +>615|TRBV5 ENSMUST00000103266|TRBV5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCTGCAGGCTTCTCCTCTATGTTTCCCTATGTCTTGTGGAAACAGCACTCATGAACACTAAAATTACTCAGTCACCAAGATATCTAATCCTGGGAAGAGCAAATAAGTCTTTGGAATGTGAGCAACATCTGGGACATAATGCTATGTACTGGTATAAACAGAGCGCTGAGAAGCCGCCAGAGCTCATGTTTCTCTACAATCTTAAACAGTTGATTCGAAATGAGACGGTGCCCAGTCGTTTTATACCTGAATGCCCAGACAGCTCCAAGCTACTTTTACATATATCTGCCGTGGATCCAGAAGACTCAGCTGTCTATTTTTGTGCCAGCAGCCAAGA +>616|TRDC ENSMUST00000196323|TRDC|C-REGION|TR|TRD|None|00 +AAAGCCAGCCTCCGGCCAAACCATCTGTTTTCATCATGAAAAATGGAACAAATGTTGCTTGTCTGGTGAAAGATTTCTACCCTAAAGAGGTGACTATAAGTCTCAGATCATCCAAGAAGATTGTGGAATTCGACCCTGCTATAGTCATCTCCCCCAGCGGGAAGTACAGTGCTGTCAAGCTTGGTCAGTATGGAGATTCGAATTCAGTGACATGTTCAGTTCAGCACAACAGTGAAACTGTGCACTCGACTGACTTTGAACCATATGCAAATTCTTTCAATAATGAAAAACTACCAGAACCTGAAAATGACACACAAATTTCAGAGCCTTGCTATGGCCCAAGAGTCACAGTTCACACTGAGAAGGTAAACATGATGTCCCTCACGGTGCTGGGCCTACGACTGCTGTTTGCCAAGACCATTGCCATCAATTTTCTCTTGACTGTTAAGTTATTCTTT +>617|TRDD1 ENSMUST00000196221|TRDD1|D-REGION|TR|TRD|None|00 +ATGGCATAT +>618|TRDD2 ENSMUST00000177564|TRDD2|D-REGION|TR|TRD|None|00 +ATCGGAGGGATACGAG +>619|TRDJ1 ENSMUST00000103682|TRDJ1|J-REGION|TR|TRD|None|00 +CTACCGACAAACTCGTCTTTGGACAAGGAACCCAAGTGACTGTGGAACCAA +>620|TRDJ2 ENSMUST00000103683|TRDJ2|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTTGGAACTGGCATAGAGCTCTTTGTGGAGCCCC +>621|TRDV1 ENSMUST00000103676|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGGGATGCGCCTTCAAGTGCTTGCTTGGCTATTGACATTTCAGGCTGCCTGGGTCAACACCCAAATGTTGCATCAGAGTCCTCAGTCTCTGACAATCCAAGAAGGAGATGAAGTCACCATGAGCTGCAATTTATCAACATCTTTATATGCCTTACTCTGGTATAGGCAGGGGGATGATGGCAGCCTCGTCTCCTTGGTGACATTACAGAAAGGAGGAGATGAGAAAAGTAAGGACAAAATAACCGCTAATCTGGATAAGAAAATGCAACAAAGTTCCCTGTGGATCCAAGCCTCCCAGCCCAGCCACTCAGGCACTTACCTCTGTGGAGGGAAAG +>622|TRDV2-1 ENSMUST00000197130|TRDV2-1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGCAGTCCTTAGCTCACTGTGGGCAGTTGTGATCACCACCTGTCTAGGAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAGTCGGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCACTCAGGGGGAGC +>623|TRDV2-2 ENSMUST00000103678|TRDV2-2|5'UTR|TR|TRD|None|00 +AGTGCTAGCGCAGCTGAGAGCAAGGACTGATCTGAAGCCGGCTTCTAGC +>624|TRDV2-2 ENSMUST00000103678|TRDV2-2|L-REGION+V-REGION|TR|TRD|None|00 +ATGGTACGGCCGTTCTTCCTGTGGGTGCTCTTCCTTTCCACTTCTCTTGAAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAATCAGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCTCTCATGGAGCGC +>625|TRDV4 ENSMUST00000103679|TRDV4|5'UTR|TR|TRD|None|00 +AGCAGATAAGGATTCTCACGGAGACAGAGACAGAGGTGAGGCTCAGCAGGGCAGCCCAGGAAAGCACCAGCCGATTACAAACTCATCCTCAGTGAAACT +>626|TRDV4 ENSMUST00000103679|TRDV4|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTTTGGAGATGTCCAGTCCTCTGCATATTCATCTTCAGTACAGGGACCTCTTTGGATGTATATTTGGAACCAGTTGCCAAAACTTTTACTGTTGTAGCTGGGGATCCTGCCTCCTTCTACTGCACTGTAACAGGAGGGGACATGAAGAATTATCATATGAGCTGGTATAAGAAGAATGGAACTAATGCTCTGTTTTTAGTATACAAGCTAAATAGCAATTCTACTGATGGTGGAAAGAGCAACCTCAAAGGGAAAATTAACATTTCAAAAAATCAGTTTATACTCGACATTCAGAAGGCAACAATGAAAGACGCTGGTACGTACTACTGTGGGTCAGATATC +>627|TRDV5 ENSMUST00000103685|TRDV5|5'UTR|TR|TRD|None|00 +CCCTCCTGTCCCCTCCCTAGACAAAGCAATAGGGATGGTTAAAGAGAGTCCAGCAGCCCTCCTCCACGCTGTGCCCCTGTACCGACTGGAAGG +>628|TRDV5 ENSMUST00000103685|TRDV5|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTGCCGCGACCCTTACCCTTCTGTTTGCCTACAAGGATGTGCTGTGCATCACGCTGACCCAGAGCTCCACTGACCAGACAGTGGCAAGCGGCACTGAAGTAACACTGCTCTGCACGTACAATGCGGATTCTCCAAACCCAGATTTATTTTGGTATCGCAAAAGGCCAGACAGATCCTTCCAGTTCATCCTTTATAGGGACGACACTAGTTCCCATGATGCAGATTTTGTTCAAGGTCGATTTTCTGTGAAGCACAGCAAGGCCAACAGAACCTTCCATCTGGTGATCTCTCCAGTGAGCCTTGAAGACAGCGCTACTTATTACTGTGCCTCGGGGTAT +>629|TRGJ1 ENSMUST00000200495|TRGJ1|J-REGION|TR|TRG|None|00 +ATAGCTCAGGTTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCCTCTG +>630|TRGJ2 ENSMUST00000197113|TRGJ2|J-REGION|TR|TRG|None|00 +ATAGCTCGGGCTTTCACAAGGTATTTGCAGAAGGAACAAAGCTCATAGTAATTCCCTCCG +>631|TRGJ3 ENSMUST00000103562|TRGJ3|J-REGION|TR|TRG|None|00 +ATAGTTGGGACTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCTTCTG +>632|TRGJ4 ENSMUST00000184430|TRGJ4|J-REGION|TR|TRG|None|00 +TCAGGCACATCATGGGTCAAGATATTTGCCAAAGGGACAAAGCTCGTAGTAATTCCCCCAG +>633|TRGV2 ENSMUST00000103563|TRGV2|5'UTR|TR|TRG|None|00 +AACAGATCATGACCAACCCTGGGGGAACCCACTGACTGCATTTTTCTGAGACTATAGCACAGTCCCACCCTCCAGCTGGTGACCTGAAATTCCAGCCTGCAGAGCACTTCCTGCCTCCCTGTGAAGCAGTCCAACCTTGGG +>634|TRGV2 ENSMUST00000103563|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGATGGTTCACCTCCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGAGACAGATGAGAATGTGCAAATATCCTGTATAGTTTATCTTCCATATTTCTCCAACACAGCTATACATTGGTACCGGCAAAAAACAAATCAACAGTTTGAGTATCTAATATATGTCGCAACAAACTACAATCAACGACCCTTAGGAGGGAAGCACAAAAAAATTGAAGCAAGTAAAGATTTTAAAAGTTCTACCTCAACCTTGGAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATGAG +>635|IGHV12-1 AJ851868.3|IGHV12-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGACTACTAGGGTTTCTCCTGTGCTTGGCAGCAGCTCTAAAAAGTGTTCTGTCCCAGATTCAGCTTAAGGAGTCTGGACCTGCTGTCATCAAGCCATCACAGTCACTGTCTCTCACCTGCATAGTCTCTGGATTCTCCATCACAAGTAGTAGTTATTGCTGGCACTGGATCCGCCAGCCCCCAGGAAAGGGGTTAGAGTGGATGGGGCGCATATGTTATGAAGGTTCAATATACTATAGTCCATCCATCAAAAGCCGCAGCACCATCTCCAGAGACACATCTCTGAACAAATTCTTTATCCAGCTGAGCTCTGTGACAAATGAGGACACAGCCATGTACTACTGTTCC +>636|IGHV1-unknown1 LVXK01034187.1|IGHV1-unknown1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGGTCGTTCTCTTCCTCCTGTCATTAACTGCAGGTGTCTATGCCCAGGGTCAGATGCAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGACTTCTGGCTTCACCTTCAGCAGTAGCTATATAAGTTGGTTGAAGCAAAAGCCTGGACAGAGTCTTGAGTGGATTGCATGGATTTATGCTGGAACTGGTGGTACTAGCTATAATCAGAAGTTCACAGGCAAGGCCCAACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAATTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>637|TRAV4-4-DV10 GRCm38-release94|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGGGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGATTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGAGTGTGCAGTGGTTCCGACAGAATTCCAGGGGCAGCCTCATCAGTTTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>638|TRAV13-1 GRCm38-release94|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAATGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGAGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>639|TRBV12-2+TRBV13-2 GRCm38-release94|TRBV12-2+TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>640|TRAV16N GRCm38-release94|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>641|TRAV6N-5 GRCm38-release94|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>642|TRAV13N-4 GRCm38-release94|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGTGCTTCTCAATTAGGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>643|TRBV13-2 GRCm38-release94|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAGTTTTGTCTTTCTTTTTATAGAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>644|IGHG3 GRCm38-release94|IGHG3|C-REGION|IG|IGH|G3|00 +AGCTGGAACTGAATGGGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTGTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>645|IGHG2B GRCm38-release94|IGHG2B|C-REGION|IG|IGH|G2B|00 +GCCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCCGTGACCTCTGGGTGCCTGGTCAAGGGGTACTTCCCTGAGCCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGCACCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTGAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACACTTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTTCTTGACTCTGACGGTTCTTACTTCATATATAGCAAGCTCAATATGAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA diff --git a/lib/rust/vdj_ann_ref/vdj_refs_4.0/human/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_4.0/human/fasta/regions.fa new file mode 100644 index 0000000..9ee14b2 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_4.0/human/fasta/regions.fa @@ -0,0 +1,1486 @@ +>1|IGHA1 ENST00000390547|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>2|IGHA1 ENST00000641837|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAACAGGGAGGGCCCCCAGTAC +>3|IGHA2 ENST00000390539|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGTAAACCCACCCACATCAATGTGTCTGTTGTCATGGCGGAGGCGGATGGCACCTGCTAC +>4|IGHA2 ENST00000497872|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGCTCTTGCTGTGTTGCAGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAAGAGGGAGGGCCCCCAGTAC +>5|IGHA2 ENST00000622473|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>6|IGHD ENST00000390556|IGHD|C-REGION|IG|IGH|D|00 +CACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTACCTGGCCATGACCCCCCTGATCCCTCAGAGCAAGGATGAGAACAGCGATGACTACACGACCTTTGATGATGTGGGCAGCCTGTGGACCACCCTGTCCACGTTTGTGGCCCTCTTCATCCTCACCCTCCTCTACAGCGGCATTGTCACTTTCATCAAGGTGAAG +>7|IGHD1-1 ENST00000454908|IGHD1-1|D-REGION|IG|IGH|None|00 +GGTACAACTGGAACGAC +>8|IGHD1-14 ENST00000451044|IGHD1-14|D-REGION|IG|IGH|None|00 +GGTATAACCGGAACCAC +>9|IGHD1-20 ENST00000450276|IGHD1-20|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACGAC +>10|IGHD1-26 ENST00000390567|IGHD1-26|D-REGION|IG|IGH|None|00 +GGTATAGTGGGAGCTACTAC +>11|IGHD1-7 ENST00000430425|IGHD1-7|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACTAC +>12|IGHD1/OR15-1A ENST00000605284|IGHD1/OR15-1A|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACAAC +>13|IGHD2-15 ENST00000390578|IGHD2-15|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTGGTGGTAGCTGCTACTCC +>14|IGHD2-2 ENST00000390591|IGHD2-2|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTAGTACCAGCTGCTATGCC +>15|IGHD2-21 ENST00000390572|IGHD2-21|D-REGION|IG|IGH|None|00 +AGCATATTGTGGTGGTGACTGCTATTCC +>16|IGHD2-8 ENST00000390585|IGHD2-8|D-REGION|IG|IGH|None|00 +AGGATATTGTACTAATGGTGTATGCTATACC +>17|IGHD2/OR15-2A ENST00000603077|IGHD2/OR15-2A|D-REGION|IG|IGH|None|00 +AGAATATTGTAATAGTACTACTTTCTATGCC +>18|IGHD3-10 ENST00000390583|IGHD3-10|D-REGION|IG|IGH|None|00 +GTATTACTATGGTTCGGGGAGTTATTA +>19|IGHD3-16 ENST00000390577|IGHD3-16|D-REGION|IG|IGH|None|00 +GTATTATGATTACGTTTGGGGGAGTTATCGTTATACC +>20|IGHD3-22 ENST00000390571|IGHD3-22|D-REGION|IG|IGH|None|00 +GTATTACTATGATAGTAGTGGTTATTACTAC +>21|IGHD3-3 ENST00000390590|IGHD3-3|D-REGION|IG|IGH|None|00 +GTATTACGATTTTTGGAGTGGTTATTATACC +>22|IGHD3-9 ENST00000390584|IGHD3-9|D-REGION|IG|IGH|None|00 +GTATTACGATATTTTGACTGGTTATTA +>23|IGHD3/OR15-3A ENST00000604950|IGHD3/OR15-3A|D-REGION|IG|IGH|None|00 +GTATTATGATTTTTGGACTGGTTATTATACC +>24|IGHD4-11 ENST00000431440|IGHD4-11|D-REGION|IG|IGH|None|00 +TGACTACAGTAACTAC +>25|IGHD4-17 ENST00000431870|IGHD4-17|D-REGION|IG|IGH|None|00 +TGACTACGGTGACTAC +>26|IGHD4-23 ENST00000437320|IGHD4-23|D-REGION|IG|IGH|None|00 +TGACTACGGTGGTAACTCC +>27|IGHD4/OR15-4A ENST00000603326|IGHD4/OR15-4A|D-REGION|IG|IGH|None|00 +TGACTATGGTGCTAACTAC +>28|IGHD5-12 ENST00000390581|IGHD5-12|D-REGION|IG|IGH|None|00 +GTGGATATAGTGGCTACGATTAC +>29|IGHD5-18 ENST00000390575|IGHD5-18|D-REGION|IG|IGH|None|00 +GTGGATACAGCTATGGTTAC +>30|IGHD5-24 ENST00000390569|IGHD5-24|D-REGION|IG|IGH|None|00 +GTAGAGATGGCTACAATTAC +>31|IGHD5/OR15-5A ENST00000604642|IGHD5/OR15-5A|D-REGION|IG|IGH|None|00 +GTGGATATAGTGTCTACGATTAC +>32|IGHD6-13 ENST00000390580|IGHD6-13|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCAGCTGGTAC +>33|IGHD6-19 ENST00000390574|IGHD6-19|D-REGION|IG|IGH|None|00 +GGGTATAGCAGTGGCTGGTAC +>34|IGHD6-25 ENST00000452198|IGHD6-25|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCGGCTAC +>35|IGHD6-6 ENST00000454691|IGHD6-6|D-REGION|IG|IGH|None|00 +GAGTATAGCAGCTCGTCC +>36|IGHD7-27 ENST00000439842|IGHD7-27|D-REGION|IG|IGH|None|00 +CTAACTGGGGA +>37|IGHE ENST00000390541|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>38|IGHE ENST00000641420|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGAGCTGGACGTGTGCGTGGAGGAGGCCGAGGGCGAGGCGCCGTGGACGTGGACCGGCCTCTGCATCTTCGCCGCACTCTTCCTGCTCAGCGTGAGCTACAGCGCCGCCATCACGCTCCTCATGGTGCAGCGGTTCCTCTCAGCCACGCGGCAGGGGAGGCCCCAGACCTCCCTCGACTACACCAACGTCCTCCAGCCCCACGCC +>39|IGHE ENST00000610670|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCGAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>40|IGHG1 ENST00000390542|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>41|IGHG1 ENST00000390548|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTACAGGAACATGATCGGACAGGGGGCC +>42|IGHG1 ENST00000390549|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>43|IGHG2 ENST00000390545|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>44|IGHG2 ENST00000641095|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACCACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCATCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATCAGGCAGGGGGCC +>45|IGHG3 ENST00000390551|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>46|IGHG3 ENST00000641136|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTATAGGAACATGATTGGGCAGGGGGCC +>47|IGHG4 ENST00000390543|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGGTAAA +>48|IGHG4 ENST00000641978|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATAAGGCAGGGGGCC +>49|IGHJ1 ENST00000390565|IGHJ1|J-REGION|IG|IGH|None|00 +GCTGAATACTTCCAGCACTGGGGCCAGGGCACCCTGGTCACCGTCTCCTCAG +>50|IGHJ2 ENST00000390564|IGHJ2|J-REGION|IG|IGH|None|00 +TACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>51|IGHJ2 ENST00000632178|IGHJ2|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>52|IGHJ3 ENST00000463911|IGHJ3|J-REGION|IG|IGH|None|00 +GATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>53|IGHJ3 ENST00000633896|IGHJ3|J-REGION|IG|IGH|None|00 +TGATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>54|IGHJ4 ENST00000461719|IGHJ4|J-REGION|IG|IGH|None|00 +TACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>55|IGHJ4 ENST00000631521|IGHJ4|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>56|IGHJ5 ENST00000488476|IGHJ5|J-REGION|IG|IGH|None|00 +AACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>57|IGHJ5 ENST00000633501|IGHJ5|J-REGION|IG|IGH|None|00 +ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>58|IGHJ6 ENST00000390560|IGHJ6|J-REGION|IG|IGH|None|00 +TACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>59|IGHJ6 ENST00000631705|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>60|IGHM ENST00000390559|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTAC +>61|IGHM ENST00000637539|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGAGGGGGAGGTGAGCGCCGACGAGGAGGGCTTTGAGAACCTGTGGGCCACCGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGTACCACCGTCACCTTGTTCAAGGTGAAA +>62|IGHV1-18 ENST00000390605|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>63|IGHV1-18 ENST00000390605|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGA +>64|IGHV1-18 ENST00000633147|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>65|IGHV1-18 ENST00000633147|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>66|IGHV1-2 ENST00000390594|IGHV1-2|5'UTR|IG|IGH|None|00 +GAGAGCATCACCCAGCAACCACATCTGTCCTCTAGAGAATCCCCTGAGAGCTCCGTTCCTCACC +>67|IGHV1-2 ENST00000390594|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCCACAGGAGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCGGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCTGGGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACATGGAGCTGAGCAGGCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>68|IGHV1-24 ENST00000390610|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>69|IGHV1-24 ENST00000390610|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACA +>70|IGHV1-24 ENST00000633490|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>71|IGHV1-24 ENST00000633490|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>72|IGHV1-3 ENST00000390595|IGHV1-3|5'UTR|IG|IGH|None|00 +CCACATCCCTCCTCAGAAGCCCCCAGAGCACAACGCCTCACC +>73|IGHV1-3 ENST00000390595|IGHV1-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTTTTGGTGGCAGCAGCCACAGGTGCCCACTCCCAGGTCCAGCTTGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGCATTGGGTGCGCCAGGCCCCCGGACAAAGGCTTGAGTGGATGGGATGGATCAACGCTGGCAATGGTAACACAAAATATTCACAGAAGTTCCAGGGCAGAGTCACCATTACCAGGGACACATCCGCGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAAGACACGGCTGTGTATTACTGTGCGAGAGA +>74|IGHV1-45 ENST00000390621|IGHV1-45|5'UTR|IG|IGH|None|00 +ATCACCCAACAACCACATCCCTCCTCTAGAGAATCCCCTGAAAGCACAGCTCCTCACC +>75|IGHV1-45 ENST00000390621|IGHV1-45|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGAATCCTCTTCTTGGTGGCAGCAGTCACAGATGCCTACTCCCAGATGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGACTGGGTCCTCAGTGAAGGTTTCCTGCAAGGCTTCCGGATACACCTTCACCTACCGCTACCTGCACTGGGTGCGACAGGCCCCCGGACAAGCGCTTGAGTGGATGGGATGGATCACACCTTTCAATGGTAACACCAACTACGCACAGAAATTCCAGGACAGAGTCACCATTACCAGGGACAGGTCTATGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACAGCCATGTATTACTGTGCAAGATA +>76|IGHV1-46 ENST00000390622|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>77|IGHV1-46 ENST00000390622|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>78|IGHV1-46 ENST00000632105|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>79|IGHV1-46 ENST00000632105|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>80|IGHV1-58 ENST00000390628|IGHV1-58|5'UTR|IG|IGH|None|00 +AGCATCATCCAGAAACCACATCCCTCCGCTAGAGAAGCCCCTGACGGCACAGTTCCTCACT +>81|IGHV1-58 ENST00000390628|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGAGGATCCTCTTCTTGGTGGGAGCAGCGACAGGTGCCCACTCCCAAATGCAGCTGGTGCAGTCTGGGCCTGAGGTGAAGAAGCCTGGGACCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATTCACCTTTACTAGCTCTGCTGTGCAGTGGGTGCGACAGGCTCGTGGACAACGCCTTGAGTGGATAGGATGGATCGTCGTTGGCAGTGGTAACACAAACTACGCACAGAAGTTCCAGGAAAGAGTCACCATTACCAGGGACATGTCCACAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCCGAGGACACGGCCGTGTATTACTGTGCGGCAGA +>82|IGHV1-69 ENST00000390633|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>83|IGHV1-69 ENST00000390633|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>84|IGHV1-69 ENST00000632882|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>85|IGHV1-69 ENST00000632882|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>86|IGHV1-69-2 ENST00000615784|IGHV1-69-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCCTCTTGGTGGCAGCAGCTACAGGCACCCACGCCGAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCTACAGTGAAAATCTCCTGCAAGGTTTCTGGATACACCTTCACCGACTACTACATGCACTGGGTGCAACAGGCCCCTGGAAAAGGGCTTGAGTGGATGGGACTTGTTGATCCTGAAGATGGTGAAACAATATACGCAGAGAAGTTCCAGGGCAGAGTCACCATAACCGCGGACACGTCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>87|IGHV1-69D ENST00000624687|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>88|IGHV1-69D ENST00000624687|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>89|IGHV1-69D ENST00000633446|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCAGATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>90|IGHV1-69D ENST00000633446|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTCCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>91|IGHV1/OR15-1 ENST00000604066|IGHV1/OR15-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACATCTTCACCGACTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGAGCTTGGGTGGATGGGACGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCAGAGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACACGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCACGTATTACTGTGCGAGAGA +>92|IGHV1/OR21-1 ENST00000622028|IGHV1/OR21-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGAATTGGAGGATCCTGTTTTTGGTGGTCATAGCTGCGGGTGCCCAGTCCCAGGTACAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCATCACCAGCTACTGTATGCACTGGGTGCACCAGGTCCATGCACAAGGGCTTGAGTGGATGGGATTGGTGTGCCCTAGTGATGGCAGCACAAGCTATGCACAGAAGTTCCAGGCCAGAGTCACCATAACCAGGGACACATCCATGAGCACAGCCTACATGGAGCTAAGCAGTCTGAGATCTGAGGACACGGCCATGTATTACTGTGTGAGAGA +>93|IGHV2-26 ENST00000390611|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>94|IGHV2-26 ENST00000390611|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATA +>95|IGHV2-26 ENST00000632457|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>96|IGHV2-26 ENST00000632457|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATAC +>97|IGHV2-5 ENST00000390597|IGHV2-5|5'UTR|IG|IGH|None|00 +AGTGACTCCTGTGCCCCACC +>98|IGHV2-5 ENST00000390597|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTCCACGCTCCTGCTGCTGACCATCCCTTCATGGGTCTTGTCCCAGATCACCTTGAAGGAGTCTGGTCCTACGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAGTGGGTGTGGGCTGGATCCGTCAGCCCCCAGGAAAGGCCCTGGAGTGGCTTGCACTCATTTATTGGGATGATGATAAGCGCTACAGCCCATCTCTGAAGAGCAGGCTCACCATCACCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACACAGAC +>99|IGHV2-70 ENST00000617374|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAGGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGTGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACTCATTGATTGGGATGATGATAAATACTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>100|IGHV2-70 ENST00000632173|IGHV2-70|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCCCCACC +>101|IGHV2-70 ENST00000632173|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATGCTTTGTTCCATGCTCCTGCTACTGACTGTCCCGTCTTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTACTGGAATGCGTGTGAGCTGGATCCGTCGGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATACTGCAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>102|IGHV2-70D ENST00000390634|IGHV2-70D|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCTCCACC +>103|IGHV2-70D ENST00000390634|IGHV2-70D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGCGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATTCTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>104|IGHV2/OR16-5 ENST00000567458|IGHV2/OR16-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACGTTTTGCTCCACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACTCTCTCTGGGTTCTCACTCAGCACTTCTGGAATGGGTATGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCTCACATTTTTTTGAATGACAAAAAATCCTACAGCACGTCTCTGAAGAACAGGCTCATCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCATGGAGAG +>105|IGHV3-11 ENST00000390601|IGHV3-11|5'UTR|IG|IGH|None|00 +CTCCCTCTGCTGATAAAAACCAGCCGAGCCCAGACCCTGCAGCTCTGGGAGAAGAGCCCCAGCCCCAGAATTCCCAGGAGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>106|IGHV3-11 ENST00000390601|IGHV3-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTATAAAAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCAAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTAGTAGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>107|IGHV3-13 ENST00000390602|IGHV3-13|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTGTATTCAGTGATCAGGACTGAACACACAGGACTCACC +>108|IGHV3-13 ENST00000390602|IGHV3-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATATTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACGACATGCACTGGGTCCGCCAAGCTACAGGAAAAGGTCTGGAGTGGGTCTCAGCTATTGGTACTGCTGGTGACCCATACTATCCAGGCTCCGTGAAGGGCCGATTCACCATCTCCAGAGAAAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGGGGACACGGCTGTGTATTACTGTGCAAGAGA +>109|IGHV3-15 ENST00000390603|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>110|IGHV3-15 ENST00000390603|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACA +>111|IGHV3-15 ENST00000632959|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>112|IGHV3-15 ENST00000632959|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACAGA +>113|IGHV3-16 ENST00000390604|IGHV3-16|5'UTR|IG|IGH|None|00 +AGCCCTGGGAGAGAAGCCCCAGCCCTGGGATTCTCAGGTGTTTCTATTGGGTCAACAGCAATAAACAAATTACC +>114|IGHV3-16 ENST00000390604|IGHV3-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGCCCGCAAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGTGGACTCCGTGAAGCGCCGATTCATCATCTCCAGAGACAATTCCAGGAACTCCCTGTATCTGCAAAAGAACAGACGGAGAGCCGAGGACATGGCTGTGTATTACTGTGTGAGA +>115|IGHV3-20 ENST00000390606|IGHV3-20|5'UTR|IG|IGH|None|00 +CCAGCCCTGAGATTCCCACGTGTTTCCATTCAGTGATCAGCACTGAACACAGAGGACTCGCC +>116|IGHV3-20 ENST00000390606|IGHV3-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGTGTGGTACGGCCTGGGGGGTCCCTGAGACTCTCCTTTGCAGCCTCTGGATTCACCTTTGATGATTATGGCATGAGCTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGAGTGGGTCTCTGGTATTAATTGGAATGGTGGTAGCACAGGTTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCCTTGTATCACTGTGCGAGAGA +>117|IGHV3-21 ENST00000390607|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>118|IGHV3-21 ENST00000390607|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>119|IGHV3-21 ENST00000632980|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>120|IGHV3-21 ENST00000632980|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>121|IGHV3-23 ENST00000390609|IGHV3-23|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCCAGCCCTGGGATTTTCAGGTGTTTTCATTTGGTGATCAGGACTGAACAGAGAGAACTCACC +>122|IGHV3-23 ENST00000390609|IGHV3-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGCTTTTTCTTGTGGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGCAGCTATGCCATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGCTATTAGTGGTAGTGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGGTTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTATATTACTGTGCGAAAGA +>123|IGHV3-30 ENST00000603660|IGHV3-30|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>124|IGHV3-30 ENST00000603660|IGHV3-30|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAAA +>125|IGHV3-33 ENST00000390615|IGHV3-33|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>126|IGHV3-33 ENST00000390615|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCGTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATGGTATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>127|IGHV3-33 ENST00000631807|IGHV3-33|5'UTR|IG|IGH|None|00 +CGAGCCCAGCACTGGAAGTCGCCGGTGTTTCCATTCGGTGATCATCACTGAACACAGAGGACTCACC +>128|IGHV3-33 ENST00000631807|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGCAATAAATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>129|IGHV3-35 ENST00000390617|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>130|IGHV3-35 ENST00000390617|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGA +>131|IGHV3-35 ENST00000632225|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>132|IGHV3-35 ENST00000632225|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGAAA +>133|IGHV3-38 ENST00000390618|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>134|IGHV3-38 ENST00000390618|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATAT +>135|IGHV3-38 ENST00000631785|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>136|IGHV3-38 ENST00000631785|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATATA +>137|IGHV3-43 ENST00000434710|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>138|IGHV3-43 ENST00000434710|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGAT +>139|IGHV3-43 ENST00000633040|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>140|IGHV3-43 ENST00000633040|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGATA +>141|IGHV3-48 ENST00000390624|IGHV3-48|5'UTR|IG|IGH|None|00 +AGCTCTCAGAGAGGTGCCTTAGCCCTGGATTCCAAGGCATTTCCACTTGGTGATCAGCACTGAACACAGAGGACTCACC +>142|IGHV3-48 ENST00000390624|IGHV3-48|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGTGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGTTATGAAATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTGGTAGTACCATATACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTTTATTACTGTGCGAGAGA +>143|IGHV3-49 ENST00000390625|IGHV3-49|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCGTGAGATTCCCAGGAGTTTCCACTTGGTGATCAGCACTGAACACAGACCACCAACC +>144|IGHV3-49 ENST00000390625|IGHV3-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTTAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAATGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCAGGGCGGTCCCTGAGACTCTCCTGTACAGCTTCTGGATTCACCTTTGGTGATTATGCTATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTAGGTTTCATTAGAAGCAAAGCTTATGGTGGGACAACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGCATCGCCTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACTAGAGA +>145|IGHV3-53 ENST00000390627|IGHV3-53|5'UTR|IG|IGH|None|00 +AATACCAATCTCCCCCAGGACACTTCATCTGCACGGAGCCCGGCCTCTCCTCAGATGTCCCACCCCAGAGCTTGCTATATAGTCGGGGACATGCAAATAGGGCCCTCCCTCTGCTGATGAAAACCAGCCCAGCTGACCCTGCAGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>146|IGHV3-53 ENST00000390627|IGHV3-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTTGGCTGAGCTGGGTTTTCCTTGTTGCTATTTCAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGACTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>147|IGHV3-64 ENST00000454421|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>148|IGHV3-64 ENST00000454421|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGA +>149|IGHV3-64 ENST00000631710|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>150|IGHV3-64 ENST00000631710|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGAGA +>151|IGHV3-64D ENST00000632099|IGHV3-64D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTCTGGCTGAGCTGGGTTCTCCTTGTTGCCATTTTAAAAGATGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTTCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATACTACGCAGACTCCGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAGCAGTCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGAAAGA +>152|IGHV3-66 ENST00000390632|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>153|IGHV3-66 ENST00000390632|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGA +>154|IGHV3-66 ENST00000632846|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>155|IGHV3-66 ENST00000632846|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>156|IGHV3-7 ENST00000390598|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>157|IGHV3-7 ENST00000390598|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGA +>158|IGHV3-7 ENST00000633988|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>159|IGHV3-7 ENST00000633988|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>160|IGHV3-72 ENST00000433072|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>161|IGHV3-72 ENST00000433072|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGA +>162|IGHV3-72 ENST00000633602|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>163|IGHV3-72 ENST00000633602|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGAGA +>164|IGHV3-73 ENST00000390636|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>165|IGHV3-73 ENST00000390636|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGA +>166|IGHV3-73 ENST00000631708|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>167|IGHV3-73 ENST00000631708|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGACA +>168|IGHV3-74 ENST00000424969|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>169|IGHV3-74 ENST00000424969|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>170|IGHV3-74 ENST00000633987|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>171|IGHV3-74 ENST00000633987|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>172|IGHV3/OR15-7 ENST00000558565|IGHV3/OR15-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGTTCTCTGAGACTCTCATGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGAGCTGGGTCCGCCAGGCTCAAGGGAAAGGGCTAGAGTTGGTAGGTTTAATAAGAAACAAAGCTAACAGTTACACGACAGAATATGCTGCGTCTGTGAAAGGCAGACTTACCATCTCAAGAGAGGATTCAAAGAACACGCTGTATCTGCAAATGAGCAACCTGAAAACCGAGGACTTGGCCGTGTATTACTGTGCTAGAGA +>173|IGHV3/OR16-10 ENST00000425181|IGHV3/OR16-10|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGCTATATTAAAAGGTGTCCAGTGTGAGGTTCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACATCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGGCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTTCGCCAGGCTCCAGGAAAAGGTCTGGAGTGGGTATCAGCTATTGGTACTGGTGGTGGCACATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACATGGCTGTGTATTACTGTGCAAGAGA +>174|IGHV3/OR16-12 ENST00000570121|IGHV3/OR16-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGAGCTCAGCTGGGTTTTCCTTGTTGCTATTTTACAAGGTGTCCACTGTGAGGTGCAGCTGGTAGAGTCTGGGAGAGGCTTGGCCCAGCCTGGGGGGTACCTAAAACTCTCCGGTGCAGCCTCTGGATTCACCGTCGGTAGCTGGTACATGAGCTGGATCCACCAGGCTCCAGGGAAGGGTCTGGAGTGGGTCTCATACATTAGTAGTAGTGGTTGTAGCACAAACTACGCAGACTCTGTGAAGGGCAGATTCACCATCTCCACAGACAACTCAAAGAACACGCTCTACCTGCAAATGAACAGCCTGAGAGTGGAGGACACGGCCGTGTATTACTGTGCAAGAGA +>175|IGHV3/OR16-13 ENST00000562905|IGHV3/OR16-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCAGACTCCATGAAGGGCCAATTCACCATCTCCAGAGACAATGCTAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACATGGCTGTGTATTACTGTACTAGAGA +>176|IGHV3/OR16-8 ENST00000565407|IGHV3/OR16-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAACTGGGTTTTCCTTGTTGCTATTATAAAAGGTGCCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTGTCCTGTCCAGCCTCTGGATTCACCTTCAGTAACCACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACATTAGTGGTGATAGTGGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGGGACAACGCCAATAACTCACCGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGA +>178|IGHV4-28 ENST00000390612|IGHV4-28|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCTGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>179|IGHV4-28 ENST00000390612|IGHV4-28|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTACAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGACACCCTGTCCCTCACCTGCGCTGTCTCTGGTTACTCCATCAGCAGTAGTAACTGGTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTACATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATGTCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGTGGACACGGCCGTGTATTACTGTGCGAGAAA +>180|IGHV4-30-2 ENST00000632151|IGHV4-30-2|5'UTR|IG|IGH|None|00 +ACTTTCTGAGAGTCCTGGACCTCCTGCACAAGAAC +>181|IGHV4-30-2 ENST00000632151|IGHV4-30-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>182|IGHV4-31 ENST00000438142|IGHV4-31|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>183|IGHV4-31 ENST00000438142|IGHV4-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>184|IGHV4-34 ENST00000390616|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>185|IGHV4-34 ENST00000390616|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGA +>186|IGHV4-34 ENST00000612474|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>187|IGHV4-34 ENST00000612474|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGAGG +>188|IGHV4-39 ENST00000390619|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>189|IGHV4-39 ENST00000390619|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGA +>190|IGHV4-39 ENST00000633618|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>191|IGHV4-39 ENST00000633618|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGACA +>192|IGHV4-4 ENST00000455737|IGHV4-4|5'UTR|IG|IGH|None|00 +AAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCATGGACCTCCTGCACAAGAAC +>193|IGHV4-4 ENST00000455737|IGHV4-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCTCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGGGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGTTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>194|IGHV4-59 ENST00000390629|IGHV4-59|5'UTR|IG|IGH|None|00 +TTTTCACCTCTCCATACAAAGGCACCACCCACATGCAAATCCTCACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>195|IGHV4-59 ENST00000390629|IGHV4-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACATCTGTGGTTCTTCCTTCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>196|IGHV4-61 ENST00000390630|IGHV4-61|5'UTR|IG|IGH|None|00 +ACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>197|IGHV4-61 ENST00000390630|IGHV4-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCGTCAGCAGTGGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>198|IGHV4/OR15-8 ENST00000557788|IGHV4/OR15-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTTCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGTTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGCTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCCCCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACAGGGCCGTGTATTACTGTGCGAGAGA +>199|IGHV5-10-1 ENST00000632950|IGHV5-10-1|5'UTR|IG|IGH|None|00 +AGTCTCCTTCACCACCCAGCTGGGATCTCAGGGCTTCCTTTTCTGTCCTCCTCCAGG +>200|IGHV5-10-1 ENST00000632950|IGHV5-10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAAGTGCAGCTGGTGCAGTCCGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAGGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCAGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGAGGATTGATCCTAGTGACTCTTATACCAACTACAGCCCGTCCTTCCAAGGCCACGTCACCATCTCAGCTGACAAGTCCATCAGCACTGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>201|IGHV5-51 ENST00000390626|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>202|IGHV5-51 ENST00000390626|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGA +>203|IGHV5-51 ENST00000620764|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>204|IGHV5-51 ENST00000620764|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>205|IGHV6-1 ENST00000390593|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>206|IGHV6-1 ENST00000390593|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>207|IGHV6-1 ENST00000633299|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>208|IGHV6-1 ENST00000633299|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>209|IGHV7-4-1 ENST00000631943|IGHV7-4-1|5'UTR|IG|IGH|None|00 +ACAACCACACCCCTCCTAAGAAGAAGCCCCTAGACCACAGCTCCACACC +>210|IGHV7-4-1 ENST00000631943|IGHV7-4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAATCTGGGTCTGAGTTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGAATTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACACCAACACTGGGAACCCAACGTATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCTTGGACACCTCTGTCAGCACGGCATATCTGCAGATCTGCAGCCTAAAGGCTGAGGACACTGCCGTGTATTACTGTGCGAGAGA +>211|IGHV7-81 ENST00000390639|IGHV7-81|5'UTR|IG|IGH|None|00 +ACCCAACAACAACATCCCTCCTTGGGAGAATCCCCTAGAGCACAGCTCCTCACC +>212|IGHV7-81 ENST00000390639|IGHV7-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTCTTCTTGGTGGCAGCAGCAACAGGTACCTACTCCCAGGTGCAGCTGGTGCAGTCTGGCCATGAGGTGAAGCAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACAGTTTCACCACCTATGGTATGAATTGGGTGCCACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGTTCAACACCTACACTGGGAACCCAACATATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCATGGACACCTCTGCCAGCACAGCATACCTGCAGATCAGCAGCCTAAAGGCTGAGGACATGGCCATGTATTACTGTGCGAGA +>213|IGKC ENST00000390237|IGKC|C-REGION|IG|IGK|None|00 +GAACTGTGGCTGCACCATCTGTCTTCATCTTCCCGCCATCTGATGAGCAGTTGAAATCTGGAACTGCCTCTGTTGTGTGCCTGCTGAATAACTTCTATCCCAGAGAGGCCAAAGTACAGTGGAAGGTGGATAACGCCCTCCAATCGGGTAACTCCCAGGAGAGTGTCACAGAGCAGGACAGCAAGGACAGCACCTACAGCCTCAGCAGCACCCTGACGCTGAGCAAAGCAGACTACGAGAAACACAAAGTCTACGCCTGCGAAGTCACCCATCAGGGCCTGAGCTCGCCCGTCACAAAGAGCTTCAACAGGGGAGAGTGT +>214|IGKJ1 ENST00000390242|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGCCAAGGGACCAAGGTGGAAATCAAAC +>215|IGKJ2 ENST00000390241|IGKJ2|J-REGION|IG|IGK|None|00 +TGTGCAGTTTTGGCCAGGGGACCAAGCTGGAGATCAAAC +>216|IGKJ3 ENST00000390240|IGKJ3|J-REGION|IG|IGK|None|00 +ATTCACTTTCGGCCCTGGGACCAAAGTGGATATCAAAC +>217|IGKJ4 ENST00000390239|IGKJ4|J-REGION|IG|IGK|None|00 +CTCACTTTCGGCGGAGGGACCAAGGTGGAGATCAAAC +>218|IGKJ5 ENST00000390238|IGKJ5|J-REGION|IG|IGK|None|00 +GATCACCTTCGGCCAAGGGACACGACTGGAGATTAAAC +>219|IGKV1-12 ENST00000480492|IGKV1-12|5'UTR|IG|IGK|None|00 +AGGCTGATCACACCCTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>220|IGKV1-12 ENST00000480492|IGKV1-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>221|IGKV1-16 ENST00000479981|IGKV1-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>222|IGKV1-16 ENST00000479981|IGKV1-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGAGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAAGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>223|IGKV1-17 ENST00000490686|IGKV1-17|5'UTR|IG|IGK|None|00 +AGGAATCAGTCCCACTCAGGACACAGC +>224|IGKV1-17 ENST00000490686|IGKV1-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGGTGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCGCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>225|IGKV1-27 ENST00000498435|IGKV1-27|5'UTR|IG|IGK|None|00 +GTGCAGAAGTCTCTCTCAGTCAGGACACAGC +>226|IGKV1-27 ENST00000498435|IGKV1-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGACTCCTGCTGCTCTGGCTCCCAGATACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTATCAGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAATCAGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCAAAAGTATAACAGTGCCCCT +>227|IGKV1-33 ENST00000473726|IGKV1-33|5'UTR|IG|IGK|None|00 +GTGCAGGAGTCAGTCCCAACCAGGACACAGC +>228|IGKV1-33 ENST00000473726|IGKV1-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>229|IGKV1-37 ENST00000465170|IGKV1-37|5'UTR|IG|IGK|None|00 +AGGCTGGTCACACCCCGTGCAGCAGTCAGTCCCAGTCAGGACACAGC +>230|IGKV1-37 ENST00000465170|IGKV1-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCT +>231|IGKV1-39 ENST00000498574|IGKV1-39|5'UTR|IG|IGK|None|00 +GGGCTGGTCGCACCCTGTGCAGGAGTCAGTCTCAGTCAGGACACAGC +>232|IGKV1-39 ENST00000498574|IGKV1-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCT +>233|IGKV1-5 ENST00000496168|IGKV1-5|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCCCTGAAGCCTTATTAATAGGCTGGTCACACTTTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>234|IGKV1-5 ENST00000496168|IGKV1-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAAATGTGACATCCAGATGACCCAGTCTCCTTCCACCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGAGTATTAGTAGCTGGTTGGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATAAGGCGTCTAGTTTAGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACCATCAGCAGCCTGCAGCCTGATGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTATTCT +>235|IGKV1-6 ENST00000464162|IGKV1-6|5'UTR|IG|IGK|None|00 +GCAGGAGTCAGACCCACTCAGGACACAGC +>236|IGKV1-6 ENST00000464162|IGKV1-6|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTTGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTACAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGCACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAAGATTACAATTACCCT +>237|IGKV1-8 ENST00000495489|IGKV1-8|5'UTR|IG|IGK|None|00 +AGGCTGGACACACTTCATGCAGGAGTCAGACCCTGTCAGGACACAGCATAGAC +>238|IGKV1-8 ENST00000495489|IGKV1-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATCCTCATTCTCTGCATCTACAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTACCCT +>239|IGKV1-9 ENST00000493819|IGKV1-9|5'UTR|IG|IGK|None|00 +AGACTTCTTAATAGGCTGGTCACACCTGTGCAGGAGTCAGTCCCAGTCAGGACACAGC +>240|IGKV1-9 ENST00000493819|IGKV1-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTTCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGCTTAATAGTTACCCT +>241|IGKV1/OR2-108 ENST00000453673|IGKV1/OR2-108|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCGAGGTGCCAGATGTGACATCCAGGTGACCCAGTCTCCATCTTCCCTGTCTGCGTCTGTAGGAGACAGAGTCACCATCACCTGCCGGGCAAGTCAGGGCATTAGCAATGGGTTATCCTGGTATCAGCAGAAACCAGGGCAAGCCCCTACGCTCCTGATCTATGCTGCATCCAGTTTGCAGTCGGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCTACAGGATTATACTACCCCATT +>242|IGKV1D-12 ENST00000377032|IGKV1D-12|5'UTR|IG|IGK|None|00 +AGACCCACTCAGGACACAGC +>243|IGKV1D-12 ENST00000377032|IGKV1D-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>244|IGKV1D-13 ENST00000611391|IGKV1D-13|5'UTR|IG|IGK|None|00 +GAGTCAGACCCACTCAGGACACAGC +>245|IGKV1D-13 ENST00000611391|IGKV1D-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTTCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGCAGTGCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGATGCCTCCAGTTTGGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTTTAATAGTTACCCT +>246|IGKV1D-16 ENST00000492446|IGKV1D-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>247|IGKV1D-16 ENST00000492446|IGKV1D-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGAGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>248|IGKV1D-17 ENST00000483379|IGKV1D-17|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGCTGCTGAGTTACTGAGATGAGCCAGCCCTGCAGCTGCGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCATAGCCTCCTGCCCTGAAGCCTTATTAATAGGCTGGACACACTTCATGGAGGAATCAGTCCCACTCAGGACACAGC +>249|IGKV1D-17 ENST00000483379|IGKV1D-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTAACATCCAGATGACCCAGTCTCCATCTGCCATGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGGCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGTCCCTAAGCACCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>250|IGKV1D-33 ENST00000390265|IGKV1D-33|5'UTR|IG|IGK|None|00 +ATGTTCGCAGAGCACAGCCCCCTGCCCTGAAGACTTATTAATAGGCTGGTCGCACCCTGTGCAGGAGTCAGTCCCAACCAGGACACAGC +>251|IGKV1D-33 ENST00000390265|IGKV1D-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>252|IGKV1D-37 ENST00000509129|IGKV1D-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCTCC +>253|IGKV1D-39 ENST00000448155|IGKV1D-39|5'UTR|IG|IGK|None|00 +GTCAGTCTCAGTCAGGACACAGC +>254|IGKV1D-39 ENST00000448155|IGKV1D-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCTCC +>255|IGKV1D-42 ENST00000390278|IGKV1D-42|5'UTR|IG|IGK|None|00 +AGTCCCAGTCAGGACACAGC +>256|IGKV1D-42 ENST00000390278|IGKV1D-42|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGTCAGATTTGACATCCAGATGACCCAGTCTCCATCTTTCCTGTCTGCATCTGTAGGAGACAGAGTCAGTATCATTTGCTGGGCAAGTGAGGGCATTAGCAGTAATTTAGCCTGGTATCTGCAGAAACCAGGGAAATCCCCTAAGCTCTTCCTCTATGATGCAAAAGATTTGCACCCTGGGGTCTCATCGAGGTTCAGTGGCAGGGGATCTGGGACGGATTTCACTCTCACCATCATCAGCCTGAAGCCTGAAGATTTTGCAGCTTATTACTGTAAACAGGACTTCAGTTACCCTCC +>257|IGKV1D-43 ENST00000468879|IGKV1D-43|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAACCAGCCCTGCAGCTGTGCCCAGCCTGCCTTGCCCCCTGCTAATTTGCATGTTCCCAGAGCACATCCTCCTACCCTGAAGACTTATTAATGCGCTGGTCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>258|IGKV1D-43 ENST00000468879|IGKV1D-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTGCCCGCTCAGCGCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATTCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCTGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGCAAAAGCCCCTAAGCTCTTCATCTATTATGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTACCCCT +>259|IGKV1D-8 ENST00000471857|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>260|IGKV1D-8 ENST00000471857|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>261|IGKV1D-8 ENST00000628219|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>262|IGKV1D-8 ENST00000628219|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGTCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGTTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>263|IGKV2-24 ENST00000484817|IGKV2-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>264|IGKV2-24 ENST00000484817|IGKV2-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCACCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGATTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCATGCAAGCTACACAATTTCCT +>265|IGKV2-28 ENST00000482769|IGKV2-28|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>266|IGKV2-28 ENST00000482769|IGKV2-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>267|IGKV2-30 ENST00000468494|IGKV2-30|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>268|IGKV2-30 ENST00000468494|IGKV2-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACCGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>270|IGKV2D-24 ENST00000462693|IGKV2D-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>271|IGKV2D-24 ENST00000462693|IGKV2D-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCGCCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTTCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGGTTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCACGCAAGCTACACAATTTCCT +>272|IGKV2D-26 ENST00000390268|IGKV2D-26|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACT +>273|IGKV2D-26 ENST00000390268|IGKV2D-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCTTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGCAGAGATTGTGATGACCCAGACTCCACTCTCCTTGTCTATCACCCCTGGAGAGCAGGCCTCCATGTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTGATGGATACACCTATTTGTATTGGTTTCTGCAGAAAGCCAGGCCAGTCTCCACGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATTTTGGAGTTTATTACTGCATGCAAGATGCACAAGATCCT +>274|IGKV2D-28 ENST00000453166|IGKV2D-28|5'UTR|IG|IGK|None|00 +TTGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>275|IGKV2D-28 ENST00000453166|IGKV2D-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>276|IGKV2D-29 ENST00000491977|IGKV2D-29|5'UTR|IG|IGK|None|00 +GATCAGGACTTCTCAGTTCATCTTCTCACC +>277|IGKV2D-29 ENST00000491977|IGKV2D-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGATACCTGGATCCAGTGCAGATATTGTGATGACCCAGACTCCACTCTCTCTGTCCGTCACCCCTGGACAGCCGGCCTCCATCTCCTGCAAGTCTAGTCAGAGCCTCCTGCATAGTGATGGAAAGACCTATTTGTATTGGTACCTGCAGAAGCCAGGCCAGCCTCCACAGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAAGTATACAGCTTCCT +>278|IGKV2D-30 ENST00000474213|IGKV2D-30|5'UTR|IG|IGK|None|00 +TGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>279|IGKV2D-30 ENST00000474213|IGKV2D-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACTGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>280|IGKV2D-40 ENST00000429992|IGKV2D-40|L-REGION+V-REGION|IG|IGK|None|00 +ATGCTCTGGGTCCCTGGATCCAGTGAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTC +>281|IGKV3-11 ENST00000483158|IGKV3-11|5'UTR|IG|IGK|None|00 +GTCAGAGCCCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>282|IGKV3-11 ENST00000483158|IGKV3-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAACAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCCT +>283|IGKV3-15 ENST00000390252|IGKV3-15|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>284|IGKV3-15 ENST00000390252|IGKV3-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGTATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCAGCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCT +>285|IGKV3-20 ENST00000492167|IGKV3-20|5'UTR|IG|IGK|None|00 +CCTGGGTCAGAGCTCTGGAGAAGAGCTGCTCAGTTAGGACCCAGAGGGAACC +>286|IGKV3-20 ENST00000492167|IGKV3-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGGCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>287|IGKV3-7 ENST00000390247|IGKV3-7|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCCCTGGGAAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>288|IGKV3-7 ENST00000390247|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCAGAGAAATTGTAATGACACAGTCTCCACCCACCCTGTCTTTGTCTCCAGGGGAAAGAGTCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAACCTGGTATCAGCAGAAACCTGGCCAGGCGCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTAGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCT +>289|IGKV3/OR2-268 ENST00000421835|IGKV3/OR2-268|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCACAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>290|IGKV3D-11 ENST00000390277|IGKV3D-11|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>291|IGKV3D-11 ENST00000390277|IGKV3D-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGCCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCATCC +>292|IGKV3D-15 ENST00000417279|IGKV3D-15|5'UTR|IG|IGK|None|00 +GGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>293|IGKV3D-15 ENST00000417279|IGKV3D-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCATCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCATCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCTCC +>294|IGKV3D-20 ENST00000390270|IGKV3D-20|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCCGCCCTGCAGTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>295|IGKV3D-20 ENST00000390270|IGKV3D-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCGGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCTGGCGCCCAGGCTCCTCATCTATGATGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>296|IGKV3D-7 ENST00000443397|IGKV3D-7|5'UTR|IG|IGK|None|00 +GAGGAACTGCTCAGTTAGGACCCAG +>297|IGKV3D-7 ENST00000443397|IGKV3D-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAACCATGGAAGCCCCAGCACAGCTTCTTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>298|IGKV4-1 ENST00000390243|IGKV4-1|5'UTR|IG|IGK|None|00 +TTTGGCTCTTGATTTACATTGGGTACTTTCACAACCCACTGCTCATGAAATTTGCTTTTGTACTCACTGGTTGTTTTTGCATAGGCCCCTCCAGGCCACGACCAGCTGTTTGGATTTTATAAACGGGCCGTTTGCATTGTGAACTGAGCTACAACAGGCAGGCAGGGGCAGCAAG +>299|IGKV4-1 ENST00000390243|IGKV4-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTTGCAGACCCAGGTCTTCATTTCTCTGTTGCTCTGGATCTCTGGTGCCTACGGGGACATCGTGATGACCCAGTCTCCAGACTCCCTGGCTGTGTCTCTGGGCGAGAGGGCCACCATCAACTGCAAGTCCAGCCAGAGTGTTTTATACAGCTCCAACAATAAGAACTACTTAGCTTGGTACCAGCAGAAACCAGGACAGCCTCCTAAGCTGCTCATTTACTGGGCATCTACCCGGGAATCCGGGGTCCCTGACCGATTCAGTGGCAGCGGGTCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGGCTGAAGATGTGGCAGTTTATTACTGTCAGCAATATTATAGTACTCCT +>300|IGKV5-2 ENST00000390244|IGKV5-2|5'UTR|IG|IGK|None|00 +ATAAAATCTGTGCTGTCAAACTGATTAGGAACTGACTACCACCTGCAGGTCAGGGCCAAGGTT +>301|IGKV5-2 ENST00000390244|IGKV5-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGGTCCCAGGTTCACCTCCTCAGCTTCCTCCTCCTTTGGATCTCTGATACCAGGGCAGAAACGACACTCACGCAGTCTCCAGCATTCATGTCAGCGACTCCAGGAGACAAAGTCAACATCTCCTGCAAAGCCAGCCAAGACATTGATGATGATATGAACTGGTACCAACAGAAACCAGGAGAAGCTGCTATTTTCATTATTCAAGAAGCTACTACTCTCGTTCCTGGAATCCCACCTCGATTCAGTGGCAGCGGGTATGGAACAGATTTTACCCTCACAATTAATAACATAGAATCTGAGGATGCTGCATATTACTTCTGTCTACAACATGATAATTTCCCT +>302|IGKV6-21 ENST00000390256|IGKV6-21|5'UTR|IG|IGK|None|00 +ATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>303|IGKV6-21 ENST00000390256|IGKV6-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTTGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCTTCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAACGTATTACTGTCATCAGAGTAGTAGTTTACCT +>304|IGKV6D-21 ENST00000436451|IGKV6D-21|5'UTR|IG|IGK|None|00 +GGTATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>305|IGKV6D-21 ENST00000436451|IGKV6D-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTCGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAGCGTATTACTGTCATCAGAGTAGTAGTTTACCT +>306|IGKV6D-41 ENST00000390271|IGKV6D-41|5'UTR|IG|IGK|None|00 +AGCAAAACTGAAGTCAAAACACTGAG +>307|IGKV6D-41 ENST00000390271|IGKV6D-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCCCGTTGCAATTCCTGCGGCTTCTGCTCCTCTGGGTTCCAGCCTCCAGGGGTGATGTTGTGATGACACAGTCTCCAGCTTTCCTCTCTGTGACTCCAGGGGAGAAAGTCACCATCACCTGCCAGGCCAGTGAAGGCATTGGCAACTACTTATACTGGTACCAGCAGAAACCAGATCAAGCCCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCTTTACCATCAGTAGCCTGGAAGCTGAAGATGCTGCAACATATTACTGTCAGCAGGGCAATAAGCACCCT +>308|IGLC1 ENST00000390321|IGLC1|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCCAACCCCACTGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTCCAAGCCAACAAGGCCACACTAGTGTGTCTGATCAGTGACTTCTACCCGGGAGCTGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCAAACCCTCCAAACAGAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>309|IGLC2 ENST00000390323|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTATCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>310|IGLC3 ENST00000390325|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAAAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>311|IGLC7 ENST00000390331|IGLC7|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCGTAAGTGACTTCAACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGTGGGAGTGGAGACCACCAAACCCTCCAAACAAAGCAACAACAAGTATGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCGGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTGCAGAATGCTCT +>312|IGLJ1 ENST00000390320|IGLJ1|J-REGION|IG|IGL|None|00 +TTATGTCTTCGGAACTGGGACCAAGGTCACCGTCCTAG +>313|IGLJ2 ENST00000390322|IGLJ2|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTCATGAGCAG +>314|IGLJ2 ENST00000390322|IGLJ2|J-REGION|IG|IGL|None|00 +TGTGGTATTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>315|IGLJ3 ENST00000390324|IGLJ3|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTC +>316|IGLJ3 ENST00000390324|IGLJ3|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>317|IGLJ4 ENST00000390326|IGLJ4|J-REGION|IG|IGL|None|00 +GTATTTGGTGGAGGAACCCAGCTGATCATTTTA +>318|IGLJ5 ENST00000390327|IGLJ5|J-REGION|IG|IGL|None|00 +CAGAGAGGGTTTTTGTATGAGCCTGTGTCACAGCACTGGGTGTTTGGTGAGGGGACCGAGCTGACCGTCCTA +>319|IGLJ6 ENST00000390328|IGLJ6|J-REGION|IG|IGL|None|00 +GGAGGGTTTGTGTGCAGGGTTATATCACAGTGTAATGTGTTCGGCAGTGGCACCAAGGTGACCGTCCTCG +>320|IGLJ7 ENST00000390330|IGLJ7|J-REGION|IG|IGL|None|00 +TCACTGTGTGCTGTGTTCGGAGGAGGCACCCAGCTGACCGTCCTCG +>321|IGLV1-36 ENST00000390301|IGLV1-36|5'UTR|IG|IGL|None|00 +GCTGCGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>322|IGLV1-36 ENST00000390301|IGLV1-36|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCCCCTCTCTTCCTCACCCTCATCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCGGTGTCTGAAGCCCCCAGGCAGAGGGTCACCATCTCCTGTTCTGGAAGCAGCTCCAACATCGGAAATAATGCTGTAAACTGGTACCAGCAGCTCCCAGGAAAGGCTCCCAAACTCCTCATCTATTATGATGATCTGCTGCCCTCAGGGGTCTCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>323|IGLV1-40 ENST00000390299|IGLV1-40|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAAGAGGCAGCACTCAGGACAATCTCCAGC +>324|IGLV1-40 ENST00000390299|IGLV1-40|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTCCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATCGGGGCAGGTTATGATGTACACTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCCAGTCCTATGACAGCAGCCTGAGTGGTTC +>325|IGLV1-44 ENST00000390297|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>326|IGLV1-44 ENST00000390297|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>327|IGLV1-44 ENST00000628287|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>328|IGLV1-44 ENST00000628287|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTC +>329|IGLV1-47 ENST00000390294|IGLV1-47|5'UTR|IG|IGL|None|00 +GGGGAAGCTCAGCTTCAGCTGTGGTAGAGAAGACAGGATTCAGGACAATCTCCAGC +>330|IGLV1-47 ENST00000390294|IGLV1-47|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCGGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATTATGTATACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCGGTCCGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAGTGGT +>331|IGLV1-50 ENST00000390291|IGLV1-50|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAGGAGGCAGCACTCAGGACAATCTCCAGC +>332|IGLV1-50 ENST00000390291|IGLV1-50|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTTCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATTGGGGCGGGTTATGTTGTACATTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCAATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGACTCCAGTCTGAGGATGAGGCTGATTATTACTGCAAAGCATGGGATAACAGCCTGAATGCT +>333|IGLV1-51 ENST00000390290|IGLV1-51|5'UTR|IG|IGL|None|00 +TGAGCGCAGAAGGCAGGACTCGGGACAATCTTCATC +>334|IGLV1-51 ENST00000390290|IGLV1-51|L-REGION+V-REGION|IG|IGL|None|00 +ATGACCTGCTCCCCTCTCCTCCTCACCCTTCTCATTCACTGCACAGGGTCCTGGGCCCAGTCTGTGTTGACGCAGCCGCCCTCAGTGTCTGCGGCCCCAGGACAGAAGGTCACCATCTCCTGCTCTGGAAGCAGCTCCAACATTGGGAATAATTATGTATCCTGGTACCAGCAGCTCCCAGGAACAGCCCCCAAACTCCTCATTTATGACAATAATAAGCGACCCTCAGGGATTCCTGACCGATTCTCTGGCTCCAAGTCTGGCACGTCAGCCACCCTGGGCATCACCGGACTCCAGACTGGGGACGAGGCCGATTATTACTGCGGAACATGGGATAGCAGCCTGAGTGCTGG +>335|IGLV10-54 ENST00000390287|IGLV10-54|5'UTR|IG|IGL|None|00 +GGGAATCTGCACC +>336|IGLV10-54 ENST00000390287|IGLV10-54|L-REGION+V-REGION|IG|IGL|None|00 +ATGCCCTGGGCTCTGCTCCTCCTGACCCTCCTCACTCACTCTGCAGTGTCAGTGGTCCAGGCAGGGCTGACTCAGCCACCCTCGGTGTCCAAGGGCTTGAGACAGACCGCCACACTCACCTGCACTGGGAACAGCAACATTGTTGGCAACCAAGGAGCAGCTTGGCTGCAGCAGCACCAGGGCCACCCTCCCAAACTCCTATCCTACAGGAATAACAACCGGCCCTCAGGGATCTCAGAGAGATTCTCTGCATCCAGGTCAGGAAACACAGCCTCCCTGACCATTACTGGACTCCAGCCTGAGGACGAGGCTGACTATTACTGCTCAGCATTGGACAGCAGCCTCAGTGCTC +>337|IGLV11-55 ENST00000390286|IGLV11-55|5'UTR|IG|IGL|None|00 +GCTGTGTCCACT +>338|IGLV11-55 ENST00000390286|IGLV11-55|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCCTGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCGGCCCGTGCTGACTCAGCCGCCCTCCCTGTCTGCATCCCCGGGAGCAACAGCCAGACTCCCCTGCACCCTGAGCAGTGACCTCAGTGTTGGTGGTAAAAACATGTTCTGGTACCAGCAGAAGCTAGGGAGCTCTCCCAGGTTATTCCTGTATCACTACTCAGACTCAGACAAGCAGCTGGGACCTGGGGTCCCCAGTCGAGTCTCTGGCTCCAAGGAGACCTCAAGTAACACAGCGTTTTTGCTCATCTCTGGGCTCCAGCCTGAGGACGAGGCCGATTATTACTGCCAGGTGTACGAAAGTAGTGCTAAT +>339|IGLV2-11 ENST00000390314|IGLV2-11|5'UTR|IG|IGL|None|00 +TGCTGGGGTCTCAGGAGGCAGCACTCTCGGGACGTCTCCACC +>340|IGLV2-11 ENST00000390314|IGLV2-11|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCAGCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCGCTCAGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGATGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCTGCTCATATGCAGGCAGCTACACTTTCCACA +>341|IGLV2-14 ENST00000390312|IGLV2-14|5'UTR|IG|IGL|None|00 +GCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACATCTCCACC +>342|IGLV2-14 ENST00000390312|IGLV2-14|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTCATATACAAGCAGCAGCACTCTCCACAGTG +>343|IGLV2-18 ENST00000390310|IGLV2-18|5'UTR|IG|IGL|None|00 +GAATATCTCCACC +>344|IGLV2-18 ENST00000390310|IGLV2-18|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCCCTCCGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTAGTTATAACCGTGTCTCCTGGTACCAGCAGCCCCCAGGCACAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGGTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTTATATACAAGCAGCAGCACTTTC +>345|IGLV2-23 ENST00000390306|IGLV2-23|5'UTR|IG|IGL|None|00 +TCTCTGAGCCCAGGCCCACGTGAGGGTGGGGTGAGGAGAGGAGCCCAGGATGCTGATTTTCATGGAGGCCCCGCCCTCCTCTGAGGCAAAGGGGATAAGACAGGGCTGGGGCAGGGCCAGTGCTGGGGTCACAAGAGGCAGCGCTCTCGGGACGTCTCCACC +>346|IGLV2-23 ENST00000390306|IGLV2-23|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACTCTCCTCACTCAGGACACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGGAGTTATAACCTTGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGGCAGTAAGCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACAATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCTGCTCATATGCAG +>347|IGLV2-33 ENST00000390302|IGLV2-33|5'UTR|IG|IGL|None|00 +GGCTAGAGGCAGGCCCGGTGCTGGGGTCTCAAGGCAGCGCTCTCGGGACATCTCCACC +>348|IGLV2-33 ENST00000390302|IGLV2-33|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAATCTGCCCTGACTCAGCCTCCTTTTGTGTCCGGGGCTCCTGGACAGTCGGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGGGATTATGATCATGTCTTCTGGTACCAAAAGCGTCTCAGCACTACCTCCAGACTCCTGATTTACAATGTCAATACTCGGCCTTCAGGGATCTCTGACCTCTTCTCAGGCTCCAAGTCTGGCAACATGGCTTCCCTGACCATCTCTGGGCTCAAGTCCGAGGTTGAGGCTAATTATCACTGCAGCTTATATTCAAGTAGTTACACTTTC +>349|IGLV2-8 ENST00000620395|IGLV2-8|5'UTR|IG|IGL|None|00 +TCTCTAAGCCCAGGCCCAAGTGAGGGTGGGGTGAGAAGAGGAGCTCAGGATGCAGATTTGCATGGAGGTCCCGCCCTTCTCTGAGGCAGAGGGGATAAGACAGGGCTGGGGGCAGGCCCAGTGCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACGTCACCACC +>350|IGLV2-8 ENST00000620395|IGLV2-8|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTCCCTCCGCGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCGTCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCAGCTCATATGCAGGCAGCAACAATTTC +>351|IGLV3-1 ENST00000390319|IGLV3-1|5'UTR|IG|IGL|None|00 +AAGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGAGGTGCCTCAGCC +>352|IGLV3-1 ENST00000390319|IGLV3-1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGATCCCTCTCTTCCTCGGCGTCCTTGCTTACTGCACAGGATCCGTGGCCTCCTATGAGCTGACTCAGCCACCCTCAGTGTCCGTGTCCCCAGGACAGACAGCCAGCATCACCTGCTCTGGAGATAAATTGGGGGATAAATATGCTTGCTGGTATCAGCAGAAGCCAGGCCAGTCCCCTGTGCTGGTCATCTATCAAGATAGCAAGCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACAGCCACTCTGACCATCAGCGGGACCCAGGCTATGGATGAGGCTGACTATTACTGTCAGGCGTGGGACAGCAGCACTGCACACA +>353|IGLV3-10 ENST00000390315|IGLV3-10|5'UTR|IG|IGL|None|00 +GTGGGCTCAGGAGGCAGAGCTCTGGGAATCTCACC +>354|IGLV3-10 ENST00000390315|IGLV3-10|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTGCTCCCCCTCCTCACTTTCTGCACAGTCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAAACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGTCAGGCCAGGCCCCTGTGCTGGTCATCTATGAGGACAGCAAACGACCCTCCGGGATCCCTGAGAGATTCTCTGGCTCCAGCTCAGGGACAATGGCCACCTTGACTATCAGTGGGGCCCAGGTGGAGGATGAAGCTGACTACTACTGTTACTCAACAGACAGCAGTGGTAATCATAG +>355|IGLV3-12 ENST00000390313|IGLV3-12|5'UTR|IG|IGL|None|00 +GCCTCAGCC +>356|IGLV3-12 ENST00000390313|IGLV3-12|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTCCTCAGCCTCCTCGCTCACTGCACAGGCTCTGCGACCTCCTATGAGCTGACTCAGCCACACTCAGTGTCAGTGGCCACAGCACAGATGGCCAGGATCACCTGTGGGGGAAACAACATTGGAAGTAAAGCTGTGCACTGGTACCAGCAAAAGCCAGGCCAGGACCCTGTGCTGGTCATCTATAGCGATAGCAACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACCCAGGGAACACCGCCACCCTAACCATCAGCAGGATCGAGGCTGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGTAGTAGTGATCATCC +>357|IGLV3-16 ENST00000390311|IGLV3-16|5'UTR|IG|IGL|None|00 +TCTGTGGGTCCAGGAGGCACAGCTCTGGGAATCTCACC +>358|IGLV3-16 ENST00000390311|IGLV3-16|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCTAGGACAGATGGCCAGGATCACCTGCTCTGGAGAAGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGTTCCCTGTGCTGGTGATATATAAAGACAGCGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAATAGTCACATTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCTATCAGCAGACAGCAGTGGTACTTATCC +>359|IGLV3-19 ENST00000390309|IGLV3-19|5'UTR|IG|IGL|None|00 +AGCTGTGGGCTCAGAAGCAGAGTTCTGGGGTGTCTCCACC +>360|IGLV3-19 ENST00000390309|IGLV3-19|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCTGGCTCACTCTCCTCACTCTTTGCATAGGTTCTGTGGTTTCTTCTGAGCTGACTCAGGACCCTGCTGTGTCTGTGGCCTTGGGACAGACAGTCAGGATCACATGCCAAGGAGACAGCCTCAGAAGCTATTATGCAAGCTGGTACCAGCAGAAGCCAGGACAGGCCCCTGTACTTGTCATCTATGGTAAAAACAACCGGCCCTCAGGGATCCCAGACCGATTCTCTGGCTCCAGCTCAGGAAACACAGCTTCCTTGACCATCACTGGGGCTCAGGCGGAAGATGAGGCTGACTATTACTGTAACTCCCGGGACAGCAGTG +>361|IGLV3-21 ENST00000390308|IGLV3-21|5'UTR|IG|IGL|None|00 +GCACAGAGGAGCTGTGCCCTGGAATGGGGCCTGTACCTGTCCAAGGCTTGTGCCGTCCCCTGTGGGAGATGAGAAGCGTCCCTGCATTGGGCTCTTGGGGACCCGTCTTGGACATGAATCTCCTCCAGCAGCAGCCTCTGACTCTGCTGATTTGCATCATGGGCCGCTCTCTCCAGCAAGGGGATAAGAGAGGCCTGGGAGGAACCTGCTCAGTCTGGGCCTAAGGAAGCAGCACTGGTGGTGCCTCAGCC +>362|IGLV3-21 ENST00000390308|IGLV3-21|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGTTCTCCTCCTCGGCCTCCTCTCTCACTGCACAGGCTCTGTGACCTCCTATGTGCTGACTCAGCCACCCTCGGTGTCAGTGGCCCCAGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAGTGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCGTCTATGATGATAGCGACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACGGCCACCCTGACCATCAGCAGGGTCGAAGCCGGGGATGAGGCCGACTATTACTGTCAGGTGTGGGATAGTAGTAGTGATCATCCCACG +>363|IGLV3-22 ENST00000390307|IGLV3-22|5'UTR|IG|IGL|None|00 +AAGAGAGGCCTGGGAAGCCCAGCTGTGCTGTGGGCTCAGGAGGCAGAGCTGTGGGTGTCTCACC +>364|IGLV3-22 ENST00000390307|IGLV3-22|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGGCCACACTCCTGCTCCCACTCCTCAACCTCTACACAGGCTCTGTTGCCTCCTATGAGCTGACACAGCTACCCTCGGTGTCAGTGTCCCCAGGACAGACAGCCAGGATCACCTGCTCTGGAGATGTACTGGGGGAAAATTATGCTGACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGAGTTGGTGATATACGAAGATAGTGAGCGGTACCCTGGAATCCCTGAACGATTCTCTGGGTCCACCTCAGGGAACACGACCACCCTGACCATCAGCAGGGTCCTGACCGAAGACGAGGCTGACTATTACTGTTTGTCTGGGGATGAGGACAATCCCTCA +>365|IGLV3-25 ENST00000390305|IGLV3-25|5'UTR|IG|IGL|None|00 +GCTGTGCTGTGGGTCCAGGAGGCAGAACTCTGGGTGTCTCACC +>366|IGLV3-25 ENST00000390305|IGLV3-25|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTACTTCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAGACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAGCAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATATATAAAGACAGTGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAACAGTCACGTTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCAATCAGCAGACAGCAGTG +>367|IGLV3-27 ENST00000390304|IGLV3-27|5'UTR|IG|IGL|None|00 +GCTGTAGGCTCAGGAGGCAGAGCTCTGAATGTCTCACC +>368|IGLV3-27 ENST00000390304|IGLV3-27|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCATTCTCTGCACAGTCTCTGTGGCCTCCTATGAGCTGACACAGCCATCCTCAGTGTCAGTGTCTCCGGGACAGACAGCCAGGATCACCTGCTCAGGAGATGTACTGGCAAAAAAATATGCTCGGTGGTTCCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATTTATAAAGACAGTGAGCGGCCCTCAGGGATCCCTGAGCGATTCTCCGGCTCCAGCTCAGGGACCACAGTCACCTTGACCATCAGCGGGGCCCAGGTTGAGGATGAGGCTGACTATTACTGTTACTCTGCGGCTGACAACAAT +>369|IGLV3-32 ENST00000390303|IGLV3-32|5'UTR|IG|IGL|None|00 +GCTGTGGACTCAGAGGCAGAGCTCTGGGGCATTTCCATT +>370|IGLV3-32 ENST00000390303|IGLV3-32|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCCCCTGCTCGTCCTCACTCTCTGCACAGGCTCCGTTATTTCCTCTGGGCCAACTCAGGTGCCTGCAGTGTCTGTGGCCTTGGGACAAATGGCCAGGATCACCTGCCAGGGAGACAGCATGGAAGGCTCTTATGAACACTGGTACCAGCAGAAGCCAGGCCAGGCCCCCGTGCTGGTCATCTATGATAGCAGTGACCGGCCCTCAAGGATCCCTGAGCGATTCTCTGGCTCCAAATCAGGCAACACAACCACCCTGACCATCACTGGGGCCCAGGCTGAGGATGAGGCTGATTATTACTATCAGTTGATAGACAACCATGCTACTCAACT +>371|IGLV3-9 ENST00000390316|IGLV3-9|5'UTR|IG|IGL|None|00 +CTTGACTCTGCTGATTTGCATCACAGGCTGCTCTCTTCAGCAAGGGGATAAGAGAGGGCTGGAAGGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGGGGTGCCGCAGCC +>372|IGLV3-9 ENST00000390316|IGLV3-9|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGCTCTCCTTCTGAGCCTCCTTGCTCACTTTACAGGTTCTGTGGCCTCCTATGAGCTGACTCAGCCACTCTCAGTGTCAGTGGCCCTGGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAATGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCATCTATAGGGATAGCAACCGGCCCTCTGGGATCCCTGAGCGATTCTCTGGCTCCAACTCGGGGAACACGGCCACCCTGACCATCAGCAGAGCCCAAGCCGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGCAGCACTGCACACA +>373|IGLV4-3 ENST00000390318|IGLV4-3|5'UTR|IG|IGL|None|00 +CTCGAATAGAGCTCTTGGAAGTCCCTCCAACC +>374|IGLV4-3 ENST00000390318|IGLV4-3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGTCTCCTTCTACCTACTGCCCTTCATTTTCTCCACAGGTCTCTGTGCTCTGCCTGTGCTGACTCAGCCCCCGTCTGCATCTGCCTTGCTGGGAGCCTCGATCAAGCTCACCTGCACCCTAAGCAGTGAGCACAGCACCTACACCATCGAATGGTATCAACAGAGACCAGGGAGGTCCCCCCAGTATATAATGAAGGTTAAGAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCCGATCGCTTCATGGGCTCCAGTTCTGGGGCTGACCGCTACCTCACCTTCTCCAACCTCCAGTCTGACGATGAGGCTGAGTATCACTGTGGAGAGAGCCACACGATTGATGGCCAAGTCGGT +>375|IGLV4-60 ENST00000390284|IGLV4-60|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCACTCCTCCTCCTCTTCCCTCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCCTGTGCTGACTCAATCATCCTCTGCCTCTGCTTCCCTGGGATCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGTAGCTACATCATCGCATGGCATCAGCAGCAGCCAGGGAAGGCCCCTCGGTACTTGATGAAGCTTGAAGGTAGTGGAAGCTACAACAAGGGGAGCGGAGTTCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGACCGCTACCTCACCATCTCCAACCTCCAGTTTGAGGATGAGGCTGATTATTACTGTGAGACCTGGGACAGTAACACTCA +>376|IGLV4-69 ENST00000390282|IGLV4-69|5'UTR|IG|IGL|None|00 +AGGGTGGGTAAGAAATACCTGCAACTGTCAGCCTCAGCAGAGCTCTGGGGAGTCTGCACC +>377|IGLV4-69 ENST00000390282|IGLV4-69|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCTTGGACCCCACTCCTCTTCCTCACCCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCTTGTGCTGACTCAATCGCCCTCTGCCTCTGCCTCCCTGGGAGCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGCAGCTACGCCATCGCATGGCATCAGCAGCAGCCAGAGAAGGGCCCTCGGTACTTGATGAAGCTTAACAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGAGCGCTACCTCACCATCTCCAGCCTCCAGTCTGAGGATGAGGCTGACTATTACTGTCAGACCTGGGGCACTGGCATTCA +>378|IGLV5-37 ENST00000390300|IGLV5-37|5'UTR|IG|IGL|None|00 +CCACC +>379|IGLV5-37 ENST00000390300|IGLV5-37|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTTCTTCTCTTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCCTCCTCCGCATCTCCTGGAGAATCCGCCAGACTCACCTGCACCTTGCCCAGTGACATCAATGTTGGTAGCTACAACATATACTGGTACCAGCAGAAGCCAGGGAGCCCTCCCAGGTATCTCCTGTACTACTACTCAGACTCAGATAAGGGCCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAGCCAATACAGGGATTTTACTCATCTCCGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCCAAGCAATGCTTCT +>380|IGLV5-39 ENST00000630493|IGLV5-39|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGCCTGTGCTGACTCAGCCAACCTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGATTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCTTCCCCGGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAACCAATGCAGGCCTTTTACTCATCTCTGGGCTCCAGTCTGAAGATGAGGCTGACTATTACTGTGCCATTTGGTACAGCAGCACTTCT +>381|IGLV5-45 ENST00000390296|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>382|IGLV5-45 ENST00000390296|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGTGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>383|IGLV5-45 ENST00000626489|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>384|IGLV5-45 ENST00000626489|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>385|IGLV5-48 ENST00000390293|IGLV5-48|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTTCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCAACTTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGACTCACCTGCACCTTGCGCAGTGGCATCAGTGTTGGTAGCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCAGGTATCTCCTGAACTACTACTCAGACTCAGATAAGCACCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGACCAATGCAGGGATTTTATTCATCTCTGGGCTC +>386|IGLV5-52 ENST00000390289|IGLV5-52|5'UTR|IG|IGL|None|00 +CCACC +>387|IGLV5-52 ENST00000390289|IGLV5-52|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCTTCTCCTTCTCGTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCATCTTCCCATTCTGCATCTTCTGGAGCATCAGTCAGACTCACCTGCATGCTGAGCAGTGGCTTCAGTGTTGGGGACTTCTGGATAAGGTGGTACCAACAAAAGCCAGGGAACCCTCCCCGGTATCTCCTGTACTACCACTCAGACTCCAATAAGGGCCAAGGCTCTGGAGTTCCCAGCCGCTTCTCTGGATCCAACGATGCATCAGCCAATGCAGGGATTCTGCGTATCTCTGGGCTCCAGCCTGAGGATGAGGCTGACTATTACTGTGGTACATGGCACAGCAACTCTAAGACTCA +>388|IGLV6-57 ENST00000390285|IGLV6-57|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCACTACTTCTCACCCTCCTCGCTCACTGCACAGGTTCTTGGGCCAATTTTATGCTGACTCAGCCCCACTCTGTGTCGGAGTCTCCGGGGAAGACGGTAACCATCTCCTGCACCGGCAGCAGTGGCAGCATTGCCAGCAACTATGTGCAGTGGTACCAGCAGCGCCCGGGCAGTGCCCCCACCACTGTGATCTATGAGGATAACCAAAGACCCTCTGGGGTCCCTGATCGGTTCTCTGGCTCCATCGACAGCTCCTCCAACTCTGCCTCCCTCACCATCTCTGGACTGAAGACTGAGGACGAGGCTGACTACTACTGTCAGTCTTATGATAGCAGCAATCA +>389|IGLV7-43 ENST00000390298|IGLV7-43|5'UTR|IG|IGL|None|00 +TCTGGCGCCAGGGGTCCCTTCCAATATCAGCACC +>390|IGLV7-43 ENST00000390298|IGLV7-43|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCTCAGACTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGCTTCCAGCACTGGAGCAGTCACCAGTGGTTACTATCCAAACTGGTTCCAGCAGAAACCTGGACAAGCACCCAGGGCACTGATTTATAGTACAAGCAACAAACACTCCTGGACCCCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACACTGTCAGGTGTGCAGCCTGAGGACGAGGCTGAGTATTACTGCCTGCTCTACTATGGTGGTGCTCAG +>391|IGLV7-46 ENST00000390295|IGLV7-46|5'UTR|IG|IGL|None|00 +TCTGGCACCAGGGGTCCCTTCCAATATCAGCACC +>392|IGLV7-46 ENST00000390295|IGLV7-46|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCCCAGGCTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGGCTCCAGCACTGGAGCTGTCACCAGTGGTCATTATCCCTACTGGTTCCAGCAGAAGCCTGGCCAAGCCCCCAGGACACTGATTTATGATACAAGCAACAAACACTCCTGGACACCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACCCTTTTGGGTGCGCAGCCTGAGGATGAGGCTGAGTATTACTGCTTGCTCTCCTATAGTGGTGCTCGG +>393|IGLV8-61 ENST00000390283|IGLV8-61|5'UTR|IG|IGL|None|00 +GAGGAAAACAAACCCCAGCTGGGAAGCCTGAGAACACTTAGCCTTC +>394|IGLV8-61 ENST00000390283|IGLV8-61|L-REGION+V-REGION|IG|IGL|None|00 +ATGAGTGTCCCCACCATGGCCTGGATGATGCTTCTCCTCGGACTCCTTGCTTATGGATCAGGAGTGGATTCTCAGACTGTGGTGACCCAGGAGCCATCGTTCTCAGTGTCCCCTGGAGGGACAGTCACACTCACTTGTGGCTTGAGCTCTGGCTCAGTCTCTACTAGTTACTACCCCAGCTGGTACCAGCAGACCCCAGGCCAGGCTCCACGCACGCTCATCTACAGCACAAACACTCGCTCTTCTGGGGTCCCTGATCGCTTCTCTGGCTCCATCCTTGGGAACAAAGCTGCCCTCACCATCACGGGGGCCCAGGCAGATGATGAATCTGATTATTACTGTGTGCTGTATATGGGTAGTGGCATTTC +>395|IGLV9-49 ENST00000427632|IGLV9-49|5'UTR|IG|IGL|None|00 +GAGAGACTGAAGAACCCAGCATTGCAGCAGCTCCACC +>396|IGLV9-49 ENST00000427632|IGLV9-49|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCTCTGCTCCTCACCCTCCTCAGTCTCCTCACAGGGTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCTGCATCAGCCTCCCTGGGAGCCTCGGTCACACTCACCTGCACCCTGAGCAGCGGCTACAGTAATTATAAAGTGGACTGGTACCAGCAGAGACCAGGGAAGGGCCCCCGGTTTGTGATGCGAGTGGGCACTGGTGGGATTGTGGGATCCAAGGGGGATGGCATCCCTGATCGCTTCTCAGTCTTGGGCTCAGGCCTGAATCGGTACCTGACCATCAAGAACATCCAGGAAGAGGATGAGAGTGACTACCACTGTGGGGCAGACCATGGCAGTGGGAGCAACTTCGTG +>397|TRAC ENST00000611116|TRAC|C-REGION|TR|TRA|None|00 +ATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>398|TRAJ1 ENST00000390536|TRAJ1|J-REGION|TR|TRA|None|00 +GTATGAAAGTATTACCTCCCAGTTGCAATTTGGCAAAGGAACCAGAGTTTCCACTTCTCCCC +>399|TRAJ10 ENST00000390527|TRAJ10|J-REGION|TR|TRA|None|00 +ATACTCACGGGAGGAGGAAACAAACTCACCTTTGGGACAGGCACTCAGCTAAAAGTGGAACTCA +>400|TRAJ11 ENST00000390526|TRAJ11|J-REGION|TR|TRA|None|00 +TGAATTCAGGATACAGCACCCTCACCTTTGGGAAGGGGACTATGCTTCTAGTCTCTCCAG +>401|TRAJ12 ENST00000390525|TRAJ12|J-REGION|TR|TRA|None|00 +GGATGGATAGCAGCTATAAATTGATCTTCGGGAGTGGGACCAGACTGCTGGTCAGGCCTG +>402|TRAJ13 ENST00000390524|TRAJ13|J-REGION|TR|TRA|None|00 +TGAATTCTGGGGGTTACCAGAAAGTTACCTTTGGAACTGGAACAAAGCTCCAAGTCATCCCAA +>403|TRAJ14 ENST00000390523|TRAJ14|J-REGION|TR|TRA|None|00 +ATTTATAGCACATTCATCTTTGGGAGTGGGACAAGATTATCAGTAAAACCTG +>404|TRAJ16 ENST00000390521|TRAJ16|J-REGION|TR|TRA|None|00 +GGTTTTCAGATGGCCAGAAGCTGCTCTTTGCAAGGGGGACCATGTTAAAGGTGGATCTTA +>405|TRAJ17 ENST00000390520|TRAJ17|J-REGION|TR|TRA|None|00 +TGATCAAAGCTGCAGGCAACAAGCTAACTTTTGGAGGAGGAACCAGGGTGCTAGTTAAACCAA +>406|TRAJ18 ENST00000390519|TRAJ18|J-REGION|TR|TRA|None|00 +CCGACAGAGGCTCAACCCTGGGGAGGCTATACTTTGGAAGAGGAACTCAGTTGACTGTCTGGCCTG +>407|TRAJ19 ENST00000390518|TRAJ19|J-REGION|TR|TRA|None|00 +GCTATCAAAGATTTTACAATTTCACCTTTGGAAAGGGATCCAAACATAATGTCACTCCAA +>408|TRAJ2 ENST00000390535|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGAACAATTGATAAACTCACATTTGGGAAAGGGACCCATGTATTCATTATATCTG +>409|TRAJ20 ENST00000390517|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTAACGACTACAAGCTCAGCTTTGGAGCCGGAACCACAGTAACTGTAAGAGCAA +>410|TRAJ21 ENST00000390516|TRAJ21|J-REGION|TR|TRA|None|00 +TACAACTTCAACAAATTTTACTTTGGATCTGGGACCAAACTCAATGTAAAACCAA +>411|TRAJ22 ENST00000390515|TRAJ22|J-REGION|TR|TRA|None|00 +TTTCTTCTGGTTCTGCAAGGCAACTGACCTTTGGATCTGGGACACAATTGACTGTTTTACCTG +>412|TRAJ23 ENST00000390514|TRAJ23|J-REGION|TR|TRA|None|00 +TGATTTATAACCAGGGAGGAAAGCTTATCTTCGGACAGGGAACGGAGTTATCTGTGAAACCCA +>413|TRAJ24 ENST00000390513|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGACAGCTGGGGGAAATTCCAGTTTGGAGCAGGGACCCAGGTTGTGGTCACCCCAG +>414|TRAJ25 ENST00000390512|TRAJ25|J-REGION|TR|TRA|None|00 +CAGAAGGACAAGGCTTCTCCTTTATCTTTGGGAAGGGGACAAGGCTGCTTGTCAAGCCAA +>415|TRAJ26 ENST00000390511|TRAJ26|J-REGION|TR|TRA|None|00 +GGGATAACTATGGTCAGAATTTTGTCTTTGGTCCCGGAACCAGATTGTCCGTGCTGCCCT +>416|TRAJ27 ENST00000390510|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATGCAGGCAAATCAACCTTTGGGGATGGGACTACGCTCACTGTGAAGCCAA +>417|TRAJ28 ENST00000390509|TRAJ28|J-REGION|TR|TRA|None|00 +CATACTCTGGGGCTGGGAGTTACCAACTCACTTTCGGGAAGGGGACCAAACTCTCGGTCATACCAA +>418|TRAJ29 ENST00000390508|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAACACACCTCTTGTCTTTGGAAAGGGCACAAGACTTTCTGTGATTGCAA +>419|TRAJ3 ENST00000390534|TRAJ3|J-REGION|TR|TRA|None|00 +GGGGTACAGCAGTGCTTCCAAGATAATCTTTGGATCAGGGACCAGACTCAGCATCCGGCCAA +>420|TRAJ30 ENST00000390507|TRAJ30|J-REGION|TR|TRA|None|00 +TGAACAGAGATGACAAGATCATCTTTGGAAAAGGGACACGACTTCATATTCTCCCCA +>421|TRAJ31 ENST00000390506|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAACAATGCCAGACTCATGTTTGGAGATGGAACTCAGCTGGTGGTGAAGCCCA +>422|TRAJ32 ENST00000390505|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGTGGTGCTACAAACAAGCTCATCTTTGGAACTGGCACTCTGCTTGCTGTCCAGCCAA +>423|TRAJ33 ENST00000390504|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTAATCTGGGGCGCTGGGACCAAGCTAATTATAAAGCCAG +>424|TRAJ34 ENST00000390503|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTATAACACCGACAAGCTCATCTTTGGGACTGGGACCAGATTACAAGTCTTTCCAA +>425|TRAJ35 ENST00000390502|TRAJ35|J-REGION|TR|TRA|None|00 +GATAGGCTTTGGGAATGTGCTGCATTGCGGGTCCGGCACTCAAGTGATTGTTTTACCAC +>426|TRAJ36 ENST00000614481|TRAJ36|J-REGION|TR|TRA|None|00 +TCAAACTGGGGCAAACAACCTCTTCTTTGGGACTGGAACGAGACTCACCGTTATTCCCT +>427|TRAJ37 ENST00000612375|TRAJ37|J-REGION|TR|TRA|None|00 +TGGCTCTAGCAACACAGGCAAACTAATCTTTGGGCAAGGGACAACTTTACAAGTAAAACCAG +>428|TRAJ38 ENST00000390499|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGCTGGCAACAACCGTAAGCTGATTTGGGGATTGGGAACAAGCCTGGCAGTAAATCCGA +>429|TRAJ39 ENST00000390498|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGCAACATGCTCACCTTTGGAGGGGGAACAAGGTTAATGGTCAAACCCC +>430|TRAJ4 ENST00000390533|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTTTCTGGTGGCTACAATAAGCTGATTTTTGGAGCAGGGACCAGGCTGGCTGTACACCCAT +>431|TRAJ40 ENST00000390497|TRAJ40|J-REGION|TR|TRA|None|00 +ACTACCTCAGGAACCTACAAATACATCTTTGGAACAGGCACCAGGCTGAAGGTTTTAGCAA +>432|TRAJ41 ENST00000390496|TRAJ41|J-REGION|TR|TRA|None|00 +GAACTCAAATTCCGGGTATGCACTCAACTTCGGCAAAGGCACCTCGCTGTTGGTCACACCCC +>433|TRAJ42 ENST00000390495|TRAJ42|J-REGION|TR|TRA|None|00 +TGAATTATGGAGGAAGCCAAGGAAATCTCATCTTTGGAAAAGGCACTAAACTCTCTGTTAAACCAA +>434|TRAJ43 ENST00000390494|TRAJ43|J-REGION|TR|TRA|None|00 +ACAATAACAATGACATGCGCTTTGGAGCAGGGACCAGACTGACAGTAAAACCAA +>435|TRAJ44 ENST00000390493|TRAJ44|J-REGION|TR|TRA|None|00 +TAAATACCGGCACTGCCAGTAAACTCACCTTTGGGACTGGAACAAGACTTCAGGTCACGCTCG +>436|TRAJ45 ENST00000390492|TRAJ45|J-REGION|TR|TRA|None|00 +TGTATTCAGGAGGAGGTGCTGACGGACTCACCTTTGGCAAAGGGACTCATCTAATCATCCAGCCCT +>437|TRAJ46 ENST00000390491|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAGAAAAGCAGCGGAGACAAGCTGACTTTTGGGACCGGGACTCGTTTAGCAGTTAGGCCCA +>438|TRAJ47 ENST00000390490|TRAJ47|J-REGION|TR|TRA|None|00 +TGGAATATGGAAACAAACTGGTCTTTGGCGCAGGAACCATTCTGAGAGTCAAGTCCT +>439|TRAJ48 ENST00000390489|TRAJ48|J-REGION|TR|TRA|None|00 +TATCTAACTTTGGAAATGAGAAATTAACCTTTGGGACTGGAACAAGACTCACCATCATACCCA +>440|TRAJ49 ENST00000390488|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACCGGTAACCAGTTCTATTTTGGGACAGGGACAAGTTTGACGGTCATTCCAA +>441|TRAJ5 ENST00000390532|TRAJ5|J-REGION|TR|TRA|None|00 +TGGACACGGGCAGGAGAGCACTTACTTTTGGGAGTGGAACAAGACTCCAAGTGCAACCAA +>442|TRAJ50 ENST00000390487|TRAJ50|J-REGION|TR|TRA|None|00 +TGAAAACCTCCTACGACAAGGTGATATTTGGGCCAGGGACAAGCTTATCAGTCATTCCAA +>443|TRAJ52 ENST00000390486|TRAJ52|J-REGION|TR|TRA|None|00 +CTAATGCTGGTGGTACTAGCTATGGAAAGCTGACATTTGGACAAGGGACCATCTTGACTGTCCATCCAA +>444|TRAJ53 ENST00000390485|TRAJ53|J-REGION|TR|TRA|None|00 +AGAATAGTGGAGGTAGCAACTATAAACTGACATTTGGAAAAGGAACTCTCTTAACCGTGAATCCAA +>445|TRAJ54 ENST00000390484|TRAJ54|J-REGION|TR|TRA|None|00 +TAATTCAGGGAGCCCAGAAGCTGGTATTTGGCCAAGGAACCAGGCTGACTATCAACCCAA +>446|TRAJ56 ENST00000390483|TRAJ56|J-REGION|TR|TRA|None|00 +TTATACTGGAGCCAATAGTAAGCTGACATTTGGAAAAGGAATAACTCTGAGTGTTAGACCAG +>447|TRAJ57 ENST00000390482|TRAJ57|J-REGION|TR|TRA|None|00 +TAACTCAGGGCGGATCTGAAAAGCTGGTCTTTGGAAAGGGAACGAAACTGACAGTAAACCCAT +>448|TRAJ58 ENST00000390481|TRAJ58|J-REGION|TR|TRA|None|00 +TTTAAGAAACCAGTGGCTCTAGGTTGACCTTTGGGGAAGGAACACAGCTCACAGTGAATCCTG +>449|TRAJ59 ENST00000390480|TRAJ59|J-REGION|TR|TRA|None|00 +GGAAGGAAGGAAACAGGAAATTTACATTTGGAATGGGGACGCAAGTGAGAGTGA +>450|TRAJ6 ENST00000390531|TRAJ6|J-REGION|TR|TRA|None|00 +TGCATCAGGAGGAAGCTACATACCTACATTTGGAAGAGGAACCAGCCTTATTGTTCATCCGT +>451|TRAJ61 ENST00000390479|TRAJ61|J-REGION|TR|TRA|None|00 +GGTACCGGGTTAATAGGAAACTGACATTTGGAGCCAACACTAGAGGAATCATGAAACTCA +>452|TRAJ7 ENST00000390530|TRAJ7|J-REGION|TR|TRA|None|00 +TGACTATGGGAACAACAGACTCGCTTTTGGGAAGGGGAACCAAGTGGTGGTCATACCAA +>453|TRAJ8 ENST00000390529|TRAJ8|J-REGION|TR|TRA|None|00 +TGAACACAGGCTTTCAGAAACTTGTATTTGGAACTGGCACCTGACTTCTGGTCAGTCCAA +>454|TRAJ9 ENST00000390528|TRAJ9|J-REGION|TR|TRA|None|00 +GGAAATACTGGAGGCTTCAAAACTATCTTTGGAGCAGGAACAAGACTATTTGTTAAAGCAA +>455|TRAV1-1 ENST00000542354|TRAV1-1|5'UTR|TR|TRA|None|00 +CTTCTGCAGACTACAGTGGCTCAGGAACCGGGGATGCAGTGCCAGGCTCATGGTATCCTGCAGCAG +>456|TRAV1-1 ENST00000542354|TRAV1-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGCTTTCCTTCTCTATGTTTCCATGAAGATGGGAGGCACTGCAGGACAAAGCCTTGAGCAGCCCTCTGAAGTGACAGCTGTGGAAGGAGCCATTGTCCAGATAAACTGCACGTACCAGACATCTGGGTTTTATGGGCTGTCCTGGTACCAGCAACATGATGGCGGAGCACCCACATTTCTTTCTTACAATGCTCTGGATGGTTTGGAGGAGACAGGTCGTTTTTCTTCATTCCTTAGTCGCTCTGATAGTTATGGTTACCTCCTTCTACAGGAGCTCCAGATGAAAGACTCTGCCTCTTACTTCTGCGCTGTGAGAGA +>457|TRAV1-2 ENST00000390423|TRAV1-2|5'UTR|TR|TRA|None|00 +CCCACATGAAGTGTCTACCTTCTGCAGACTCCAATGGCTCAGGAACTGGGAATGCAGTGCCAGGCTCGTGGTATCCTGCAGCAG +>458|TRAV1-2 ENST00000390423|TRAV1-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGTTTTCCTTCTTTATGTTTCCATGAAGATGGGAGGCACTACAGGACAAAACATTGACCAGCCCACTGAGATGACAGCTACGGAAGGTGCCATTGTCCAGATCAACTGCACGTACCAGACATCTGGGTTCAACGGGCTGTTCTGGTACCAGCAACATGCTGGCGAAGCACCTACATTTCTGTCTTACAATGTTCTGGATGGTTTGGAGGAGAAAGGTCGTTTTTCTTCATTCCTTAGTCGGTCTAAAGGGTACAGTTACCTCCTTTTGAAGGAGCTCCAGATGAAAGACTCTGCCTCTTACCTCTGTGCT +>459|TRAV10 ENST00000390432|TRAV10|5'UTR|TR|TRA|None|00 +AGTCAACTTCTGGGAGCAGATCTCTGCAGAATAAAA +>460|TRAV10 ENST00000390432|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCATCTGACGACCTTCTTGGTGATTTTGTGGCTTTATTTTTATAGGGGGAATGGCAAAAACCAAGTGGAGCAGAGTCCTCAGTCCCTGATCATCCTGGAGGGAAAGAACTGCACTCTTCAATGCAATTATACAGTGAGCCCCTTCAGCAACTTAAGGTGGTATAAGCAAGATACGGGGAGAGGTCCTGTTTCCCTGACAATCATGACTTTCAGTGAGAACACAAAGTCGAACGGAAGATATACAGCAACTCTGGATGCAGACACAAAGCAAAGCTCTCTGCACATCACAGCCTCCCAGCTCAGCGATTCAGCCTCCTACATCTGTGTGGTGAGCG +>461|TRAV12-1 ENST00000390433|TRAV12-1|5'UTR|TR|TRA|None|00 +ATG +>462|TRAV12-1 ENST00000390433|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGATATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACGGAAGGAGGTGGAGCAGGATCCTGGACCCTTCAATGTTCCAGAGGGAGCCACTGTCGCTTTCAACTGTACTTACAGCAACAGTGCTTCTCAGTCTTTCTTCTGGTACAGACAGGATTGCAGGAAAGAACCTAAGTTGCTGATGTCCGTATACTCCAGTGGTAATGAAGATGGAAGGTTTACAGCACAGCTCAATAGAGCCAGCCAGTATATTTCCCTGCTCATCAGAGACTCCAAGCTCAGTGATTCAGCCACCTACCTCTGTGTGGTGAACA +>463|TRAV12-2 ENST00000390437|TRAV12-2|5'UTR|TR|TRA|None|00 +AAAGCAGATTCTTTTTATGATTTTTAAAGTAGAAATATCCATTCTAGGTGCATTTTTTAAGGGTTTAAAATTTGAATCCTCAGTGAACCAGGGCAGAGAAGAATG +>464|TRAV12-2 ENST00000390437|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGAGTTTTACTAGTGATCCTGTGGCTTCAGTTGAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGAATTCTGGACCCCTCAGTGTTCCAGAGGGAGCCATTGCCTCTCTCAACTGCACTTACAGTGACCGAGGTTCCCAGTCCTTCTTCTGGTACAGACAATATTCTGGGAAAAGCCCTGAGTTGATAATGTTCATATACTCCAATGGTGACAAAGAAGATGGAAGGTTTACAGCACAGCTCAATAAAGCCAGCCAGTATGTTTCTCTGCTCATCAGAGACTCCCAGCCCAGTGATTCAGCCACCTACCTCTGTGCCGTGAACA +>465|TRAV12-3 ENST00000390442|TRAV12-3|5'UTR|TR|TRA|None|00 +ATTATTTTTTTTTCGTGTTTAAGGTTTGAATCCTCAGTGAACCAGGGCAGAAAAGA +>466|TRAV12-3 ENST00000390442|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGGATCCTGGACCACTCAGTGTTCCAGAGGGAGCCATTGTTTCTCTCAACTGCACTTACAGCAACAGTGCTTTTCAATACTTCATGTGGTACAGACAGTATTCCAGAAAAGGCCCTGAGTTGCTGATGTACACATACTCCAGTGGTAACAAAGAAGATGGAAGGTTTACAGCACAGGTCGATAAATCCAGCAAGTATATCTCCTTGTTCATCAGAGACTCACAGCCCAGTGATTCAGCCACCTACCTCTGTGCAATGAGCG +>467|TRAV13-1 ENST00000390436|TRAV13-1|5'UTR|TR|TRA|None|00 +GATCTTAATTGGGAAGAACAAGG +>468|TRAV13-1 ENST00000390436|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACATCCATTCGAGCTGTATTTATATTCCTGTGGCTGCAGCTGGACTTGGTGAATGGAGAGAATGTGGAGCAGCATCCTTCAACCCTGAGTGTCCAGGAGGGAGACAGCGCTGTTATCAAGTGTACTTATTCAGACAGTGCCTCAAACTACTTCCCTTGGTATAAGCAAGAACTTGGAAAAGGACCTCAGCTTATTATAGACATTCGTTCAAATGTGGGCGAAAAGAAAGACCAACGAATTGCTGTTACATTGAACAAGACAGCCAAACATTTCTCCCTGCACATCACAGAGACCCAACCTGAAGACTCGGCTGTCTACTTCTGTGCAGCAAGTA +>469|TRAV13-2 ENST00000390439|TRAV13-2|5'UTR|TR|TRA|None|00 +CGATGATGGAAGTAGCTCTTATGGCTGGAGATTGCAGGTTTATGACTGATCCTATTTGGGAAGAACAATG +>470|TRAV13-2 ENST00000390439|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCAGGCATTCGAGCTTTATTTATGTACTTGTGGCTGCAGCTGGACTGGGTGAGCAGAGGAGAGAGTGTGGGGCTGCATCTTCCTACCCTGAGTGTCCAGGAGGGTGACAACTCTATTATCAACTGTGCTTATTCAAACAGCGCCTCAGACTACTTCATTTGGTACAAGCAAGAATCTGGAAAAGGTCCTCAATTCATTATAGACATTCGTTCAAATATGGACAAAAGGCAAGGCCAAAGAGTCACCGTTTTATTGAATAAGACAGTGAAACATCTCTCTCTGCAAATTGCAGCTACTCAACCTGGAGACTCAGCTGTCTACTTTTGTGCAGAGAATA +>471|TRAV14/DV4 ENST00000390440|TRAV14/DV4|5'UTR|TR|TRA|None|00 +GCCAGGTTCACTTCACAGTACAGAGTCCTGAAAATAAAGAAGAAAATTTTTTTTTATCTAGAAAAAGAACCAAAC +>472|TRAV14/DV4 ENST00000390440|TRAV14/DV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGTCACTTTCTAGCCTGCTGAAGGTGGTCACAGCTTCACTGTGGCTAGGACCTGGCATTGCCCAGAAGATAACTCAAACCCAACCAGGAATGTTCGTGCAGGAAAAGGAGGCTGTGACTCTGGACTGCACATATGACACCAGTGATCCAAGTTATGGTCTATTCTGGTACAAGCAGCCCAGCAGTGGGGAAATGATTTTTCTTATTTATCAGGGGTCTTATGACCAGCAAAATGCAACAGAAGGTCGCTACTCATTGAATTTCCAGAAGGCAAGAAAATCCGCCAACCTTGTCATCTCCGCTTCACAACTGGGGGACTCAGCAATGTACTTCTGTGCAATGAGAGAGGG +>473|TRAV16 ENST00000390444|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCCCACCCTCATCTCAGTGCTTGTGATAATATTTATACTCAGAGGAACAAGAGCCCAGAGAGTGACTCAGCCCGAGAAGCTCCTCTCTGTCTTTAAAGGGGCCCCAGTGGAGCTGAAGTGCAACTATTCCTATTCTGGGAGTCCTGAACTCTTCTGGTATGTCCAGTACTCCAGACAACGCCTCCAGTTACTCTTGAGACACATCTCTAGAGAGAGCATCAAAGGCTTCACTGCTGACCTTAACAAAGGCGAGACATCTTTCCACCTGAAGAAACCATTTGCTCAAGAGGAAGACTCAGCCATGTATTACTGTGCTCTAAGTGG +>474|TRAV17 ENST00000390445|TRAV17|5'UTR|TR|TRA|None|00 +AGGACTGAGCTTGCCTGTGACTGGCTAGGGAGGAACCTGAGACTAGGGGACAGAAAGACTAGGGATTCACCCAGTAAAGAGAGCTCATCTGTGACTGAGGAGCCTTGCTCCATTTCAGGTCTTCTGTGATTTCAATAAGGAAGAAGA +>475|TRAV17 ENST00000390445|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAAACTCTCCTGGGAGTGTCTTTGGTGATTCTATGGCTTCAACTGGCTAGGGTGAACAGTCAACAGGGAGAAGAGGATCCTCAGGCCTTGAGCATCCAGGAGGGTGAAAATGCCACCATGAACTGCAGTTACAAAACTAGTATAAACAATTTACAGTGGTATAGACAAAATTCAGGTAGAGGCCTTGTCCACCTAATTTTAATACGTTCAAATGAAAGAGAGAAACACAGTGGAAGATTAAGAGTCACGCTTGACACTTCCAAGAAAAGCAGTTCCTTGTTGATCACGGCTTCCCGGGCAGCAGACACTGCTTCTTACTTCTGTGCTACGGACG +>476|TRAV18 ENST00000390446|TRAV18|5'UTR|TR|TRA|None|00 +GATTTTGTAGAAGATTCCGCCAAAGACTCAACAACATAAAGAAATATATATACCTTTCGGTTTGGATATCTCTCAACAAAACCTTCTACTGCTTCTCAGCCAGCC +>477|TRAV18 ENST00000390446|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGTCTGCTTCCTGCTCAGGACTTGTGATCTTGTTGATATTCAGAAGGACCAGTGGAGACTCGGTTACCCAGACAGAAGGCCCAGTTACCCTCCCTGAGAGGGCAGCTCTGACATTAAACTGCACTTATCAGTCCAGCTATTCAACTTTTCTATTCTGGTATGTCCAGTATCTAAACAAAGAGCCTGAGCTCCTCCTGAAAAGTTCAGAAAACCAGGAGACGGACAGCAGAGGTTTTCAGGCCAGTCCTATCAAGAGTGACAGTTCCTTCCACCTGGAGAAGCCCTCGGTGCAGCTGTCGGACTCTGCCGTGTACTACTGCGCTCTGAGAGA +>478|TRAV19 ENST00000390447|TRAV19|5'UTR|TR|TRA|None|00 +CAGAAGCCTCACACAGCCCAGTAACTTTGCTAGTACCTCTTGAGTGCAAGGTGGAGAATTAAGATCTGGATTTGAGACGGAGCACGGAACATTTCACTCAGGGGAAGAGCTATGAAC +>479|TRAV19 ENST00000390447|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGACTGCCAGCCTGTTGAGGGCAGTCATAGCCTCCATCTGTGTTGTATCCAGCATGGCTCAGAAGGTAACTCAAGCGCAGACTGAAATTTCTGTGGTGGAGAAGGAGGATGTGACCTTGGACTGTGTGTATGAAACCCGTGATACTACTTATTACTTATTCTGGTACAAGCAACCACCAAGTGGAGAATTGGTTTTCCTTATTCGTCGGAACTCTTTTGATGAGCAAAATGAAATAAGTGGTCGGTATTCTTGGAACTTCCAGAAATCCACCAGTTCCTTCAACTTCACCATCACAGCCTCACAAGTCGTGGACTCAGCAGTATACTTCTGTGCTCTGAGTGAGGC +>480|TRAV2 ENST00000390424|TRAV2|5'UTR|TR|TRA|None|00 +CATTTTGGCC +>481|TRAV2 ENST00000390424|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTGCAGAGCACTCTGGGGGCGGTGTGGCTAGGGCTTCTCCTCAACTCTCTCTGGAAGGTTGCAGAAAGCAAGGACCAAGTGTTTCAGCCTTCCACAGTGGCATCTTCAGAGGGAGCTGTGGTGGAAATCTTCTGTAATCACTCTGTGTCCAATGCTTACAACTTCTTCTGGTACCTTCACTTCCCGGGATGTGCACCAAGACTCCTTGTTAAAGGCTCAAAGCCTTCTCAGCAGGGACGATACAACATGACCTATGAACGGTTCTCTTCATCGCTGCTCATCCTCCAGGTGCGGGAGGCAGATGCTGCTGTTTACTACTGTGCTGTGGAGGA +>482|TRAV20 ENST00000390448|TRAV20|5'UTR|TR|TRA|None|00 +ACAGAAGTGGCGCCTCTGAGAAAAGAAGGTTGGAATTATCGTAATTTGTTTCTAGGCTGAGATACCAGC +>483|TRAV20 ENST00000390448|TRAV20|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAAATGTTGGAGTGTGCATTCATAGTCTTGTGGCTTCAGCTTGGCTGGTTGAGTGGAGAAGACCAGGTGACGCAGAGTCCCGAGGCCCTGAGACTCCAGGAGGGAGAGAGTAGCAGTCTCAACTGCAGTTACACAGTCAGCGGTTTAAGAGGGCTGTTCTGGTATAGGCAAGATCCTGGGAAAGGCCCTGAATTCCTCTTCACCCTGTATTCAGCTGGGGAAGAAAAGGAGAAAGAAAGGCTAAAAGCCACATTAACAAAGAAGGAAAGCTTTCTGCACATCACAGCCCCTAAACCTGAAGACTCAGCCACTTATCTCTGTGCTGTGCAGG +>484|TRAV21 ENST00000390449|TRAV21|5'UTR|TR|TRA|None|00 +AGAAGGA +>485|TRAV21 ENST00000390449|TRAV21|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACCCTCTTGGGCCTGCTTATCCTTTGGCTGCAGCTGCAATGGGTGAGCAGCAAACAGGAGGTGACGCAGATTCCTGCAGCTCTGAGTGTCCCAGAAGGAGAAAACTTGGTTCTCAACTGCAGTTTCACTGATAGCGCTATTTACAACCTCCAGTGGTTTAGGCAGGACCCTGGGAAAGGTCTCACATCTCTGTTGCTTATTCAGTCAAGTCAGAGAGAGCAAACAAGTGGAAGACTTAATGCCTCGCTGGATAAATCATCAGGACGTAGTACTTTATACATTGCAGCTTCTCAGCCTGGTGACTCAGCCACCTACCTCTGTGCTGTGAGG +>486|TRAV22 ENST00000390450|TRAV22|5'UTR|TR|TRA|None|00 +GGCTTTGTCGGGTGGAGCTGATTGGTTGCAGGAGCAGCAACAGTTCCAGAGCCAAGTCATGACACCGACCTCCCCAAGGTTTAGTTAAATATATCTTATGGTGAAAATGCCCGGAGCAAGAAGGCAAAGCATC +>487|TRAV22 ENST00000390450|TRAV22|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGATATTGGGAGCTCTGCTGGGGCTCTTGAGTGCCCAGGTTTGCTGTGTGAGAGGAATACAAGTGGAGCAGAGTCCTCCAGACCTGATTCTCCAGGAGGGAGCCAATTCCACGCTGCGGTGCAATTTTTCTGACTCTGTGAACAATTTGCAGTGGTTTCATCAAAACCCTTGGGGACAGCTCATCAACCTGTTTTACATTCCCTCAGGGACAAAACAGAATGGAAGATTAAGCGCCACGACTGTCGCTACGGAACGCTACAGCTTATTGTACATTTCCTCTTCCCAGACCACAGACTCAGGCGTTTATTTCTGTGCTGTGGAGC +>488|TRAV23/DV6 ENST00000390451|TRAV23/DV6|5'UTR|TR|TRA|None|00 +CTGGAAGACCACCTGGGCTGTCATTGAGCTCTGGTGCCAGGAGGA +>489|TRAV23/DV6 ENST00000390451|TRAV23/DV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCTTAGGAGCATCATTTTTAGTTCTGTGGCTTCAACTATGCTGGGTGAGTGGCCAACAGAAGGAGAAAAGTGACCAGCAGCAGGTGAAACAAAGTCCTCAATCTTTGATAGTCCAGAAAGGAGGGATTTCAATTATAAACTGTGCTTATGAGAACACTGCGTTTGACTACTTTCCATGGTACCAACAATTCCCTGGGAAAGGCCCTGCATTATTGATAGCCATACGTCCAGATGTGAGTGAAAAGAAAGAAGGAAGATTCACAATCTCCTTCAATAAAAGTGCCAAGCAGTTCTCATCGCATATCATGGATTCCCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGCA +>490|TRAV24 ENST00000390453|TRAV24|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGAATCCTTTGGCAGCCCCATTACTAATCCTCTGGTTTCATCTTGACTGCGTGAGCAGCATACTGAACGTGGAACAAAGTCCTCAGTCACTGCATGTTCAGGAGGGAGACAGCACCAATTTCACCTGCAGCTTCCCTTCCAGCAATTTTTATGCCTTACACTGGTACAGATGGGAAACTGCAAAAAGCCCCGAGGCCTTGTTTGTAATGACTTTAAATGGGGATGAAAAGAAGAAAGGACGAATAAGTGCCACTCTTAATACCAAGGAGGGTTACAGCTATTTGTACATCAAAGGATCCCAGCCTGAAGACTCAGCCACATACCTCTGTGCCTTTA +>491|TRAV25 ENST00000390454|TRAV25|5'UTR|TR|TRA|None|00 +ACTATTTCTATTGATCTGGAAGAAGCTTGTACCAGGCAACCCATTTAGGAGAAGTTGGATGAAGAGGGAGAGGGAG +>492|TRAV25 ENST00000390454|TRAV25|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTACTCATCACATCAATGTTGGTCTTATGGATGCAATTGTCACAGGTGAATGGACAACAGGTAATGCAAATTCCTCAGTACCAGCATGTACAAGAAGGAGAGGACTTCACCACGTACTGCAATTCCTCAACTACTTTAAGCAATATACAGTGGTATAAGCAAAGGCCTGGTGGACATCCCGTTTTTTTGATACAGTTAGTGAAGAGTGGAGAAGTGAAGAAGCAGAAAAGACTGACATTTCAGTTTGGAGAAGCAAAAAAGAACAGCTCCCTGCACATCACAGCCACCCAGACTACAGATGTAGGAACCTACTTCTGTGCAGGG +>493|TRAV26-1 ENST00000390455|TRAV26-1|5'UTR|TR|TRA|None|00 +AGGAACATGACTAAACCTGGGGAGGAAGACATAGAAAAGCAACTGCTCTATCATTGGCTGACAAGATCCTGACAACAACACAATGAGAGCTGCACTCCTTGCAAGTCTTTACTAGTAGCTGTTGCTTCTGTTCTCTGGAAATTCTTTAAACCTAGAATCAGACACAAAAACTGAACTCTGGGTCCACAATCCTCATTTGTCCTTGAAGT +>494|TRAV26-1 ENST00000390455|TRAV26-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCTGGTGGCAAGAGTAACTGTGTTTCTGACCTTTGGAACTATAATTGATGCTAAGACCACCCAGCCCACCTCCATGGATTGCGCTGAAGGAAGAGCTGCAAACCTGCCTTGTAATCACTCTACCATCAGTGGAAATGAGTATGTGTATTGGTATCGACAGATTCACTCCCAGGGGCCACAGTATATCATTCATGGTCTAAAAAACAATGAAACCAATGAAATGGCCTCTCTGATCATCACAGAAGACAGAAAGTCCAGCACCTTGATCCTGCCCCACGCTACGCTGAGAGACACTGCTGTGTACTATTGCATCGTCAGAGTCG +>495|TRAV26-2 ENST00000390460|TRAV26-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTTGGTGACAAGCATTACTGTACTCCTATCTTTGGGTATTATGGGTGATGCTAAGACCACACAGCCAAATTCAATGGAGAGTAACGAAGAAGAGCCTGTTCACTTGCCTTGTAACCACTCCACAATCAGTGGAACTGATTACATACATTGGTATCGACAGCTTCCCTCCCAGGGTCCAGAGTACGTGATTCATGGTCTTACAAGCAATGTGAACAACAGAATGGCCTCTCTGGCAATCGCTGAAGACAGAAAGTCCAGTACCTTGATCCTGCACCGTGCTACCTTGAGAGATGCTGCTGTGTACTACTGCATCCTGAGAGAC +>496|TRAV27 ENST00000390457|TRAV27|5'UTR|TR|TRA|None|00 +AAGCACTCTTCTAGCCCAGAGAAGTCTGTTCCAGGACGGGCTCTTTCAGGAGCAGCTAAAGTCAGGGGCCATGTCCACCATGTGATAGAAAGACAAG +>497|TRAV27 ENST00000390457|TRAV27|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTCCTGAAATTCTCCGTGTCCATTCTTTGGATTCAGTTGGCATGGGTGAGCACCCAGCTGCTGGAGCAGAGCCCTCAGTTTCTAAGCATCCAAGAGGGAGAAAATCTCACTGTGTACTGCAACTCCTCAAGTGTTTTTTCCAGCTTACAATGGTACAGACAGGAGCCTGGGGAAGGTCCTGTCCTCCTGGTGACAGTAGTTACGGGTGGAGAAGTGAAGAAGCTGAAGAGACTAACCTTTCAGTTTGGTGATGCAAGAAAGGACAGTTCTCTCCACATCACTGCAGCCCAGACTGGTGATACAGGCCTCTACCTCTGTGCAGGAG +>498|TRAV29/DV5 ENST00000390458|TRAV29/DV5|5'UTR|TR|TRA|None|00 +ATATGTAAAATGAAGGGTCTGTGGAAGGACATGAATAAAGCACAGGAGGTTGAAGTCAGATTTGCAGCTTTCTAGGCAGGAGATAAGACAATCTGCATCTTCACAGGAGGG +>499|TRAV29/DV5 ENST00000390458|TRAV29/DV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCATGCTCCTGGGGGCATCAGTGCTGATTCTGTGGCTTCAGCCAGACTGGGTAAACAGTCAACAGAAGAATGATGACCAGCAAGTTAAGCAAAATTCACCATCCCTGAGCGTCCAGGAAGGAAGAATTTCTATTCTGAACTGTGACTATACTAACAGCATGTTTGATTATTTCCTATGGTACAAAAAATACCCTGCTGAAGGTCCTACATTCCTGATATCTATAAGTTCCATTAAGGATAAAAATGAAGATGGAAGATTCACTGTTTTCTTAAACAAAAGTGCCAAGCACCTCTCTCTGCACATTGTGCCCTCCCAGCCTGGAGACTCTGCAGTGTACTTCTGTGCAGCAAGCG +>500|TRAV3 ENST00000390425|TRAV3|5'UTR|TR|TRA|None|00 +CCGGTGTCGGGAAGCACCAGTGCCCTGAGGAAGGGCCATTTCCAAAAGCCCTGTGCTGACACAGGGTTGCTGGTTCCTCTTCAAGAGCCCACTCTCTGGGGTGGGGCCATATCTCCAGCAGAGGTGGGCTGGAAAGGACCCCCCCAATCCCGCCCGCCGTGAGCTTAGCTGGAGCC +>501|TRAV3 ENST00000390425|TRAV3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCTCTGCACCCATCTCGATGCTTGCGATGCTCTTCACATTGAGTGGGCTGAGAGCTCAGTCAGTGGCTCAGCCGGAAGATCAGGTCAACGTTGCTGAAGGGAATCCTCTGACTGTGAAATGCACCTATTCAGTCTCTGGAAACCCTTATCTTTTTTGGTATGTTCAATACCCCAACCGAGGCCTCCAGTTCCTTCTGAAATACATCACAGGGGATAACCTGGTTAAAGGCAGCTATGGCTTTGAAGCTGAATTTAACAAGAGCCAAACCTCCTTCCACCTGAAGAAACCATCTGCCCTTGTGAGCGACTCCGCTTTGTACTTCTGTGCTGTGAGAGACA +>502|TRAV30 ENST00000557168|TRAV30|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTCTCCTGAAAGTGCTTTCAGGCACCTTGTTGTGGCAGTTGACCTGGGTGAGAAGCCAACAACCAGTGCAGAGTCCTCAAGCCGTGATCCTCCGAGAAGGGGAAGATGCTGTCATCAACTGCAGTTCCTCCAAGGCTTTATATTCTGTACACTGGTACAGGCAGAAGCATGGTGAAGCACCCGTCTTCCTGATGATATTACTGAAGGGTGGAGAACAGAAGGGTCATGACAAAATATCTGCTTCATTTAATGAAAAAAAGCAGCAAAGCTCCCTGTACCTTACGGCCTCCCAGCTCAGTTACTCAGGAACCTACTTCTGCGGCACAGAGA +>503|TRAV34 ENST00000390461|TRAV34|5'UTR|TR|TRA|None|00 +AATAGCTAAGGG +>504|TRAV34 ENST00000390461|TRAV34|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTGTTCTGCAAGTACTCCTAGGGATATTGGGGTTCCAAGCAGCCTGGGTCAGTAGCCAAGAACTGGAGCAGAGTCCTCAGTCCTTGATCGTCCAAGAGGGAAAGAATCTCACCATAAACTGCACGTCATCAAAGACGTTATATGGCTTATACTGGTATAAGCAAAAGTATGGTGAAGGTCTTATCTTCTTGATGATGCTACAGAAAGGTGGGGAAGAGAAAAGTCATGAAAAGATAACTGCCAAGTTGGATGAGAAAAAGCAGCAAAGTTCCCTGCATATCACAGCCTCCCAGCCCAGCCATGCAGGCATCTACCTCTGTGGAGCAGACA +>505|TRAV35 ENST00000390462|TRAV35|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTTGAACATTTATTAATAATCTTGTGGATGCAGCTGACATGGGTCAGTGGTCAACAGCTGAATCAGAGTCCTCAATCTATGTTTACCCAGGAAGGAGAAGATGTCTCCATGAACTGCACTTCTTCAAGCATATTTAACACCTGACTATGGTACAAGCAGGACCCTGGGGAAGGTCCTGTCCTCTTGATAGCCTTATATAAGGCTGGTGAATTGACCTCAAATGGAAGACTGACTGCTCAGTTTGGTATAACCAGAAAGGACAGCTTCCTGAATATCTCAGCATCCATACCTAGTGATGTAGGCATCTACTTCTGTGCTGGGCAG +>506|TRAV36/DV7 ENST00000390463|TRAV36/DV7|5'UTR|TR|TRA|None|00 +ACTTGATAACTGAAGG +>507|TRAV36/DV7 ENST00000390463|TRAV36/DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAGTGTCCACAGGCTTTACTAGCTATCTTTTGGCTTCTACTGAGCTGGGTGAGCAGTGAAGACAAGGTGGTACAAAGCCCTCTATCTCTGGTTGTCCACGAGGGAGACACCGTAACTCTCAATTGCAGTTATGAAGTGACTAACTTTCGAAGCCTACTATGGTACAAGCAGGAAAAGAAAGCTCCCACATTTCTATTTATGCTAACTTCAAGTGGAATTGAAAAGAAGTCAGGAAGACTAAGTAGCATATTAGATAAGAAAGAACTTTTCAGCATCCTGAACATCACAGCCACCCAGACCGGAGACTCGGCCATCTACCTCTGTGCTGTGGAGG +>508|TRAV38-1 ENST00000390464|TRAV38-1|5'UTR|TR|TRA|None|00 +AGC +>509|TRAV38-1 ENST00000390464|TRAV38-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACACGAGTTAGCTTGCTGTGGGCAGTCGTGGTCTCCACCTGTCTTGAATCCGGCATGGCCCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACTGTGACCCTGAGTTGCACATATGACACCAGTGAGAATAATTATTATTTGTTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACGGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGACACTGCGATGTATTTCTGTGCTTTCATGAAGCA +>510|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|5'UTR|TR|TRA|None|00 +AGATCAGAAGAGGAGGCTTCTCACCCTGCAGCAGGGACCTGTGAGC +>511|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCATGCCCTGGCTTCCTGTGGGCACTTGTGATCTCCACCTGTCTTGAATTTAGCATGGCTCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACCGTGACCCTGAGCTGCACATATGACACCAGTGAGAGTGATTATTATTTATTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACAGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGATGCCGCGATGTATTTCTGTGCTTATAGGAGCG +>512|TRAV39 ENST00000390466|TRAV39|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAAGCTACTAGCAATGATTCTGTGGCTTCAACTAGACCGGTTAAGTGGAGAGCTGAAAGTGGAACAAAACCCTCTGTTCCTGAGCATGCAGGAGGGAAAAAACTATACCATCTACTGCAATTATTCAACCACTTCAGACAGACTGTATTGGTACAGGCAGGATCCTGGGAAAAGTCTGGAATCTCTGTTTGTGTTGCTATCAAATGGAGCAGTGAAGCAGGAGGGACGATTAATGGCCTCACTTGATACCAAAGCCCGTCTCAGCACCCTCCACATCACAGCTGCCGTGCATGACCTCTCTGCCACCTACTTCTGTGCCGTGGACA +>513|TRAV4 ENST00000390426|TRAV4|5'UTR|TR|TRA|None|00 +CTGGGCTCATTGCAGCTCAGACACAGCAAAAGAGCCTAGAACCTGGGTCCTAGTTTGCACCTAGAAT +>514|TRAV4 ENST00000390426|TRAV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCAAGTGGCGAGAGTGATCGTGTTCCTGACCCTGAGTACTTTGAGCCTTGCTAAGACCACCCAGCCCATCTCCATGGACTCATATGAAGGACAAGAAGTGAACATAACCTGTAGCCACAACAACATTGCTACAAATGATTATATCACGTGGTACCAACAGTTTCCCAGCCAAGGACCACGATTTATTATTCAAGGATACAAGACAAAAGTTACAAACGAAGTGGCCTCCCTGTTTATCCCTGCCGACAGAAAGTCCAGCACTCTGAGCCTGCCCCGGGTTTCCCTGAGCGACACTGCTGTGTACTACTGCCTCGTGGGTGACA +>515|TRAV40 ENST00000390467|TRAV40|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCCTCTCTGGACTTTCTAATTCTGATCTTAATGTTTGGAGGAACCAGCAGCAATTCAGTCAAGCAGACGGGCCAAATAACCGTCTCGGAGGGAGCATCTGTGACTATGAACTGCACATACACATCCACGGGGTACCCTACCCTTTTCTGGTATGTGGAATACCCCAGCAAACCTCTGCAGCTTCTTCAGAGAGAGACAATGGAAAACAGCAAAAACTTCGGAGGCGGAAATATTAAAGACAAAAACTCCCCCATTGTGAAATATTCAGTCCAGGTATCAGACTCAGCCGTGTACTACTGTCTTCTGGGAGA +>516|TRAV41 ENST00000390468|TRAV41|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTGAAGATCCGGCAATTTTTGTTGGCTATTTTGTGGCTTCAGCTAAGCTGTGTAAGTGCCGCCAAAAATGAAGTGGAGCAGAGTCCTCAGAACCTGACTGCCCAGGAAGGAGAATTTATCACAATCAACTGCAGTTACTCGGTAGGAATAAGTGCCTTACACTGGCTGCAACAGCATCCAGGAGGAGGCATTGTTTCCTTGTTTATGCTGAGCTCAGGGAAGAAGAAGCATGGAAGATTAATTGCCACAATAAACATACAGGAAAAGCACAGCTCCCTGCACATCACAGCCTCCCATCCCAGAGACTCTGCCGTCTACATCTGTGCTGTCAGA +>517|TRAV5 ENST00000390427|TRAV5|5'UTR|TR|TRA|None|00 +GTGGGGAGAACA +>518|TRAV5 ENST00000390427|TRAV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATTTGCTGGATTTTCGTTCCTGTTTTTGTGGCTGCAGCTGGACTGTATGAGTAGAGGAGAGGATGTGGAGCAGAGTCTTTTCCTGAGTGTCCGAGAGGGAGACAGCTCCGTTATAAACTGCACTTACACAGACAGCTCCTCCACCTACTTATACTGGTATAAGCAAGAACCTGGAGCAGGTCTCCAGTTGCTGACGTATATTTTTTCAAATATGGACATGAAACAAGACCAAAGACTCACTGTTCTATTGAATAAAAAGGATAAACATCTGTCTCTGCGCATTGCAGACACCCAGACTGGGGACTCAGCTATCTACTTCTGTGCAGAGAGTA +>519|TRAV6 ENST00000390428|TRAV6|5'UTR|TR|TRA|None|00 +AAACAGA +>520|TRAV6 ENST00000390428|TRAV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTTTGGCTGAGAAGCCTGGGTCTACATTTCAGGCCACATTTGGGGAGACGAATGGAGTCATTCCTGGGAGGTGTTTTGCTGATTTTGTGGCTTCAAGTGGACTGGGTGAAGAGCCAAAAGATAGAACAGAATTCCGAGGCTCTGAACATTCAGGAGGGTAAAACGGCCACCCTGACCTGCAACTATACAAACTATTCTCCAGCATACTTACAGTGGTACCGACAAGATCCAGGAAGAGGCCCTGTTTTCTTGCTACTCATACGTGAAAATGAGAAAGAAAAAAGGAAAGAAAGACTGAAGGTCACCTTTGATACCACCCTTAAACAGAGTTTGTTTCATATCACAGCCTCCCAGCCTGCAGACTCAGCTACCTACCTCTGTGCTCTAGACA +>521|TRAV7 ENST00000390429|TRAV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGATGCGGAGACCTGTCCTAATTATATTTTGTCTATGTCTTGGCTGGGCAAATGGAGAAAACCAGGTGGAGCACAGCCCTCATTTTCTGGGACCCCAGCAGGGAGACGTTGCCTCCATGAGCTGCACGTACTCTGTCAGTCGTTTTAACAATTTGCAGTGGTACAGGCAAAATACAGGGATGGGTCCCAAACACCTATTATCCATGTATTCAGCTGGATATGAGAAGCAGAAAGGAAGACTAAATGCTACATTACTGAAGAATGGAAGCAGCTTGTACATTACAGCCGTGCAGCCTGAAGATTCAGCCACCTATTTCTGTGCTGTAGATG +>522|TRAV8-1 ENST00000390430|TRAV8-1|5'UTR|TR|TRA|None|00 +CCAAAACAAGAGACTTGCCTAGCCCAACCTTCCTCACGCTCGCTATTCTCAAGACCTGGGTTCCAGCCACTTTCCTACTGGCCCCGAGGAGAATTTCCAAAGAGACGCCTGCAGTGTTTCCACAGCTCAGCC +>523|TRAV8-1 ENST00000390430|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGTTGCTCATACCAGTGCTGGGGATGATTTTTGCCCTGAGAGATGCCAGAGCCCAGTCTGTGAGCCAGCATAACCACCACGTAATTCTCTCTGAAGCAGCCTCACTGGAGTTGGGATGCAACTATTCCTATGGTGGAACTGTTAATCTCTTCTGGTATGTCCAGTACCCTGGTCAACACCTTCAGCTTCTCCTCAAGTACTTTTCAGGGGATCCACTGGTTAAAGGCATCAAGGGCTTTGAGGCTGAATTTATAAAGAGTAAATTCTCCTTTAATCTGAGGAAACCCTCTGTGCAGTGGAGTGACACAGCTGAGTACTTCTGTGCCGTGAATGC +>524|TRAV8-2 ENST00000390434|TRAV8-2|5'UTR|TR|TRA|None|00 +GGCTGATGTAGCTCACTGATGTCTGTGTAGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGACTCCTTAAGAGAAAGCCTTTCTGTTTTGGAAACTTTTCAAAGCCAGGGACTTGTCCAGCCCAACCTCCCCATTGCTCCTAGCTCCCGAGGCTCAGGACCCCTGGCTTCTGTCCTCCCTGCTCAGGGTCCTGCAGCGTTGCCTCTGCTCAGCC +>525|TRAV8-2 ENST00000390434|TRAV8-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGACAGCCACGTCTCTGTCTCTGAAGGAACCCCGGTGCTGCTGAGGTGCAACTACTCATCTTCTTATTCACCGTCTCTCTTCTGGTATGTGCAACACCCCAACAAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGTTGTGAGTGA +>526|TRAV8-3 ENST00000390435|TRAV8-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGAGCTTATCCCACTGCTGGGGATACATTTTGTCCTGAGAACTGCCAGAGCCCAGTCAGTGACCCAGCCTGACATCCACATCACTGTCTCTGAAGGAGCCTCACTGGAGTTGAGATGTAACTATTCCTATGGGGCAACACCTTATCTCTTCTGGTATGTCCAGTCCCCCGGCCAAGGCCTCCAGCTGCTCCTGAAGTACTTTTCAGGAGACACTCTGGTTCAAGGCATTAAAGGCTTTGAGGCTGAATTTAAGAGGAGTCAATCTTCCTTCAATCTGAGGAAACCCTCTGTGCATTGGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGC +>527|TRAV8-4 ENST00000390438|TRAV8-4|5'UTR|TR|TRA|None|00 +TTTTGAAACCCTTCAAAGGCAGAGACTTGTCCAGCCTAACCTGCCTGCTGCTCCTAGCTCCTGAGGCTCAGGGCCCTTGGCTTCTGTCCGCTCTGCTCAGGGCCCTCCAGCGTGGCCACTGCTCAGCC +>528|TRAV8-4 ENST00000390438|TRAV8-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGGCAGCCACGTCTCTGTCTCTGAAGGAGCCCTGGTTCTGCTGAGGTGCAACTACTCATCGTCTGTTCCACCATATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGCTGTGAGTGA +>529|TRAV8-6 ENST00000390443|TRAV8-6|5'UTR|TR|TRA|None|00 +GTAGCTCGTTGATGTCTGTGTGGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGGCTCCTTAAGGGAAAGCCTCTTTCTGTTTCTGAAACTTTTCAAAGCCAGGGACTTGTCCAATCCAACCTCCTCACAGTTCCTAGCTCCTGAGGCTCAGCGCCCTTGGCTTCTGTCCGCCCAGCTTAAGGTCCTGCAGCATTGCCACTGCTCAGCC +>530|TRAV8-6 ENST00000390443|TRAV8-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGCGTTCCAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCTGTGACCCAGCTTGACAGCCAAGTCCCTGTCTTTGAAGAAGCCCCTGTGGAGCTGAGGTGCAACTACTCATCGTCTGTTTCAGTGTATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTATTTATCAGGATCCACCCTGGTTGAAAGCATCAACGGTTTTGAGGCTGAATTTAACAAGAGTCAAACTTCCTTCCACTTGAGGAAACCCTCAGTCCATATAAGCGACACGGCTGAGTACTTCTGTGCTGTGAGTGA +>531|TRAV8-7 ENST00000390456|TRAV8-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCTTAGTGGTCATTCTGCTGCTTGGAATGTTCTTCACACTGAGTAAAACCCAGTCGGTGACCCAGCTTGATGGCCACATCACTGTCTCTGAAGAAGCCCCTCTGGAACTGAAGTGCAACTATTCCTATAGTGGAGTTCCTTCTCTCTTCTGGTATGTCCAATACTCTAGCCAAAGCCTCCAGCTTCTCCTCAAAGACCTAACAAAGGCCACCCAGGTTAAAGGCATCAGAGGTTTTGAGGCTGAATTTAAGAAGAGCGAAACCTCCTTCTACCTGAGGAAACCATCAACCCATGTGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGACAGGAG +>532|TRAV9-1 ENST00000390431|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATTCTTCTCCAGGACCAGCGATTGCACTATTCTTAATGTTTGGGGGAATCAATGGAGATTCAGTGGTCCAGACAGAAGGCCAAGTGCTCCCCTCTGAAGGGGATTCCCTGATTGTGAACTGCTCCTATGAAACCACACAGTACCCTTCCCTTTTTTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCACCTGAAAGCCATGAAGGCCAATGACAAGGGAAGGAACAAAGGTTTTGAAGCCATGTACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGACTCAGTTCAAGAGTCAGACTCCGCTGTGTACTTCTGTGCTCTGAGTGA +>533|TRAV9-2 ENST00000390441|TRAV9-2|5'UTR|TR|TRA|None|00 +CACTGTGATTTCTTCATGTTAAGGATCAAGACCATTATTTGGGTAACACACTAAAG +>534|TRAV9-2 ENST00000390441|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGGCTTAGTATCTCTGATACTCTTACTGCTTGGAAGAACCCGTGGAGATTCAGTGACCCAGATGGAAGGGCCAGTGACTCTCTCAGAAGAGGCCTTCCTGACTATAAACTGCACGTACACAGCCACAGGATACCCTTCCCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCTACAGCTCCTCCTGAAAGCCACGAAGGCTGATGACAAGGGAAGCAACAAAGGTTTTGAAGCCACATACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGGCTCAGTTCAAGTGTCAGACTCAGCGGTGTACTTCTGTGCTCTGAGTGA +>535|TRBC1 ENST00000633705|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>536|TRBC1 ENST00000632136|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>537|TRBC2 ENST00000466254|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>538|TRBC2 ENST00000622053|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>539|TRBD1 ENST00000631435|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>540|TRBJ1-1 ENST00000634213|TRBJ1-1|J-REGION|TR|TRB|None|00 +TGAACACTGAAGCTTTCTTTGGACAAGGCACCAGACTCACAGTTGTAG +>541|TRBJ1-2 ENST00000631745|TRBJ1-2|J-REGION|TR|TRB|None|00 +CTAACTATGGCTACACCTTCGGTTCGGGGACCAGGTTAACCGTTGTAG +>542|TRBJ1-3 ENST00000633780|TRBJ1-3|J-REGION|TR|TRB|None|00 +CTCTGGAAACACCATATATTTTGGAGAGGGAAGTTGGCTCACTGTTGTAG +>543|TRBJ1-4 ENST00000632041|TRBJ1-4|J-REGION|TR|TRB|None|00 +CAACTAATGAAAAACTGTTTTTTGGCAGTGGAACCCAGCTCTCTGTCTTGG +>544|TRBJ1-5 ENST00000634000|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAGCAATCAGCCCCAGCATTTTGGTGATGGGACTCGACTCTCCATCCTAG +>545|TRBJ1-6 ENST00000632228|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAACGGGACCAGGCTCACTGTGACAG +>546|TRBJ1-6 ENST00000633713|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAATGGGACCAGGCTCACTGTGACAG +>547|TRBJ2-1 ENST00000390412|TRBJ2-1|J-REGION|TR|TRB|None|00 +CTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAG +>548|TRBJ2-2 ENST00000390413|TRBJ2-2|J-REGION|TR|TRB|None|00 +CGAACACCGGGGAGCTGTTTTTTGGAGAAGGCTCTAGGCTGACCGTACTGG +>549|TRBJ2-2P ENST00000390414|TRBJ2-2P|J-REGION|TR|TRB|None|00 +CTGAGAGGCGCTGCTGGGCGTCTGGGCGGAGGACTCCTGGTTCTGG +>550|TRBJ2-3 ENST00000390415|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCG +>551|TRBJ2-4 ENST00000390416|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGCCAAAAACATTCAGTACTTCGGCGCCGGGACCCGGCTCTCAGTGCTGG +>552|TRBJ2-5 ENST00000390417|TRBJ2-5|J-REGION|TR|TRB|None|00 +ACCAAGAGACCCAGTACTTCGGGCCAGGCACGCGGCTCCTGGTGCTCG +>553|TRBJ2-6 ENST00000390418|TRBJ2-6|J-REGION|TR|TRB|None|00 +CTCTGGGGCCAACGTCCTGACTTTCGGGGCCGGCAGCAGGCTGACCGTGCTGG +>554|TRBJ2-7 ENST00000390419|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACTTCGGGCCGGGCACCAGGCTCACGGTCACAG +>555|TRBJ2-7 ENST00000633660|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACGTCGGGCCGGGCACCAGGCTCACGGTCACAG +>556|TRBV10-1 ENST00000390364|TRBV10-1|5'UTR|TR|TRB|None|00 +ACTGAGAGCCCAACTTCAGTCTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>557|TRBV10-1 ENST00000390364|TRBV10-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACGAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGAAATCACCCAGAGCCCAAGACACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGGCGTGTCACCAGACTTGGAACCACAACAATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCCATTACTCATATGGTGTTCACGACACTAACAAAGGAGAAGTCTCAGATGGCTACAGTGTCTCTAGATCAAACACAGAGGACCTCCCCCTCACTCTGGAGTCTGCTGCCTCCTCCCAGACATCTGTATATTTCTGCGCCAGCAGTGAGTC +>558|TRBV10-2 ENST00000426318|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>559|TRBV10-2 ENST00000426318|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTACGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>560|TRBV10-2 ENST00000633575|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>561|TRBV10-2 ENST00000633575|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTATGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>562|TRBV10-3 ENST00000611462|TRBV10-3|5'UTR|TR|TRB|None|00 +ATGAGATCCTGGCCTGGACCTGAA +>563|TRBV10-3 ENST00000611462|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCACCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>564|TRBV10-3 ENST00000631471|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCATCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>565|TRBV11-1 ENST00000390367|TRBV11-1|5'UTR|TR|TRB|None|00 +CCTGCCCTGACCCTGCC +>566|TRBV11-1 ENST00000390367|TRBV11-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCACCAGGCTTCTCTGCTGGATGGCCCTCTGTCTCCTGGGGGCAGAACTCTCAGAAGCTGAAGTTGCCCAGTCCCCCAGATATAAGATTACAGAGAAAAGCCAGGCTGTGGCTTTTTGGTGTGATCCTATTTCTGGCCATGCTACCCTTTACTGGTACCGGCAGATCCTGGGACAGGGCCCGGAGCTTCTGGTTCAATTTCAGGATGAGAGTGTAGTAGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>567|TRBV11-3 ENST00000611787|TRBV11-3|5'UTR|TR|TRB|None|00 +AGTGACCCTGATCTGGCAAAGCTTCCATCCTGCCCTGACCCTGCC +>568|TRBV11-3 ENST00000611787|TRBV11-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGGCTCCTCTGCTGGGTGGCCTTCTGTCTCCTGGTGGAAGAACTCATAGAAGCTGGAGTGGTTCAGTCTCCCAGATATAAGATTATAGAGAAAAAACAGCCTGTGGCTTTTTGGTGCAATCCTATTTCTGGCCACAATACCCTTTACTGGTACCTGCAGAACTTGGGACAGGGCCCGGAGCTTCTGATTCGATATGAGAATGAGGAAGCAGTAGACGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGA +>569|TRBV12-3 ENST00000620569|TRBV12-3|5'UTR|TR|TRB|None|00 +TTCTTTGCTCATGCTCACAGAGGGCCTGGTCTAGAATATTCCACATCTGCTCTCACTCTGCC +>570|TRBV12-3 ENST00000620569|TRBV12-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCTTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCGAAGCATACAGATGCTGGAGTTATCCAGTCACCCCGCCATGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGCCACAACTCCCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>571|TRBV12-4 ENST00000617347|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>572|TRBV12-4 ENST00000617347|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>573|TRBV12-4 ENST00000631824|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>574|TRBV12-4 ENST00000631824|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>575|TRBV12-5 ENST00000621184|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>576|TRBV12-5 ENST00000621184|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGCACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>577|TRBV12-5 ENST00000632829|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>578|TRBV12-5 ENST00000632829|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGGACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>579|TRBV13 ENST00000614171|TRBV13|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTTAGTCCTGACCTGCCTGACTCTGCCTGGAACACCAGGCTCCTCTGCCGTGTCATGCTTTGTCTCCTGGGAGCAGGTTCAGTGGCTGCTGGAGTCATCCAGTCCCCAAGACATCTGATCAAAGAAAAGAGGGAAACAGCCACTCTGAAATGCTATCCTATCCCTAGACACGACACTGTCTACTGGTACCAGCAGGGTCCAGGTCAGGACCCCCAGTTCCTCATTTCGTTTTATGAAAAGATGCAGAGCGATAAAGGAAGCATCCCTGATCGATTCTCAGCTCAACAGTTCAGTGACTATCATTCTGAACTGAACATGAGCTCCTTGGAGCTGGGGGACTCAGCCCTGTACTTCTGTGCCAGCAGCTTAGG +>580|TRBV14 ENST00000617639|TRBV14|5'UTR|TR|TRB|None|00 +CCTTTTTCTCATGCTTGTAAGCTCCTTCATCTGGAAATGTGATTTACCTGGGTCCTGCC +>581|TRBV14 ENST00000617639|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGTTTCCAGGCTTCTCAGTTTAGTGTCCCTTTGTCTCCTGGGAGCAAAGCACATAGAAGCTGGAGTTACTCAGTTCCCCAGCCACAGCGTAATAGAGAAGGGCCAGACTGTGACTCTGAGATGTGACCCAATTTCTGGACATGATAATCTTTATTGGTATCGACGTGTTATGGGAAAAGAAATAAAATTTCTGTTACATTTTGTGAAAGAGTCTAAACAGGATGAGTCCGGTATGCCCAACAATCGATTCTTAGCTGAAAGGACTGGAGGGACGTATTCTACTCTGAAGGTGCAGCCTGCAGAACTGGAGGATTCTGGAGTTTATTTCTGTGCCAGCAGCCAAGA +>582|TRBV15 ENST00000616518|TRBV15|5'UTR|TR|TRB|None|00 +ACTCCCACCTCTCAACCCAGGAATCAGAGCCTGAGACAGACAGATGCTTCATTCCTGTATGGGGTGGTATTCCTGCC +>583|TRBV15 ENST00000616518|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTCCTGGGCTTCTCCACTGGATGGCCCTTTGTCTCCTTGGAACAGGTCATGGGGATGCCATGGTCATCCAGAACCCAAGATACCAGGTTACCCAGTTTGGAAAGCCAGTGACCCTGAGTTGTTCTCAGACTTTGAACCATAACGTCATGTACTGGTACCAGCAGAAGTCAAGTCAGGCCCCAAAGCTGCTGTTCCACTACTATGACAAAGATTTTAACAATGAAGCAGACACCCCTGATAACTTCCAATCCAGGAGGCCGAACACTTCTTTCTGCTTTCTTGACATCCGCTCACCAGGCCTGGGGGACGCAGCCATGTACCTGTGTGCCACCAGCAGAGA +>584|TRBV16 ENST00000620773|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCCAATATTCACCTGCATCACAATCCTTTGTCTGCTGGCTGCAGGTTCTCCTGGTGAAGAAGTCGCCCAGACTCCAAAACATCTTGTCAGAGGGGAAGGACAGAAAGCAAAATTATATTGTGCCCCAATAAAAGGACACAGTTATGTTTTTTGGTACCAACAGGTCCTGAAAAACGAGTTCAAGTTCTTGATTTCCTTCCAGAATGAAAATGTCTTTGATGAAACAGGTATGCCCAAGGAAAGATTTTCAGCTAAGTGCCTCCCAAATTCACCCTGTAGCCTTGAGATCCAGGCTACGAAGCTTGAGGATTCAGCAGTGTATTTTTGTGCCAGCAGCCAATC +>585|TRBV17 ENST00000619103|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACACTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>586|TRBV17 ENST00000631663|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACGCTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>587|TRBV18 ENST00000611520|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>588|TRBV18 ENST00000611520|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGACTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>589|TRBV18 ENST00000631559|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>590|TRBV18 ENST00000631559|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGAGTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>591|TRBV19 ENST00000390393|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>592|TRBV19 ENST00000390393|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTCTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>593|TRBV19 ENST00000632638|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>594|TRBV19 ENST00000632638|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTTTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>595|TRBV2 ENST00000455382|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>596|TRBV2 ENST00000455382|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCGCTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>597|TRBV2 ENST00000632828|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>598|TRBV2 ENST00000632828|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCACTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>599|TRBV20-1 ENST00000390394|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>600|TRBV20-1 ENST00000390394|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>601|TRBV20-1 ENST00000633466|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>602|TRBV20-1 ENST00000633466|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCTGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>603|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|5'UTR|TR|TRB|None|00 +GATCAGTCATCCCTCCTCGCTGGTGA +>604|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTAGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAACATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGCTCCGGAAACAGAGCCTCATGCTGATGGCAACTTCCAATGAGGGCTCCGAGGTCACATACGAGCAAGGCGTCAAGAAGGACAAGTTTCCCATCAACCATCCAAACCTGACCTTCTCCGCTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGA +>605|TRBV21-1 ENST00000453262|TRBV21-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGCCTCAGACTTCTCTGCTGTGTGGCCATTTCTTTCTGGGGAGCCAGGCTCCACGGACACCAAGGTCACCCAGAGACCTAGACTTCTGGCCAAAGCAAGTGAACAGAAAGCAAAGATGGATTGTGTTCCTATAAAAGCACATAGTTATGTTTACTGGTATCGTAAGAAGCTGGAAGAAGAGCTCAAGTTTTTGGTTTACTTTCAGAACGAAGAACTTATTCAGAAAGCAGAAATAATCAATGAGCGATTTTTAGCCCAATGCTCCAAAAACTCATCCTGTACCTTGGAGATCCAGTCCACGGAGTCAGGGGACACAGCACTGTATTTCTGTGCCAGCAGCAAAGC +>606|TRBV21-1 ENST00000633477|TRBV21-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGCCTCAGACTTCTCTGCTGTGTGGCCATTTCTTTCTGGGGAGCCAGGCTCCACGGACACCAAGGTCACCCAGAGACCTAGACTTCTGGTCAAAGCAAGTGAACAGAAAGCAAAGATGGATTGTGTTCCTATAAAAGCACATAGTTATGTTTACTGGTATCGTAAGAAGCTGGAAGAAGAGCTCAAGTTTTTGGTTTACTTTCAGAATGAAGAACTTATTCAGAAAGCAGAAATAATCAATGAGCGATTTTTAGCCCAATGCTCCAAAAACTCATCCTGTACCTTGGAGATCCAGTCCACGGAGTCAGGGGACACAGCACTGTATTTCTGTGCCAGCAGCAAAGC +>607|TRBV23-1 ENST00000390396|TRBV23-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCGGCTGTGCAGCCCTGTGTCTCCTGGCAGCAGACTCTTTTCATGCCAAAGTCACACAGACTCCAGGACATTTGGTCAAAGGAAAAGGACAGAAAACAAAGATGGATTGTACCCCCGAAAAAGGACATACTTTTGTTTATTGGTATCAACAGAATCAGAATAAAGAGTTTATGCTTTTGATTTCCTTTCAGAATGAACAAGTTCTTCAAGAAACGGAGATGCACAAGAAGCGATTCTCATCTCAATGCCCCAAGAACGCACCCTGCAGCCTGGCAATCCTGTCCTCAGAACCGGGAGACACGGCACTGTATCTCTGCGCCAGCAGTCAATC +>608|TRBV24-1 ENST00000390397|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>609|TRBV24-1 ENST00000390397|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACAGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>610|TRBV24-1 ENST00000633092|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>611|TRBV24-1 ENST00000633092|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACGGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>612|TRBV25-1 ENST00000610439|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>613|TRBV25-1 ENST00000610439|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>614|TRBV25-1 ENST00000390398|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>615|TRBV25-1 ENST00000390398|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>616|TRBV27 ENST00000390399|TRBV27|5'UTR|TR|TRB|None|00 +ACCTGGAGCCCCCAGAACTGGCAGACACCTGCCTGATGCTGCC +>617|TRBV27 ENST00000390399|TRBV27|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCCAGCTCCTTGGCTATGTGGTCCTTTGCCTTCTAGGAGCAGGCCCCCTGGAAGCCCAAGTGACCCAGAACCCAAGATACCTCATCACAGTGACTGGAAAGAAGTTAACAGTGACTTGTTCTCAGAATATGAACCATGAGTATATGTCCTGGTATCGACAAGACCCAGGGCTGGGCTTAAGGCAGATCTACTATTCAATGAATGTTGAGGTGACTGATAAGGGAGATGTTCCTGAAGGGTACAAAGTCTCTCGAAAAGAGAAGAGGAATTTCCCCCTGATCCTGGAGTCGCCCAGCCCCAACCAGACCTCTCTGTACTTCTGTGCCAGCAGTTTATC +>618|TRBV28 ENST00000390400|TRBV28|5'UTR|TR|TRB|None|00 +ATTCTTTCTTCAAAGCAGCC +>619|TRBV28 ENST00000390400|TRBV28|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTATG +>620|TRBV29-1 ENST00000422143|TRBV29-1|5'UTR|TR|TRB|None|00 +GAAGGAAAGATGAACTTGAGTTTCACTTCTTAGTGCCTTTTCTCAGGGGAGAGGCCATCACTTGAAG +>621|TRBV29-1 ENST00000422143|TRBV29-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGAGTCTTCTGCTCCTTCTCCTGGGACTAGGCTCTGTGTTCAGTGCTGTCATCTCTCAAAAGCCAAGCAGGGATATCTGTCAACGTGGAACCTCCCTGACGATCCAGTGTCAAGTCGATAGCCAAGTCACCATGATGTTCTGGTACCGTCAGCAACCTGGACAGAGCCTGACACTGATCGCAACTGCAAATCAGGGCTCTGAGGCCACATATGAGAGTGGATTTGTCATTGACAAGTTTCCCATCAGCCGCCCAAACCTAACATTCTCAACTCTGACTGTGAGCAACATGAGCCCTGAAGACAGCAGCATATATCTCTGCAGCGTTGAAGA +>622|TRBV3-1 ENST00000390387|TRBV3-1|5'UTR|TR|TRB|None|00 +AGACCAGAATCCTGCCCTGGGCCTTGCCTGGTCTGCCTCACTCTGCC +>623|TRBV3-1 ENST00000390387|TRBV3-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTCCTCTGCTGTGTGGTCTTCTGCCTCCTCCAAGCAGGTCCCTTGGACACAGCTGTTTCCCAGACTCCAAAATACCTGGTCACACAGATGGGAAACGACAAGTCCATTAAATGTGAACAAAATCTGGGCCATGATACTATGTATTGGTATAAACAGGACTCTAAGAAATTTCTGAAGATAATGTTTAGCTACAATAATAAGGAGCTCATTATAAATGAAACAGTTCCAAATCGCTTCTCACCTAAATCTCCAGACAAAGCTCACTTAAATCTTCACATCAATTCCCTGGAGCTTGGTGACTCTGCTGTGTATTTCTGTGCCAGCAGCCAAGA +>624|TRBV30 ENST00000417977|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>625|TRBV30 ENST00000417977|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTTCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>626|TRBV30 ENST00000631690|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>627|TRBV30 ENST00000631690|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTCCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>628|TRBV4-1 ENST00000390357|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>629|TRBV4-1 ENST00000390357|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>630|TRBV4-1 ENST00000632713|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>631|TRBV4-1 ENST00000632713|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCGAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>632|TRBV4-2 ENST00000390392|TRBV4-2|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>633|TRBV4-2 ENST00000390392|TRBV4-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGGCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAACTTTAAAGAACAGACTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGTGCCAGCAGCCAAGA +>634|TRBV4-3 ENST00000631427|TRBV4-3|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>635|TRBV4-3 ENST00000631427|TRBV4-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGTCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAGTCTTGAAGAACGGGTTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>636|TRBV5-1 ENST00000390381|TRBV5-1|5'UTR|TR|TRB|None|00 +CTCAGAGGACCAGTATCCCTCACAGGGTGACACCTGACCAGCTCTGTCCCACCTGGCCATGGGCTCCAGGTACCTCTGATGGGAAGACCTTTGTCTCTTGGGAACAAGTGAATCCTTGGCACAGGCCCAGTGGATTCTGCTGTGCAGAACAGAGAGCAGTGGACCTCAGGAGGCCTGCAAGGGGAGGACATAGGACAGTGACATCACAGTATGCCCCTCCCACCAGGAAAAGCAAGGCTGAGAATTTAGCTCTTTCCCAGGAGGACCAAGCCCTGAGCACAGACACAGTGCTGCCTGCCCCTTTGTGCC +>637|TRBV5-1 ENST00000390381|TRBV5-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTGCTCTGTTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTAAAGGCTGGAGTCACTCAAACTCCAAGATATCTGATCAAAACGAGAGGACAGCAAGTGACACTGAGCTGCTCCCCTATCTCTGGGCATAGGAGTGTATCCTGGTACCAACAGACCCCAGGACAGGGCCTTCAGTTCCTCTTTGAATACTTCAGTGAGACACAGAGAAACAAAGGAAACTTCCCTGGTCGATTCTCAGGGCGCCAGTTCTCTAACTCTCGCTCTGAGATGAATGTGAGCACCTTGGAGCTGGGGGACTCGGCCCTTTATCTTTGCGCCAGCAGCTTGG +>638|TRBV5-3 ENST00000390362|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTATTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>639|TRBV5-3 ENST00000634123|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTGTTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>640|TRBV5-4 ENST00000454561|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACACAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGCCCCACTGTGCC +>641|TRBV5-4 ENST00000454561|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGAGACTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>642|TRBV5-4 ENST00000633696|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACTCAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGGCCCACTGTGCC +>643|TRBV5-4 ENST00000633696|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATGATAGCTCTGAGCTGAATGTGAATGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>644|TRBV5-5 ENST00000390372|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>645|TRBV5-5 ENST00000390372|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>646|TRBV5-5 ENST00000632187|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>647|TRBV5-5 ENST00000632187|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGTAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>648|TRBV5-6 ENST00000390375|TRBV5-6|5'UTR|TR|TRB|None|00 +AAGCCCTGAATCAGATGCAGTGCTTCCTGTCCCTCTGTGCC +>649|TRBV5-6 ENST00000390375|TRBV5-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGCACTGCTTTGTCTCCTGGGAGCAGGCTTAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTAAGTCTGGGCATGACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGGAGGAAGAGAGACAGAGAGGCAACTTCCCTGATCGATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>650|TRBV5-7 ENST00000390378|TRBV5-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGTGCTGCTTTGTCCCCTAGGAGAAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCACGTGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTCCTCGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCAATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTAGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>651|TRBV5-8 ENST00000631639|TRBV5-8|5'UTR|TR|TRB|None|00 +TGGCCACTGAGGAAAGGGAAGAGAATGTTGCCTGGGACAGGAAAATATAGAAAATGAAGGCCCAGAACTCACTCGGCTCTTCCCCAGGAAGACCAAGCCCTGAATCAGGTGCAGTGCCGCCTGGCCCACTGTGCC +>652|TRBV5-8 ENST00000631639|TRBV5-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGACCCAGGCTCCTCTTCTGGGCACTGCTTTGTCTCCTCGGAACAGGCCCAGTGGAGGCTGGAGTCACACAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGCGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTACTGGTACCAACAGGCCCTGGGTCTGGGCCTCCAGTTCCTCCTTTGGTATGACGAGGGTGAAGAGAGAAACAGAGGAAACTTCCCTCCTAGATTTTCAGGTCGCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGAGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>653|TRBV6-1 ENST00000390353|TRBV6-1|5'UTR|TR|TRB|None|00 +GTTCCCCTATCACCGATGCACAGACCCAGAAGACCCCTCCATCCTGTAGCACCTGCC +>654|TRBV6-1 ENST00000390353|TRBV6-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAAGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTCCATGTACTGGTATCGACAAGACCCAGGCATGGGACTGAGGCTGATTTATTACTCAGCTTCTGAGGGTACCACTGACAAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATTAAACAAACGGGAGTTCTCGCTCAGGCTGGAGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTGAAGC +>655|TRBV6-2 ENST00000632016|TRBV6-2|5'UTR|TR|TRB|None|00 +TCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>656|TRBV6-2 ENST00000632016|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>657|TRBV6-2 ENST00000634383|TRBV6-2|5'UTR|TR|TRB|None|00 +AGAATGACGCCCTTGAAAGACGTGTTCCCTTTTCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>658|TRBV6-2 ENST00000634383|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>659|TRBV6-4 ENST00000390360|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>660|TRBV6-4 ENST00000390360|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGACTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGAGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>661|TRBV6-4 ENST00000633472|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>662|TRBV6-4 ENST00000633472|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGATTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGCGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>663|TRBV6-5 ENST00000390368|TRBV6-5|5'UTR|TR|TRB|None|00 +GAGAGTCCTGCTCCCCTTTCATCAATGCACAGATACAGAAGACCCCTCCGTCATGCAGCATCTGCC +>664|TRBV6-5 ENST00000390368|TRBV6-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGCCTCCTGTGCTGTGCAGCCTTGTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGAATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGCTGGTATCACTGACCAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGCTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>665|TRBV6-6 ENST00000390371|TRBV6-6|5'UTR|TR|TRB|None|00 +CAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>666|TRBV6-6 ENST00000390371|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGACAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>667|TRBV6-6 ENST00000633963|TRBV6-6|5'UTR|TR|TRB|None|00 +ATCAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>668|TRBV6-6 ENST00000633963|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGATAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGTATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>669|TRBV6-7 ENST00000390373|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTGATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>670|TRBV6-7 ENST00000631511|TRBV6-7|5'UTR|TR|TRB|None|00 +ATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>671|TRBV6-7 ENST00000631511|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTTATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>672|TRBV6-8 ENST00000390376|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCCGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>673|TRBV6-8 ENST00000632425|TRBV6-8|5'UTR|TR|TRB|None|00 +GAGAGTCCTGTTCCCCTTTTATCAATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>674|TRBV6-8 ENST00000632425|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCGGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>675|TRBV6-9 ENST00000634093|TRBV6-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACTTGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCGCATTCATTACTCAGTTGCTGCTGGTATCACTGACAAAGGAGAAGTCCCCGATGGCTACAATGTATCCAGATCAAACACAGAGGATTTCCCGCTCAGGCTGGAGTCAGCTGCTCCCTCCCAGACATCTGTATACTTCTGTGCCAGCAGTTATTC +>676|TRBV7-1 ENST00000547918|TRBV7-1|5'UTR|TR|TRB|None|00 +CTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>677|TRBV7-1 ENST00000547918|TRBV7-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGCTCCTCTGCTGGGCAGCCATATGTCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGTCCCTGAGACACAAGGTAGCAAAGAAGGGAAAGGATGTAGCTCTCAGATATGATCCAATTTCAGGTCATAATGCCCTTTATTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTCCAATTTACTTCCAAGGCAAGGATGCAGCAGACAAATCGGGGCTTCCCCGTGATCGGTTCTCTGCACAGAGGTCTGAGGGATCCATCTCCACTCTGAAGTTCCAGCGCACACAGCAGGGGGACTTGGCTGTGTATCTCTGTGCCAGCAGCTCAGC +>678|TRBV7-2 ENST00000631392|TRBV7-2|5'UTR|TR|TRB|None|00 +CCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>679|TRBV7-2 ENST00000631392|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>680|TRBV7-2 ENST00000634605|TRBV7-2|5'UTR|TR|TRB|None|00 +ACAGTGATCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>681|TRBV7-2 ENST00000634605|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>682|TRBV7-3 ENST00000390361|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>683|TRBV7-3 ENST00000390361|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAAGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAAAGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCCGCGTATCTCCGTGCCAGCAGCTTAAC +>684|TRBV7-3 ENST00000631882|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>685|TRBV7-3 ENST00000631882|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAATATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAACGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCGGGGGGACTCAGCCGTGTATCTCTGTGCCAGCAGCTTAAC +>686|TRBV7-4 ENST00000390369|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>687|TRBV7-4 ENST00000633313|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGTGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>688|TRBV7-6 ENST00000390374|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGTCCTGACCCTGCC +>689|TRBV7-6 ENST00000390374|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>690|TRBV7-6 ENST00000633265|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGGCCTGACCCTGCC +>691|TRBV7-6 ENST00000633265|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCGTCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>692|TRBV7-7 ENST00000390377|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>693|TRBV7-8 ENST00000632560|TRBV7-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCTAGGTACAAAGTCGCAAAGAGAGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTTTTGGTACCAACAGGCCCTGGGGCAGGGGCCAGAGTTTCTGACTTATTTCCAGAATGAAGCTCAACTAGACAAATCGGGGCTGCCCAGTGATCGCTTCTTTGCAGAAAGGCCTGAGGGATCCGTCTCCACTCTGAAGATCCAGCGCACACAGCAGGAGGACTCCGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>694|TRBV7-9 ENST00000612787|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGAACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>695|TRBV7-9 ENST00000632021|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGGACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>696|TRBV9 ENST00000390363|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>697|TRBV9 ENST00000390363|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCACTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>698|TRBV9 ENST00000633328|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>699|TRBV9 ENST00000633328|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCAGTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>700|TRDC ENST00000390477|TRDC|C-REGION|TR|TRD|None|00 +GAAGTCAGCCTCATACCAAACCATCCGTTTTTGTCATGAAAAATGGAACAAATGTCGCTTGTCTGGTGAAGGAATTCTACCCCAAGGATATAAGAATAAATCTCGTGTCATCCAAGAAGATAACAGAGTTTGATCCTGCTATTGTCATCTCTCCCAGTGGGAAGTACAATGCTGTCAAGCTTGGTAAATATGAAGATTCAAATTCAGTGACATGTTCAGTTCAACACGACAATAAAACTGTGCACTCCACTGACTTTGAAGTGAAGACAGATTCTACAGATCACGTAAAACCAAAGGAAACTGAAAACACAAAGCAACCTTCAAAGAGCTGCCATAAACCCAAAGCCATAGTTCATACCGAGAAGGTGAACATGATGTCCCTCACAGTGCTTGGGCTACGAATGCTGTTTGCAAAGACTGTTGCCGTCAATTTTCTCTTGACTGCCAAGTTATTTTTCTTG +>701|TRDD1 ENST00000415118|TRDD1|D-REGION|TR|TRD|None|00 +GAAATAGT +>702|TRDD2 ENST00000434970|TRDD2|D-REGION|TR|TRD|None|00 +CCTTCCTAC +>703|TRDD3 ENST00000448914|TRDD3|D-REGION|TR|TRD|None|00 +ACTGGGGGATACG +>704|TRDJ1 ENST00000390473|TRDJ1|J-REGION|TR|TRD|None|00 +ACACCGATAAACTCATCTTTGGAAAAGGAACCCGTGTGACTGTGGAACCAA +>705|TRDJ2 ENST00000390475|TRDJ2|J-REGION|TR|TRD|None|00 +CTTTGACAGCACAACTCTTCTTTGGAAAGGGAACACAACTCATCGTGGAACCAG +>706|TRDJ3 ENST00000390476|TRDJ3|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTCGGAACTGGCATCAAACTCTTCGTGGAGCCCC +>707|TRDJ4 ENST00000390474|TRDJ4|J-REGION|TR|TRD|None|00 +CCAGACCCCTGATCTTTGGCAAAGGAACCTATCTGGAGGTACAACAAC +>708|TRDV1 ENST00000390452|TRDV1|5'UTR|TR|TRD|None|00 +CAAAGAGCTACATGCCAC +>709|TRDV1 ENST00000390452|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTGTTCTCCAGCCTGCTGTGTGTATTTGTGGCCTTCAGCTACTCTGGATCAAGTGTGGCCCAGAAGGTTACTCAAGCCCAGTCATCAGTATCCATGCCAGTGAGGAAAGCAGTCACCCTGAACTGCCTGTATGAAACAAGTTGGTGGTCATATTATATTTTTTGGTACAAGCAACTTCCCAGCAAAGAGATGATTTTCCTTATTCGCCAGGGTTCTGATGAACAGAATGCAAAAAGTGGTCGCTATTCTGTCAACTTCAAGAAAGCAGCGAAATCCGTCGCCTTAACCATTTCAGCCTTACAGCTAGAAGATTCAGCAAAGTACTTTTGTGCTCTTGGGGAACT +>710|TRDV2 ENST00000390469|TRDV2|5'UTR|TR|TRD|None|00 +ATTAGCAGGCAGCAGGCCCTGCGAGCCTCCTGTGATCAGCTAGATTTCTCTGGGGAATGAAACAGCTGCTGATAGGGACTGACTTCCTCAGTCACAAGTGTTTCACAAGTGTGTTGGTTCAGAGGAGGGACCAGGCAGAAGGTGGTTGAGAGGCAGAGCTGCCCCTGAGTGAGCC +>711|TRDV2 ENST00000390469|TRDV2|L-REGION+V-REGION|TR|TRD|None|00 +ATGCAGAGGATCTCCTCCCTCATCCATCTCTCTCTCTTCTGGGCAGGAGTCATGTCAGCCATTGAGTTGGTGCCTGAACACCAAACAGTGCCTGTGTCAATAGGGGTCCCTGCCACCCTCAGGTGCTCCATGAAAGGAGAAGCGATCGGTAACTACTATATCAACTGGTACAGGAAGACCCAAGGTAACACAATGACTTTCATATACCGAGAAAAGGACATCTATGGCCCTGGTTTCAAAGACAATTTCCAAGGTGACATTGATATTGCAAAGAACCTGGCTGTACTTAAGATACTTGCACCATCAGAGAGAGATGAAGGGTCTTACTACTGTGCCTGTGACACC +>712|TRDV3 ENST00000535880|TRDV3|5'UTR|TR|TRD|None|00 +TCTTTCATTAGAACCGTCAGATAGTCTCTGAGATCTTAGGAACCCTGTTTTGTTGTATATCCTCTGCCCTGATATGAAGAAAAG +>713|TRDV3 ENST00000535880|TRDV3|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTACTGTGGGCTTTAGCTTTTTGTTTTTCTACAGGGGCACGCTGTGTGACAAAGTAACCCAGAGTTCCCCGGACCAGACGGTGGCGAGTGGCAGTGAGGTGGTACTGCTCTGCACTTACGACACTGTATATTCAAATCCAGATTTATTCTGGTACCGGATAAGGCCAGATTATTCCTTTCAGTTTGTCTTTTATGGGGATAACAGCAGATCAGAAGGTGCAGATTTTACTCAAGGACGGTTTTCTGTGAAACACATTCTGACCCAGAAAGCCTTTCACTTGGTGATCTCTCCAGTAAGGACTGAAGACAGTGCCACTTACTACTGTGCCTTTAG +>714|TRGC1 ENST00000443402|TRGC1|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCAATTGCTGAAACAAAGCTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCTGATGTTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAAAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAGTTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCATCACAATGGATCCCAAAGACAATTGTTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACATGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>715|TRGC2 ENST00000436911|TRGC2|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCGATTGCTGAAACAAAACTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCAGATATTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAGAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAATTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCACCACAGTGGATCCCAAATACAATTATTCAAAGGATGCAAATGATGTCATCACAATGGATCCCAAAGACAATTGGTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACACGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>716|TRGJ1 ENST00000390337|TRGJ1|J-REGION|TR|TRG|None|00 +GAATTATTATAAGAAACTCTTTGGCAGTGGAACAACACTTGTTGTCACAG +>717|TRGJP ENST00000390338|TRGJP|J-REGION|TR|TRG|None|00 +GGGCAAGAGTTGGGCAAAAAAATCAAGGTATTTGGTCCCGGAACAAAGCTTATCATTACAG +>718|TRGJP1 ENST00000390339|TRGJP1|J-REGION|TR|TRG|None|00 +ATACCACTGGTTGGTTCAAGATATTTGCTGAAGGGACTAAGCTCATAGTAACTTCACCTG +>719|TRGJP2 ENST00000390334|TRGJP2|J-REGION|TR|TRG|None|00 +ATAGTAGTGATTGGATCAAGACGTTTGCAAAAGGGACTAGGCTCATAGTAACTTCGCCTG +>720|TRGV1 ENST00000390348|TRGV1|5'UTR|TR|TRG|None|00 +TACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>721|TRGV1 ENST00000390348|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGATATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCTGACTGGGTCATCTGCTGAAATCACCTGTGATCTTCCTGGAGCAAGTACCTTATACATCCACTGGTACCTGCACCAGGAGGGGAAGGCCCCACAGTGTCTTCTGTACTATGAACCCTACTACTCCAGGGTTGTGCTGGAATCAGGAATCACTCCAGGAAAGTATGACACTGGAAGCACAAGGAGCAATTGGAATTTGAGACTGCAAAATCTAATTAAAAATGATTCTGGGTTCTATTACTGTGCCACCTGGGACAGG +>722|TRGV10 ENST00000390341|TRGV10|5'UTR|TR|TRG|None|00 +ACTTTCCTGCCTTCTCCTTGGGTACACCGCCCCGAAGACAGGATGTCACTGCTGGAAGCATTTGCCTTCTCCTCCTGGGCTCCTGAGTTGCTGTCCGAACATTTCAGTCTAGCTGCGTGACCAAAATCATTCTTCAATGTTTCCCTCTTCTACTGTCAG +>723|TRGV10 ENST00000390341|TRGV10|L-REGION+V-REGION|TR|TRG|None|00 +ATGTTCATTGGAAATTCTCCTCTTTTACTTACAGTTGGACTTGGATTATCAAAAGTGGAGCAGTTCCAGCTATCCATTTCCACGGAAGTCAAGAAAAGTATTGACATACCTTGCAAGATATCGAGCACAAGGTTTGAAACAGATGTCATTCACTGGTACCGGCAGAAACCAAATCAGGCTTTGGAGCACCTGATCTATATTGTCTCAACAAAATCCGCAGCTCGACGCAGCATGGGTAAGACAAGCAACAAAGTGGAGGCAAGAAAGAATTCTCAAACTCTCACTTCAATCCTTACCATCAAGTCCGTAGAGAAAGAAGACATGGCCGTTTACTACTGTGCTGCGTGGGATTA +>724|TRGV2 ENST00000426402|TRGV2|5'UTR|TR|TRG|None|00 +GGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCCCTCTGCTTGTGTCTCAGGAAGACCACCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGAACCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>725|TRGV2 ENST00000426402|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTAACGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCAGTACTATGACTCCTACAACTCCAAGGTTGTGTTGGAATCAGGAGTCAGTCCAGGGAAGTATTATACTTACGCAAGCACAAGGAACAACTTGAGATTGATACTGCGAAATCTAATTGAAAATGACTTTGGGGTCTATTACTGTGCCACCTGGGACGGG +>726|TRGV3 ENST00000390346|TRGV3|5'UTR|TR|TRG|None|00 +CTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGTCTCAGGAAACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCGTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>727|TRGV3 ENST00000390346|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCAGACTGGGTCATCTGCTGAAATCACTTGCGATCTTACTGTAACAAATACCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCACCGCAAGGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGAGACTGCAAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>728|TRGV4 ENST00000390345|TRGV4|5'UTR|TR|TRG|None|00 +GGCCTGAGCTCTCCTGGCCCCTGGCTCTCTTCTGCAGAGGGCCTGCTCTCAGCTGCCACAAGAGGGCGCCGGAGAACGGACCTGAGCAAGAGAGGCAGGAGCTCCTCTGCAGGTCCTCCCAGGCACCAATCCTTCTGGGAGGGAGGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCTCTCTGCTTGTGTCTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCTCAGAGAGGAAGGC +>729|TRGV4 ENST00000390345|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTACCGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACACCTCCAGCGTTGTGTTGGAATCAGGAATCAGCCCAGGGAAGTATGATACTTACGGAAGCACAAGGAAGAACTTGAGAATGATACTGCGAAATCTTATTGAAAATGACTCTGGAGTCTATTACTGTGCCACCTGGGATGGG +>730|TRGV5 ENST00000390344|TRGV5|5'UTR|TR|TRG|None|00 +TTCTGGGAGGAAGGCTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGACTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCGGAGTTTTAAGAGGATCTTCTGCTCCTCCTCATCTGGTCCCTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>731|TRGV5 ENST00000390344|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGGGAACGAAGTCAGTCACGAGGCCGACTAGGTCATCTGCTGAAATCACTTGTGACCTTACTGTAATAAATGCCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCAACTCAAAGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGATACTACGAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>732|TRGV8 ENST00000390343|TRGV8|5'UTR|TR|TRG|None|00 +CTACTGTCTTCTGTGTTAGGGATCACTTCCTTGTTGAGTGGGACCTGAGTTTTGAGAGGGTCTTCTGCTCCTCTTCGTCTGGTCCCTTACTTCCAAGACCCCAGAGAGGAAGGC +>733|TRGV8 ENST00000390343|TRGV8|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTTGGCTCTAGCTCTGCTTCTAGCTTTCCTGCCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACAAAGTCAGTCACCAGGCCAACTGGGTCATCAGCTGTAATCACTTGTGATCTTCCTGTAGAAAATGCCGTCTACACCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACAACTCCAGGGTTGTGTTGGAATCAGGAATCAGTCGAGAAAAGTATCATACTTATGCAAGCACAGGGAAGAGCCTTAAATTTATACTGGAAAATCTAATTGAACGTGACTCTGGGGTCTATTACTGTGCCACCTGGGATAGG +>734|TRGV9 ENST00000444775|TRGV9|5'UTR|TR|TRG|None|00 +AAAAAAATTCAAGTCAATCCATAGAAGTGGGTCGTGGAATTCCAGGCAGAAAGTGACTAAATGAAGATGGAAGGACAGGGAGGGGGTGGCCACATCACAGAGAACCTCTTATCCTAAGAACTCTGGACTTCATCTTCAGAGGCAAGGTAGAGAGAGCAAGGACTTTAGAGCAGGAAAAGGACCAGGTCAGTCTAGTGGCCATGGGGAAGGTGGGTGGGAGGGGCCGAGATGGGATGTATGGAGGTGCGTGAGGTGGAGGCAGTGGTGAGCCAGGAAATGTTTAGGACGTAGAATCCTCAGGAATTAGAGTGCGGTGAATTAGAGGGGAGAATTGAGGCTGATGCTCAAGCTCCTGGCTTGGGCAATGTGGGTAGTTATGTCATACAGGGAACTCGGAAGAAGATATGGTTTGGGGGAAGGGAATGAGTTCACTCTGGCTATGAGCAGACTTTGTTTGAGATCCCATGTCAGACGTACTTGAAAATGTCCAAGAGTTAGCTGGATATGGGTACAGACAGCTTTCGATTTAACTGAGGTCCGACTTAAGATTTTTTTTTACTTTATGATGGTGCAAAAGTGACACGCATTTGGTAGAAAACATAATTTGACCTTTGCTGTTTCCCCAGGACAGTGATATAAGGTTATGATACTCTCTTGCGATGCTGGGCAGTGGCAGTGAGCTGCAGCTCCCAGTGGGTAAATTAAGCATGGAAATCTGGAACACAGCAGCTTTTAAGGGATGCACTGGGGAGAGCAGTTTGTAAAAATACCTTGGGACGGATTAAATGTCTTGGCTTAGAGAAAGAACAACAGACAATAGGAAACTGTCATTGAGGAGAAGCCGGGATTCAGGAGATGTACATTATTCAGGTAGCTGAGGGAGGGGACAGGAACCTGAATCTTCAACAGAAGCAAACAAACTGGGATGGAGGGCCCAGCCTCATGAAGGTGACCAGAAGGACCCGGTGCTGCAGGCTGTGTGGGTAGCTGAGCAGAGCTAAGCGGCTTGACGGACCAACATCTCTCCAGCTGGTTGAAGACAAGCTCTCAGAAGACAATGCTGCATGTCACAGCCCCAGCAACCAACAACACCAGCCTGACAACTTGCTGGGGTGGCCGCCTTGTGGTCTGAGGTGGCCGTCTAAACTATGTGGTCTGATCTCAGGCTGCAGACCTTGCAGGACTGTCTTCACACAGACTGGAAGTGCTAACAGGTGGTGAGGACACCGCTTTACAACGATGCAGGGGGCCCCATGTCACCCTCACCCATGGGAAGTTTGACTTGGTGGACTCAGCCAAGCCACAGAGGTCTAACGCTTCTCTGCGGTGATTTCAGGCTGCCCTGGCAGAAAGCACAGTGCCTGCAGAC +>735|TRGV9 ENST00000444775|TRGV9|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTCACTGCTCCACACATCAACGCTGGCAGTCCTTGGGGCTCTGTGTGTATATGGTGCAGGTCACCTAGAGCAACCTCAAATTTCCAGTACTAAAACGCTGTCAAAAACAGCCCGCCTGGAATGTGTGGTGTCTGGAATAACAATTTCTGCAACATCTGTATATTGGTATCGAGAGAGACCTGGTGAAGTCATACAGTTCCTGGTGTCCATTTCATATGACGGCACTGTCAGAAAGGAATCCGGCATTCCGTCAGGCAAATTTGAGGTGGATAGGATACCTGAAACGTCTACATCCACTCTCACCATTCACAATGTAGAGAAACAGGACATAGCTACCTACTACTGTGCCTTGTGGGAGGTG +>736|TRBD2 GRCh38-release94|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTAGCGGGAGGG +>737|TRAJ15 GRCh38-release94|TRAJ15|J-REGION|TR|TRA|None|00 +CCAACCAGGCAGGAACTGCTCTGATCTTTGGGAAGGGAACCACCTTATCAGTGAGTTCCA +>738|IGLV6-57 GRCh38-release94|IGLV6-57|5'UTR|IG|IGL|None|00 +TCTGAGGATACGCGTGACAGATAAGAAGGGCTGGTGGGATCAGTCCTGGTGGTAGCTCAGGAAGCAGAGCCTGGAGCATCTCCACT +>739|TRBV11-2 GRCh38-release94|TRBV11-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCGGCCCTCTGTCTCCTGGGAGCAGAACTCACAGAAGCTGGAGTTGCCCAGTCTCCCAGATATAAGATTATAGAGAAAAGGCAGAGTGTGGCTTTTTGGTGCAATCCTATATCTGGCCATGCTACCCTTTACTGGTACCAGCAGATCCTGGGACAGGGCCCAAAGCTTCTGATTCAGTTTCAGAATAACGGTGTAGTGGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAACCTGCAAAGCTTGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGC +>740|IGKV2-18 GRCh38-release94|IGKV2-18|L-REGION+V-REGION|IG|IGK|None|00 +ATGCTTTGGGTTCCTGGATCCAGTGGAGATATTGTGATGACCCAGACTCCACCCTCCCTGCCCGTCAACCCTGGAGAGCCGGCCTCCATCTCTTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATATACCTATTTGCATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATTTATAGGGTTTCCAATCATCTTTCTGGGGTCCCAGACAGGTTTAGTGGCAGTGGGTCAGGTAGTGATTTCACACTGAAAATCAGCTGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTACACAGTTTCCTAACAC +>741|TRGV11 AC244625.2|TRGV11|L-REGION+V-REGION|TR|TRG|None|00 +ATGCCACTGGTAGTAGCTGTTATCTTCTTCTCCCTCTGGGTTTTTGCACTTGGGCAGTTGGAACAACCTGAAATATCTATTTCCAGACCAGCAAATAAGAGTGCCCACATATCTTGGAAGGCATCCATCCAAGGCTTTAGCAGTAAAATCATACACTGGTACTGGCAGAAACCAAACAAAGGCTTAGAATATTTATTACATGTCTTCTTGACAATCTCTGCTCAAGATTGCTCAGGTGGGAAGACTAAGAAACTTGAGGTAAGTAAAAATGCTCACACTTCCACTTCCACTTTGAAAATAAAGTTCTTAGAGAAAGAAGATGAGGTGGTGTACCACTGTGCCTGCTGGATTAGGCAC +>742|IGHV1-8 AC_000146.1|IGHV1-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAAGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCAGTTATGATATCAACTGGGTGCGACAGGCCACTGGACAAGGGCTTGAGTGGATGGGATGGATGAACCCTAACAGTGGTAACACAGGCTATGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGAACACCTCCATAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGG +>743|IGHJ6 GRCh38-release94|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACGGTATGGACGTCTGGGGCCAAGGGACCACGGTCACCGTCTCCTCAG +>744|TRBV20-1 GRCh38-release94|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>745|TRBV7-7 GRCh38-release94|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATTCTGTTTCCACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC diff --git a/lib/rust/vdj_ann_ref/vdj_refs_4.0/mouse/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_4.0/mouse/fasta/regions.fa new file mode 100644 index 0000000..7edd0b2 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_4.0/mouse/fasta/regions.fa @@ -0,0 +1,1284 @@ +>1|IGHA ENSMUST00000178282|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGGTAAACCCACCAATGTCAGCGTGTCTGTGATCATGTCAGAGGGAGATGGCATCTGCTAC +>2|IGHA ENSMUST00000194738|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGAACGTCAAGAGCCACTTTCCTATGTGCTACTGGACCAGTCAGAAGACATCCTGGAGGAAGAGGCCCCAGGTGCCAGCCTGTGGCCCACCACTGTGACCTTCCTCACCCTCTTCCTACTGAGCTTGTTCTACAGCACAGCACTCACTGTTACAACTGTTCGAGGCCCGTTTGGCAGCAAAGAGGTCCCCCAGTAC +>3|IGHD ENSMUST00000192250|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGATGCTACCACCTCCTGCCTGAGTCAGACGGTCCTTCCAGGAGACCTGATGGTCCTGCCCTTGCC +>4|IGHD ENSMUST00000194162|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGCATAGTCAACACCATCCAACACTCGTGTATCATGGATGAGCAAAGTGACAGCTACATGGACTTAGAGGAGGAGAACGGCCTGTGGCCCACAATGTGCACCTTCGTGGCCCTCTTCCTGCTCACACTGCTCTACAGTGGCTTCGTCACCTTCATCAAGGTGAAG +>5|IGHD1-1 ENSMUST00000103439|IGHD1-1|D-REGION|IG|IGH|None|00 +TTTATTACTACGGTAGTAGCTAC +>6|IGHD2-3 ENSMUST00000177839|IGHD2-3|D-REGION|IG|IGH|None|00 +TCTATGATGGTTACTAC +>7|IGHD2-4 ENSMUST00000179560|IGHD2-4|D-REGION|IG|IGH|None|00 +TCTACTATGATTACGAC +>8|IGHD2-5 ENSMUST00000178549|IGHD2-5|D-REGION|IG|IGH|None|00 +CCTACTATAGTAACTAC +>9|IGHD2-7 ENSMUST00000177965|IGHD2-7|D-REGION|IG|IGH|None|00 +TCTACTATGGTTACGAC +>10|IGHD2-8 ENSMUST00000180001|IGHD2-8|D-REGION|IG|IGH|None|00 +TCTACTATGGTAACTAC +>11|IGHD3-1 ENSMUST00000180266|IGHD3-1|D-REGION|IG|IGH|None|00 +GGCACAGCTCGGGCTAC +>12|IGHD3-2 ENSMUST00000179883|IGHD3-2|D-REGION|IG|IGH|None|00 +AGACAGCTCAGGCTAC +>13|IGHD4-1 ENSMUST00000179520|IGHD4-1|D-REGION|IG|IGH|None|00 +CTAACTGGGAC +>14|IGHD5-2 ENSMUST00000179166|IGHD5-2|D-REGION|IG|IGH|None|00 +GAATACCTAC +>15|IGHD5-5 ENSMUST00000178815|IGHD5-5|D-REGION|IG|IGH|None|00 +GACTACCTAC +>16|IGHD5-7 ENSMUST00000178483|IGHD5-7|D-REGION|IG|IGH|None|00 +AGGCAGCTAGCCTCTGCAGTGCCACAACC +>17|IGHD5-8 ENSMUST00000178909|IGHD5-8|D-REGION|IG|IGH|None|00 +AGACAGCTAGCCTCTGCAGTGCCACAACC +>18|IGHE ENSMUST00000137336|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGGTAACACCTCCCTCCATCCCTCC +>19|IGHE ENSMUST00000223335|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGAGCTAGACCTCCAGGACCTATGTATTGAAGAGGTGGAGGGCGAGGAGCTGGAAGAGCTGTGGACCAGTATTTGTGTCTTCATCACCCTGTTCCTGCTCAGTGTGAGCTATGGGGCCACTGTCACCGTCCTCAAGGTGAAGTGGGTCTTCTCCACACCGATGCAGGATACACCCCAGACCTTCCAAGACTATGCCAACATCTTCCAGACCAGGGCA +>20|IGHG1 ENSMUST00000103420|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGTAAA +>21|IGHG1 ENSMUST00000194304|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGGCTGCAACTGGACGAGACCTGTGCTGAGGCCCAGGACGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGTGTGTGCTACAGCGCTGCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCGGTGGTGGAGCTGAAGCAGACACTGGTTCCTGAATACAAGAACATGATTGGGCAAGCACCC +>22|IGHG2B ENSMUST00000103418|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>23|IGHG2B ENSMUST00000192188|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGGCTAGACCTGGATGATATCTGTGCTGAGGCCAAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCAGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>24|IGHG2C ENSMUST00000103416|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGGCTAGACCTGGATGATGTCTGTACTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACAACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGTTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCTGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>25|IGHG2C ENSMUST00000195192|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGTAAA +>26|IGHG3 ENSMUST00000103423|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGGTAAA +>27|IGHG3 ENSMUST00000223179|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGAGCTGGAACTGAATGAGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>28|IGHJ1 ENSMUST00000103430|IGHJ1|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATGTCTGGGGCACAGGGACCACGGTCACCGTCTCCTCAG +>29|IGHJ2 ENSMUST00000192746|IGHJ2|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAAGGCACCACTCTCACAGTCTCCTCAG +>30|IGHJ3 ENSMUST00000103428|IGHJ3|J-REGION|IG|IGH|None|00 +CCTGGTTTGCTTACTGGGGCCAAGGGACTCTGGTCACTGTCTCTGCAG +>31|IGHJ4 ENSMUST00000103427|IGHJ4|J-REGION|IG|IGH|None|00 +ATTACTATGCTATGGACTACTGGGGTCAAGGAACCTCAGTCACCGTCTCCTCAG +>32|IGHM ENSMUST00000103426|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGGTAAACCCACACTGTACAATGTCTCCCTGATCATGTCTGACACAGGCGGCACCTGCTAT +>33|IGHM ENSMUST00000177715|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGAGGGGGAGGTGAATGCTGAGGAGGAAGGCTTTGAGAACCTGTGGACCACTGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGCACCACCGTCACCCTGTTCAAGGTGAAA +>34|IGHV1-11 ENSMUST00000191801|IGHV1-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCCAGATCACCCTCTTTCTGGTGGCAGCAATTACATGTGCCTACTCCCAGATCCAGCTGCAACAGTCAGGAGCTGAGCTGGCGAGTCCTGGGGCATCAGTGACACTGTCCTGCAAGGCTTCTGGCTACACATTTACTGACCATATTATGAATTGGGTAAAAAAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAGGATTTATCCAGTAAGTGGTGAAACTAACTACAATCAAAAGTTCATGGGCAAGGCCACATTCTCTGTAGACCGGTCCTCCAGCACAGTGTACATGGTGTTGAACAGCCTGACATCTGAGGACCCTGCTGTCTATTACTGTGGAAGG +>35|IGHV1-12 ENSMUST00000109711|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>36|IGHV1-12 ENSMUST00000109711|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>37|IGHV1-12 ENSMUST00000195469|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>38|IGHV1-12 ENSMUST00000195469|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGCTTATCTACAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTTACCAGTTACAATATGCACTGGGTAAAGCAGACACCTAGACAGGGCCTGGAATGGATTGGAGCTATTTATCCAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>39|IGHV1-15 ENSMUST00000192077|IGHV1-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAATTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGACGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGGGTGAAGCAGACACCTGTGCATGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTGGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCATACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>41|IGHV1-18 ENSMUST00000194350|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCCTCTTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATACCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGGACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTATCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACACTGCAGTCTATTACTGTGCAAGA +>42|IGHV1-19 ENSMUST00000193855|IGHV1-19|5'UTR|IG|IGH|None|00 +AACAACACATGTCCAATGTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>43|IGHV1-19 ENSMUST00000193855|IGHV1-19|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGTAAGGCTTCTGGATACACATTCACTGACTACTATATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGTTATTAATCCTTACAACGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTTGACAAGTCCTCCAGCACAGCCTACATGGAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>44|IGHV1-20 ENSMUST00000194968|IGHV1-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGCAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGATTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGATGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCGGAGCCTGACATCTGAGGACTCTGCAGTCTATTATTGTGCAAGA +>45|IGHV1-22 ENSMUST00000103507|IGHV1-22|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGAAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTAACCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAAACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCGGAGGATTCTGCAGTCTATTACTGTGCAAGA +>46|IGHV1-23 ENSMUST00000194625|IGHV1-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGTGTGAAGCAGACACCTGTGCACGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTTGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>47|IGHV1-24 ENSMUST00000191861|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCGGCTGCAGCAGTCTGGACCTAAGGTAGTGAATGCTGGGGCTTCCGTGAAGCTGTCCTGCAAGTCTTCTGGTTACTCATTCAGTAGATACAAAATGGAATGTGTGAAACAGAGCCATGGAAAGAGCCTTGAGTGGATTGAACATATTAATCTTTTCAAAGGTGTTACTAACTACAATGGAAAGTTCAAAAGCAAGGCCACATTGACTGTAGACATATCCTCTAGCACAGCCTATATGGAGCTTAGCAGATTGACATCTGAAGACTCAGAGGTATATTACTGTGCAAGA +>48|IGHV1-26 ENSMUST00000103510|IGHV1-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAATCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATACACGTTCACTGACTACTACATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>49|IGHV1-31 ENSMUST00000195735|IGHV1-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTATCTGGATCTTTCTCTTCCTTCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAGAGCCATGGAAATATCCTCGATTGGATTGGATATATTTATCCTTACAATGGTGTTTCTAGCTACAACCAGAAATTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCTAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>50|IGHV1-34 ENSMUST00000103512|IGHV1-34|5'UTR|IG|IGH|None|00 +GTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>51|IGHV1-34 ENSMUST00000103512|IGHV1-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGTTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTTATCCTAACAATGGTGGTAATGGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>52|IGHV1-36 ENSMUST00000191862|IGHV1-36|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGCCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATTCACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACTTGTTTATCCTTACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGGAGCTAAACAGCCTGACTTCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>53|IGHV1-37 ENSMUST00000193950|IGHV1-37|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGTAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCTGAGCCTGACATCTGAGGACTTTGCAGTCTATTATTGTGCAAGA +>54|IGHV1-39 ENSMUST00000103515|IGHV1-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTCTCAGGAACTGCAGGTGTCCACTCTGAGTTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGCGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGACTACAACATGAACTGGGTGAAGCAGAGCAATGGAAAGAGCCTTGAGTGGATTGGAGTAATTAATCCTAACTATGGTACTACTAGCTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACCAATCTTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>55|IGHV1-4 ENSMUST00000103493|IGHV1-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTTCCTGTTGTCAGTAACTTCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAGACCTGGTGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACACGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTGAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>56|IGHV1-42 ENSMUST00000191868|IGHV1-42|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAACTGGATCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGAACTGGGTGAAGCAAAGTCCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTACCTACAACCAGAAGTTCAAGGCCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>57|IGHV1-43 ENSMUST00000195417|IGHV1-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCAAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAAAGTTCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTAACTGTAGACAAGTCATCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCTGTCTATTACTGTGCAAGA +>58|IGHV1-47 ENSMUST00000194865|IGHV1-47|5'UTR|IG|IGH|None|00 +ATAAGATCAGTCTTCTCTATAATCACTGAGTGCAGAGGACCTCACA +>59|IGHV1-47 ENSMUST00000194865|IGHV1-47|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCGTGGATCTCTATCATCCTCTTCCTAGTGGCAACAGCTATAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTAGTGAAGCCTGGAGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACTACCTATCCTATAGAGTGGATGAAGCAGAATCATGGAAAGAGCCTAGAGTGGATTGGAAATTTTCATCCTTACAATGATGATACTAAGTACAATGAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGAAAAATCCTCTAGCACAGTCTACTTGGAGCTCAGCCGATTAACATCTGATGACTCTGCTGTTTATTACTGTGCAAGG +>60|IGHV1-49 ENSMUST00000192724|IGHV1-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGGTCTTTCTCTTCCTCCTGTCAGGAACTGCAGGAGTCCACTCACAGCGTGAGCTGCAGCAGTCTGGAGCTGAGTTGGTGAGACCTGGGTCCTCAGTGAAGTTGTCCTGCAAGGATTCTTACTTTGCCTTCATGGCCAGTGCTATGCACTGGGTGAAGCAAAGACCTGGACATGGCCTGGAATGGATAGGATCTTTTACTATGTACAGTGATGCTACTGAGTACAGTGAAAACTTCAAGGGCAAGGCCACATTGACTGCAAACACATCCTCGAGCACAGCCTACATGGAACTCAGCAGCCTCACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>61|IGHV1-5 ENSMUST00000191803|IGHV1-5|5'UTR|IG|IGH|None|00 +GATCAGTATCCTCTTCACAGTCACTGAAAACATTGACTCTAATC +>62|IGHV1-5 ENSMUST00000191803|IGHV1-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTAACTGGATACTTCCTTTTATTCTGTCGGTAACTTCAGGGGTCTACTCAGAGGTTCAGCTCCAGCAGTCTGGGACTGTGCTGGCAAGGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGACTTCTGGCTACACATTTACCAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATAGGGGCTATTTATCCTGGAAATAGTGATACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCAAACTGACTGCAGTCACATCCGCCAGCACTGCCTACATGGAGCTCAGCAGCCTGACAAATGAGGACTCTGCGGTCTATTACTGTACAAGA +>63|IGHV1-50 ENSMUST00000103521|IGHV1-50|5'UTR|IG|IGH|None|00 +CTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCGCC +>64|IGHV1-50 ENSMUST00000103521|IGHV1-50|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCTCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGCTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>65|IGHV1-52 ENSMUST00000192554|IGHV1-52|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCATTGGGTGAAGCAGAGGCCTATACAAGGCCTTGAATGGATTGGTAACATTGACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>66|IGHV1-53 ENSMUST00000103523|IGHV1-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGACTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAAATATTAATCCTAGCAATGGTGGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>67|IGHV1-54 ENSMUST00000103525|IGHV1-54|5'UTR|IG|IGH|None|00 +AGTCCCTGAACACACTGACTCTCACC +>68|IGHV1-54 ENSMUST00000103525|IGHV1-54|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCAGAGTCTTTATCTTTCTCCTATCAGTAACTGCAGGTGTTCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGATACGCCTTCACTAATTACTTGATAGAGTGGGTAAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGTGATTAATCCTGGAAGTGGTGGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCAACACTGACTGCAGACAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>69|IGHV1-55 ENSMUST00000103526|IGHV1-55|5'UTR|IG|IGH|None|00 +CACCACACAAAAAAGCATAAGATCACTGTTCTCTCTACAGTTACTAAGCACACAGGATCTCACC +>70|IGHV1-55 ENSMUST00000103526|IGHV1-55|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCATTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATAACCTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAGATATTTATCCTGGTAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>71|IGHV1-56 ENSMUST00000194071|IGHV1-56|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGTTGGGTCTTTCTTTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTCCTGGCTATACCTTCACCAGCCACTGGATGCAGTGGGTAAGACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>72|IGHV1-58 ENSMUST00000103529|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGATCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTCCAGCTTCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGTCCTCAGTGAAGATGTCCTGCAAGACTTCTGGATATACATTCACAAGCTACGGTATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTGGAATGGATTGGATATATTTATATTGGAAATGGTTATACTGAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTTCAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAATCTATTTCTGTGCAAGA +>73|IGHV1-59 ENSMUST00000195359|IGHV1-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATTGTCCTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGACTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTAAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGTGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>74|IGHV1-61 ENSMUST00000103531|IGHV1-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGGATTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAATGGATTGGTAACATTTACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>75|IGHV1-62-1 ENSMUST00000103503|IGHV1-62-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACAGAGTTGGGTCTTACTCTTCCTCCTGTCAGAAACTGCAGGTGTCCACTGCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACAGCAGAGAACTCTGCAATCTATCTGTGCAAGG +>76|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|5'UTR|IG|IGH|None|00 +GAACACACTGACTCAAACC +>77|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>78|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>79|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTTCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCAGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>80|IGHV1-63 ENSMUST00000103534|IGHV1-63|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCGGGGTCTTTATCTTTCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACCTTCACTAACTACTGGATAGGTTGGGCAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGATATTTACCCTGGAGGTGGTTATACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGTTCAGCAGCCTGACATCTGAGGACTCTGCCATCTATTACTGTGCAAGA +>81|IGHV1-64 ENSMUST00000103535|IGHV1-64|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACAGTTCTCTCTACAGTTACTGAGCACACAGGACCTCACA +>82|IGHV1-64 ENSMUST00000103535|IGHV1-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTATATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTAAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACTTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAATGATTCATCCTAATAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>83|IGHV1-66 ENSMUST00000103537|IGHV1-66|5'UTR|IG|IGH|None|00 +ATGATCAGTGTCCTCTCTACACAGTCCCTGACGACACTGACTCTAACC +>84|IGHV1-66 ENSMUST00000103537|IGHV1-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACAGCTTCACAAGCTACTATATACACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGTGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACGGCAGACACATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTAACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>85|IGHV1-69 ENSMUST00000199933|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGATGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGTCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>86|IGHV1-7 ENSMUST00000103496|IGHV1-7|5'UTR|IG|IGH|None|00 +GCATCCTCTCCACAGACACTGAAAACTCTGACTCAAC +>87|IGHV1-7 ENSMUST00000103496|IGHV1-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTCCCTGTTGTCAGTAATAGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAAACCTGGGGCCTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTGAGCAGCCTGACATATGAGGACTCTGCAGTCTATTACTGTGCAAGA +>88|IGHV1-71 ENSMUST00000196690|IGHV1-71|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>89|IGHV1-72 ENSMUST00000103541|IGHV1-72|5'UTR|IG|IGH|None|00 +AGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>90|IGHV1-72 ENSMUST00000103541|IGHV1-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>91|IGHV1-74 ENSMUST00000196587|IGHV1-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGCCAAGGCCTTGAGTGGATTGGAAGGATTCATCCTTCTGATAGTGATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAATA +>92|IGHV1-75 ENSMUST00000103544|IGHV1-75|5'UTR|IG|IGH|None|00 +CCTGACGACACTGACTCTAACC +>93|IGHV1-75 ENSMUST00000103544|IGHV1-75|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTACAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTTTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTTACTGTAGACAAATCCTCCAGCACAGCCTACATGTTGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>94|IGHV1-76 ENSMUST00000197537|IGHV1-76|5'UTR|IG|IGH|None|00 +CGACACTGATTCTAACC +>95|IGHV1-76 ENSMUST00000197537|IGHV1-76|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTGTCAGGTCCAGCTGAAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACTTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGCAAGGATTTATCCTGGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGAAAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCTGTCTATTTCTGTGCAAGA +>96|IGHV1-77 ENSMUST00000198777|IGHV1-77|5'UTR|IG|IGH|None|00 +AAACAACCTATGATCAGTGTCCTCTCCACAGTCTCTGAACACCCTTACTCAAACC +>97|IGHV1-77 ENSMUST00000198777|IGHV1-77|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTCCAGCTGAAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAAGATTGGTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>98|IGHV1-78 ENSMUST00000199373|IGHV1-78|5'UTR|IG|IGH|None|00 +GTCCCTGAACACACTGACTGTAACA +>99|IGHV1-78 ENSMUST00000199373|IGHV1-78|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTCTCTCTTCTTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGTTCAGCTGCAACAGTCTGACGCTGAGTTGGTGAAACCTGGAGCTTCAGTGAAGATATCCTGCAAGGTTTCTGGCTACACCTTCACTGACCATACTATTCACTGGATGAAGCAGAGGCCTGAACAGGGCCTGGAATGGATTGGATATATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>100|IGHV1-80 ENSMUST00000103547|IGHV1-80|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTTGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAAGCTTCTGGCTACGCATTCAGTAGCTACTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACAGATTTATCCTGGAGATGGTGATACTAACTACAACGGAAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>101|IGHV1-81 ENSMUST00000103548|IGHV1-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGATCTTTCTCTTCATCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGGCGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTATGGTATAAGCTGGGTGAAGCAGAGAACTGGACAGGGCCTTGAGTGGATTGGAGAGATTTATCCTAGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCGTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>102|IGHV1-82 ENSMUST00000196991|IGHV1-82|5'UTR|IG|IGH|None|00 +CTTCTCCACAGTCCCAGAACACACTCACTCTAACC +>103|IGHV1-82 ENSMUST00000196991|IGHV1-82|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTGTATCTTTCTCTTCCTCCTGTCAGTAACTGAAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAGGCTTCTGGCTACGCATTCAGTAGCTCCTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACGGATTTATCCTGGAGATGGAGATACTAACTACAATGGGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTACTTCTGTGCAAGA +>104|IGHV1-84 ENSMUST00000103551|IGHV1-84|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTTTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGATCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGCGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>105|IGHV1-85 ENSMUST00000103552|IGHV1-85|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTACGATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCGTACATGGAGCTCCACAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>106|IGHV1-9 ENSMUST00000193893|IGHV1-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGACCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGATGAAGCCTGGGGCCTCAGTGAAGCTTTCCTGCAAGGCTACTGGCTACACATTCACTGGCTACTGGATAGAGTGGGTAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGAGATTTTACCTGGAAGTGGTAGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACATTCACTGCAGATACATCCTCCAACACAGCCTACATGCAACTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>107|IGHV10-1 ENSMUST00000103492|IGHV10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGCTGTTGGGGCTGAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGGTCATTGAAACTCTCATGTGCAGCCTCTGGATTCAGCTTCAATACCTACGCCATGAACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAATAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCAGAAAGCATGCTCTATCTGCAAATGAACAACTTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGACA +>108|IGHV10-3 ENSMUST00000103495|IGHV10-3|5'UTR|IG|IGH|None|00 +GACAATATAACATTGAAC +>109|IGHV10-3 ENSMUST00000103495|IGHV10-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGTGTTGGGGCTTAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGATCATTGAAACTCTCATGTGCCGCCTCTGGTTTCACCTTCAATACCTATGCCATGCACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAGTAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCACAAAGCATGCTCTATCTGCAAATGAACAACCTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGAGA +>110|IGHV11-1 ENSMUST00000103466|IGHV11-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGAAGGCTTGGTGCCACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGCTTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCTGAGGACACAGCCACGTATTTCTGTATGAGATA +>111|IGHV11-2 ENSMUST00000103468|IGHV11-2|5'UTR|IG|IGH|None|00 +ATGCAAATAGGGCCTCTTTCTACTCATGAAACGCAGACCAACCTATCCTTGCAGTTCAGACAGAGGAGCTTGGCTCTGGTTCCCAAGACCTCTTACTCACTTCTCAAC +>112|IGHV11-2 ENSMUST00000103468|IGHV11-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGGAGGCTTGGTGCAACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGATTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCGGAGGACACAGCCACGTATTTCTGTATGAGATA +>113|IGHV12-3 ENSMUST00000103485|IGHV12-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGCTGGGATTTGTGTGCCTGGTGACAGTCCTTCCTGGTAGCCTGTCTCAGATGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCCTCACAGTCACTCTTCCTTACCTGCTCTATTACTGGTTTCCCCATCACCAGTGGTTACTACTGGATCTGGATCCGTCAGTCACCTGGGAAACCCCTAGAATGGATGGGGTACATCACTCATAGTGGGGAAACTTTCTACAACCCATCTCTCCAGAGCCCCATCTCCATTACTAGAGAAACGTCAAAGAACCAGTTCTTCCTCCAATTGAACTCTGTGACCACAGAGGACACAGCCATGTATTACTGTGCAGGAGACAG +>114|IGHV13-2 ENSMUST00000125484|IGHV13-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGACTGAGCTGGGTATTTCTTGTGGCTCTTTTGAACGGTGTCCAGTGTCAGGTGCAGCTTGTAGAGACCGGGGGAGGCTTGGTGAGGCCTGGAAATTCTCTGAAACTCTCCTGTGTTACCTCGGGATTCACTTTCAGTAACTACCGGATGCACTGGCTTCGCCAGCCTCCAGGGAAGAGGCTGGAGTGGATTGCTGTAATTACAGTCAAATCTGATAATTATGGAGCAAATTATGCAGAGTCTGTGAAAGGCAGATTCGCCATTTCAAGAGATGATTCAAAAAGCAGTGTCTACCTAGAGATGAACAGATTAAGAGAGGAAGACACTGCCACTTATTTTTGTAGTAGACA +>115|IGHV14-1 ENSMUST00000103463|IGHV14-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGATACTGAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATGACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>116|IGHV14-2 ENSMUST00000103467|IGHV14-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGATCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAAGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGACTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGAAACTAAATATGCCCCGAAATTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTGCTAGA +>117|IGHV14-3 ENSMUST00000103469|IGHV14-3|5'UTR|IG|IGH|None|00 +ATATGAGCCCTATATTCTCTACAGACACTGAATCTCAAGGTCCTTACA +>118|IGHV14-3 ENSMUST00000103469|IGHV14-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATTCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGTGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAAACACCTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGCGAATGGTAATACTAAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATAACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCATCTATTACTGTGCTAGA +>119|IGHV14-4 ENSMUST00000195706|IGHV14-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTATAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTTAACATTAAAGACGACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGATGGATTGATCCTGAGAATGGTGATACTGAATATGCCTCGAAGTTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>120|IGHV15-2 ENSMUST00000195337|IGHV15-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGATCACTCTCCATCTGCTGGCAGCAGCTACAGGTATCCAATCCCAGGTTCACCTACAACAGTCTGGTTCTGAACTGAGGAGTCCTGGGTCTTCAGTAAAGCTGTCATGCAAGGATTTTGATTCAGAAGTCTTCCCTATTGCTTATATGAGTTGGGTAAGGCAGAAGCCTGGGCATGGATTTGAATGGATTGGAGGCATACTCCCAAGTATTGGTAGAACAATCTATGGAGAGAAGTTTGAGGACAAAGCCACATTGGATGCAGACACACTGTCCAACACAGCCTACTTGGAGCTCAACAGTCTGACATCCGAGGACTCTGCTATCTACTACTGTGCAAGG +>121|IGHV16-1 ENSMUST00000195641|IGHV16-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTTAGTTGGGCTTTCCTTGTTATTTTAAAAGGCATACAGGGTGAGGTGCAGCTGGTGGAATCTGGAGGCAGCTTGGGACAGCCTGGAGGGTCCACTAAACTCTCTTGTGAAGAAGCATCTGGATTCACTTTCAGTGATCATTGGATGGACTGGTTTCGCCAAGCCCCAGGCATGAGGCTAGAATGGTTAGCAAATACAAACCATGATGAGAGTGGAAAAGGCTATGCAGAGTCTGTGAAAGACAGATTCTCCATCTCCAGAGACAATTCTGAGAACTTATTGTATCTACAAATGAACAGTCTGAGAAACGAAGACACGGCTCTGTATTATTGTGCCAGAGA +>122|IGHV2-2 ENSMUST00000103443|IGHV2-2|5'UTR|IG|IGH|None|00 +GC +>123|IGHV2-2 ENSMUST00000103443|IGHV2-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCTTGGGGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCAGCTTTCATATCCAGACTGAGCATCAGCAAGGACAATTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACAGCCATATATTACTGTGCCAGAAA +>124|IGHV2-3 ENSMUST00000178229|IGHV2-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCACTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCAGGGTTCTCATTAACCAGCTATGGTGTAAGCTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGACGGGAGCACAAATTATCATTCAGCTCTCATATCCAGACTGAGCATCAGCAAGGATAACTCCAAGAGCCAAGTTTTCTTAAAACTGAACAGTCTGCAAACTGATGACACAGCCACGTACTACTGTGCCAA +>125|IGHV2-4 ENSMUST00000103447|IGHV2-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCTGCTTTCATATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>126|IGHV2-5 ENSMUST00000195707|IGHV2-5|5'UTR|IG|IGH|None|00 +ATCCTTGCTCATTGTTTCCTTTTATCCTTTCAGAAACCTCCCCCAATGCAAAGCAGCCCTCAGGCAGAGGATAAAAGCCCACACAAAGCTGAGAAGCCCCATCCTCTTCTCATAGAGCCTCCATCAGAGC +>127|IGHV2-5 ENSMUST00000195707|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATAACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGAGGTGGAAGCACAGACTACAATGCAGCTTTCATGTCCAGACTGAGCATCACCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>128|IGHV2-6 ENSMUST00000179657|IGHV2-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTTCTCTGCCTGGTGACTTTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACCGTCTCAGGGTTCTCATTAACCAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGTAGTGATATGGAGTGATGGAAGCACAACCTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTCCAAACTGATGACACAGCCATGTACTACTGTGCCAGACA +>129|IGHV2-6-8 ENSMUST00000192911|IGHV2-6-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTATCCTTTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGTTGGAAGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAGTGA +>130|IGHV2-7 ENSMUST00000103456|IGHV2-7|5'UTR|IG|IGH|None|00 +AGAGC +>131|IGHV2-7 ENSMUST00000103456|IGHV2-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTCCTCTGCCTGGTGACCTTTCCAAGCTGTGTCCTGTCACAAGTGCAGATGAAGGAGTCAGGACCTGACCTTGTGCAGCCATCACAGACTCTGTCTCTCACCTGCACTGTCTCTGGGTTCTCATTAAGTAGCTATGGTGTACATTGGTTTCGCAAGCCTCCGAGAAAGGGATTGGAATGGTTGGGAGGAATATGGTCTGGTGGAAGCATATACTATACTCCAGCTCTCAGTTCCCGACTGAGTGTCAGCAGGGACACCTCTAAGAGCCAAGTTTTCTTTAAAATGAGCAGTCTGCAAAGTGAAGACACGGCTGTGTACCACTGTGCCAGATA +>132|IGHV2-9 ENSMUST00000103451|IGHV2-9|5'UTR|IG|IGH|None|00 +CCCCATCAGAGC +>133|IGHV2-9 ENSMUST00000103451|IGHV2-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGTTCCTCTGCCTGGTTGCATTTCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACTTGCACTGTCTCTGGGTTTTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGGTGGAAGCACAAATTATAATTCAGCTCTCATGTCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAAACA +>134|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|5'UTR|IG|IGH|None|00 +ATAGAGCCTCCATCAGAGC +>135|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTGCCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGCTATAAGCTGGGTTCGCCAGCCACCAGGAAAGGGTCTGGAGTGGCTTGGAGTAATATGGACTGGTGGAGGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGTCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCAGGTACTACTGTGCCAGAAA +>136|IGHV3-1 ENSMUST00000103478|IGHV3-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGCGTGCTGATTCTTTTGTGGCTGTTCACAGCCTTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCATGGTGAAACCTTCTCAGTCACTTTCCCTCACCTGCACTGTCACTGGCTACTCCATCACCAGTGGTTATGACTGGCACTGGATCCGACATTTTCCAGGAAACAAACTGGAGTGGATGGGCTACATAAGCTACAGTGGTAGCACTAACTACAACCCATCCCTCAAAAGTCGAATCTCCATCACTCATGACACATCTAAGAACCATTTCTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>137|IGHV3-3 ENSMUST00000191693|IGHV3-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAATGTTGAGTGTTCTGTACCTGTTGTCAGCCCTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTAGCCTGGTGAGACCTTCTCAGACACTCTCCCTTACCTGCACTGTTACTGGCTTCTCCATCAACAGTGATTGTTACTGGATCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTACATCGGGTACACATTCTACAGTGGTATCACTTACTACAACCCATCTCTTGAAAGTCGAACGTACATAACGCGTGACACATCTAAGAACCAGTTCTCACTGAAGTTGAGTTCTGTGACTACTGAGGACACAGCCACTTACTACTGTGCGAGAGA +>138|IGHV3-4 ENSMUST00000193408|IGHV3-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGTTGATTCTTGTGTACCTGTTGACAGCCCTTCCTGGTATCTTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGCCCTGGTGAAGCCTTCTCAGACAGTGTCCCTCACCTGCACTGTCACTGGCTACTCTATCACTAATGGTAATCACTGGTGGAACTGGATCCGGCAGGTTTCAGGAAGCAAACTGGAGTGGATAGGGTACATAAGCTCCAGTGGTAGCACTGACAGCAATCCATCTCTCAAAAGTCGAATCTCCATCACTAGAGACACTTCCAAGAACCAGTTATTCCTGCAGTTGAACTCTGTGACTACTGAAGATATAGCCACATATTACTGTGCAAGAGA +>139|IGHV3-5 ENSMUST00000195619|IGHV3-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAATGTTCACTCTTCTGTACCTGTTGACAGTCGTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCTTCTCAGACAGTGTTCCTCACCTGCACTGTCACTGGCATTTCCATCACCACTGGAAATTACAGGTGGAGCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTGGATAGGGTACATATACTACAGTGGTACCATTACCTACAATCCATCTCTCACAAGTCGAACCACCATCACTAGAGACACTCCCAAGAACCAGTTCTTCCTGGAAATGAACTCTTTGACTGCTGAGGACACAGCCACATACTACTGTGCACGAGA +>140|IGHV3-6 ENSMUST00000195124|IGHV3-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAGTGTTGAGTCTGTTGTACCTGTTGACAGCCATTCCTGGTATCCTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGGCCTCGTGAAACCTTCTCAGTCTCTGTCTCTCACCTGCTCTGTCACTGGCTACTCCATCACCAGTGGTTATTACTGGAACTGGATCCGGCAGTTTCCAGGAAACAAACTGGAATGGATGGGCTACATAAGCTACGATGGTAGCAATAACTACAACCCATCTCTCAAAAATCGAATCTCCATCACTCGTGACACATCTAAGAACCAGTTTTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>141|IGHV3-8 ENSMUST00000103483|IGHV3-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGTGTTAAGTCTTCTGTACCTGTTGACAGCCCTTCCGGGTATCCTGTCAGAGGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGCAAAACCTTCTCAGACTCTGTCCCTCACCTGTTCTGTCACTGGCTACTCCATCACCAGTGATTACTGGAACTGGATCCGGAAATTCCCAGGGAATAAACTTGAGTACATGGGGTACATAAGCTACAGTGGTAGCACTTACTACAATCCATCTCTCAAAAGTCGAATCTCCATAACTCGAGACACATCCAAGAACCAGTATTACCTGCAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGATACACAGTGTGGAGTCTTCAGTGTAGGCCCAGACATAAACCTCCTTGTA +>142|IGHV4-1 ENSMUST00000103464|IGHV4-1|5'UTR|IG|IGH|None|00 +GAAGCAAAGGGGATCAGCCCGAGATTCTCATTCAGTGATCAACACTGAACACACATCCCTTACC +>143|IGHV4-1 ENSMUST00000103464|IGHV4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTTTGGGCTGATTTTTTTTATTGTTGCTCTTTTAAAAGGGGTCCAGTGTGAGGTGAAGCTTCTCCAGTCTGGAGGTGGCCTGGTGCAGCCTGGAGGATCCCTGAAACTCTCCTGTGCAGCCTCAGGAATCGATTTTAGTAGATACTGGATGAGTTGGGTTCGGCGGGCTCCAGGGAAAGGACTAGAATGGATTGGAGAAATTAATCCAGATAGCAGTACAATAAACTATGCACCATCTCTAAAGGATAAATTCATCATCTCCAGAGACAACGCCAAAAATACGCTGTACCTGCAAATGAGCAAAGTGAGATCTGAGGACACAGCCCTTTATTACTGTGCAAGACC +>144|IGHV5-12 ENSMUST00000103450|IGHV5-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTGGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATTACATGTATTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAATGGTGGTGGTAGCACCTATTATCCAGACACTGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCCGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>145|IGHV5-12-4 ENSMUST00000195381|IGHV5-12-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCATATTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTCGTGGAGTCTGGGGGAGGTTTAGTGAAGCCTGGACAGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACTATTACATGTCTTGGGTTCACCAGACTCCGGAGAAGAGGCTGGAGTGGGTTGCATACATTAGTAGTAGTGGTGTTAGCACCTATTATCCAGACAATGTAAAGGGCCGATTCGCCATCTCCAGAGACAATGCCAAGAACACCCTTTACCTGCAAATGACCAGTCTGAAGTCAGAGGACACGGCCTTGTATTACTGTGCAAGAGG +>146|IGHV5-15 ENSMUST00000192877|IGHV5-15|5'UTR|IG|IGH|None|00 +CACTCATC +>147|IGHV5-15 ENSMUST00000192877|IGHV5-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCAGGCTCAGCTTACTTATTTTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTACGGAATGGCGTGGGTTCGACAGGCTCCAAGGAAGGGGCCTGAGTGGGTAGCATTCATTAGTAATTTGGCATATAGTATCTACTATGCAGACACTGTGACGGGCCGATTCACCATCTCTAGAGAGAATGCCAAGAACACCCTGTACCTGGAAATGAGCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGACA +>148|IGHV5-16 ENSMUST00000193652|IGHV5-16|5'UTR|IG|IGH|None|00 +ATCAGGACTGAACACAGACCAGTCACC +>149|IGHV5-16 ENSMUST00000193652|IGHV5-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTCAGGCTCAGCTCAGTTTTTCTTGTTCTTATTTTAAAAGGAGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGAGGGAGGCTTAGTGCAGCCTGGAAGTTCCATGAAACTCTCCTGCACAGCCTCTGGATTCACTTTCAGTGACTATTACATGGCTTGGGTCCGCCAGGTTCCAGAAAAGGGTCTAGAATGGGTTGCAAACATTAATTATGATGGTAGTAGCACCTACTATCTGGACTCCTTGAAGAGCCGTTTCATCATCTCGAGAGACAATGCAAAGAACATTCTATACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCACGTATTACTGTGCAAGAGA +>150|IGHV5-17 ENSMUST00000103459|IGHV5-17|5'UTR|IG|IGH|None|00 +TGGATTCCCAGGTCCTCACATTCAGTGATCAGCACTGAACACAGACCACTCACC +>151|IGHV5-17 ENSMUST00000103459|IGHV5-17|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTCCAGGCTCAATTTAGTTTTCCTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATGGAATGCACTGGGTTCGTCAGGCTCCAGAGAAGGGGCTGGAGTGGGTTGCATACATTAGTAGTGGCAGTAGTACCATCTACTATGCAGACACAGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTTCCTGCAAATGACCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGG +>152|IGHV5-2 ENSMUST00000195468|IGHV5-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCGGGCTCAGCTTGGTTTTCCTTGTCCTTATTTTAAAAAGTGTACAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGAGTCCCTGAAACTCTCCTGTGAATCCAATGAATACGAATTCCCTTCCCATGACATGTCTTGGGTCCGCAAGACTCCGGAGAAGAGGCTGGAGTTGGTCGCAGCCATTAATAGTGATGGTGGTAGCACCTACTATCCAGACACCATGGAGAGACGATTCATCATCTCCAGAGACAATACCAAGAAGACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACAGCCTTGTATTACTGTGCAAGACA +>153|IGHV5-4 ENSMUST00000103444|IGHV5-4|5'UTR|IG|IGH|None|00 +TGACAGAGGAGGCCGGTCCTGGATTCGAGTTCCTCACATTCAGTGATGAGCACTGAACACGGACCCCTCACC +>154|IGHV5-4 ENSMUST00000103444|IGHV5-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCGGAAAAGAGGCTGGAGTGGGTCGCAACCATTAGTGATGGTGGTAGTTACACCTACTATCCAGACAATGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACAACCTGTACCTGCAAATGAGCCATCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGAGA +>155|IGHV5-6 ENSMUST00000103446|IGHV5-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGACTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGGCATGTCTTGGGTTCGCCAGACTCCAGACAAGAGGCTGGAGTGGGTCGCAACCATTAGTAGTGGTGGTAGTTACACCTACTATCCAGACAGTGTGAAGGGGCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>156|IGHV5-9 ENSMUST00000103448|IGHV5-9|5'UTR|IG|IGH|None|00 +GGAGGCAGGTCCTAGATTTGAGTTCCTCACATTCAGTGATCAGCACTGAACACGGAACCCTCACC +>157|IGHV5-9 ENSMUST00000103448|IGHV5-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTTGGGCTGAGCTTGATTTTCCTTGTCCTAATTTTAAAAGGTGTCCAGTGTGAAGTGATGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATACCATGTCTTGGGTTCGCCAGACTCCGGAGAAGAGGCTGGAGTGGGTCGCAACCATTAGTGGTGGTGGTGGTAACACCTACTATCCAGACAGTGTGAAGGGTCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACGGCCTTGTATTACTGTGCAAGACA +>158|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|5'UTR|IG|IGH|None|00 +CTGGAATTGATTCCTAGTTCCTCACGTTCAGTG +>159|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGTACTGAACACAGACCCCTCACCATGAACTTCGGGCTCAGATTGATTTTCCTTGTCCTTACTTTAAAAGGTGTCCAGTGTGACGTGAAGCTGGTGGAGTCTGGGGAAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAGTGGTGGTGATTACATCTACTATGCAGACACTGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAGGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTACAAGAGA +>160|IGHV6-3 ENSMUST00000103486|IGHV6-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGAGACTGAGCTGTGCTTTTATTATTGTTCTTTTAAAAGGGGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTCAGTAACTACTGGATGAACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTCAAATTAGATTGAAATCTGATAATTATGCAACACATTATGCGGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAACTTAAGGGCTGAAGACACTGGAATTTATTACTGCACAGG +>161|IGHV6-4 ENSMUST00000191918|IGHV6-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGAACTGAGCTGTGTTTTCATTGTTGTTCTCTTAAAAGGTGTCCAGAGTGATGTGAACCTGGAAGTGTCTGGAGGAGGCTTAGTTAAACCTGGAGGATCCATGCAACTCTTTTGTGTAGCCTCTGGATTTACTTTTGTAGATGGCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGTCTTGAGTGGGTTGCTGAAATTGCAAACAAAGCTAATAATTATGCAACATATTATCCCGAGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTTCAAAAGTAGTGTCTACCTGCATATGAACAGCTTAAGAGCCGAAGATACAGGCATTTATTACTGTACAAGG +>162|IGHV6-5 ENSMUST00000193936|IGHV6-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGGAACTGAACTGTGTTTTCATTGTTGTCCTCTTAAAAGGTGTCCAGAGTGAAGTGAAAATTGAGGAGTCAGGAGGAGGCTTGGTCCAACCTGGAGGATCCATGAAACTCTCTTGTGCAGCCTCTGGATTCACTTTCAGTGATTACAGGATGGACTGGGTCCACCACTCTACAGAGAATGGGTTGGAGTGGGTTGCTGAAATTAGAAACAAAGCTAGTAATTATGCAACATATTATGTGGAGTCTGTGAATGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGATACTGGCATTTATTACTGTACAAGG +>163|IGHV6-6 ENSMUST00000103489|IGHV6-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAACTGTGTATTCATAGTTTTTCTCTTAAAAGGTGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCTTGTGCTGCCTCTGGATTCACTTTTAGTGACGCCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTGAAATTAGAAACAAAGCTAATAATCATGCAACATACTATGCTGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGACACTGGCATTTATTACTGTACCAGG +>164|IGHV6-7 ENSMUST00000193397|IGHV6-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAGCTGTGTATTCATTTTTTTTCTCTTAAAAGGTGTCCAGTGTGAGGAGAAGCTGGATGAGTCTGGAGGAGGCTTGGTGCAACCTGGGAGGTCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTTACTAACTCCTGGATGAACTGGTTCTGCCAGTCTCCAGAGAAAGGACTGGAGTGGGTAGCACAAATTAAAAGCAAACCTTATAATTATGAAACATATTATTCAGATTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTATACCTGCAAATGAACAACTTAAGAGCTGAAGACACGGGCATCTATTACTGTACATGG +>165|IGHV7-1 ENSMUST00000103474|IGHV7-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGTTAAACTGGGTTTTTCTTTTAACACTTTTACATGGTATCCAGTGTGAGGTGAAGCTGGTGGAATCTGGAGGAGGCTTGGTACAGTCTGGGCGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCAGTGATTTCTACATGGAGTGGGTCCGCCAAGCTCCAGGGAAGGGACTGGAGTGGATTGCTGCAAGTAGAAACAAAGCTAATGATTATACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCATCGTCTCCAGAGACACTTCCCAAAGCATCCTCTACCTTCAGATGAATGCCCTGAGAGCTGAGGACACTGCCATTTATTACTGTGCAAGAGATGCA +>166|IGHV7-2 ENSMUST00000193133|IGHV7-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGTTTAACATCATTATCTTCACAGTAACACCTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGAAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCACTGATTTCTACATGAACTGGGTCTGCCAGCCTCCAAGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGACTACAGTGCATCTATGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAACACACTGAGAACTGAGGACAGTGCCACTTATTACTGTGCAAGAGATACA +>167|IGHV7-3 ENSMUST00000103461|IGHV7-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGCTGAACTGGATTTTCCTTGTAACACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGTCTCTCCTGTGCAGCTTCTGGATTCACCTTCACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAATGCCCTGAGAGCTGAGGACAGTGCCACTTATTACTGTGCAAGATATA +>168|IGHV7-4 ENSMUST00000192499|IGHV7-4|5'UTR|IG|IGH|None|00 +ATGAACCTAGTCTTGATTTCCCCAGCCTTCAGTTCCCAGATTCAGTGATCAGCCTTGAACACAGACCTGTCACC +>169|IGHV7-4 ENSMUST00000192499|IGHV7-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGGTGAACTGGATTCTACTTGTAGCACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGATGGAATCTGGAGGAGGCTTGGTACAGCCTGGGGCTTCTCTGAGACTCTCCTGTGCAGCTTCTGGATTCACCTTTACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACCTGAGTGGTTGGCTTTGATTAGAAACAAAGCTAATGGTTACACAACAGAGTATACTGCATCTGTTAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAACATCCTCTATCTTCAAATGAACACCCTGAGGGCTGAGGACAGTGCCACTTATTACTGTGTAAAAGCTGTA +>170|IGHV8-11 ENSMUST00000103536|IGHV8-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGCTACTGATTGTTCCTGCATATGTCCTCTCCCAGATTACTCAGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTAGGCTGGATTCATCAGCCTTCAGGGAATGGTCTGGAGTGGCTGGCACACATTTGGTGGAATGATAATAAGTACTATAACACAGCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCGCCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>171|IGHV8-12 ENSMUST00000199266|IGHV8-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTGCTGCTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGTCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGAAAGGGTCTGGAGTGGCTGGCACACATTTACTGGGATGATGACAAGCGCTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAGAAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAAGAG +>173|IGHV8-2 ENSMUST00000195037|IGHV8-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGACTTACATTCTCATTCCTGCTGCTGCTGCCTGTCCCTGCATATGTCCTATCTCAGGTTACTCTGAAAGTGTCTGGCCCTGGGATATTGCAGCCATCACAGACTCTCAGCCTGGCCTGTACTTTCTCTGGGATTTCACTGAGTACTTCTGGTATGGGTTTGAGCTGGCTTCGTAAGCCCTCAGGGAAGGCTTTAGAGTGGCTGGCAAGCATTTGGAATAATGATAACTACTACAACCCATCTTTGAAGAGCCGGCTCACAATCTCCAAGGAGACCTCCAACTACCAAGTATTCCTTAAACTCACCAGTGTGGACACTGCAGATTCTGCCACATACTACGGTGCTTGGAGAGA +>174|IGHV8-4 ENSMUST00000192298|IGHV8-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTATGTCTTCATTCCTGCTGCTGGTTGTCCCTATATATGTTCTGTCCCAGATTACTCTGAAACAGTCTGGCCCTGGGATAGTGCAGCCATCCCAGCCCGTCAGACTTACTTGCACTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATAGGTGTAACCTGGATTCGTCAGCCCTCAGGGAAGGGTCTGGAGTGGCTGGCAACCATTTGGTGGGATGATGATAACCGCTACAACCCATCTCTAAAGAGCAGGCTCGCAGTCTCCAAAGACACCTCCAACAACCAAGCATTCCTGAATATCATCACTGTGGAAACTGCAGATACTGCCATATACTACTGTGCT +>175|IGHV8-5 ENSMUST00000194257|IGHV8-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCTTGCTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTAATATGGGTATAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTAGAGTGGCTGGCACACATTTGGTGGAATGATGATAAGTACTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCAAATAG +>176|IGHV8-6 ENSMUST00000193145|IGHV8-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCGCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGTACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGATCTGGAGTGGCTGGCACACATTTATTGGGATGATGACAAGCACTATAACCCATCCTTGAAGAGCCAGCTCAGAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGTAGATACTGCCACATACTACTGTGCTCGA +>177|IGHV8-8 ENSMUST00000192591|IGHV8-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGTTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTTTGGTATGGGTGTAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTGGTGGGATGATGATAAGTACTATAACCCAGCCCTGAAGAGTCGGCTCACAATCTCCAAGGATACCTCCAAAAACCAGGTATTCCTCAAGATCGCCAATGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>178|IGHV8-9 ENSMUST00000197803|IGHV8-9|5'UTR|IG|IGH|None|00 +CAGAC +>179|IGHV8-9 ENSMUST00000197803|IGHV8-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCCCAGACCCTCAGTCTGACCTGTTCTTTCTCTGTGTTTTCACTGAGCACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTATTGGGATGAGGACAAGCACTATAAACCATCCTTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGCAGATACTGCCACATACTACTCTGCTCGAAGAG +>180|IGHV9-1 ENSMUST00000195884|IGHV9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATAGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCATGATATACACCGACACTGGAGAGCCAACATATGCTGAAGAGTTCAAGGGACGGTTTGCCTTCTCTTTGGAGACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGTAAGA +>181|IGHV9-2 ENSMUST00000103472|IGHV9-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATGGCAGCTGCCCAAAGGGCTCAAGCACAGATCCAGTTCGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGTGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCTGGATAAACACCTACTCTGGAGAGCCAACATATGCTGACGACTTCAAGGGACGGTTTGCCTTTTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>182|IGHV9-3 ENSMUST00000103473|IGHV9-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGTTGGCTGTGGAACTTGCTATTCCTGATGGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTACAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACCTATGGAATGAGCTGGGTGAAACAGGCTCCAGGAAAGGGTTTAAAGTGGATGGGCTGGATAAACACCTACTCTGGAGTGCCAACATATGCTGATGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>183|IGHV9-4 ENSMUST00000194159|IGHV9-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCTGTGGAACTTGCTATTTCTCATGGCAGCAGCTCAAAGTATCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACTGCTGGAATGCAGTGGGTGCAAAAGATGCCAGGAAAGGGTTTTAAGTGGATTGGCTGGATAAACACCCACTCTGGAGAGCCAAAATATGCAGAAGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTACAGATAAGCAACCTCAAAAATGAGGACACGGCTACGTATTTCTGTGCGAGA +>184|IGKC ENSMUST00000103410|IGKC|C-REGION|IG|IGK|None|00 +GGGCTGATGCTGCACCAACTGTATCCATCTTCCCACCATCCAGTGAGCAGTTAACATCTGGAGGTGCCTCAGTCGTGTGCTTCTTGAACAACTTCTACCCCAAAGACATCAATGTCAAGTGGAAGATTGATGGCAGTGAACGACAAAATGGCGTCCTGAACAGTTGGACTGATCAGGACAGCAAAGACAGCACCTACAGCATGAGCAGCACCCTCACGTTGACCAAGGACGAGTATGAACGACATAACAGCTATACCTGTGAGGCCACTCACAAGACATCAACTTCACCCATTGTCAAGAGCTTCAACAGGAATGAGTGT +>185|IGKJ1 ENSMUST00000103405|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGTGGAGGCACCAAGCTGGAAATCAAAC +>186|IGKJ2 ENSMUST00000198234|IGKJ2|J-REGION|IG|IGK|None|00 +TGTACACGTTCGGAGGGGGGACCAAGCTGGAAATAAAAC +>187|IGKJ3 ENSMUST00000199487|IGKJ3|J-REGION|IG|IGK|None|00 +AATCACATTCAGTGATGGGACCAGACTGGAAATAAAAC +>188|IGKJ4 ENSMUST00000103408|IGKJ4|J-REGION|IG|IGK|None|00 +ATTCACGTTCGGCTCGGGGACAAAGTTGGAAATAAAAC +>189|IGKJ5 ENSMUST00000199459|IGKJ5|J-REGION|IG|IGK|None|00 +GCTCACGTTCGGTGCTGGGACCAAGCTGGAGCTGAAAC +>190|IGKV1-110 ENSMUST00000103321|IGKV1-110|5'UTR|IG|IGK|None|00 +GATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>191|IGKV1-110 ENSMUST00000103321|IGKV1-110|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCCTTGTACACAGTAATGGAAACACCTATTTACATTGGTACCTGCAGAAGCCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTTCTGCTCTCAAAGTACACATGTTCCTCC +>192|IGKV1-117 ENSMUST00000103317|IGKV1-117|5'UTR|IG|IGK|None|00 +ACTGATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>193|IGKV1-117 ENSMUST00000103317|IGKV1-117|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTTTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCATTGTACATAGTAATGGAAACACCTATTTAGAATGGTACCTGCAGAAACCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTACTGCTTTCAAGGTTCACATGTTCCTCC +>194|IGKV1-122 ENSMUST00000103314|IGKV1-122|5'UTR|IG|IGK|None|00 +GTCTCCTCAGGCTCCCTCCTCAAA +>195|IGKV1-122 ENSMUST00000103314|IGKV1-122|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGCTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGGTCTAGTCAGAGCCTTGAAAACAGTAATGGAAACACCTATTTGAACTGGTACCTCCAGAAACCAGGCCAGTCTCCACAGCTCCTGATCTACAGGGTTTCCAACCGATTTTCTGGGGTCCTAGACAGGTTCAGTGGTAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTTCTGCCTCCAAGTTACACATGTCCCTCC +>196|IGKV1-131 ENSMUST00000103306|IGKV1-131|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGCTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTACATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCGCCTATTCTATCTGGTATCCAAACTGGACCCTGGCATCCCTGACAGTTTCAGTGGCAGTGGATCAGAGACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCCTGCAAGGTACACATTTTCCTCT +>197|IGKV1-132 ENSMUST00000103305|IGKV1-132|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGTTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTGTCTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCACCTAATGTATCAGGTGTCCAAACTGGACCCTGGCATCCCTGACAGGTTCAGTGGCAGTGGATCAGAAACAGATTTTACACTTAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCTTGCAAGGTACATATTATCCTCA +>198|IGKV1-133 ENSMUST00000103304|IGKV1-133|5'UTR|IG|IGK|None|00 +TATTTCCTCAAA +>199|IGKV1-133 ENSMUST00000103304|IGKV1-133|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAAACCTATTTGAATTGGTTATTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGAACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCGTGCAAGGTACACATTTTCCTCA +>200|IGKV1-135 ENSMUST00000103303|IGKV1-135|5'UTR|IG|IGK|None|00 +ACTGATCACTCTCCTATGTTCATTTCCTCAAA +>201|IGKV1-135 ENSMUST00000103303|IGKV1-135|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCGGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTAGATAGTGATGGAAAGACATATTTGAATTGGTTGTTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTGGCAAGGTACACATTTTCCTCA +>202|IGKV1-35 ENSMUST00000197820|IGKV1-35|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCACTCCATATTTATATTGTTGCTTTGGATTGTGGGAATCAGTGGTGACGTTGTGATGACCCAGACTCCACTCACTTTATCAGCTACCATTGGACAATCAGCCTCCGTCTCTTGCAGGTCAAGTCAGAGTCTCTTACATAGTAATGGAAACACATACTTGAATTGGTTTGTACAAAGGCCAGGCCCATCTCCACAGCTTCTAATTTATGGGGTGTTTGAACAGGAATCTGGGGTTCCTGACAGGTTCAGTGGCAGTGGGTCTGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCATGCAAGCTACCTATGAACCTCC +>203|IGKV1-88 ENSMUST00000103336|IGKV1-88|L-REGION+V-REGION|IG|IGK|None|00 +ATGAATTTGCCTGTTCATCTCTTGGTGCTTCTGTTGTTCTGGATTCCTGCTTCCAGAGGTGATGTTGTGGTGACTCAAACTCCACTCTCCCTGCCTGTCAGCTTTGGAGATCAAGTTTCTATCTCTTGCAGGTCTAGTCAGAGTCTTGCAAACAGTTATGGGAACACCTATTTGTCTTGGTACCTGCACAAGCCTGGCCAGTCTCCACAGCTCCTCATCTATGGGATTTCCAACAGATTTTCTGGGGTGCCAGACAGGTTCAGTGGCAGTGGTTCAGGGACAGATTTCACACTCAAGATCAGCACAATAAAGCCTGAGGACTTGGGAATGTATTACTGCTTACAAGGTACACATCAGCCTCC +>204|IGKV1-99 ENSMUST00000168090|IGKV1-99|5'UTR|IG|IGK|None|00 +GGCGCCTCATCAAA +>205|IGKV1-99 ENSMUST00000168090|IGKV1-99|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGCTGCCTGTTCTGCTAGTGGTGCTGCTATTGTTCACGAGTCCAGCCTCAAGCAGTGATGTTGTTCTGACCCAAACTCCACTCTCTCTGCCTGTCAATATTGGAGATCAAGCCTCTATCTCTTGCAAGTCTACTAAGAGTCTTCTGAATAGTGATGGATTCACTTATTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTAATATATTTGGTTTCTAATCGATTTTCTGGAGTTCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTTCCAGAGTAACTATCTTCCTCT +>206|IGKV10-94 ENSMUST00000103330|IGKV10-94|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGTGCAAGTCAGGGCATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAAGTTTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGACAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>207|IGKV10-95 ENSMUST00000198735|IGKV10-95|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTTTGTTTTCAAGGTACCAGATATGATATCCAGATGACACAGACTACTTCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTGAGGACATTAGCACTTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAGGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGGCAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>208|IGKV10-96 ENSMUST00000103328|IGKV10-96|5'UTR|IG|IGK|None|00 +CTCAGCCTGGAC +>209|IGKV10-96 ENSMUST00000103328|IGKV10-96|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTCAGGACATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTACTACACATCAAGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGAACAGATTATTCTCTCACCATTAGCAACCTGGAGCAAGAAGATATTGCCACTTACTTTTGCCAACAGGGTAATACGCTTCCTCC +>210|IGKV11-125 ENSMUST00000197406|IGKV11-125|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACACGAGGGCCCCTGCTGAGTTCCTTGGGTTCCTGTTGCTCTGGTTTTTAGGTGCCAGATGTGATGTCCAGATGATTCAGTCTCCATCCTCCCTGTCTGCATCTTTGGGAGACATAGTCACCATGACTTGCCAGGCAAGTCAGGGCACTAGCATTAATTTAAACTGGTTTCAGCAAAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGGTGCAAGCAACTTGGAAGATGGGGTCCCATCAAGGTTCAGTGGCAGTAGATATGGGACAGATTTCACTCTCACCATCAGCAGCCTGGAGGATGAAGATATGGCAACTTATTTCTGTCTACAGCATAGTTATCTCCCTCC +>211|IGKV12-38 ENSMUST00000198880|IGKV12-38|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAACTCCTGGGGTTGCTGCTGCTGTGGCTTACAGACGCAGGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTGGCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAACATTTACTACAGTTTAGCATGGTATCAGCAGAAGCAAGGGAAATCTCCTCAGCTCCTGATCTATAATGCAAACAGCTTGGAAGATGGTGTCCCATCGAGGTTCAGTGGCAGTGGATCTGGGACACAGTATTCTATGAAGATCAACAGCATGCAGCCTGAAGATACCGCAACTTATTTCTGTAAACAGGCTTATGACGTTCCTCC +>212|IGKV12-41 ENSMUST00000103369|IGKV12-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCTCACTCAGGTCCTGGCGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGGGAATATTCACAATTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGAACACAATATTCTCTCAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGAGTACTCCTCC +>213|IGKV12-44 ENSMUST00000103367|IGKV12-44|5'UTR|IG|IGK|None|00 +ATAGTCAGGTCACACCCTGTGCTGTAATCAGCATCACACTGAAAACACACAGAC +>214|IGKV12-44 ENSMUST00000103367|IGKV12-44|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGAAGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTTTTCTCTGAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATCATTATGGTACTCCTCC +>215|IGKV12-46 ENSMUST00000103365|IGKV12-46|5'UTR|IG|IGK|None|00 +GAGTCAGCCTCACACTGATCACACACAGAC +>216|IGKV12-46 ENSMUST00000103365|IGKV12-46|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGATGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGTATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTAATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATGCTGCAACAAACTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTATTCCCTCAAGATCAACAGCCTGCAGTCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGGGTACTCCTCC +>217|IGKV12-89 ENSMUST00000199143|IGKV12-89|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGTGTACCCACTCAGCTCCTGTTGCTGTGGCTTACAGTTGTCAGATGTGACATCCAGATGACTCAGTCTCCAGCTTCACTGTCTGCATCTGTGGGAGAAACTGTCACCATCACATGTGGAGCAAGTGAGAATATTTACGGTGCTTTAAATTGGTATCAGCGGAAACAGGGAAAATCTCCTCAGCTCCTGATCTATGGTGCAACCAACTTGGCAGATGGCATGTCATCGAGGTTCAGTGGCAGTGGATCTGGTAGACAGTATTCTCTCAAGATCAGTAGCCTGCATCCTGACGATGTTGCAACGTATTACTGTCAAAATGTGTTAAGTACTCCTCC +>218|IGKV12-98 ENSMUST00000196839|IGKV12-98|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACATGCTCACTCAGCTCCTGGGATTACTGCTGCTCTGGTTTGCAGGTGGTAAATGTGACATTCAGATGACCCAGTCTCCTGCCTCCCAGTCTGCATCTCTGGGAGAAAGTGTCACCATCACATGCCTGGCAAGTCAGACCATTGGTACATGGTTAGCATGGTATCAGCAGAAACCAGGGAAATCTCCTCAGCTCCTGATTTATGCTGCAACCAGCTTGGCAGATGGGGTCCCATCAAGGTTCAGTGGTAGTGGATCTGGCACAAAATTTTCTTTCAAGATCAGCAGCCTACAGGCTGAAGATTTTGTAAGTTATTACTGTCAACAACTTTACAGTACTCCTCT +>219|IGKV13-84 ENSMUST00000103339|IGKV13-84|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTACTGCTGTTTGGAATCCCAGGCATGATATGTGACATCCAGATGACACAATCTTCATCCTCCTTTTCTGTATCTCTAGGAGACAGAGTCACCATTACTTGCAAGGCAAGTGAGGACATATATAATCGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>220|IGKV13-85 ENSMUST00000114212|IGKV13-85|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTCCTGCTGTTCAGAATCACAGGCATAATATGTGACATCCAGATGACACAATCTTCATCCTACTTGTCTGTATCTCTAGGAGGCAGAGTCACCATTACTTGCAAGGCAAGTGACCACATTAATAATTGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>221|IGKV14-100 ENSMUST00000199510|IGKV14-100|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCTTGCTCAGTTTCTTGCATTCTTGTTGCTTTGGTTTCCAGGTGCAAGATGTGACATCCTGATGACCCAATCTCCATCCTCCATGTCTGTATCTCTGGGAGACACAGTCAGCATCACTTGCCATGCAAGTCAGGGCATTAGCAGTAATATAGGGTGGTTGCAGCAGAAACCAGGGAAATCATTTAAGGGCCTGATCTATCATGGAACCAACTTGGAAGATGGAGTTCCATCAAGGTTCAGTGGCAGTGGATCTGGAGCAGATTATTCTCTCACCATCAGCAGCCTGGAATCTGAAGATTTTGCAGACTATTACTGTGTACAGTATGCTCAGTTTCCTCC +>222|IGKV14-111 ENSMUST00000103320|IGKV14-111|5'UTR|IG|IGK|None|00 +CAGCCAGGACTCAGC +>223|IGKV14-111 ENSMUST00000103320|IGKV14-111|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGACCCCTGCTCAGTTTCTTGGAATCTTGTTGCTCTGGTTTCCAGGTATCAAATGTGACATCAAGATGACCCAGTCTCCATCTTCCATGTATGCATCTCTAGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAATAGCTATTTAAGCTGGTTCCAGCAGAAACCAGGGAAATCTCCTAAGACCCTGATCTATCGTGCAAACAGATTGGTAGATGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTCACCATCAGCAGCCTGGAGTATGAAGATATGGGAATTTATTATTGTCTACAGTATGATGAGTTTCCTCC +>224|IGKV14-126 ENSMUST00000103310|IGKV14-126|5'UTR|IG|IGK|None|00 +TCAGC +>225|IGKV14-126 ENSMUST00000103310|IGKV14-126|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCCCCTGCTCAGTTTTTTGGGATCTTGTTGCTCTGGTTTCCAGGTATCAGATGTGACATCAAGATGACCCAGTCTCCATCCTCCATGTATGCATCGCTGGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAAAAGCTATTTAAGCTGGTACCAGCAGAAACCATGGAAATCTCCTAAGACCCTGATCTATTATGCAACAAGCTTGGCAGATGGGGTCCCATCAAGATTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTAACCATCAGCAGCCTGGAGTCTGACGATACAGCAACTTATTACTGTCTACAGCATGGTGAGAGCCCTCC +>226|IGKV14-130 ENSMUST00000196006|IGKV14-130|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGTTTCTTGGGATCTTGTTGCTCTGGTTCCCAGGTGCCAGATGTGAAATCCAGATGACCCAGTCTCCATCCTCTATGTCTGCATCTCTGGGAGACAGAATAACCATCACTTGCCAGGCAACTCAAGACATTGTTAAGAATTTAAACTGGTATCAGCAGAAACCAGGGAAACCCCCTTCATTCCTGATCTATTATGCAACTGAACTGGCAGAAGGGGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGACTATTCTCTGACAATCAGCAACCTGGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGTTTTATGAGTTTCCTCC +>227|IGKV15-103 ENSMUST00000103324|IGKV15-103|5'UTR|IG|IGK|None|00 +TCACTCTCAGTGAGGATACACCATCAGC +>228|IGKV15-103 ENSMUST00000103324|IGKV15-103|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCTTGCTGAGCTCCTGGGGCTGCTGCTGTTCTGCTTTTTAGGTGTGAGATGTGACATCCAGATGAACCAGTCTCCATCCAGTCTGTCTGCATCCCTTGGAGACACAATTACCATCACTTGCCATGCCAGTCAGAACATTAATGTTTGGTTAAGCTGGTACCAGCAGAAACCAGGAAATATTCCTAAACTATTGATCTATAAGGCTTCCAACTTGCACACAGGCGTCCCATCAAGGTTTAGTGGCAGTGGATCTGGAACAGGTTTCACATTAACCATCAGCAGCCTGCAGCCTGAAGACATTGCCACTTACTACTGTCAACAGGGTCAAAGTTATCCTCT +>229|IGKV16-104 ENSMUST00000103323|IGKV16-104|5'UTR|IG|IGK|None|00 +AATCAGTTCCTGCCAGGACACAGTTTAGAT +>230|IGKV16-104 ENSMUST00000103323|IGKV16-104|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCCAGGTTCAGGTTCTGGGGCTCCTTCTGCTCTGGATATCAGGTGCCCAGTGTGATGTCCAGATAACCCAGTCTCCATCTTATCTTGCTGCATCTCCTGGAGAAACCATTACTATTAATTGCAGGGCAAGTAAGAGCATTAGCAAATATTTAGCCTGGTATCAAGAGAAACCTGGGAAAACTAATAAGCTTCTTATCTACTCTGGATCCACTTTGCAATCTGGAATTCCATCAAGGTTCAGTGGCAGTGGATCTGGTACAGATTTCACTCTCACCATCAGTAGCCTGGAGCCTGAAGATTTTGCAATGTATTACTGTCAACAGCATAATGAATACCCGTAC +>231|IGKV17-121 ENSMUST00000197515|IGKV17-121|5'UTR|IG|IGK|None|00 +AAGGCC +>232|IGKV17-121 ENSMUST00000197515|IGKV17-121|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGTTCTCACTAGCTCTTCTCCTCAGTCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCATGGCTATAGGAGAAAAAGTCACCATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGTACAGATTTTGTTTTTACAATTGAAAACATGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACTTGCCTCT +>233|IGKV17-127 ENSMUST00000200586|IGKV17-127|5'UTR|IG|IGK|None|00 +AAGGCC +>234|IGKV17-127 ENSMUST00000200586|IGKV17-127|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGCTCTCACTAGCTCCTCTCCTCAGCCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCGTGGCTACAGGAGAAAAAGTCACTATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGCACAGATTTTGTTTTTACAATTGAAAACACGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACATGCCTCT +>235|IGKV18-36 ENSMUST00000200160|IGKV18-36|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACTCCAGCTTCATTTCTTTGCCTCCTTTTACTGTGGACCACGGCTGTCACTGGAGAAACAACACAGGCTCCAGCTTCTCTGAGTTTTTCTCTTGGTGAAACAGCAACACTGTCATGCAGGTCCAGTGAGAGTGTTGGCAGCTACTTAGCCTGGTACCAGCAGAAAGCAGAGCAAGTTCCCCGGCTCCTTATCCATAGTGCCTCCACTAGGGCCGGTGGTGTCCCAGTCCGGTTCAGTGGCACTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGTCTAGAACCTGAAGATGCTGCAGTTTACTACTGTCAACCTTTCAAAAGTTGGTCATA +>236|IGKV19-93 ENSMUST00000196863|IGKV19-93|5'UTR|IG|IGK|None|00 +AGGAGACGTTGTAGAA +>237|IGKV19-93 ENSMUST00000196863|IGKV19-93|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGACCGTCTATTCAGTTCCTGGGGCTCTTGTTGTTCTGGCTTCATGGTGCTCAGTGTGACATCCAGATGACACAGTCTCCATCCTCACTGTCTGCATCTCTGGGAGGCAAAGTCACCATCACTTGCAAGGCAAGCCAAGACATTAACAAGTATATAGCTTGGTACCAACACAAGCCTGGAAAAGGTCCTAGGCTGCTCATACATTACACATCTACATTACAGCCAGGCATCCCATCAAGGTTCAGTGGAAGTGGGTCTGGGAGAGATTATTCCTTCAGCATCAGCAACCTGGAGCCTGAAGATATTGCAACTTATTATTGTCTACAGTATGATAATCTTCTACC +>238|IGKV2-109 ENSMUST00000103322|IGKV2-109|5'UTR|IG|IGK|None|00 +CAAGTTCGCAGA +>239|IGKV2-109 ENSMUST00000103322|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCATTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAAGCCAGGCCAGTCTCCTCAGCTCCTGATTTATCAGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTAGCAGTGGGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTGCTCAAAATCTAGAACTTCCTCC +>240|IGKV2-112 ENSMUST00000103318|IGKV2-112|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCTCTCTTCAGTTCCTGGGGGTGCTTATGTTCTGGATCTCTGGAGTCAGTGGGGATATTGTGATAACCCAGGATGAACTCTCCAATCCTGTCACTTCTGGAGAATCAGTTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTATATAAGGATGGGAAGACATACTTGAATTGGTTTCTGCAGAGACCAGGACAATCTCCTCAGCTCCTGATCTATTTGATGTCCACCCGTGCATCAGGAGTCTCAGACCGGTTTAGTGGCAGTGGGTCAGGAACAGATTTCACCCTGGAAATCAGTAGAGTGAAGGCTGAGGATGTGGGTGTGTATTACTGTCAACAACTTGTAGAGTATCCTC +>241|IGKV2-137 ENSMUST00000103302|IGKV2-137|5'UTR|IG|IGK|None|00 +GGCTACTTTTCACACAGCTGCACCAAGCAGGGGATTTGCATATTGCTCCCTTGGGAGGATCTCTCCTGCAGGTCCAAGACAAAAGCTAGCCTCCATTTCTGTCTTGACTACTCAAGACTTTTTGTATCAAGTTCTCAGA +>242|IGKV2-137 ENSMUST00000103302|IGKV2-137|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCCTAGCTGAGTTCCTGGGGCTGCTTGTGCTCTGGATCCCTGGAGCCATTGGGGATATTGTGATGACTCAGGCTGCACCCTCTGTACCTGTCACTCCTGGAGAGTCAGTATCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTGCATAGTAATGGCAACACTTACTTGTATTGGTTCCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACTGCTTTCACACTGAGAATCAGTAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTATGCAACATCTAGAATATCCTTT +>243|IGKV20-101-2 ENSMUST00000200406|IGKV20-101-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGCTCTAGTTCAGCTCCTAGGGATGCTGATGCTCTGGCTCCAAGGCATGAGCTGTAATATCCAGGTGATCCAGTCACCATTTCTGTCTGCATCTGTGGGAGAGAGGGTCACAATCAGCTGCAAGACACATCAGCATATTAACAGTTCCATAGCCTGGTACCAGCAAAAAGTTGGAAAAGCTCCCATACTCCTGATAAGAGATGCAAGTTTTTCTCTAACAGACACCCCATCAAGGTTCACTGGGAATGGATTTGGCACAGATTTCACACTCAGCATCAGCAGTATGCAGTCTCAAGATGGTGCCACATATTTCTGCCAGCAGCATTTTCACTATTAC +>244|IGKV3-1 ENSMUST00000103404|IGKV3-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTCACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGAGCCACCATCTCCTGCAGAGCCAGTGAAAGTGTTGAATATTATGGCACAAGTTTAATGCAGTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACGTAGAATCTGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTGTGGAGGAGGATGATATTGCAATGTATTTCTGTCAGCAAAGTAGGAAGGTTCCTTC +>245|IGKV3-10 ENSMUST00000196940|IGKV3-10|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTAACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTGATCCTGTGGAGGCTGATGATGCTGCAACCTATTACTGTCAGCAAAATAATGAGGATCCTCC +>246|IGKV3-12 ENSMUST00000103396|IGKV3-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGTTATGGGTACTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCAAAAGTGTCAGTACATCTGGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCACAGTAGGGAGCTTCCTCC +>247|IGKV3-2 ENSMUST00000103403|IGKV3-2|5'UTR|IG|IGK|None|00 +TCTCTTCCAGTTCTCAGAG +>248|IGKV3-2 ENSMUST00000103403|IGKV3-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGAAAGACACACTCCTGCTATGGGTCCTGCTTCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAGAGCCAGCGAAAGTGTTGATAATTATGGCATTAGTTTTATGAACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCAAGGATCCGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTATGGAGGAGGATGATACTGCAATGTATTTCTGTCAGCAAAGTAAGGAGGTTCCTCC +>249|IGKV3-3 ENSMUST00000103402|IGKV3-3|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGAGCCACTATCTTCTGCAGAGCCAGCCAGAGTGTCGATTATAATGGAATTAGTTATATGCACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAAGATGCTGCAACCTATTACTGTCAGCAAAGTATTGAGGATCCTCC +>250|IGKV3-4 ENSMUST00000103401|IGKV3-4|5'UTR|IG|IGK|None|00 +G +>251|IGKV3-4 ENSMUST00000103401|IGKV3-4|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACAATCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAAGGCCAGCCAAAGTGTTGATTATGATGGTGATAGTTATATGAACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAATCTAGAATCTGGGATCCCAGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>252|IGKV3-5 ENSMUST00000103400|IGKV3-5|5'UTR|IG|IGK|None|00 +ATCCTCTCTTCCAGCTCTCAGAG +>253|IGKV3-5 ENSMUST00000103400|IGKV3-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTAATCCTGTGGAGGCTGATGATGTTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>254|IGKV3-7 ENSMUST00000197560|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCCAAAGTGTCAGTACATCTAGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCAAGTATGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATACTGCAACATATTACTGTCAGCACAGTTGGGAGATTCCTCC +>255|IGKV3-9 ENSMUST00000103398|IGKV3-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACCCACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGGGCCACCATATCCTGCCAAGCCAGCGAAAGTGTCAGTTTTGCTGGTACAAGTTTAATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGAGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGAGTCAGACTTCACTCTCACCATCGATCCTGTGGAGGAAGATGATGCTGCAATGTATTACTGTATGCAAAGTATGGAAGATCCTCC +>256|IGKV4-50 ENSMUST00000103363|IGKV4-50|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTATCTCAGTTGTAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGAAGGTCACCATGAGCTGCAGGGCCAGCTCAAGTGTAAATTACATGTACTGGTACCAGCAGAAGTCAGATGCCTCCCCCAAACTATGGATTTATTACACATCCAACCTGGCTCCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGAACTCTTATTCTCTCACAATCAGCAGCATGGAGGGTGAAGATGCTGCCACTTATTACTGCCAGCAGTTTACTAGTTCCCCATCCA +>257|IGKV4-51 ENSMUST00000103345|IGKV4-51|5'UTR|IG|IGK|None|00 +GCAGGAATTAGCCAGGGACTAAAATTCAAAGACACA +>258|IGKV4-51 ENSMUST00000103345|IGKV4-51|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCATTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCCCCCAAACTCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGGCTGGGATCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAAATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>259|IGKV4-53 ENSMUST00000198328|IGKV4-53|5'UTR|IG|IGK|None|00 +AAAAACACA +>260|IGKV4-53 ENSMUST00000198328|IGKV4-53|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCATGTGCAGATTTTCAGCTTCATGCTAATCAGTGTCACAGTCATATTGTCCAGTGGAGAAATTGTGCTCACCCAGTCTCCAGCACTCATGGCTGCATCTCCAGGGGAGAAGGTCACCATCACCTGCAGTGTCAGCTCAAGTATAAGTTCCAGCAACTTGCACTGGTACCAGCAGAAGTCAGAAACCTCCCCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGTCAACAGTGGAGTAGTTACCCACTCA +>261|IGKV4-54 ENSMUST00000199437|IGKV4-54|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACAGGTACCAGCAGAAGCCAGGATCCTCACCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAATATCATAGTTACCCACCCA +>262|IGKV4-55 ENSMUST00000103359|IGKV4-55|5'UTR|IG|IGK|None|00 +AGCTAGGGACCAAAGTTCAAAGACAAA +>263|IGKV4-55 ENSMUST00000103359|IGKV4-55|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCCTGATTTATGACACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTTACCCACCCA +>264|IGKV4-57 ENSMUST00000103357|IGKV4-57|L-REGION+V-REGION|IG|IGK|None|00 +ATGCATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATAACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTTCCAGCAGAAGCCAGGCACTTCTCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAAAGGAGTAGTTACCCACCCA +>265|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|5'UTR|IG|IGK|None|00 +AAATTCAAATACACA +>266|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCTGGTGCAGATTTTCAGCTTCTTGCTAATCAGTGCCTCAGTTGCAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGGGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGTGCCTCCCCCAAACTCTGGATTTATAGCACATCCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCACTCA +>267|IGKV4-58 ENSMUST00000197448|IGKV4-58|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCAGTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGCAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGCGCTTCCCCCAAACCCTTGATTCATAGGACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCGTGGAGGCTGAAGATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>268|IGKV4-59 ENSMUST00000103354|IGKV4-59|5'UTR|IG|IGK|None|00 +AAAATTCAAAGACAAA +>269|IGKV4-59 ENSMUST00000103354|IGKV4-59|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATATCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>270|IGKV4-61 ENSMUST00000199160|IGKV4-61|5'UTR|IG|IGK|None|00 +ATTAGCTAGGGACCAAAATTCAAAGACAGA +>271|IGKV4-61 ENSMUST00000199160|IGKV4-61|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATATCCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATCGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTATCATAGTTACCCACCCA +>272|IGKV4-62 ENSMUST00000198345|IGKV4-62|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGCCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGCTCCTCCCCCAGACTCTGGATTTATGACACATCCAACCTGGTTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTAGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCATCCA +>273|IGKV4-63 ENSMUST00000196595|IGKV4-63|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGAGAAAATGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAAGCACCTCCCCCAAACTCTGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCAGGTCGCTTCAGTGGCAGTGGGTCTGGAAACTCTTACTCTCTCACGATCAGCAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTTTTCAGGGGAGTGGGTACCCACTCA +>274|IGKV4-68 ENSMUST00000103350|IGKV4-68|5'UTR|IG|IGK|None|00 +AGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>275|IGKV4-68 ENSMUST00000103350|IGKV4-68|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATGAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCACTCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAAGATCCTCCCCCAAACCCTGGATTTATCTCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>276|IGKV4-69 ENSMUST00000103349|IGKV4-69|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTTAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTCTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCGCCCAAACCCTGGATTTATGACACATCCAACCTGGCTTCTGGATTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCATAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>277|IGKV4-70 ENSMUST00000103348|IGKV4-70|5'UTR|IG|IGK|None|00 +AATTAGCTAGGGACCAAAATTCAAAGACAAA +>278|IGKV4-70 ENSMUST00000103348|IGKV4-70|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTATAAGTTACATGCACTGGTACCAGCAGAAGCCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>279|IGKV4-71 ENSMUST00000196201|IGKV4-71|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTATTCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCTGGATTTATTTAACATTCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCTCAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>280|IGKV4-72 ENSMUST00000103346|IGKV4-72|5'UTR|IG|IGK|None|00 +TACTTATGAGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>281|IGKV4-72 ENSMUST00000103346|IGKV4-72|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTGTTCTCTCCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACAATGACTTGCAGGGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATGCCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGAGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>282|IGKV4-74 ENSMUST00000103344|IGKV4-74|5'UTR|IG|IGK|None|00 +GCAGTAATTAGCTAGGGACCAAAATTCAAAGGAAAA +>283|IGKV4-74 ENSMUST00000103344|IGKV4-74|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAACGGGTCACCATGACCTGCACTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCACCAGTATCATCGTTCCCCACCCA +>284|IGKV4-78 ENSMUST00000103343|IGKV4-78|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCATGACCTGCAGTGCCAGATCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTTTTACTGCCAGCAGTACAGTGGTTACCCATCCA +>285|IGKV4-79 ENSMUST00000103342|IGKV4-79|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCTTGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCTCTTATTTCTGCCATCAGTGGAGTAGTTACCCACCCC +>286|IGKV4-80 ENSMUST00000103341|IGKV4-80|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGGAGATCACCCTAACCTGCAGTGCCAGCTCGAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACTTCTCCCAAACTCTTGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTTCTCGCTTCAGTGGCAGTGGGTCTGGGACCTTTTATTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCGATTATTACTGCCATCAGTGGAGTAGTTATCCA +>287|IGKV4-81 ENSMUST00000197966|IGKV4-81|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGTTAATCAGTGTCTCAGTCATAATGTCCAGAGGAGAAAATGTGCTGACCCAGTCTCCAGCAATCATGGCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCTAGTAACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCTACCAAATTCTGGATTTATAGGACATCCAACCTGGCTTCAGAAGTCCCAGCTCCCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTTACAATCAGCAGCGTGGAGGCCGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTGGTTACCCACCCA +>288|IGKV4-86 ENSMUST00000200454|IGKV4-86|5'UTR|IG|IGK|None|00 +CACTAATTAGCCAGAGACCAAAATCCAAATACACA +>289|IGKV4-86 ENSMUST00000200454|IGKV4-86|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACTTTCGGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTGTCCAGAGGAGAAATTGTGCTCACTCAGTCTCCAGCCATCACAGCTGCATCTCTGGGGCAAAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAACCATGGATTTATGAAATATCCAAACTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCATTTATTACTGCCAGCAGTGGAATTATCCTCTTA +>290|IGKV4-90 ENSMUST00000103334|IGKV4-90|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTCATATTGACCAATGGAGAAATTTTGCTCACCCAGTCTCCAGCAATCATAGCTGCATCTCCTGGGGAGAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGAACTGGTACCAGCAGAAACCAGGATCCTCCCCCAAAATATGGATTTATGGTATATCCAACCTGGCTTCTGGAGTTCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACATCTTTCTCTTTCACAATCAACAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTCAGCAAAGGAGTAGTTACCCACCCA +>291|IGKV4-91 ENSMUST00000103333|IGKV4-91|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGATGCAGATTATCAGCTTGCTGCTAATCAGTGTCACAGTCATAGTGTCTAATGGAGAAATTGTGCTCACCCAGTCTCCAACCACCATGGCTGCATCTCCCGGGGAGAAGATCACTATCACCTGCAGTGCCAGCTCAAGTATAAGTTCCAATTACTTGCATTGGTATCAGCAGAAGCCAGGATTCTCCCCTAAACTCTTGATTTATAGGACATCCAATCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATTGGCACCATGGAGGCTGAAGATGTTGCCACTTACTACTGCCAGCAGGGTAGTAGTATACCACGCA +>292|IGKV4-92 ENSMUST00000103332|IGKV4-92|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATATGTGGGTGCAGATTTTCAGCTTACTGCTAATCTGTGTCACAGTGTCAAAGGGAGAAATGGTTCTCACCCAGTCTCCAGTATCCATAACTGCATCTCGAGGGGAGAAGGTCACCATCACCTGCCGTGCCAGCTCAAGTATAAGTTCCAATTACTTACACTGGTACCAGCAGAAGCCAGGATCCTCCCCTAAACTTTTGATTTATAGGACATCCATCCTGGCATCTGGAGTCCTAGACAGCTTCAGTGGCAGTGGGTCTGAGAGCTCTTACACTCTGACAATCAGCTGCATGCAGGACGAAGTTGCTGCCACTTACTATTGTCAGCAGGGGAGTAGTAGCCCACCA +>293|IGKV5-37 ENSMUST00000103372|IGKV5-37|5'UTR|IG|IGK|None|00 +GAAAGCTTAAAG +>294|IGKV5-37 ENSMUST00000103372|IGKV5-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATTCACACCTCATATCCTTGGACTTCTGCTTTTCTGGATTTCAGCCTCCACAGGTGACATCCTGCTGACCCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGAAACAGTCAGTCTTTCCTGTAGGGCCAGCCAGAGTATTTACAAGAACCTACACTGGTATCAACAGAAATCACATCGGTCTCCAAGGCTTCTCATCAAGTATGCTTCTGATTCCATCTCTGGGATCCCCTCCAGGTTCACTGGCAGTGGATCAGGGACAGATTACACTCTCAGTATCAACAGTGTGAAGCCCGAAGATGAAGGAATATATTACTGTCTTCAAGGTTACAGCACACCTTC +>295|IGKV5-39 ENSMUST00000197290|IGKV5-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCACTTCTCAGCTCCTTGGACTTTTGCTTTTCTGGACTTCAGCCTCCAGATGTGACATTGTGATGACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCTCTCTTTCCTGCAGGGCCAGCCAGAGTATTAGCGACTACTTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAATATGCTTCCCAATCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGTCAGATTTCACTCTCAGTATCAACAGTGTGGAACCTGAAGATGTTGGAGTGTATTACTGTCAAAATGGTCACAGCTTTCCTCC +>296|IGKV5-43 ENSMUST00000103368|IGKV5-43|5'UTR|IG|IGK|None|00 +ATGAGCCACACAAACTCAGGGAAAGCTCGAAG +>297|IGKV5-43 ENSMUST00000103368|IGKV5-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATACTTGGACTTATGCTTTTTTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGCGTCAGTCTTTCCTGCAGGGCCAGCCAAAGTATTAGCAACAACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>298|IGKV5-45 ENSMUST00000103366|IGKV5-45|5'UTR|IG|IGK|None|00 +TGTGTCATGATCCACACAAACTCAGGGAAAGCTCGAAG +>299|IGKV5-45 ENSMUST00000103366|IGKV5-45|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATTCTTGGACTTATGCTTTTCTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCAGTCTTTCCTGCAGGGCCAGTCAAAGTATTAGCAACTACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>300|IGKV5-48 ENSMUST00000103364|IGKV5-48|5'UTR|IG|IGK|None|00 +GGAAAGTTTGAAG +>301|IGKV5-48 ENSMUST00000103364|IGKV5-48|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCCACACCTCAGTTCCTTGTATTTTTGCTTTTCTGGATTCCAGCCTCCAGAGGTGACATCTTGCTGACTCAGTCTCCAGCCATCCTGTCTGTGAGTCCAGGAGAAAGAGTCAGTTTCTCCTGCAGGGCCAGTCAGAGCATTGGCACAAGCATACACTGGTATCAGCAAAGAACAAATGGTTCTCCAAGGCTTCTCATAAAGTATGCTTCTGAGTCTATCTCTGGGATCCCTTCCAGGTTTAGTGGCAGTGGATCAGGGACAGATTTTACTCTTAGCATCAACAGTGTGGAGTCTGAAGATATTGCAGATTATTACTGTCAACAAAGTAATAGCTGGCCAAC +>302|IGKV6-13 ENSMUST00000198184|IGKV6-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGCTTCAAGATGGAGTCTCATACTCAGGCCTTTGTATTCGCGTTTCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCAATCGGTACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATATGCAGTCTGAAGACCTGGCAGATTATTTCTGCCAGCAATATAGCAGCTATCCTCT +>303|IGKV6-14 ENSMUST00000103394|IGKV6-14|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTCTTTGTATTCGTGTTGCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTTCGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAGTCTCCTAAAGCACTGATTTACTTGGCATCCAACCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAATCTGAAGACCTGGCAGATTATTTCTGTCTGCAACATTGGAATTATCCTCT +>304|IGKV6-15 ENSMUST00000103393|IGKV6-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGACTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCGTCACCTGCAAGGCCAGTCAGAATGTGGGTACTAATGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAAGCACTGATTTACTCGGCATCCTACCGGTACAGTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATGTGCAGTCTGAAGACTTGGCAGAGTATTTCTGTCAGCAATATAACAGCTATCCTCT +>305|IGKV6-17 ENSMUST00000103391|IGKV6-17|5'UTR|IG|IGK|None|00 +GAAATGCATCACACCAGCATGGGCATCAAA +>306|IGKV6-17 ENSMUST00000103391|IGKV6-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGTCTTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCTACCGGTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATCTGGGACGGATTTCACTTTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAACATTATAGTACTCCTCC +>307|IGKV6-20 ENSMUST00000103388|IGKV6-20|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>308|IGKV6-20 ENSMUST00000103388|IGKV6-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACACTGGGGTCCCCGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGAGTTACAGCTATCCTCC +>309|IGKV6-23 ENSMUST00000103386|IGKV6-23|5'UTR|IG|IGK|None|00 +TCAGACCAGCATGGGCATCAAG +>310|IGKV6-23 ENSMUST00000103386|IGKV6-23|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACACATTCTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGAAGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAGTCTGAAGACTTGGCAGATTATTTCTGTCAGCAATATAGCAGCTATCCTCT +>311|IGKV6-25 ENSMUST00000103383|IGKV6-25|5'UTR|IG|IGK|None|00 +TATGAAATGCATCGCACCAGCATGGGCATCAAG +>312|IGKV6-25 ENSMUST00000103383|IGKV6-25|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGCATTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAAAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTATACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCACTTTATTACTGTCAGCAACATTATAGCACTCCTCC +>313|IGKV6-29 ENSMUST00000197371|IGKV6-29|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>314|IGKV6-29 ENSMUST00000197371|IGKV6-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACCCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTCTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGGGTTACAGCTATCTTCC +>315|IGKV6-32 ENSMUST00000103377|IGKV6-32|5'UTR|IG|IGK|None|00 +GGCAGGCAAGGGCATCAAG +>316|IGKV6-32 ENSMUST00000103377|IGKV6-32|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTCACAGACCCAGGTCTTCGTATTTCTACTGCTCTGTGTGTCTGGTGCTCATGGGAGTATTGTGATGACCCAGACTCCCAAATTCCTGCTTGTATCAGCAGGAGACAGGGTTACCATAACCTGCAAGGCCAGTCAGAGTGTGAGTAATGATGTAGCTTGGTACCAACAGAAGCCAGGGCAGTCTCCTAAACTGCTGATATACTATGCATCCAATCGCTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATATGGGACGGATTTCACTTTCACCATCAGCACTGTGCAGGCTGAAGACCTGGCAGTTTATTTCTGTCAGCAGGATTATAGCTCTCCTCC +>317|IGKV7-33 ENSMUST00000197429|IGKV7-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTACTCATGTCCCTGCTGCTCTGCATGTCTGGTGCCTGTGCAGACATTGTGATGACTCAGTCTCCAACTTTCCTTGCTGTGACAGCAAGTAAGAAGGTCACCATTAGTTGCACGGCCAGTGAGAGCCTTTATTCAAGCAAACACAAGGTGCACTACTTGGCTTGGTACCAGAAGAAACCAGAGCAATCTCCTAAACTGCTGATATACGGGGCATCCAACCGATACATTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTGACCATCAGCAGTGTACAGGTTGAAGACCTCACACATTATTACTGTGCACAGTTTTACAGCTATCCTCT +>318|IGKV8-16 ENSMUST00000195945|IGKV8-16|5'UTR|IG|IGK|None|00 +GGCAGGGGAGCAAT +>319|IGKV8-16 ENSMUST00000195945|IGKV8-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCAGAGACCCATGTCCTCATATTTTTGCTGCTATGGGTGTCTGGTGCTTGTGGGGAAATTGTGTTGACCCAGTCTATACCATCCCTGACTGTGTCAGCAGGAGAGAGGGTCACTATCAGCTGCAAATCCAATCAGAATCTTTTATGGAGTGGAAACCAAAGGTACTGTTTGGTCTGGCACCAGTGGAAACCAGGGCAAACTCCTACACCGTTGATCACCTGGACATCTGATAGGTACTCTGGAGTCCCTGATCGTTTCATAGGCAGTGGATCTGTGACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGATGTGGCAGTTTATTTCTGTCAGCAGCATTTACACATTCCTCC +>320|IGKV8-18 ENSMUST00000103390|IGKV8-18|5'UTR|IG|IGK|None|00 +CATCAGTCAGGCAGGGGGGAGAAAG +>321|IGKV8-18 ENSMUST00000103390|IGKV8-18|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGATGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAATAACTACTTATCCTGGTACCAGCAGAAACAAGGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGATTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAGCACAATCATGGCAGCTTTCTCCCCC +>322|IGKV8-19 ENSMUST00000196599|IGKV8-19|5'UTR|IG|IGK|None|00 +GCAAG +>323|IGKV8-19 ENSMUST00000196599|IGKV8-19|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATGTCCCTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGACTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGACCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATTATAGTTATCCTCC +>324|IGKV8-21 ENSMUST00000103387|IGKV8-21|5'UTR|IG|IGK|None|00 +AGACAGGCAGTGGGAGCAAG +>325|IGKV8-21 ENSMUST00000103387|IGKV8-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATATTGCTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTGGCTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAATCCAGTCAGAGTCTGCTCAACAGTAGAACCCGAAAGAACTACTTGGCTTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGCAAGCAATCTTATAATCTTCC +>326|IGKV8-24 ENSMUST00000103384|IGKV8-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCAGGTCCTCATGTTTCTTCTGCTCTGGGTATCTGGTGCCTGTGCAGACATTGTGATGACACAGTCTCCATCCTCCCTGGCTATGTCAGTAGGACAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTAAATAGTAGCAATCAAAAGAACTATTTGGCCTGGTACCAGCAGAAACCAGGACAGTCTCCTAAACTTCTGGTATACTTTGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACAGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGATTACTTCTGTCAGCAACATTATAGCACTCCTCC +>327|IGKV8-26 ENSMUST00000103382|IGKV8-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGAACCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAAGAACTACTTGTCCTGGTACCAGCAGAAACAAAGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGGTTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAACACAATCATGGCAGCTTTCTCCCCCC +>328|IGKV8-27 ENSMUST00000197272|IGKV8-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCTTCCTCTCCCTGCTGCTCTGGGTATCTGGTACCTGTGGGAACATTATGATGACACAGTCGCCATCATCTCTGGCTGTGTCTGCAGGAGAAAAGGTCACTATGAGCTGTAAGTCCAGTCAAAGTGTTTTATACAGTTCAAATCAGAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGTGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTTACTCTTACCATCAGCAGTGTACAAGCTGAAGACCTGGCAGTTTATTACTGTCATCAATACCTCTCCTCG +>329|IGKV8-28 ENSMUST00000197525|IGKV8-28|5'UTR|IG|IGK|None|00 +GCAAG +>330|IGKV8-28 ENSMUST00000197525|IGKV8-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATCTCCTTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGAGTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACGGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACCGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATCATAGTTATCCTCC +>331|IGKV8-30 ENSMUST00000103378|IGKV8-30|5'UTR|IG|IGK|None|00 +AAG +>332|IGKV8-30 ENSMUST00000103378|IGKV8-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATGTTACTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTAGCTGTGTCAGTTGGAGAGAAGGTTACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTATATAGTAGCAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATTTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGAAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAATATTATAGCTATCCTCC +>333|IGKV8-34 ENSMUST00000196959|IGKV8-34|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTCCTCATGTTGCTGCTGCTATCGGTATCTGGTACCTGTGGAGACATTTTGATGACCCAGTCTCCATCCTCCCTGACTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTAGCTAGTGGCAACCAAAATAACTACTTGGCCTGGCACCAGCAGAAACCAGGACGATCTCCTAAAATGCTGATAATTTGGGCATCCACTAGGGTATCTGGAGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACGGATTTCACTCTGACCATCAACAGTGTGCAGGCTGAAGATCTGGCTGTTTATTACTGTCAGCAGTCCTACAGCGCTCCTAC +>334|IGKV9-120 ENSMUST00000103316|IGKV9-120|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCACAGATTTTTGGCTTCTTGTTGCTCTTGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGACATTGGTAGTAGCTTAAACTGGCTTCAGCAGGAACCAGATGGAACTATTAAACGCCTGATCTACGCCACATCCAGTTTAGATTCTGGTGTCCCCAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGTAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>335|IGKV9-123 ENSMUST00000103313|IGKV9-123|5'UTR|IG|IGK|None|00 +TTGTCATTGCATTCAGAACTCAGC +>336|IGKV9-123 ENSMUST00000103313|IGKV9-123|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATCAGGGCTCCTGCTCAGTTTCTTGGCATCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGATTCAGTCTCCATCGTCCATGTTTGCCTCTCTGGGAGACAGAGTCAGTCTCTCTTGTCGGGCTAGTCAGGGCATTAGAGGTAATTTAGACTGGTATCAGCAGAAACCAGGTGGAACTATTAAACTCCTGATCTACTCCACATCCAATTTAAATTCTGGTGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTAGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGCGTAATGCGTATCCTCT +>337|IGKV9-124 ENSMUST00000196768|IGKV9-124|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTTCCTGCTCACGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGAAATTAGTGGTTACTTAAGCTGGCTTCAGCAGAAACCAGATGGAACTATTAAACGCCTGATCTACGCCGCATCCACTTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTATCCTCC +>338|IGKV9-129 ENSMUST00000200578|IGKV9-129|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGCCGGGCAAGTCAGGACATTCATGGTTATTTAAACTTGTTTCAGCAGAAACCAGGTGAAACTATTAAACACCTGATCTATGAAACATCCAATTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCATTATCGGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>339|IGLC1 ENSMUST00000200568|IGLC1|C-REGION|IG|IGL|None|00 +GCCAGCCCAAGTCTTCGCCATCAGTCACCCTGTTTCCACCTTCCTCTGAAGAGCTCGAGACTAACAAGGCCACACTGGTGTGTACGATCACTGATTTCTACCCAGGTGTGGTGACAGTGGACTGGAAGGTAGATGGTACCCCTGTCACTCAGGGTATGGAGACAACCCAGCCTTCCAAACAGAGCAACAACAAGTACATGGCTAGCAGCTACCTGACCCTGACAGCAAGAGCATGGGAAAGGCATAGCAGTTACAGCTGCCAGGTCACTCATGAAGGTCACACTGTGGAGAAGAGTTTGTCCCGTGCTGACTGTTCC +>340|IGLC2 ENSMUST00000198182|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACTCTCACCGTGTTTCCACCTTCCTCTGAGGAGCTCAAGGAAAACAAAGCCACACTGGTGTGTCTGATTTCCAACTTTTCCCCGAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGGCAACAAGTTCATGGCCAGCAGCTTCCTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGTCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>341|IGLC3 ENSMUST00000200235|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACACTCACCATGTTTCCACCTTCCCCTGAGGAGCTCCAGGAAAACAAAGCCACACTCGTGTGTCTGATTTCCAATTTTTCCCCAAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGACAACAAGTACATGGCCAGCAGCTTCTTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGCCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>342|IGLC4 ENSMUST00000197046|IGLC4|C-REGION|IG|IGL|None|00 +GCCAACCCAAGGCTACACCCTCAGTTAATCTGTTCCCACCTTCCTCTGAAGAGCTCAAGACTAAAAAGGCCACACTGGTGTGTATGATCACTGAGTTCTACGCAGCTGCTGTGAGAGTGGCCTGGAAGGCAGATGGTACCCCTTTCACTCAGGGTGTAGAGACTACCCAGCCTCCCAAACAGAGGGACAACATGGCTAGCAGTTACCTGCTCTTCACAGCAGAAGCGTGGGAATCTCATAGCAGTTACAGCTGCCATGTCACTCATGAAGGGAACACTGTGGAGAAGAGTTTGTCCCGTGCTGAGTGTTCCTAG +>343|IGLJ1 ENSMUST00000199490|IGLJ1|J-REGION|IG|IGL|None|00 +CTGGGTGTTCGGTGGAGGAACCAAACTGACTGTCCTAG +>344|IGLJ2 ENSMUST00000197969|IGLJ2|J-REGION|IG|IGL|None|00 +TTATGTTTTCGGCGGTGGAACCAAGGTCACTGTCCTAG +>345|IGLJ3 ENSMUST00000200211|IGLJ3|J-REGION|IG|IGL|None|00 +GTTTATTTTCGGCAGTGGAACCAAGGTCACTGTCCTAG +>346|IGLJ3PSEUDOGENE ENSMUST00000200074|IGLJ3PSEUDOGENE|J-REGION|IG|IGL|None|00 +AGGTTCTTTTTCCTCAAATGGCCTATTGTATGCAGGAG +>347|IGLJ4 ENSMUST00000198313|IGLJ4|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGAGGTGGAACCAGATTGACTGTCCTAGATGA +>348|IGLV1 ENSMUST00000103746|IGLV1|5'UTR|IG|IGL|None|00 +GCTGACCAATATTGAAAAGAATAGACCTGGTTTGTGAATT +>349|IGLV1 ENSMUST00000103746|IGLV1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATTTCACTTATACTCTCTCTCCTGGCTCTCAGCTCAGGGGCCATTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGAAACAGTCACACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAACAACCGAGCTCCAGGTGTTCCTGCCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGAGGCAATATATTTCTGTGCTCTATGGTACAGCAACCATTTC +>350|IGLV2 ENSMUST00000197518|IGLV2|5'UTR|IG|IGL|None|00 +CTTGGTTTGTGAATT +>351|IGLV2 ENSMUST00000197518|IGLV2|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTTCACTTATACTCTCTCTCCTGGCTCTCTGCTCAGGAGCCAGTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGGAACAGTCATACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAGCAACCGAGCTCCAGGTGTTCCTGTCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGATGCAATGTATTTCTGTGCTCTATGGTACAGCACCCATTTC +>352|IGLV3 ENSMUST00000103751|IGLV3|5'UTR|IG|IGL|None|00 +GTACCTGCATT +>353|IGLV3 ENSMUST00000103751|IGLV3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTCTTCTTCTTTGTTCTTCATTGCTCAGGTTCTTTCTCCCAACTTGTGCTCACTCAGTCATCTTCAGCCTCTTTCTCCCTGGGAGCCTCAGCAAAACTCACGTGCACCTTGAGTAGTCAGCACAGTACGTACACCATTGAATGGTATCAGCAACAGCCACTCAAGCCTCCTAAGTATGTGATGGAGCTTAAGAAAGATGGAAGCCACAGCACAGGTGATGGGATTCCTGATCGCTTCTCTGGATCCAGCTCTGGTGCTGATCGCTACCTTAGCATTTCCAACATCCAGCCTGAAGATGAAGCAATATACATCTGTGGTGTGGGTGATACAATTAAGGAACAATTTGTGTAAC +>354|TRAC ENSMUST00000198398|TRAC|C-REGION|TR|TRA|None|00 +ACATCCAGAACCCAGAACCTGCTGTGTACCAGTTAAAAGATCCTCGGTCTCAGGACAGCACCCTCTGCCTGTTCACCGACTTTGACTCCCAAATCAATGTGCCGAAAACCATGGAATCTGGAACGTTCATCACTGACAAAACTGTGCTGGACATGAAAGCTATGGATTCCAAGAGCAATGGGGCCATTGCCTGGAGCAACCAGACAAGCTTCACCTGCCAAGATATCTTCAAAGAGACCAACGCCACCTACCCCAGTTCAGACGTTCCCTGTGATGCCACGTTGACTGAGAAAAGCTTTGAAACAGATATGAACCTAAACTTTCAAAACCTGTCAGTTATGGGACTCCGAATCCTCCTGCTGAAAGTAGCCGGATTTAACCTGCTCATGACGCTGAGGCTGTGGTCCAGT +>355|TRAJ11 ENSMUST00000103730|TRAJ11|J-REGION|TR|TRA|None|00 +TGACTCGGGATACAACAAACTCACTTTTGGAAAGGGCACGGTGCTTCTAGTCTCTCCAG +>356|TRAJ12 ENSMUST00000103729|TRAJ12|J-REGION|TR|TRA|None|00 +GGGACTGGAGGCTATAAAGTGGTCTTTGGAAGTGGGACTCGATTGCTGGTAAGCCCTG +>357|TRAJ13 ENSMUST00000103728|TRAJ13|J-REGION|TR|TRA|None|00 +CAAATTCTGGGACTTACCAGAGGTTTGGAACTGGGACAAAACTCCAAGTCGTTCCAA +>358|TRAJ15 ENSMUST00000103726|TRAJ15|J-REGION|TR|TRA|None|00 +CCTACCAGGGAGGCAGAGCTCTGATATTTGGAACAGGAACCACGGTATCAGTCAGCCCCA +>359|TRAJ16 ENSMUST00000103725|TRAJ16|J-REGION|TR|TRA|None|00 +GCAACTTCAAGTGGCCAGAAGCTGGTTTTTGGCCAGGGGACCATATTAAAGGTGTACCTGC +>360|TRAJ17 ENSMUST00000103724|TRAJ17|J-REGION|TR|TRA|None|00 +TGACTAACAGTGCAGGGAACAAGCTAACTTTTGGAATCGGAACCAGGGTGCTGGTCAGGCCAG +>361|TRAJ18 ENSMUST00000103723|TRAJ18|J-REGION|TR|TRA|None|00 +TAGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTTGGAGCTGGGACTCAGCTGATTGTCATACCTG +>362|TRAJ19 ENSMUST00000103722|TRAJ19|J-REGION|TR|TRA|None|00 +ATCTATCGAGGTTTTCATAAGTTCAGCTCTGGAATAGAATCCAAGCATAATGTAAGTCCTA +>363|TRAJ2 ENSMUST00000103738|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGACTAAGTGGTAAATTAACATTCGGGGAAGGGACCCAAGTGACGGTAATATCTG +>364|TRAJ20 ENSMUST00000103721|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTGGTAACTACAAGCTCGGTGTTGAGTCAGTAACCATGATGTCTGTAAGAGCAGG +>365|TRAJ21 ENSMUST00000103720|TRAJ21|J-REGION|TR|TRA|None|00 +TGTCTAATTACAACGTGCTTTACTTCGGATCTGGCACCAAACTCACTGTAGAGCCAA +>366|TRAJ22 ENSMUST00000103719|TRAJ22|J-REGION|TR|TRA|None|00 +CATCTTCTGGCAGCTGGCAACTCATCTTTGGATCTGGAACCCAACTGACAGTTATGCCTG +>367|TRAJ23 ENSMUST00000103718|TRAJ23|J-REGION|TR|TRA|None|00 +TGAATTATAACCAGGGGAAGCTTATCTTTGGACAGGGAACCAAGTTATCTATCAAGCCCA +>368|TRAJ24 ENSMUST00000103717|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGCCAGTTTGGGGAAACTGCAGTTTGGAACAGGAACCCAGGTTGTGGTGACCCCAG +>369|TRAJ25 ENSMUST00000103716|TRAJ25|J-REGION|TR|TRA|None|00 +GAAGGACAAAAGTCTCCTCTGTCTTTGGGACAGGGAGAAGGCTGCTGGTGAAGCCAA +>370|TRAJ26 ENSMUST00000103715|TRAJ26|J-REGION|TR|TRA|None|00 +GAAATAACTATGCCCAGGGATTAACCTTCGGTCTTGGCACCAGAGTATCTGTGTTTCCCT +>371|TRAJ27 ENSMUST00000103714|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATACAGGCAAATTAACCTTTGGGGATGGGACCGTGCTCACAGTGAAGCCAA +>372|TRAJ28 ENSMUST00000103713|TRAJ28|J-REGION|TR|TRA|None|00 +TCTACCAGGCACTGGGAGTAACAGGCTCACTTTTGGGAAAGGCACCAAATTCTCACTCATCCCGA +>373|TRAJ29 ENSMUST00000103712|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAGCAGGGAGCTTGTCTTAGGAAGGGAAGCAAGGCTTTCTATGATTGAAA +>374|TRAJ3 ENSMUST00000103737|TRAJ3|J-REGION|TR|TRA|None|00 +GGAATTCAGCTATAGCTCTAAACTAATCTTTGGAGCTGAAACCAAACTCAGAAATCCACCATATAC +>375|TRAJ30 ENSMUST00000103711|TRAJ30|J-REGION|TR|TRA|None|00 +TGACACAAATGCTTACAAAGTCATCTTTGGAAAAGGGACACATCTTCATGTTCTCCCTA +>376|TRAJ31 ENSMUST00000103710|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAGCAATAACAGAATCTTCTTTGGTGATGGGACGCAGCTGGTGGTGAAGCCCA +>377|TRAJ32 ENSMUST00000103709|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGGAGCAGTGGCAACAAGCTCATCTTTGGAATTGGGACTCTGCTTTCTGTCAAGCCAA +>378|TRAJ33 ENSMUST00000103708|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTGATCTGGGGCTCTGGGACCAAGCTAATTATAAAGCCAG +>379|TRAJ34 ENSMUST00000103707|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTCCAATACCAACAAAGTCGTCTTTGGAACAGGGACCAGATTACAAGTATTACCAA +>380|TRAJ35 ENSMUST00000103706|TRAJ35|J-REGION|TR|TRA|None|00 +GCAGACAGGCTTTGCAAGTGCGCTGACATTTGGATCTGGCACAAAAGTCATTCCATGTCTACCAT +>381|TRAJ37 ENSMUST00000103705|TRAJ37|J-REGION|TR|TRA|None|00 +TAACAGGCAATACCGGAAAACTCATCTTTGGACTGGGGACAACTTTACAAGTGCAACCAG +>382|TRAJ38 ENSMUST00000103704|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGTTGGTGACAACAGTAAGCTGATTTGGGGCTTGGGGACAAGTCTGGTAGTAAATCCAA +>383|TRAJ39 ENSMUST00000103703|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGTGCCAAGCTCACATTCGGAGGGGGAACAAGGTTAACGGTCAGACCCG +>384|TRAJ4 ENSMUST00000103736|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTATCTGGTAGCTTCAATAAGTTGACCTTTGGAGCAGGGACCAGACTGGCTGTGTGCCCAT +>385|TRAJ40 ENSMUST00000103702|TRAJ40|J-REGION|TR|TRA|None|00 +GTTAATACAGGAAACTACAAATACGTCTTTGGAGCAGGTACCAGACTGAAGGTTATAGCAC +>386|TRAJ41 ENSMUST00000103701|TRAJ41|J-REGION|TR|TRA|None|00 +GGTCTCAAACACTAGCTCCATGTTGGCAGAAGCACCTCATTATTGGTCACACCCG +>387|TRAJ42 ENSMUST00000103700|TRAJ42|J-REGION|TR|TRA|None|00 +AATTCTGGAGGAAGCAATGCAAAGCTAACCTTCGGGAAAGGCACTAAACTCTCTGTTAAATCAA +>388|TRAJ43 ENSMUST00000103699|TRAJ43|J-REGION|TR|TRA|None|00 +GCAATAACAACAATGCCCCACGATTTGGAGCGGGAACCAAATTATCAGTAAAACCAA +>389|TRAJ44 ENSMUST00000103698|TRAJ44|J-REGION|TR|TRA|None|00 +GTTACTGGCAGTGGTGGAAAACTCACTTTGGGGGCTGGAACAAGACTTCAGGTCAACCTTG +>390|TRAJ45 ENSMUST00000103697|TRAJ45|J-REGION|TR|TRA|None|00 +TGAATACAGAAGGTGCAGATAGACTCACCTTTGGGAAAGGAACTCAGCTGATCATCCAGCCCT +>391|TRAJ46 ENSMUST00000103696|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAAGACAGCAGTGTAGACATGCTGGCTTTGGGGATGGGGATGAACTTGGAGTGAGCACAAA +>392|TRAJ47 ENSMUST00000197949|TRAJ47|J-REGION|TR|TRA|None|00 +TGGACTATGCAAACAAGATGATCTTTGGCTTGGGAACCATTTTGAGAGTCAGACCTC +>393|TRAJ48 ENSMUST00000200046|TRAJ48|J-REGION|TR|TRA|None|00 +GCCAACTATGGAAATGAGAAAATAACTTTTGGGGCTGGAACCAAACTCACCATTAAACCCA +>394|TRAJ49 ENSMUST00000199452|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACGGGTTACCAGAACTTCTATTTTGGGAAAGGAACAAGTTTGACTGTCATTCCAA +>395|TRAJ5 ENSMUST00000103735|TRAJ5|J-REGION|TR|TRA|None|00 +GGGGACACAGGTTGTGGGGCAGCTCACTTTCGGGAGGGGGACAAGACTCCAAGTTTATGCAA +>396|TRAJ50 ENSMUST00000103693|TRAJ50|J-REGION|TR|TRA|None|00 +TAGCATCCTCCTCCTTCAGCAAGCTGGTGTTTGGGCAGGGGACATCCTTATCAGTCGTTCCAA +>397|TRAJ52 ENSMUST00000103691|TRAJ52|J-REGION|TR|TRA|None|00 +CTAACACTGGAGCTAACACTGGAAAGCTCACGTTTGGACACGGCACCATCCTTAGGGTCCATCCAA +>398|TRAJ53 ENSMUST00000103690|TRAJ53|J-REGION|TR|TRA|None|00 +GGAACAGTGGAGGCAGCAATTACAAACTGACATTTGGGAAAGGAACTCTCTTAACTGTGACTCCAA +>399|TRAJ56 ENSMUST00000103689|TRAJ56|J-REGION|TR|TRA|None|00 +TGGCTACTGGAGGCAATAATAAGCTGACTTTTGGTCAAGGAACCGTTCTGAGTGTTATACCAG +>400|TRAJ57 ENSMUST00000196977|TRAJ57|J-REGION|TR|TRA|None|00 +TGAATCAAGGAGGGTCTGCGAAGCTCATCTTTGGGGAGGGGACAAAGCTGACAGTGAGCTCAT +>401|TRAJ58 ENSMUST00000103687|TRAJ58|J-REGION|TR|TRA|None|00 +TGCAGCAAGGCACTGGGTCTAAGCTGTCATTTGGGAAGGGGGCAAAGCTCACAGTGAGTCCAG +>402|TRAJ59 ENSMUST00000197589|TRAJ59|J-REGION|TR|TRA|None|00 +CTACTAAAAAGAGAAGATAAAGCTACCTTTGCAACTGGAGGGTATGAAGCTGAGGAAGACCT +>403|TRAJ6 ENSMUST00000103734|TRAJ6|J-REGION|TR|TRA|None|00 +AACCTCAGGAGGAAACTACAAACCTACGTTTGGGAAAGGGACCAGCCTCGTGGTTCATCCAT +>404|TRAJ7 ENSMUST00000103733|TRAJ7|J-REGION|TR|TRA|None|00 +GGACTACAGCAACAACAGACTTACTTTGGGGAAGGGAACCCAGGTGGTGGTGTTACCAA +>405|TRAJ9 ENSMUST00000103731|TRAJ9|J-REGION|TR|TRA|None|00 +AGCAACATGGGCTACAAACTTACCTTCGGGACAGGAACAAGCTTGTTGGTTGATCCAA +>406|TRAV1 ENSMUST00000103567|TRAV1|5'UTR|TR|TRA|None|00 +GCTCAGGAGCTGGGGACTCAGTGTCAGGCTGGTGGTGTC +>407|TRAV1 ENSMUST00000103567|TRAV1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGCAGATGTGGGGGTTTGTTCTCTATCTCTTCCTGACGGTGGGAGGTGCTGCAGGACAGGGTGTGGAGCAGCCTGCCAAATTGATGTCTGTGGAGGGAACCTTTGCTCGGGTCAACTGCACATACAGCACCTCAGGGTTCAACGGGTTATCCTGGTACCAGCAACGTGAAGGCCAAGCCCCTGTATTTCTTTCTTATGTTGTTTTGGATGGTTTGAAGGACAGTGGGCATTTCTCCACTTTCCTGAGCCGCTCGAATGGGTACAGTTACCTGCTTCTGACAGAGCTCCAGATCAAAGACTCTGCCTCATACCTCTGTGCTGTGAGGGA +>408|TRAV10 ENSMUST00000103583|TRAV10|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>409|TRAV10 ENSMUST00000103583|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTATGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACATGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCTTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>410|TRAV10D ENSMUST00000103646|TRAV10D|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>411|TRAV10D ENSMUST00000103646|TRAV10D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>412|TRAV10N ENSMUST00000103612|TRAV10N|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAAAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTACAGTTTTATTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>413|TRAV11 ENSMUST00000103585|TRAV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGCG +>414|TRAV11D ENSMUST00000103648|TRAV11D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGC +>415|TRAV12-1 ENSMUST00000200115|TRAV12-1|5'UTR|TR|TRA|None|00 +GTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCT +>416|TRAV12-1 ENSMUST00000200115|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTCCTCAGTTCTCGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACCGAGGGGTTGCCTGTGAAGCTGAACTGCACCTATCAGACTACTTATTTAACTATTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTCAGGTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>417|TRAV12-2 ENSMUST00000180972|TRAV12-2|5'UTR|TR|TRA|None|00 +GTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>418|TRAV12-2 ENSMUST00000180972|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAACAATGGAGACTCTGTGACCCAGACAGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGAGTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTTTTGAAGAGCTTCACAGACAACAAGAGGCCCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTTTGAGTGA +>419|TRAV12-3 ENSMUST00000103657|TRAV12-3|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTTTGAGGAGATCCTGCAGTAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCTATGAAC +>420|TRAV12-3 ENSMUST00000103657|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGGCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGAGATGGAGACTCAGTGACCCAGAAGGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATGCTTTCCTTTTCTGGTATGTGCACTATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>421|TRAV12D-1 ENSMUST00000181360|TRAV12D-1|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>422|TRAV12D-1 ENSMUST00000181360|TRAV12D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTGCTTACTCAGATGTTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTAAACTACTCCTGCGGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>423|TRAV12D-2 ENSMUST00000197007|TRAV12D-2|5'UTR|TR|TRA|None|00 +GAGACTGTGCAGACAGAGGCCCTTGTCTGTGAGTGAGGAGTGTGAGGAGATTCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAGGGACCAAGTGTCATTTCTTCCATGAAC +>424|TRAV12D-2 ENSMUST00000197007|TRAV12D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAGCAATGGAGACTCAGTGACCCAGACAGAAGGCCTGGTCACTCTCACCAAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCTACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTTCTGTGCTTTGAGTGA +>425|TRAV12D-3 ENSMUST00000177703|TRAV12D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>426|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|5'UTR|TR|TRA|None|00 +CTGAAC +>427|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>428|TRAV13-1 ENSMUST00000103651|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGAGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCATAGTGGGAGACTGACATCCACTACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>429|TRAV13-2 ENSMUST00000103658|TRAV13-2|5'UTR|TR|TRA|None|00 +TGACACAACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCATCCACACAAGCACC +>430|TRAV13-2 ENSMUST00000103658|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGTTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACATCCTGGGGGAAGACTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAACGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATAGATC +>431|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>432|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCGGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>433|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|5'UTR|TR|TRA|None|00 +CCACCCTGACACCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>434|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>435|TRAV13D-2 ENSMUST00000197954|TRAV13D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCAGCTGCAGTGGTTTTACCAAAGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAGGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTATAGATC +>436|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>437|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAATGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>438|TRAV13D-4 ENSMUST00000196079|TRAV13D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACACAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATGGAAC +>439|TRAV13N-1 ENSMUST00000198359|TRAV13N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCATCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>440|TRAV13N-3 ENSMUST00000179580|TRAV13N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAACGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>441|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|5'UTR|TR|TRA|None|00 +GACTGGTTGCAGAAGAAGGAGGGGACACTTCAACAGCCACCCTGACACCACAGCCCAGGAGCTGGTTACTTGCTTCTGTCTCCAGCAGCTACACAAGCACC +>442|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>443|TRAV14-1 ENSMUST00000198297|TRAV14-1|5'UTR|TR|TRA|None|00 +CACCTGAGTTTCCCCCAAGCTTCAGTCTAGGAGGA +>444|TRAV14-1 ENSMUST00000198297|TRAV14-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATTCTGACAGCATCATTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGAAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGGAACCACAGTTCTGACCTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAACAGTTCCCTGGGGAAGGCCCTGCACTTCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAACCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCATAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>445|TRAV14-2 ENSMUST00000179267|TRAV14-2|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAAGAGGA +>446|TRAV14-2 ENSMUST00000179267|TRAV14-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACCATCAGTTCCCTGGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGTTCTCCTTGCACATCGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>447|TRAV14-3 ENSMUST00000103589|TRAV14-3|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAGGAGAA +>448|TRAV14-3 ENSMUST00000103589|TRAV14-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCATTTTTACTTCTAGGCCTTCACCTATCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTAAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCCACTTACTTCTGTGCAGCAAGTG +>449|TRAV14D-1 ENSMUST00000181038|TRAV14D-1|5'UTR|TR|TRA|None|00 +GTGGGAGACAAAAGGTCACCTGAGTTCCCTTCAAGCTTCAGTCTAGGAGGA +>450|TRAV14D-1 ENSMUST00000181038|TRAV14D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCAACGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCACTCCTGATATCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>451|TRAV14D-2 ENSMUST00000196802|TRAV14D-2|5'UTR|TR|TRA|None|00 +GGAGCCTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGGCCACCTGAGTTCCCCCAAGCTTCAGTCTAGGAGGA +>452|TRAV14D-2 ENSMUST00000196802|TRAV14D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACTGGCAGTTCCCTAGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>453|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|5'UTR|TR|TRA|None|00 +CTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGACCACAGAGTTTCTCCCAAGCTTCAGTCTAGGAGGA +>454|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTTCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGTCCCGCTCTCCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATTGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>455|TRAV14N-3 ENSMUST00000103652|TRAV14N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATTGTTTTTACTTCTAGGTCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTTCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAATCTCTCCTTGCACATCAAAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>456|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|5'UTR|TR|TRA|None|00 +GCTGAGGCAGAGCAGACACACTCATGCAGAGGACAGTGTGTCAC +>457|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCCAGAAAGTGATTCAGGTCTGGTCAACAACAAGCAGGCAGGAGGGCGAAAAACTCACACTGGACTGTTCATATAAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTGCTTATTCGACAAATGCCTTCTACTATTGCAATAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACGCAAATCCATCAGCCTTGTCATTTCAACCTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>458|TRAV15-2-DV6-2 ENSMUST00000103660|TRAV15-2-DV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGGACATGTGTCACATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGTCAACAGGCAGCAGTCAGTGGGGAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTCCTACCTTATTCTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGATACTCAGAACCAGAGGAGCGGCCACTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>459|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|5'UTR|TR|TRA|None|00 +GCACTTAGACACTGATCTCTGAGCTGAGGCAGAGCAGACACACTC +>460|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGACAGTGTGTCACATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>461|TRAV15D-2-DV6D-2 ENSMUST00000199800|TRAV15D-2-DV6D-2|5'UTR|TR|TRA|None|00 +GAGCTGAGGCAGAGCAGACACACTCATGCAGAGGGACATGTGTCAC +>462|TRAV15D-2-DV6D-2 ENSMUST00000199800|TRAV15D-2-DV6D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGCCAACAGGCAGCAGTCAGTGGGGAGAAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTTCTACCGTATTTTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGACACTCAGAACCAGAGGAGCGGCCGCTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>463|TRAV15N-1 ENSMUST00000197433|TRAV15N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>464|TRAV16 ENSMUST00000103667|TRAV16|5'UTR|TR|TRA|None|00 +CACAAAGTATAGATTAAGATCTGGTTGAGAGAGGACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>465|TRAV16 ENSMUST00000103667|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGCTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGAAGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACTGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>466|TRAV16D-DV11 ENSMUST00000103606|TRAV16D-DV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCTCCATTTTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCAGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCGGCAGTATATTTCTGTGCTATGAGAGAGGG +>467|TRAV16N ENSMUST00000199280|TRAV16N|5'UTR|TR|TRA|None|00 +ATAGATTAAGATCTGGTTGAGAGAGAACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>468|TRAV16N ENSMUST00000199280|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>469|TRAV17 ENSMUST00000103672|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGTTCCCAGTGACCATTCTGCTGCTCAGCGCGTTCTTCTCACTGAGAGGAAACAGTGCCCAGTCCGTGGACCAGCCTGATGCTCATGTCACGCTCTCTGAAGGAGCCTCCCTGGAGCTCAGATGCAGTTATTCATACAGTGCAGCACCTTACCTCTTCTGGTACGTGCAGTATCCTGGCCAGAGCCTCCAGTTTCTCCTCAAATACATCACAGGAGACACCGTTGTTAAAGGCACCAAGGGCTTTGAGGCCGAGTTTAGGAAGAGTAACTCCTCTTTCAACCTGAAGAAATCCCCAGCCCATTGGAGCGACTCAGCCAAGTACTTCTGTGCACTGGAGGG +>470|TRAV18 ENSMUST00000103673|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGAAACTCTCTGTGTTGCTCCTTTGGAATCAAGTGGCCCGTGTGGCCACTCAACGGCTGGAGCAGAGTCCTCGGTTTCTGAGTATCCAGGAGGGGCAAGATTTCACTGCACGCTGCAGCTCCTCAACCACCTTCCCCCAACTTTACTGGTACCGACAGGTCCCCAGGGAAGGTCCTGTCATCCTGGTGACATTGGTCAAGAGTGGAGAGGTAAAGGAGCAGAGGAGGATGACTGCTAAGTTTGGTGAAGCAAGAAAGAACAGCTCCCTATTCATCGCCAGAGCTCAGCCTGGAGACGCAGGCATCTACTTCTGTACAGGAA +>471|TRAV19 ENSMUST00000103674|TRAV19|5'UTR|TR|TRA|None|00 +AAAGGGAATAAAGTCAGGACAGGAAGATGAAATCTGAGTTGCAGTTCCCTGAGTAGAAGGAGAGACAACTCAAAGCTTCAGAGAAGAC +>472|TRAV19 ENSMUST00000103674|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGACTGGCTTCCTGAAGGCCTTGCTGTTGGTTCTGTGCCTGCGGCCAGAATGGGTAAAGAGTCAACAGAAGACTAGTGGCCAGCAAGTTAAACAAAGCTCTCCATCGCTGACTGTTCAAGAGGGAGGGATATCGATCCTGAATTGTGACTACGAGAATGATATGTTTGACTATTTTGCCTGGTACAAAAAATACCCTGACAACAGCCCCACACTCCTGATATCCGTACGCTCAAATGTGGATAAGAGGGAAGACGGAAGACTCACAGTTTTCTTGAACAAAAGCGGCAAACACTTCTCACTGCACATCACAGCCTCCCAGCCTGAAGACACAGCAGTGTACCTCTGCGCAGCAGGTG +>473|TRAV2 ENSMUST00000196939|TRAV2|5'UTR|TR|TRA|None|00 +CAGTGGCTTCTGAGTCTCCTCCTTGGTTCGTATTCTGGTCTAAGCTCAGATTCAGCAAAGAATCTGGAATCTGGGCCTGTGCTTACAAAGAGAAT +>474|TRAV2 ENSMUST00000196939|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCAGGTGGCAAAAGTGACTGTGCTCCTGATCTTGGTCTCATGGAGCCTTGCCAAGACCACCCAGCCCCCCTCCATGGAGGCCTATGAAGGGCAAGAAGTGAACGTGTCCTGCAGCCATACAAACATTGCTACAAGCGAGTACATCTACTGGTACCGACAGGTTCCCCACCAGGGACCACAGTTTATCATTCAAGGATATAAGGACTATGTGGTAAATGAAGTGGCATCTCTGTTTATCTCTGCTGACCGGAAGCTCAGCACTCTGAGCCTGCCCTGGGTTTCCCTGAGAGATGCTGCTGTGTATTACTGCATTGTGACTGACA +>475|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|5'UTR|TR|TRA|None|00 +ACAGATCTGAGCTCATCCATTTGCTCTTAACT +>476|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGATGTGTGAGTGGAATTGCCATTCTCCTGGCTTTGGGTATTGCGGGTGATGCTAAGACTACACAACCAGATTCAATGGAAAGTACTGAAGGAGAAACGGTGCACTTGCCTTGTAGCCACGCCACAATCAGTGGAAACGAGTACATCTATTGGTACCGACAGGTTCCTCTTCAGGGTCCAGAATATGTGACTCACGGTCTACAACAAAATACAACCAATAGTATGGCTTTCCTGGCTATTGCCTCTGACAGAAAGTCAAGCACCTTGATCCTGCCTCATGTCAGCCTGAGAGACGCGGCTGTGTACCACTGTATCCTGAGAGTAG +>477|TRAV23 ENSMUST00000199137|TRAV23|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGCACTGGCAATGATACTGAGGCTTCAGCTAGACTGGTTATGTGGAGAGAAGACAGTGCAGCAAACCCCTCCGTTTCTCGGCTCCTGGGAAGGAAGAAACAGCACTATCCTCTGCAGTTATTCAAGATCCGCTACAGACAGCCTGCTCTGGTATAGACAAGATCTGGGGGAAAGCCTGGAGTTTCTGTTTGCATTGCTGTCAAATGGAGCAGTGAAGAGAGATAGAAGATTAACAGCCTCACTTGATCAGAAAGCTCGCCTCAGCGCCCTGCACTTCTCCCCTGCACTTCTCCGGACTCCAGCACAGCCACTCTGCCATCTACTTCTGTGCCCTGGGCA +>478|TRAV3-1 ENSMUST00000103569|TRAV3-1|5'UTR|TR|TRA|None|00 +GGCATCTTGTCTGGCTGAAGGCCACAGTCCAGAGGGAGAGCA +>479|TRAV3-1 ENSMUST00000103569|TRAV3-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTGCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCATTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTCCTGGTACAAGCAAGAGGCGGGGGCAGGTCTTCAGTTGCTTATGAGTGTCCTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>480|TRAV3-3 ENSMUST00000181768|TRAV3-3|5'UTR|TR|TRA|None|00 +GAAGATGCCTCAGTGCTGTGGAGGTGATCACAGAGGCATCTTGTCTGGCTGAAGGTCAGAGTCTGGAGGGAGAGCA +>481|TRAV3-3 ENSMUST00000181768|TRAV3-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCACCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAAGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGCGTACTTCTGCGCAGTCAGTG +>482|TRAV3-4 ENSMUST00000103670|TRAV3-4|5'UTR|TR|TRA|None|00 +CAGTAGCCTTCTGTGCAGACAGGTGAAGTAGCCTCAGTGCTGTGGAGAACAGAGGAGGTGAGCTGATCACAGAGGCATCTTGTCTGGCTGAAGGCCAGAGTCTGGAGGGAGAGCA +>483|TRAV3-4 ENSMUST00000103670|TRAV3-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACAGTGGCTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGTTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCTTTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTACTGGTACAAGCAAGAGCCAGGGGCAGGTCTTCAGTTGCTTATGAGTGTCTTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCTGTGTACTTCTGCGCAGTCAGTG +>484|TRAV3D-3 ENSMUST00000196023|TRAV3D-3|5'UTR|TR|TRA|None|00 +ACACAGCTGAAGATGCCTCCGTGTTGTGGAGGTGATCACAGAGGCATCCTGTCTGGCTAAAGGTCAGAGTCTGGAGGGAGCGCA +>485|TRAV3D-3 ENSMUST00000196023|TRAV3D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCATCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAGGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACAACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>486|TRAV4-2 ENSMUST00000103637|TRAV4-2|5'UTR|TR|TRA|None|00 +CCCTGCTGACTGTTGGAAATCAGCAGCTTGACAGGGTCA +>487|TRAV4-2 ENSMUST00000103637|TRAV4-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAGCCCGGGAACTGTGCTGGGGCTGCTGTTGGTGCCGCTATGCTGGGTAAGAGGAATGCCGGTGGAACAGAATCCTCCAGCCCTGAGTCTTTATGAAGGAGCTGAGTCTGGTCTGAGATGCAATTTTTCTACCACCATGAAAGGTGTCCAGTGGTTTCAACAAAATCACAGAGGCAGACTTATCACTCTGTTTTACCTGGCTCAAGGAACAAAGGAGAATGGAAGGTTAAAGTCAACATTCAATTCTAAGGAGCGCTACAGCACCCTGCACATCAAGGATGCACAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGTTGAGG +>488|TRAV4-3 ENSMUST00000103655|TRAV4-3|5'UTR|TR|TRA|None|00 +AGTCTGTAAGCACAAGTGTGTCTGGGCATAAGACACCCTTCAGAGCTGGAGAGAAGACAACCAGCGATTGGACAGGGGCC +>489|TRAV4-3 ENSMUST00000103655|TRAV4-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAACAAAGTCCCTCAGCGCTGAGTCTCCAAGAAGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCCGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATCAATCTTTTTTACCTGGTTCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTCGATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>490|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|5'UTR|TR|TRA|None|00 +GAGAAGACAACCAGCGATTGGACAGGGGCC +>491|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGGCTGTGCAGTGGTTCCAACAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAACATTCAATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>492|TRAV4D-3 ENSMUST00000103592|TRAV4D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAGCAAAGTCCCTCAGCGCTGAGTCTCCAAGAGGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCTGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATGAATCTTTTTTACCTGGTGCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTTGATTCTAAGGAGAGCTACAGCACCCTGCACATTAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>493|TRAV4D-4 ENSMUST00000103600|TRAV4D-4|5'UTR|TR|TRA|None|00 +ATCCCAGCGATTGGACAGGGGCC +>494|TRAV4D-4 ENSMUST00000103600|TRAV4D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACTACCACCATGAGGGCTGTGCAGTGGTTCCGAAAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>495|TRAV5-1 ENSMUST00000103570|TRAV5-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGCTATTCATGCTTTATTTATTTTCTTCTGGCTACAGATGGACTGGAAGAGCCAAGGTGAGCAGGTGGAACAGCTCCCTTCCTCCCTGATTGTCCAGGAGGGAGCCAGTGTTCTGATCAACTGCTCCTACACAGACAGTGCCTCTGTCTACTTCCCTTGGTATAAGCAAGAGCCTGGGAAGCGTCTTCAGTTCATCATAGACATCCGTTCAAATATGGAAAGAAAGCAGACTCAAAGACTCACCCTTTTATTTGATAAGAAAACCAAACACCTTTCCCTGCACATTACAGCCACTCAGCCTGGAGACTCAGCCATCTACTTCTGCTCAGCAAGTA +>496|TRAV5-4 ENSMUST00000103664|TRAV5-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGCGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCAGTTATGAAGACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGATCCAAGAACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>497|TRAV5D-4 ENSMUST00000179701|TRAV5D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGTGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCACTTATGAGAACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGACCCAAGGACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>498|TRAV6-1 ENSMUST00000103571|TRAV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGCTTTAGTGACTGTGATGCTGTTTGTGTTTGGGAGGACCCATGGAGACTCAGTAACCCAGATGCAAGGTCAAGTGACCCTCTCAGAAGACGACTTCCTATTTATAAACTGTACTTATTCAACCACATGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAACAAGGGAATCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACAACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCTGCTGTGTACTACTGTGTTCTGGGTGA +>499|TRAV6-2 ENSMUST00000198058|TRAV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACACTTCTCCAGCTTTAGTGACTGTGATGCTGCTGTTCATGCTTGAGAGGACACATGGAAATTCAGTGACCCAGATGCAAGGTCAAGTGACCCTTTCAGAAGAGGAGTTTCTATTTATAAACTGTACCTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAATAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>500|TRAV6-3 ENSMUST00000180549|TRAV6-3|5'UTR|TR|TRA|None|00 +ATCATTTCTTCATGTGAAGAGTTGAGAGCATCACTCTGGTGACACTGAAG +>501|TRAV6-3 ENSMUST00000180549|TRAV6-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGAGA +>502|TRAV6-4 ENSMUST00000180711|TRAV6-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCAGCACTCTACACTGAAC +>503|TRAV6-4 ENSMUST00000180711|TRAV6-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTAACTGTGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACATACCCAACTCTTTTGTGGTATGTCCAATATCTTGGACAAGGTCCACAGCTCCTTCTGAAAGTGACAACTGCCAACAATAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>504|TRAV6-5 ENSMUST00000181210|TRAV6-5|5'UTR|TR|TRA|None|00 +AAAATATTTGTATTCACACACTCCAGTGGCTCAGAAA +>505|TRAV6-5 ENSMUST00000181210|TRAV6-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>506|TRAV6-6 ENSMUST00000103584|TRAV6-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTTGGAAGGACCCACGGAGATTCCGTGACTCAAACAGAAGGCCCAGTGACCGTCTCAGAAAGCGAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGCTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>507|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|5'UTR|TR|TRA|None|00 +AC +>508|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTAAGAATCATGAACACTGTCGAGATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGGCCACAGCTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCTTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>509|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|5'UTR|TR|TRA|None|00 +ACACTGAAG +>510|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGTGA +>511|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCATCACTCTACACTGAAC +>512|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTGACTGCGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACGTACCCAACTCTTTTCTGGTATGTCCAATATCCTGGACAAGGTCCACAGCTCCTTCTGAAAGTCACAACTGCCAACAACAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACCTCCTTCCACTTACAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>513|TRAV6D-5 ENSMUST00000180687|TRAV6D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGGATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCGGTGACTCAGACAAAAGGTCCAGTGACATTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACGTATGATAAAGGGACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>514|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|5'UTR|TR|TRA|None|00 +CTGTCGAGATGGGTCTAAAG +>515|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>516|TRAV6N-5 ENSMUST00000103611|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>517|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|5'UTR|TR|TRA|None|00 +ACTTTCTAGATGACACTAAAG +>518|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTGGGAAGGACCCATGGAGATTCCGTGACTCAAACAGAAGGCCAAGTGACTGTCTCAGAAAGCAAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGGTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGCGCTCTGAGTGA +>519|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|5'UTR|TR|TRA|None|00 +CTGTCGAG +>520|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>521|TRAV7-1 ENSMUST00000198019|TRAV7-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTCCTTGTGTGTTTCACTAGTGGTCCTGTGGCTTCAGCTACACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTAATTCTCAGTATTTCTGGTGGTACAGACAGCATTCTGGGGAAGGCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGACAAGAAGGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTATCCCTGCACATCAAAGACTCCCAACCCAGTGACTCTGCTCTCTACTTCTGTGCAGTGAGCA +>522|TRAV7-2 ENSMUST00000103636|TRAV7-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGC +>523|TRAV7-3 ENSMUST00000177622|TRAV7-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAACTTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAGGAAGAGAGA +>524|TRAV7-3 ENSMUST00000177622|TRAV7-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>525|TRAV7-4 ENSMUST00000181728|TRAV7-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>526|TRAV7-4 ENSMUST00000181728|TRAV7-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCAATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>527|TRAV7-5 ENSMUST00000200609|TRAV7-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGCAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACGTTCAGTGATGGTACTTCTAACAACTTCAGGTGGTACAGACAGCATTCTGCGAAAGGCCTTGAGGTGCTAGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGATTTACAGCTCACCTCAATAGAGCCAACTTGCATGTTTCCCTACACATCAGAGAACCACAACCCAGTGACTCTGCTGTCTACCTCTGTGCAGTGAGCA +>528|TRAV7-6 ENSMUST00000103641|TRAV7-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>529|TRAV7-6 ENSMUST00000103641|TRAV7-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGGTCTCCCTCAACTGCAGTTTCAGCGACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCAAAGCACTAATATCCATCTTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAAAGACTCCCAGCCCAGTGACTCCGCTGTCTACCTCTGTGCAGTGAGCA +>530|TRAV7D-2 ENSMUST00000200127|TRAV7D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGCA +>531|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAAATTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAAGAAGAGAGA +>532|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCGCTACACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>533|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>534|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTTACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>535|TRAV7D-5 ENSMUST00000197128|TRAV7D-5|5'UTR|TR|TRA|None|00 +ATG +>536|TRAV7D-5 ENSMUST00000197128|TRAV7D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGAAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTTCTTCTGACAACTTCAGGTGGTACAGACAGCATTCTGGGAAAGGCCTTGAGGTGCTGGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGTTTTACAGCTCACCTCAATAGAGCCAGCCTGCATGTTTTCCTACACATCAGAGAGCCGCAACCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>537|TRAV7N-4 ENSMUST00000103609|TRAV7N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAAGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTATTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAAGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGTTAGTGAGCA +>538|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>539|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGTCCTCCCTCAACTGCACTTTCAGCAACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCGAAGCACTAATATCCATATTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCCGTCTACCTCTGTGCAGTGAGCA +>540|TRAV8-1 ENSMUST00000103643|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGTTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATTCGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>541|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|5'UTR|TR|TRA|None|00 +AAACCAACCACCTTGAACAGGCCTGGAGCTGTATCTCTTGCGATCTGATCTTCATAGGGAAGA +>542|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGATGGTGTCACTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATCTGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCGAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>543|TRAV8D-2 ENSMUST00000198439|TRAV8D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCGAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTATACAACTGTTGTACACTGGTACAGGCAAGACTCAGGCAGAGGCCCTGCCCTGATAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTAAGAGCCACCCTTGACACCTCCAGCCAAAGTAGCTCTCTGTCCATCACTGCTGCTCAGTGTGAAGACACTGCTGTGTACTTCTGTGCTACAGATG +>544|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|5'UTR|TR|TRA|None|00 +CTGTCCTAGGAACCAGGTTCCACTTCAGGGTGCAGCACAGCCTTTCCTGTGACATCAATAAAGCAAGAAAA +>545|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCAAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTACACAACTGTTGTTCAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTCAGAGCCACCCTTGACACTTCCAGCCAGAGCAGCTCCCTGTCCATCACTGGTACTCTAGCTACAGACACTGCTGTGTACTTCTGTGCTACTGATG +>546|TRAV9-1 ENSMUST00000103581|TRAV9-1|5'UTR|TR|TRA|None|00 +TCTTTCCTGCACGAGCCAGGTTTTTCCAGAAAGGCACCAGAGCTGTTTCCAGTGTGCAGCC +>547|TRAV9-1 ENSMUST00000103581|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCATGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCGAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>548|TRAV9-2 ENSMUST00000103654|TRAV9-2|5'UTR|TR|TRA|None|00 +TTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCCTACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCTTTTCCAAGGCTCAGCC +>549|TRAV9-2 ENSMUST00000103654|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCTGCTGTGTACTTCTGTGTTTTGAGCG +>550|TRAV9-4 ENSMUST00000103662|TRAV9-4|5'UTR|TR|TRA|None|00 +TGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>551|TRAV9-4 ENSMUST00000103662|TRAV9-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCACTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACGCCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCATCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>552|TRAV9D-1 ENSMUST00000178426|TRAV9D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCGTGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCAAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>553|TRAV9D-2 ENSMUST00000199746|TRAV9D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTCCTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGTTCTGAGCG +>554|TRAV9D-3 ENSMUST00000178252|TRAV9D-3|5'UTR|TR|TRA|None|00 +ATCTCATCCCTCTTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGTTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCTGCTTTCCTGCCTGTCCTGTTCCAGAGTTTCTCCACAACAGAGCTGCAGCCTTCTCAAGGCTCAGTC +>555|TRAV9D-3 ENSMUST00000178252|TRAV9D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTCTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTTTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATCCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTGGGCTGTGTACTTCTGTGCTGTGAGCA +>556|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>557|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>558|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>559|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAACAGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>560|TRBC1 ENSMUST00000192856|TRBC1|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGCAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGGATTACCTCAGCATCCTATCAACAAGGGGTCTTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAAGCCACCCTGTATGCTGTGCTTGTCAGTACACTGGTGGTGATGGCTATGGTCAAAAGAAAGAATTCA +>561|TRBC2 ENSMUST00000103299|TRBC2|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGAAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGAATCACTTCAGCATCCTATCATCAGGGGGTTCTGTCTGCAACCATCCTCTATGAGATCCTACTGGGGAAGGCCACCCTATATGCTGTGCTGGTCAGTGGCCTGGTGCTGATGGCCATGGTCAAGAAAAAAAATTCC +>562|TRBD1 ENSMUST00000178537|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>563|TRBD2 ENSMUST00000178862|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTGGGGGGGC +>564|TRBJ1-1 ENSMUST00000103284|TRBJ1-1|J-REGION|TR|TRB|None|00 +CAAACACAGAAGTCTTCTTTGGTAAAGGAACCAGACTCACAGTTGTAG +>565|TRBJ1-2 ENSMUST00000103285|TRBJ1-2|J-REGION|TR|TRB|None|00 +CAAACTCCGACTACACCTTCGGCTCAGGGACCAGGCTTTTGGTAATAG +>566|TRBJ1-3 ENSMUST00000192366|TRBJ1-3|J-REGION|TR|TRB|None|00 +TTCTGGAAATACGCTCTATTTTGGAGAAGGAAGCCGGCTCATTGTTGTAG +>567|TRBJ1-4 ENSMUST00000103287|TRBJ1-4|J-REGION|TR|TRB|None|00 +TTTCCAACGAAAGATTATTTTTCGGTCATGGAACCAAGCTGTCTGTCCTGG +>568|TRBJ1-5 ENSMUST00000103288|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAACAACCAGGCTCCGCTTTTTGGAGAGGGGACTCGACTCTCTGTTCTAG +>569|TRBJ1-6 ENSMUST00000103289|TRBJ1-6|J-REGION|TR|TRB|None|00 +TTCCTATAATTCGCCCCTCTACTTTGCGGCAGGCACCCGGCTCACTGTGACAG +>570|TRBJ1-7 ENSMUST00000193061|TRBJ1-7|J-REGION|TR|TRB|None|00 +CCTGTGTTGGATGACCATGGTCTTGGAAAGGAACTTAGGTATAAGA +>571|TRBJ2-1 ENSMUST00000103293|TRBJ2-1|J-REGION|TR|TRB|None|00 +TAACTATGCTGAGCAGTTCTTCGGACCAGGGACACGACTCACCGTCCTAG +>572|TRBJ2-2 ENSMUST00000103294|TRBJ2-2|J-REGION|TR|TRB|None|00 +CAAACACCGGGCAGCTCTACTTTGGTGAAGGCTCAAAGCTGACAGTGCTGG +>573|TRBJ2-3 ENSMUST00000103295|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGTGCAGAAACGCTGTATTTTGGCTCAGGAACCAGACTGACTGTTCTCG +>574|TRBJ2-4 ENSMUST00000103296|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGTCAAAACACCTTGTACTTTGGTGCGGGCACCCGACTATCGGTGCTAG +>575|TRBJ2-5 ENSMUST00000103297|TRBJ2-5|J-REGION|TR|TRB|None|00 +AACCAAGACACCCAGTACTTTGGGCCAGGCACTCGGCTCCTCGTGTTAG +>576|TRBJ2-7 ENSMUST00000103298|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTATGAACAGTACTTCGGTCCCGGCACCAGGCTCACGGTTTTAG +>577|TRBV1 ENSMUST00000103262|TRBV1|5'UTR|TR|TRB|None|00 +GGATTCTCTTCTCTTGCCTGATGCCCTGCATGCCCCACAGAGATAGAGAGAACCTGAGGTCTCAGAG +>578|TRBV1 ENSMUST00000103262|TRBV1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGCAGTTTTGCATTCTGTGCCTCTGTGTACTCATGGCTTCTGTGGCTACAGACCCCACAGTGACTTTGCTGGAGCAAAACCCAAGGTGGCGTCTGGTACCACGTGGTCAAGCTGTGAACCTACGCTGCATCTTGAAGAATTCCCAGTATCCCTGGATGAGCTGGTATCAGCAGGATCTCCAAAAGCAACTACAGTGGCTGTTCACTCTGCGGAGTCCTGGGGACAAAGAGGTCAAATCTCTTCCCGGTGCTGATTACCTGGCCACACGGGTCACTGATACGGAGCTGAGGCTGCAAGTGGCCAACATGAGCCAGGGCAGAACCTTGTACTGCACCTGCAGTGCAGA +>579|TRBV10 ENSMUST00000103265|TRBV10|5'UTR|TR|TRB|None|00 +TCTGATAGCTGCAGTAGGTAGGGCTTATTTGCCCTGCCTTGACCCAACT +>580|TRBV10 ENSMUST00000103265|TRBV10|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGTAGGCTCCTAAGCTGTGTGGCCTTCTGCCTCTTGGGAATAGGCCCTTTGGAGACGGCTGTTTTCCAGACTCCAAACTATCATGTCACACAGGTGGGAAATGAAGTGTCTTTCAATTGTAAGCAAACTCTGGGCCACGATACTATGTATTGGTACAAGCAAGACTCTAAGAAATTGCTGAAGATTATGTTTAGCTACAATAATAAGCAACTCATTGTAAACGAAACAGTTCCAAGGCGCTTCTCACCTCAGTCTTCAGATAAAGCTCATTTGAATCTTCGAATCAAGTCTGTAGAGCCGGAGGACTCTGCTGTGTATCTCTGTGCCAGCAGCTAAGA +>581|TRBV12-1 ENSMUST00000103267|TRBV12-1|5'UTR|TR|TRB|None|00 +GCATCCTGAGAAGAAGC +>582|TRBV12-1 ENSMUST00000103267|TRBV12-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGTCCTCGCTGATTCTGCCTGGGGCATCACCCTGCTATCTTGGGTTACTGTCTTTCTCTTGGGAACAAGTTCAGCAGATTCTGGGGTTGTCCAGTCTCCAAGACACATAATCAAAGAAAAGGGAGGAAGGTCCGTTCTGACGTGTATTCCCATCTCTGGACATAGCAATGTGGTCTGGTACCAGCAGACTCTGGGGAAGGAATTAAAGTTCCTTATTCAGCATTATGAAAAGGTGGAGAGAGACAAAGGATTCCTACCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAAATGAACATGAGTGCCTTGGAACTGGAGGACTCTGCTATGTACTTCTGTGCCAGCTCTCTC +>583|TRBV12-2 ENSMUST00000103269|TRBV12-2|5'UTR|TR|TRB|None|00 +CCTGAGAGGAAGC +>584|TRBV12-2 ENSMUST00000103269|TRBV12-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAGTTCAGCAAATTCTGGGGTTGTCCAGTCTCCAAGATACATAATCAAAGGAAAGGGAGAAAGGTCCATTCTAAAATGTATTCCCATCTCTGGACATCTCTCTGTGGCCTGGTATCAACAGACTCAGGGGCAGGAACTAAAGTTCTTCATTCAGCATTATGATAAAATGGAGAGAGATAAAGGAAACCTGCCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAGATGAACATGAGTGCCTTGGAGCTAGAGGACTCTGCCGTGTACTTCTGTGCCAGCTCTCTC +>585|TRBV13-1 ENSMUST00000194399|TRBV13-1|5'UTR|TR|TRB|None|00 +AACATACAAGAGCCTGACTTGGTCGCGAG +>586|TRBV13-1 ENSMUST00000194399|TRBV13-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTTCTGGTCTTGAGCCTCCTGTGTACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCTAGAAACAAGGTGACAGTAACAGGAGGAAACGTGACATTGAGCTGTCGCCAGACTAATAGCCACAACTACATGTACTGGTATCGGCAGGACACTGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGCTGGCAACCTTCAAATAGGAGATGTCCCTGATGGGTACAAGGCCACCAGAACAACGCAAGAAGACTTCTTCCTCCTGCTGGAATTGGCTTCTCCCTCTCAGACATCTTTGTACTTCTGTGCCAGCAGTGATG +>587|TRBV13-2 ENSMUST00000103270|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>588|TRBV13-3 ENSMUST00000103271|TRBV13-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGACTCTTCTTTGTGGTTTTGATTCTCCTGTGTGCAAAACACATGGAGGCTGCAGTCACCCAAAGTCCAAGAAGCAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTCACCAGACTAATAACCATGACTATATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTACTCATATGTCGCTGACAGCACGGAGAAAGGAGATATCCCTGATGGGTACAAGGCCTCCAGACCAAGCCAAGAGAATTTCTCTCTCATTCTGGAGTTGGCTTCCCTTTCTCAGACAGCTGTATATTTCTGTGCCAGCAGTGATG +>589|TRBV14 ENSMUST00000103272|TRBV14|5'UTR|TR|TRB|None|00 +CCTCCTCTGCCCTCAATCTGCC +>590|TRBV14 ENSMUST00000103272|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTTCTTGGCTGGGCAGTGTTCTGTCTCCTTGACACAGTACTGTCTGAAGCTGGAGTCACCCAGTCTCCCAGATATGCAGTCCTACAGGAAGGGCAAGCTGTTTCCTTTTGGTGTGACCCTATTTCTGGACATGATACCCTTTACTGGTATCAGCAGCCCAGAGACCAGGGGCCCCAGCTTCTAGTTTACTTTCGGGATGAGGCTGTTATAGATAATTCACAGTTGCCCTCGGATCGATTTTCTGCTGTGAGGCCTAAAGGAACTAACTCCACTCTCAAGATCCAGTCTGCAAAGCAGGGCGACACAGCCACCTATCTCTGTGCCAGCAGTTTCT +>591|TRBV15 ENSMUST00000103273|TRBV15|5'UTR|TR|TRB|None|00 +GTCACATCAGTGCTCATCCCACT +>592|TRBV15 ENSMUST00000103273|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCATCCAGACCCTCTGTTGTGTGATCTTTTATGTTCTGATAGCAAATCACACAGATGCTGGAGTTACCCAGACACCCAGACATGAGGTGGCAGAGAAAGGACAAACAATAATCCTGAAGTGTGAGCCAGTTTCAGGCCACAATGACCTTTTCTGGTACAGACAGACCAAGATACAGGGACTAGAGTTGCTGAGCTACTTCCGCAGCAAGTCTCTTATGGAAGATGGTGGGGCTTTCAAGGATCGATTCAAAGCTGAGATGCTAAATTCATCCTTCTCCACTCTGAAGATTCAACCTACAGAACCCAAGGACTCAGCTGTGTATCTGTGTGCCAGCAGTTTAGC +>593|TRBV16 ENSMUST00000103274|TRBV16|5'UTR|TR|TRB|None|00 +TCTCGTGCTTACGTGGAGTTTCTATGAGTGAAGCCACTGCCTCATCTTGCC +>594|TRBV16 ENSMUST00000103274|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCCCCAGGCTCCTTTTCTGTCTGGTTCTTTGCTTCTTGAGAGCAGAACCAACAAATGCTGGTGTCATCCAAACACCTAGGCACAAGGTGACAGGGAAGGGACAAGAAGCAACTCTGTGGTGTGAGCCAATTTCAGGACATAGTGCTGTTTTCTGGTACAGACAGACCATTGTGCAGGGCCTGGAGTTCCTGACTTACTTTCGAAATCAAGCTCCTATAGATGATTCAGGGATGCCCAAGGAACGATTCTCAGCTCAGATGCCCAATCAGTCGCACTCAACTCTGAAGATCCAGAGCACGCAACCCCAGGACTCAGCGGTGTATCTTTGTGCAAGCAGCTTAGA +>595|TRBV17 ENSMUST00000103275|TRBV17|5'UTR|TR|TRB|None|00 +CAAATATTCCTTTCCTGTTCTGGACCATCC +>596|TRBV17 ENSMUST00000103275|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATCCTAGACTTCTTTGCTGTGTGATCTTCTGTCTTCTTGCAGCCACTTTTGTGGATACTACGGTTAAGCAGAACCCAAGATACAAGCTTGCAAGAGTTGGAAAACCAGTGAATTTGATCTGTTCTCAGACTATGAATCATGATACCATGTACTGGTACCAAAAGAAGCCAAACCAAGCACCAAAGCTTCTTCTTTTCTACTATGATAAGATTTTGAACAGGGAAGCTGACACTTTTGAGAAGTTCCAATCCAGTCGGCCTAACAATTCTTTCTGCTCTCTCTACATTGGCTCTGCAGGCCTAGAGTATTCTGCCATGTACCTCTGTGCTAGCAGTAGAGA +>597|TRBV19 ENSMUST00000103276|TRBV19|5'UTR|TR|TRB|None|00 +CCCCTCTTCTCAGAACTGGTGCAGATGCTTGGAGCCAGTGTCTGGCTCTCTGGTCTCCCTCTCCTTCTGCCACACCAGGAAGCTCCTTTTGAACATCTCAAGAGTCTTCCTACCATTCTAGTCATCATAGTTAGCCAGGTGGAGCCCCTGCATAGCGCGTCTCCTTGTTTCTCTTTTAACTAATGCCCAGAGCCAAAGAAAGTCCCTCCAAACT +>598|TRBV19 ENSMUST00000103276|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAACAAGTGGGTTTTCTGCTGGGTAACCCTTTGTCTCCTTACTGTAGAGACCACACATGGTGATGGTGGCATCATTACTCAGACACCCAAATTCCTGATTGGTCAGGAAGGGCAAAAACTGACCTTGAAATGTCAACAGAATTTCAATCATGATACAATGTACTGGTACCGACAGGATTCAGGGAAAGGATTGAGACTGATCTACTATTCAATAACTGAAAACGATCTTCAAAAAGGCGATCTATCTGAAGGCTATGATGCGTCTCGAGAGAAGAAGTCATCTTTTTCTCTCACTGTGACATCTGCCCAGAAGAACGAGATGGCCGTTTTTCTCTGTGCCAGCAGTATAG +>599|TRBV2 ENSMUST00000103263|TRBV2|5'UTR|TR|TRB|None|00 +GCACAAGAAACTGTCTGAGGAGACCCAAGAGGTAGCTGGGTATGGTCTAGGTCTGGGAGCCTATGCCCTGACAAGCATGAAGGGCAAAGAGGAAGTGTGAGCTGAAACCATCTACACAACAGGGAGCATCCAAGCAAAGCATTTTACAGGTCAGCAAAAGGCACCCAGACAGCCAGGATCCAAAGAGAAAGAGATCCTATCCTGTGTGACACTGCT +>600|TRBV2 ENSMUST00000103263|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCATTTTCCTCAGTTGCCTGGCCGTTTGTCTCCTGGTGGCAGGTCCAGTCGACCCGAAAATTATCCAGAAACCAAAATATCTGGTGGCAGTCACAGGGAGCGAAAAAATCCTGATATGCGAACAGTATCTAGGCCACAATGCTATGTATTGGTATAGACAAAGTGCTAAGAAGCCTCTAGAGTTCATGTTTTCCTACAGCTATCAAAAACTTATGGACAATCAGACTGCCTCAAGTCGCTTCCAACCTCAAAGTTCAAAGAAAAACCATTTAGACCTTCAGATCACAGCTCTAAAGCCTGATGACTCGGCCACATACTTCTGTGCCAGCAGCCAAGA +>601|TRBV20 ENSMUST00000103277|TRBV20|L-REGION+V-REGION|TR|TRB|None|00 +ATGTTACTGCTTCTATTACTTCTGGGGCCTGGCTGTGGGCTTGGAGCACTCGTCTATCAATATCCCAGAAGAACCATCTGTAAGAGTGGAACTTCCATGAGGATGGAGTGTCAAGCTGTGGGTTTTCAGGCAACTTCTGTAGCTTGGTATCGTCAATCGCCTCAAAAGACATTTGAACTGATAGCACTTTCTACTGTGAACTCAGCAATCAAATATGAACAAAATTTTACCCAGGAAAAATTTCCCATCAGTCATCCCAACTTATCCTTTTCATCTATGACAGTTTTAAATGCATATCTTGAAGACAGAGGCTTATATCTCTGTGGTGCTAGGGA +>602|TRBV21 ENSMUST00000195087|TRBV21|5'UTR|TR|TRB|None|00 +AGACAGCTAGCTGATCAGCACTCTCTATGAATCAACCATGCACTGCAAACTTTTCTACTGTGTGCCCTTTTATTCTGGACATCAAGCTCC +>604|TRBV23 ENSMUST00000193997|TRBV23|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTGCACGGCTCATTTGCTATGTAGCACTTTGCCTCCTGGGGGCAGGCTCTTTTGATGCTGCAGTTACACAGAAGCCAAGATATTTGATCAAAATGAAAGGCCAGGAAGCAGAGATGAAATGTATCCCTGAAAAGGGGCACACTGCTGTTTTCTGGTATCAACAAAAGCAGAGCAAAGAATTAAAGTTCCTGATTTACTTTCAGAATCAACAGCCTCTTGATCAAATAGACATGGTCAAGGAGAGATTCTCAGCTGTGTGCCCCTCCAGCTCACTCTGCAGCCTGGGAATCAGAACGTGCGAAGCAGAAGACTCAGCACTGTACTTGTGCTCCAGCAGTCAATC +>605|TRBV26 ENSMUST00000193064|TRBV26|5'UTR|TR|TRB|None|00 +TTTCGTACTTCTAAGCCACC +>606|TRBV26 ENSMUST00000193064|TRBV26|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCTACAAGGCTCCTCTGTTACACAGTACTTTGTCTCCTGGGTGCAAGAATTTTGAATTCAAAAGTCATTCAGACTCCAAGATATCTGGTGAAAGGGCAAGGACAAAAAGCAAAGATGAGGTGTATCCCTGAAAAGGGACATCCAGTTGTATTCTGGTATCAACAAAATAAGAACAATGAGTTTAAATTTTTGATTAACTTTCAGAATCAAGAAGTTCTTCAGCAAATAGACATGACTGAAAAACGATTCTCTGCTGAGTGTCCTTCAAACTCACCTTGCAGCCTAGAAATTCAGTCCTCTGAGGCAGGAGACTCAGCACTGTACCTCTGTGCCAGCAGTCTGTC +>607|TRBV29 ENSMUST00000103281|TRBV29|5'UTR|TR|TRB|None|00 +AAAACCACC +>608|TRBV29 ENSMUST00000103281|TRBV29|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAGTTAGGCTCATCTCTGCTGTGGTGCTGTGTTTCCTAGGAACAGGCCTTGTGGACATGAAAGTAACCCAGATGCCAAGATACCTGATCAAAAGAATGGGAGAGAATGTTTTGCTGGAATGTGGACAGGACATGAGCCATGAAACAATGTACTGGTATCGACAAGACCCTGGTCTGGGGCTACAGCTGATTTATATCTCATACGATGTTGATAGTAACAGCGAAGGAGACATCCCTAAAGGATACAGGGTCTCACGGAAGAAGCGGGAGCATTTCTCCCTGATTCTGGATTCTGCTAAAACAAACCAGACATCTGTGTACTTCTGTGCTAGCAGTTTATC +>609|TRBV3 ENSMUST00000103264|TRBV3|5'UTR|TR|TRB|None|00 +GTCAGACCTTGCCTATGGGACCATAGGATGCTAGCATACCCCTCCTGTTTCTGATGTGCAGTCAGTCAAGCTAGGAGAAACTACATTCCTGCCGTGACCCTACT +>610|TRBV3 ENSMUST00000103264|TRBV3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTTCTAGGTTGGATAATTTTTAGTTTCTTGGAAGCAGGACACACAGGACCCAAAGTCTTACAGATCCCAAGTCATCAAATAATAGATATGGGGCAGATGGTGACCCTCAATTGTGACCCAGTTTCTAATCACCTATATTTTTATTGGTATAAACAGATTTTAGGACAGCAGATGGAGTTTCTGGTTAATTTCTACAATGGTAAAGTCATGGAGAAGTCTAAACTGTTTAAGGATCAGTTTTCAGTTGAAAGACCAGATGGTTCATATTTCACTCTGAAAATCCAACCCACAGCACTGGAGGACTCAGCTGTGTACTTCTGTGCCAGCAGCTTAGCCACA +>611|TRBV30 ENSMUST00000191646|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGACATTCCTGCTACTTCTTTGGAGCCAAGGTTCTGTATTCAGTGTCCTCCTCTACCAAAAGCCAAACAGGGACATCTGTCAAAGTGGCACTTCACTGAAAATCCAGTGTGTGGCTGACAGTCAAGTTGTTTCGATGTTTTGGTACCAACAGTTCCAGGAACAGAGCTTGATGCTCATGGCAACTGCAAATGAAGGCTCTGAAGCCACATACGAGAGTGGATTCACCAAGGACAAGTTTCCAATCAGCCGGCCAAACCTAACATTCTCAACGTTGACAGTGAACAATGCAAGGCCTGGAGACAGCAGTATCTATTTCTGTAGTTCTAGAGA +>612|TRBV31 ENSMUST00000193003|TRBV31|5'UTR|TR|TRB|None|00 +GGAGGGGCCTGTGCATCTCTGGCTTAGAAAAGGAAGTACAAGTGCAGAGTAGACAAGCCTAGACAAAGACCATCTTGAACT +>613|TRBV31 ENSMUST00000193003|TRBV31|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGTACTCTCTCCTTGCCTTTCTCCTGGGCATGTTCTTGGGTGTTAGTGCTCAGACTATCCATCAATGGCCAGTTGCCGAGATCAAGGCTGTGGGCAGCCCACTGTCTCTGGGGTGTACCATAAAGGGGAAATCAAGCCCTAACCTCTACTGGTACTGGCAGGCCACAGGAGGCACCCTCCAGCAACTCTTCTACTCTATTACTGTTGGCCAGGTAGAGTCGGTGGTGCAACTGAACCTCTCAGCTTCCAGGCCGAAGGACGACCAATTCATCCTAAGCACGGAGAAGCTGCTTCTCAGCCACTCTGGCTTCTACCTCTGTGCCTGGAGTCT +>614|TRBV5 ENSMUST00000103266|TRBV5|5'UTR|TR|TRB|None|00 +AATACCCGTCTGGAGCCTGATTCCACC +>615|TRBV5 ENSMUST00000103266|TRBV5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCTGCAGGCTTCTCCTCTATGTTTCCCTATGTCTTGTGGAAACAGCACTCATGAACACTAAAATTACTCAGTCACCAAGATATCTAATCCTGGGAAGAGCAAATAAGTCTTTGGAATGTGAGCAACATCTGGGACATAATGCTATGTACTGGTATAAACAGAGCGCTGAGAAGCCGCCAGAGCTCATGTTTCTCTACAATCTTAAACAGTTGATTCGAAATGAGACGGTGCCCAGTCGTTTTATACCTGAATGCCCAGACAGCTCCAAGCTACTTTTACATATATCTGCCGTGGATCCAGAAGACTCAGCTGTCTATTTTTGTGCCAGCAGCCAAGA +>616|TRDC ENSMUST00000196323|TRDC|C-REGION|TR|TRD|None|00 +AAAGCCAGCCTCCGGCCAAACCATCTGTTTTCATCATGAAAAATGGAACAAATGTTGCTTGTCTGGTGAAAGATTTCTACCCTAAAGAGGTGACTATAAGTCTCAGATCATCCAAGAAGATTGTGGAATTCGACCCTGCTATAGTCATCTCCCCCAGCGGGAAGTACAGTGCTGTCAAGCTTGGTCAGTATGGAGATTCGAATTCAGTGACATGTTCAGTTCAGCACAACAGTGAAACTGTGCACTCGACTGACTTTGAACCATATGCAAATTCTTTCAATAATGAAAAACTACCAGAACCTGAAAATGACACACAAATTTCAGAGCCTTGCTATGGCCCAAGAGTCACAGTTCACACTGAGAAGGTAAACATGATGTCCCTCACGGTGCTGGGCCTACGACTGCTGTTTGCCAAGACCATTGCCATCAATTTTCTCTTGACTGTTAAGTTATTCTTT +>617|TRDD1 ENSMUST00000196221|TRDD1|D-REGION|TR|TRD|None|00 +ATGGCATAT +>618|TRDD2 ENSMUST00000177564|TRDD2|D-REGION|TR|TRD|None|00 +ATCGGAGGGATACGAG +>619|TRDJ1 ENSMUST00000103682|TRDJ1|J-REGION|TR|TRD|None|00 +CTACCGACAAACTCGTCTTTGGACAAGGAACCCAAGTGACTGTGGAACCAA +>620|TRDJ2 ENSMUST00000103683|TRDJ2|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTTGGAACTGGCATAGAGCTCTTTGTGGAGCCCC +>621|TRDV1 ENSMUST00000103676|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGGGATGCGCCTTCAAGTGCTTGCTTGGCTATTGACATTTCAGGCTGCCTGGGTCAACACCCAAATGTTGCATCAGAGTCCTCAGTCTCTGACAATCCAAGAAGGAGATGAAGTCACCATGAGCTGCAATTTATCAACATCTTTATATGCCTTACTCTGGTATAGGCAGGGGGATGATGGCAGCCTCGTCTCCTTGGTGACATTACAGAAAGGAGGAGATGAGAAAAGTAAGGACAAAATAACCGCTAATCTGGATAAGAAAATGCAACAAAGTTCCCTGTGGATCCAAGCCTCCCAGCCCAGCCACTCAGGCACTTACCTCTGTGGAGGGAAAG +>622|TRDV2-1 ENSMUST00000197130|TRDV2-1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGCAGTCCTTAGCTCACTGTGGGCAGTTGTGATCACCACCTGTCTAGGAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAGTCGGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCACTCAGGGGGAGC +>623|TRDV2-2 ENSMUST00000103678|TRDV2-2|5'UTR|TR|TRD|None|00 +AGTGCTAGCGCAGCTGAGAGCAAGGACTGATCTGAAGCCGGCTTCTAGC +>624|TRDV2-2 ENSMUST00000103678|TRDV2-2|L-REGION+V-REGION|TR|TRD|None|00 +ATGGTACGGCCGTTCTTCCTGTGGGTGCTCTTCCTTTCCACTTCTCTTGAAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAATCAGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCTCTCATGGAGCGC +>625|TRDV4 ENSMUST00000103679|TRDV4|5'UTR|TR|TRD|None|00 +AGCAGATAAGGATTCTCACGGAGACAGAGACAGAGGTGAGGCTCAGCAGGGCAGCCCAGGAAAGCACCAGCCGATTACAAACTCATCCTCAGTGAAACT +>626|TRDV4 ENSMUST00000103679|TRDV4|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTTTGGAGATGTCCAGTCCTCTGCATATTCATCTTCAGTACAGGGACCTCTTTGGATGTATATTTGGAACCAGTTGCCAAAACTTTTACTGTTGTAGCTGGGGATCCTGCCTCCTTCTACTGCACTGTAACAGGAGGGGACATGAAGAATTATCATATGAGCTGGTATAAGAAGAATGGAACTAATGCTCTGTTTTTAGTATACAAGCTAAATAGCAATTCTACTGATGGTGGAAAGAGCAACCTCAAAGGGAAAATTAACATTTCAAAAAATCAGTTTATACTCGACATTCAGAAGGCAACAATGAAAGACGCTGGTACGTACTACTGTGGGTCAGATATC +>627|TRDV5 ENSMUST00000103685|TRDV5|5'UTR|TR|TRD|None|00 +CCCTCCTGTCCCCTCCCTAGACAAAGCAATAGGGATGGTTAAAGAGAGTCCAGCAGCCCTCCTCCACGCTGTGCCCCTGTACCGACTGGAAGG +>628|TRDV5 ENSMUST00000103685|TRDV5|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTGCCGCGACCCTTACCCTTCTGTTTGCCTACAAGGATGTGCTGTGCATCACGCTGACCCAGAGCTCCACTGACCAGACAGTGGCAAGCGGCACTGAAGTAACACTGCTCTGCACGTACAATGCGGATTCTCCAAACCCAGATTTATTTTGGTATCGCAAAAGGCCAGACAGATCCTTCCAGTTCATCCTTTATAGGGACGACACTAGTTCCCATGATGCAGATTTTGTTCAAGGTCGATTTTCTGTGAAGCACAGCAAGGCCAACAGAACCTTCCATCTGGTGATCTCTCCAGTGAGCCTTGAAGACAGCGCTACTTATTACTGTGCCTCGGGGTAT +>629|TRGJ1 ENSMUST00000200495|TRGJ1|J-REGION|TR|TRG|None|00 +ATAGCTCAGGTTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCCTCTG +>630|TRGJ2 ENSMUST00000197113|TRGJ2|J-REGION|TR|TRG|None|00 +ATAGCTCGGGCTTTCACAAGGTATTTGCAGAAGGAACAAAGCTCATAGTAATTCCCTCCG +>631|TRGJ3 ENSMUST00000103562|TRGJ3|J-REGION|TR|TRG|None|00 +ATAGTTGGGACTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCTTCTG +>632|TRGJ4 ENSMUST00000184430|TRGJ4|J-REGION|TR|TRG|None|00 +TCAGGCACATCATGGGTCAAGATATTTGCCAAAGGGACAAAGCTCGTAGTAATTCCCCCAG +>633|TRGV2 ENSMUST00000103563|TRGV2|5'UTR|TR|TRG|None|00 +AACAGATCATGACCAACCCTGGGGGAACCCACTGACTGCATTTTTCTGAGACTATAGCACAGTCCCACCCTCCAGCTGGTGACCTGAAATTCCAGCCTGCAGAGCACTTCCTGCCTCCCTGTGAAGCAGTCCAACCTTGGG +>634|TRGV2 ENSMUST00000103563|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGATGGTTCACCTCCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGAGACAGATGAGAATGTGCAAATATCCTGTATAGTTTATCTTCCATATTTCTCCAACACAGCTATACATTGGTACCGGCAAAAAACAAATCAACAGTTTGAGTATCTAATATATGTCGCAACAAACTACAATCAACGACCCTTAGGAGGGAAGCACAAAAAAATTGAAGCAAGTAAAGATTTTAAAAGTTCTACCTCAACCTTGGAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATGAG +>635|IGHV12-1 AJ851868.3|IGHV12-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGACTACTAGGGTTTCTCCTGTGCTTGGCAGCAGCTCTAAAAAGTGTTCTGTCCCAGATTCAGCTTAAGGAGTCTGGACCTGCTGTCATCAAGCCATCACAGTCACTGTCTCTCACCTGCATAGTCTCTGGATTCTCCATCACAAGTAGTAGTTATTGCTGGCACTGGATCCGCCAGCCCCCAGGAAAGGGGTTAGAGTGGATGGGGCGCATATGTTATGAAGGTTCAATATACTATAGTCCATCCATCAAAAGCCGCAGCACCATCTCCAGAGACACATCTCTGAACAAATTCTTTATCCAGCTGAGCTCTGTGACAAATGAGGACACAGCCATGTACTACTGTTCC +>636|IGHV1-unknown1 LVXK01034187.1|IGHV1-unknown1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGGTCGTTCTCTTCCTCCTGTCATTAACTGCAGGTGTCTATGCCCAGGGTCAGATGCAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGACTTCTGGCTTCACCTTCAGCAGTAGCTATATAAGTTGGTTGAAGCAAAAGCCTGGACAGAGTCTTGAGTGGATTGCATGGATTTATGCTGGAACTGGTGGTACTAGCTATAATCAGAAGTTCACAGGCAAGGCCCAACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAATTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>637|TRAV4-4-DV10 GRCm38-release94|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGGGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGATTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGAGTGTGCAGTGGTTCCGACAGAATTCCAGGGGCAGCCTCATCAGTTTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>638|TRAV13-1 GRCm38-release94|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAATGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGAGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>639|TRBV12-2+TRBV13-2 GRCm38-release94|TRBV12-2+TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>640|TRAV16N GRCm38-release94|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>641|TRAV6N-5 GRCm38-release94|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>642|TRAV13N-4 GRCm38-release94|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGTGCTTCTCAATTAGGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>643|TRBV13-2 GRCm38-release94|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAGTTTTGTCTTTCTTTTTATAGAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>644|IGHG3 GRCm38-release94|IGHG3|C-REGION|IG|IGH|G3|00 +AGCTGGAACTGAATGGGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTGTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>645|IGHG2B GRCm38-release94|IGHG2B|C-REGION|IG|IGH|G2B|00 +GCCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCCGTGACCTCTGGGTGCCTGGTCAAGGGGTACTTCCCTGAGCCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGCACCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTGAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACACTTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTTCTTGACTCTGACGGTTCTTACTTCATATATAGCAAGCTCAATATGAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA diff --git a/lib/rust/vdj_ann_ref/vdj_refs_5.0/human/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_5.0/human/fasta/regions.fa new file mode 100644 index 0000000..9ec6891 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_5.0/human/fasta/regions.fa @@ -0,0 +1,1484 @@ +>1|IGHA1 ENST00000390547|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>2|IGHA1 ENST00000641837|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAACAGGGAGGGCCCCCAGTAC +>3|IGHA2 ENST00000390539|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGTAAACCCACCCACATCAATGTGTCTGTTGTCATGGCGGAGGCGGATGGCACCTGCTAC +>4|IGHA2 ENST00000497872|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGCTCTTGCTGTGTTGCAGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAAGAGGGAGGGCCCCCAGTAC +>5|IGHA2 ENST00000622473|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>6|IGHD ENST00000390556|IGHD|C-REGION|IG|IGH|D|00 +CACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTACCTGGCCATGACCCCCCTGATCCCTCAGAGCAAGGATGAGAACAGCGATGACTACACGACCTTTGATGATGTGGGCAGCCTGTGGACCACCCTGTCCACGTTTGTGGCCCTCTTCATCCTCACCCTCCTCTACAGCGGCATTGTCACTTTCATCAAGGTGAAG +>7|IGHD1-1 ENST00000454908|IGHD1-1|D-REGION|IG|IGH|None|00 +GGTACAACTGGAACGAC +>8|IGHD1-14 ENST00000451044|IGHD1-14|D-REGION|IG|IGH|None|00 +GGTATAACCGGAACCAC +>9|IGHD1-20 ENST00000450276|IGHD1-20|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACGAC +>10|IGHD1-26 ENST00000390567|IGHD1-26|D-REGION|IG|IGH|None|00 +GGTATAGTGGGAGCTACTAC +>11|IGHD1-7 ENST00000430425|IGHD1-7|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACTAC +>12|IGHD1/OR15-1A ENST00000605284|IGHD1/OR15-1A|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACAAC +>13|IGHD2-15 ENST00000390578|IGHD2-15|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTGGTGGTAGCTGCTACTCC +>14|IGHD2-2 ENST00000390591|IGHD2-2|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTAGTACCAGCTGCTATGCC +>15|IGHD2-21 ENST00000390572|IGHD2-21|D-REGION|IG|IGH|None|00 +AGCATATTGTGGTGGTGACTGCTATTCC +>16|IGHD2-8 ENST00000390585|IGHD2-8|D-REGION|IG|IGH|None|00 +AGGATATTGTACTAATGGTGTATGCTATACC +>17|IGHD2/OR15-2A ENST00000603077|IGHD2/OR15-2A|D-REGION|IG|IGH|None|00 +AGAATATTGTAATAGTACTACTTTCTATGCC +>18|IGHD3-10 ENST00000390583|IGHD3-10|D-REGION|IG|IGH|None|00 +GTATTACTATGGTTCGGGGAGTTATTA +>19|IGHD3-16 ENST00000390577|IGHD3-16|D-REGION|IG|IGH|None|00 +GTATTATGATTACGTTTGGGGGAGTTATCGTTATACC +>20|IGHD3-22 ENST00000390571|IGHD3-22|D-REGION|IG|IGH|None|00 +GTATTACTATGATAGTAGTGGTTATTACTAC +>21|IGHD3-3 ENST00000390590|IGHD3-3|D-REGION|IG|IGH|None|00 +GTATTACGATTTTTGGAGTGGTTATTATACC +>22|IGHD3-9 ENST00000390584|IGHD3-9|D-REGION|IG|IGH|None|00 +GTATTACGATATTTTGACTGGTTATTA +>23|IGHD3/OR15-3A ENST00000604950|IGHD3/OR15-3A|D-REGION|IG|IGH|None|00 +GTATTATGATTTTTGGACTGGTTATTATACC +>24|IGHD4-11 ENST00000431440|IGHD4-11|D-REGION|IG|IGH|None|00 +TGACTACAGTAACTAC +>25|IGHD4-17 ENST00000431870|IGHD4-17|D-REGION|IG|IGH|None|00 +TGACTACGGTGACTAC +>26|IGHD4-23 ENST00000437320|IGHD4-23|D-REGION|IG|IGH|None|00 +TGACTACGGTGGTAACTCC +>27|IGHD4/OR15-4A ENST00000603326|IGHD4/OR15-4A|D-REGION|IG|IGH|None|00 +TGACTATGGTGCTAACTAC +>28|IGHD5-12 ENST00000390581|IGHD5-12|D-REGION|IG|IGH|None|00 +GTGGATATAGTGGCTACGATTAC +>29|IGHD5-18 ENST00000390575|IGHD5-18|D-REGION|IG|IGH|None|00 +GTGGATACAGCTATGGTTAC +>30|IGHD5-24 ENST00000390569|IGHD5-24|D-REGION|IG|IGH|None|00 +GTAGAGATGGCTACAATTAC +>31|IGHD5/OR15-5A ENST00000604642|IGHD5/OR15-5A|D-REGION|IG|IGH|None|00 +GTGGATATAGTGTCTACGATTAC +>32|IGHD6-13 ENST00000390580|IGHD6-13|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCAGCTGGTAC +>33|IGHD6-19 ENST00000390574|IGHD6-19|D-REGION|IG|IGH|None|00 +GGGTATAGCAGTGGCTGGTAC +>34|IGHD6-25 ENST00000452198|IGHD6-25|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCGGCTAC +>35|IGHD6-6 ENST00000454691|IGHD6-6|D-REGION|IG|IGH|None|00 +GAGTATAGCAGCTCGTCC +>36|IGHD7-27 ENST00000439842|IGHD7-27|D-REGION|IG|IGH|None|00 +CTAACTGGGGA +>37|IGHE ENST00000390541|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>38|IGHE ENST00000641420|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGAGCTGGACGTGTGCGTGGAGGAGGCCGAGGGCGAGGCGCCGTGGACGTGGACCGGCCTCTGCATCTTCGCCGCACTCTTCCTGCTCAGCGTGAGCTACAGCGCCGCCATCACGCTCCTCATGGTGCAGCGGTTCCTCTCAGCCACGCGGCAGGGGAGGCCCCAGACCTCCCTCGACTACACCAACGTCCTCCAGCCCCACGCC +>39|IGHE ENST00000610670|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCGAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>40|IGHG1 ENST00000390542|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>41|IGHG1 ENST00000390548|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTACAGGAACATGATCGGACAGGGGGCC +>42|IGHG1 ENST00000390549|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>43|IGHG2 ENST00000390545|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>44|IGHG2 ENST00000641095|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACCACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCATCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATCAGGCAGGGGGCC +>45|IGHG3 ENST00000390551|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>46|IGHG3 ENST00000641136|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTATAGGAACATGATTGGGCAGGGGGCC +>47|IGHG4 ENST00000390543|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGGTAAA +>48|IGHG4 ENST00000641978|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATAAGGCAGGGGGCC +>49|IGHJ1 ENST00000390565|IGHJ1|J-REGION|IG|IGH|None|00 +GCTGAATACTTCCAGCACTGGGGCCAGGGCACCCTGGTCACCGTCTCCTCAG +>50|IGHJ2 ENST00000390564|IGHJ2|J-REGION|IG|IGH|None|00 +TACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>51|IGHJ2 ENST00000632178|IGHJ2|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>52|IGHJ3 ENST00000463911|IGHJ3|J-REGION|IG|IGH|None|00 +GATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>53|IGHJ3 ENST00000633896|IGHJ3|J-REGION|IG|IGH|None|00 +TGATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>54|IGHJ4 ENST00000461719|IGHJ4|J-REGION|IG|IGH|None|00 +TACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>55|IGHJ4 ENST00000631521|IGHJ4|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>56|IGHJ5 ENST00000488476|IGHJ5|J-REGION|IG|IGH|None|00 +AACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>57|IGHJ5 ENST00000633501|IGHJ5|J-REGION|IG|IGH|None|00 +ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>58|IGHJ6 ENST00000390560|IGHJ6|J-REGION|IG|IGH|None|00 +TACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>59|IGHJ6 ENST00000631705|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>60|IGHM ENST00000390559|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTAC +>61|IGHM ENST00000637539|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGAGGGGGAGGTGAGCGCCGACGAGGAGGGCTTTGAGAACCTGTGGGCCACCGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGTACCACCGTCACCTTGTTCAAGGTGAAA +>62|IGHV1-18 ENST00000390605|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>63|IGHV1-18 ENST00000390605|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGA +>64|IGHV1-18 ENST00000633147|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>65|IGHV1-18 ENST00000633147|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>66|IGHV1-2 ENST00000390594|IGHV1-2|5'UTR|IG|IGH|None|00 +GAGAGCATCACCCAGCAACCACATCTGTCCTCTAGAGAATCCCCTGAGAGCTCCGTTCCTCACC +>67|IGHV1-2 ENST00000390594|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCCACAGGAGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCGGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCTGGGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACATGGAGCTGAGCAGGCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>68|IGHV1-24 ENST00000390610|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>69|IGHV1-24 ENST00000390610|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACA +>70|IGHV1-24 ENST00000633490|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>71|IGHV1-24 ENST00000633490|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>72|IGHV1-3 ENST00000390595|IGHV1-3|5'UTR|IG|IGH|None|00 +CCACATCCCTCCTCAGAAGCCCCCAGAGCACAACGCCTCACC +>73|IGHV1-3 ENST00000390595|IGHV1-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTTTTGGTGGCAGCAGCCACAGGTGCCCACTCCCAGGTCCAGCTTGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGCATTGGGTGCGCCAGGCCCCCGGACAAAGGCTTGAGTGGATGGGATGGATCAACGCTGGCAATGGTAACACAAAATATTCACAGAAGTTCCAGGGCAGAGTCACCATTACCAGGGACACATCCGCGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAAGACACGGCTGTGTATTACTGTGCGAGAGA +>74|IGHV1-45 ENST00000390621|IGHV1-45|5'UTR|IG|IGH|None|00 +ATCACCCAACAACCACATCCCTCCTCTAGAGAATCCCCTGAAAGCACAGCTCCTCACC +>75|IGHV1-45 ENST00000390621|IGHV1-45|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGAATCCTCTTCTTGGTGGCAGCAGTCACAGATGCCTACTCCCAGATGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGACTGGGTCCTCAGTGAAGGTTTCCTGCAAGGCTTCCGGATACACCTTCACCTACCGCTACCTGCACTGGGTGCGACAGGCCCCCGGACAAGCGCTTGAGTGGATGGGATGGATCACACCTTTCAATGGTAACACCAACTACGCACAGAAATTCCAGGACAGAGTCACCATTACCAGGGACAGGTCTATGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACAGCCATGTATTACTGTGCAAGATA +>76|IGHV1-46 ENST00000390622|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>77|IGHV1-46 ENST00000390622|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>78|IGHV1-46 ENST00000632105|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>79|IGHV1-46 ENST00000632105|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>80|IGHV1-58 ENST00000390628|IGHV1-58|5'UTR|IG|IGH|None|00 +AGCATCATCCAGAAACCACATCCCTCCGCTAGAGAAGCCCCTGACGGCACAGTTCCTCACT +>81|IGHV1-58 ENST00000390628|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGAGGATCCTCTTCTTGGTGGGAGCAGCGACAGGTGCCCACTCCCAAATGCAGCTGGTGCAGTCTGGGCCTGAGGTGAAGAAGCCTGGGACCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATTCACCTTTACTAGCTCTGCTGTGCAGTGGGTGCGACAGGCTCGTGGACAACGCCTTGAGTGGATAGGATGGATCGTCGTTGGCAGTGGTAACACAAACTACGCACAGAAGTTCCAGGAAAGAGTCACCATTACCAGGGACATGTCCACAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCCGAGGACACGGCCGTGTATTACTGTGCGGCAGA +>82|IGHV1-69 ENST00000390633|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>83|IGHV1-69 ENST00000390633|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>84|IGHV1-69 ENST00000632882|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>85|IGHV1-69 ENST00000632882|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>86|IGHV1-69-2 ENST00000615784|IGHV1-69-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCCTCTTGGTGGCAGCAGCTACAGGCACCCACGCCGAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCTACAGTGAAAATCTCCTGCAAGGTTTCTGGATACACCTTCACCGACTACTACATGCACTGGGTGCAACAGGCCCCTGGAAAAGGGCTTGAGTGGATGGGACTTGTTGATCCTGAAGATGGTGAAACAATATACGCAGAGAAGTTCCAGGGCAGAGTCACCATAACCGCGGACACGTCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>87|IGHV1-69D ENST00000624687|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>88|IGHV1-69D ENST00000624687|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>89|IGHV1-69D ENST00000633446|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCAGATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>90|IGHV1-69D ENST00000633446|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTCCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>91|IGHV1/OR15-1 ENST00000604066|IGHV1/OR15-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACATCTTCACCGACTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGAGCTTGGGTGGATGGGACGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCAGAGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACACGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCACGTATTACTGTGCGAGAGA +>92|IGHV1/OR21-1 ENST00000622028|IGHV1/OR21-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGAATTGGAGGATCCTGTTTTTGGTGGTCATAGCTGCGGGTGCCCAGTCCCAGGTACAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCATCACCAGCTACTGTATGCACTGGGTGCACCAGGTCCATGCACAAGGGCTTGAGTGGATGGGATTGGTGTGCCCTAGTGATGGCAGCACAAGCTATGCACAGAAGTTCCAGGCCAGAGTCACCATAACCAGGGACACATCCATGAGCACAGCCTACATGGAGCTAAGCAGTCTGAGATCTGAGGACACGGCCATGTATTACTGTGTGAGAGA +>93|IGHV2-26 ENST00000390611|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>94|IGHV2-26 ENST00000390611|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATA +>95|IGHV2-26 ENST00000632457|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>96|IGHV2-26 ENST00000632457|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATAC +>97|IGHV2-5 ENST00000390597|IGHV2-5|5'UTR|IG|IGH|None|00 +AGTGACTCCTGTGCCCCACC +>98|IGHV2-5 ENST00000390597|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTCCACGCTCCTGCTGCTGACCATCCCTTCATGGGTCTTGTCCCAGATCACCTTGAAGGAGTCTGGTCCTACGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAGTGGGTGTGGGCTGGATCCGTCAGCCCCCAGGAAAGGCCCTGGAGTGGCTTGCACTCATTTATTGGGATGATGATAAGCGCTACAGCCCATCTCTGAAGAGCAGGCTCACCATCACCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACACAGAC +>99|IGHV2-70 ENST00000617374|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAGGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGTGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACTCATTGATTGGGATGATGATAAATACTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>100|IGHV2-70 ENST00000632173|IGHV2-70|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCCCCACC +>101|IGHV2-70 ENST00000632173|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATGCTTTGTTCCATGCTCCTGCTACTGACTGTCCCGTCTTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTACTGGAATGCGTGTGAGCTGGATCCGTCGGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATACTGCAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>102|IGHV2-70D ENST00000390634|IGHV2-70D|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCTCCACC +>103|IGHV2-70D ENST00000390634|IGHV2-70D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGCGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATTCTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>104|IGHV2/OR16-5 ENST00000567458|IGHV2/OR16-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACGTTTTGCTCCACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACTCTCTCTGGGTTCTCACTCAGCACTTCTGGAATGGGTATGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCTCACATTTTTTTGAATGACAAAAAATCCTACAGCACGTCTCTGAAGAACAGGCTCATCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCATGGAGAG +>105|IGHV3-11 ENST00000390601|IGHV3-11|5'UTR|IG|IGH|None|00 +CTCCCTCTGCTGATAAAAACCAGCCGAGCCCAGACCCTGCAGCTCTGGGAGAAGAGCCCCAGCCCCAGAATTCCCAGGAGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>106|IGHV3-11 ENST00000390601|IGHV3-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTATAAAAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCAAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTAGTAGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>107|IGHV3-13 ENST00000390602|IGHV3-13|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTGTATTCAGTGATCAGGACTGAACACACAGGACTCACC +>108|IGHV3-13 ENST00000390602|IGHV3-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATATTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACGACATGCACTGGGTCCGCCAAGCTACAGGAAAAGGTCTGGAGTGGGTCTCAGCTATTGGTACTGCTGGTGACCCATACTATCCAGGCTCCGTGAAGGGCCGATTCACCATCTCCAGAGAAAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGGGGACACGGCTGTGTATTACTGTGCAAGAGA +>109|IGHV3-15 ENST00000390603|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>110|IGHV3-15 ENST00000390603|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACA +>111|IGHV3-15 ENST00000632959|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>112|IGHV3-15 ENST00000632959|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACAGA +>113|IGHV3-16 ENST00000390604|IGHV3-16|5'UTR|IG|IGH|None|00 +AGCCCTGGGAGAGAAGCCCCAGCCCTGGGATTCTCAGGTGTTTCTATTGGGTCAACAGCAATAAACAAATTACC +>114|IGHV3-16 ENST00000390604|IGHV3-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGCCCGCAAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGTGGACTCCGTGAAGCGCCGATTCATCATCTCCAGAGACAATTCCAGGAACTCCCTGTATCTGCAAAAGAACAGACGGAGAGCCGAGGACATGGCTGTGTATTACTGTGTGAGA +>115|IGHV3-20 ENST00000390606|IGHV3-20|5'UTR|IG|IGH|None|00 +CCAGCCCTGAGATTCCCACGTGTTTCCATTCAGTGATCAGCACTGAACACAGAGGACTCGCC +>116|IGHV3-20 ENST00000390606|IGHV3-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGTGTGGTACGGCCTGGGGGGTCCCTGAGACTCTCCTTTGCAGCCTCTGGATTCACCTTTGATGATTATGGCATGAGCTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGAGTGGGTCTCTGGTATTAATTGGAATGGTGGTAGCACAGGTTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCCTTGTATCACTGTGCGAGAGA +>117|IGHV3-21 ENST00000390607|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>118|IGHV3-21 ENST00000390607|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>119|IGHV3-21 ENST00000632980|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>120|IGHV3-21 ENST00000632980|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>121|IGHV3-23 ENST00000390609|IGHV3-23|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCCAGCCCTGGGATTTTCAGGTGTTTTCATTTGGTGATCAGGACTGAACAGAGAGAACTCACC +>122|IGHV3-23 ENST00000390609|IGHV3-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGCTTTTTCTTGTGGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGCAGCTATGCCATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGCTATTAGTGGTAGTGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGGTTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTATATTACTGTGCGAAAGA +>123|IGHV3-30 ENST00000603660|IGHV3-30|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>124|IGHV3-30 ENST00000603660|IGHV3-30|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAAA +>125|IGHV3-33 ENST00000390615|IGHV3-33|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>126|IGHV3-33 ENST00000390615|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCGTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATGGTATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>127|IGHV3-33 ENST00000631807|IGHV3-33|5'UTR|IG|IGH|None|00 +CGAGCCCAGCACTGGAAGTCGCCGGTGTTTCCATTCGGTGATCATCACTGAACACAGAGGACTCACC +>128|IGHV3-33 ENST00000631807|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGCAATAAATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>129|IGHV3-35 ENST00000390617|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>130|IGHV3-35 ENST00000390617|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGA +>131|IGHV3-35 ENST00000632225|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>132|IGHV3-35 ENST00000632225|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGAAA +>133|IGHV3-38 ENST00000390618|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>134|IGHV3-38 ENST00000390618|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATAT +>135|IGHV3-38 ENST00000631785|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>136|IGHV3-38 ENST00000631785|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATATA +>137|IGHV3-43 ENST00000434710|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>138|IGHV3-43 ENST00000434710|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGAT +>139|IGHV3-43 ENST00000633040|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>140|IGHV3-43 ENST00000633040|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGATA +>141|IGHV3-48 ENST00000390624|IGHV3-48|5'UTR|IG|IGH|None|00 +AGCTCTCAGAGAGGTGCCTTAGCCCTGGATTCCAAGGCATTTCCACTTGGTGATCAGCACTGAACACAGAGGACTCACC +>142|IGHV3-48 ENST00000390624|IGHV3-48|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGTGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGTTATGAAATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTGGTAGTACCATATACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTTTATTACTGTGCGAGAGA +>143|IGHV3-49 ENST00000390625|IGHV3-49|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCGTGAGATTCCCAGGAGTTTCCACTTGGTGATCAGCACTGAACACAGACCACCAACC +>144|IGHV3-49 ENST00000390625|IGHV3-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTTAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAATGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCAGGGCGGTCCCTGAGACTCTCCTGTACAGCTTCTGGATTCACCTTTGGTGATTATGCTATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTAGGTTTCATTAGAAGCAAAGCTTATGGTGGGACAACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGCATCGCCTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACTAGAGA +>145|IGHV3-53 ENST00000390627|IGHV3-53|5'UTR|IG|IGH|None|00 +AATACCAATCTCCCCCAGGACACTTCATCTGCACGGAGCCCGGCCTCTCCTCAGATGTCCCACCCCAGAGCTTGCTATATAGTCGGGGACATGCAAATAGGGCCCTCCCTCTGCTGATGAAAACCAGCCCAGCTGACCCTGCAGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>146|IGHV3-53 ENST00000390627|IGHV3-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTTGGCTGAGCTGGGTTTTCCTTGTTGCTATTTCAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGACTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>147|IGHV3-64 ENST00000454421|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>148|IGHV3-64 ENST00000454421|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGA +>149|IGHV3-64 ENST00000631710|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>150|IGHV3-64 ENST00000631710|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGAGA +>151|IGHV3-64D ENST00000632099|IGHV3-64D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTCTGGCTGAGCTGGGTTCTCCTTGTTGCCATTTTAAAAGATGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTTCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATACTACGCAGACTCCGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAGCAGTCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGAAAGA +>152|IGHV3-66 ENST00000390632|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>153|IGHV3-66 ENST00000390632|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGA +>154|IGHV3-66 ENST00000632846|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>155|IGHV3-66 ENST00000632846|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>156|IGHV3-7 ENST00000390598|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>157|IGHV3-7 ENST00000390598|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGA +>158|IGHV3-7 ENST00000633988|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>159|IGHV3-7 ENST00000633988|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>160|IGHV3-72 ENST00000433072|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>161|IGHV3-72 ENST00000433072|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGA +>162|IGHV3-72 ENST00000633602|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>163|IGHV3-72 ENST00000633602|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGAGA +>164|IGHV3-73 ENST00000390636|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>165|IGHV3-73 ENST00000390636|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGA +>166|IGHV3-73 ENST00000631708|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>167|IGHV3-73 ENST00000631708|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGACA +>168|IGHV3-74 ENST00000424969|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>169|IGHV3-74 ENST00000424969|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>170|IGHV3-74 ENST00000633987|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>171|IGHV3-74 ENST00000633987|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>172|IGHV3/OR15-7 ENST00000558565|IGHV3/OR15-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGTTCTCTGAGACTCTCATGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGAGCTGGGTCCGCCAGGCTCAAGGGAAAGGGCTAGAGTTGGTAGGTTTAATAAGAAACAAAGCTAACAGTTACACGACAGAATATGCTGCGTCTGTGAAAGGCAGACTTACCATCTCAAGAGAGGATTCAAAGAACACGCTGTATCTGCAAATGAGCAACCTGAAAACCGAGGACTTGGCCGTGTATTACTGTGCTAGAGA +>173|IGHV3/OR16-10 ENST00000425181|IGHV3/OR16-10|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGCTATATTAAAAGGTGTCCAGTGTGAGGTTCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACATCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGGCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTTCGCCAGGCTCCAGGAAAAGGTCTGGAGTGGGTATCAGCTATTGGTACTGGTGGTGGCACATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACATGGCTGTGTATTACTGTGCAAGAGA +>174|IGHV3/OR16-12 ENST00000570121|IGHV3/OR16-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGAGCTCAGCTGGGTTTTCCTTGTTGCTATTTTACAAGGTGTCCACTGTGAGGTGCAGCTGGTAGAGTCTGGGAGAGGCTTGGCCCAGCCTGGGGGGTACCTAAAACTCTCCGGTGCAGCCTCTGGATTCACCGTCGGTAGCTGGTACATGAGCTGGATCCACCAGGCTCCAGGGAAGGGTCTGGAGTGGGTCTCATACATTAGTAGTAGTGGTTGTAGCACAAACTACGCAGACTCTGTGAAGGGCAGATTCACCATCTCCACAGACAACTCAAAGAACACGCTCTACCTGCAAATGAACAGCCTGAGAGTGGAGGACACGGCCGTGTATTACTGTGCAAGAGA +>175|IGHV3/OR16-13 ENST00000562905|IGHV3/OR16-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCAGACTCCATGAAGGGCCAATTCACCATCTCCAGAGACAATGCTAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACATGGCTGTGTATTACTGTACTAGAGA +>176|IGHV3/OR16-8 ENST00000565407|IGHV3/OR16-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAACTGGGTTTTCCTTGTTGCTATTATAAAAGGTGCCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTGTCCTGTCCAGCCTCTGGATTCACCTTCAGTAACCACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACATTAGTGGTGATAGTGGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGGGACAACGCCAATAACTCACCGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGA +>177|IGHV4-28 ENST00000390612|IGHV4-28|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCTGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>178|IGHV4-28 ENST00000390612|IGHV4-28|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTACAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGACACCCTGTCCCTCACCTGCGCTGTCTCTGGTTACTCCATCAGCAGTAGTAACTGGTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTACATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATGTCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGTGGACACGGCCGTGTATTACTGTGCGAGAAA +>179|IGHV4-30-2 ENST00000632151|IGHV4-30-2|5'UTR|IG|IGH|None|00 +ACTTTCTGAGAGTCCTGGACCTCCTGCACAAGAAC +>180|IGHV4-30-2 ENST00000632151|IGHV4-30-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>181|IGHV4-31 ENST00000438142|IGHV4-31|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>182|IGHV4-31 ENST00000438142|IGHV4-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>183|IGHV4-34 ENST00000390616|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>184|IGHV4-34 ENST00000390616|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGA +>185|IGHV4-34 ENST00000612474|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>186|IGHV4-34 ENST00000612474|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGAGG +>187|IGHV4-39 ENST00000390619|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>188|IGHV4-39 ENST00000390619|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGA +>189|IGHV4-39 ENST00000633618|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>190|IGHV4-39 ENST00000633618|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGACA +>191|IGHV4-4 ENST00000455737|IGHV4-4|5'UTR|IG|IGH|None|00 +AAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCATGGACCTCCTGCACAAGAAC +>192|IGHV4-4 ENST00000455737|IGHV4-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCTCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGGGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGTTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>193|IGHV4-59 ENST00000390629|IGHV4-59|5'UTR|IG|IGH|None|00 +TTTTCACCTCTCCATACAAAGGCACCACCCACATGCAAATCCTCACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>194|IGHV4-59 ENST00000390629|IGHV4-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACATCTGTGGTTCTTCCTTCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>195|IGHV4-61 ENST00000390630|IGHV4-61|5'UTR|IG|IGH|None|00 +ACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>196|IGHV4-61 ENST00000390630|IGHV4-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCGTCAGCAGTGGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>197|IGHV4/OR15-8 ENST00000557788|IGHV4/OR15-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTTCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGTTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGCTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCCCCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACAGGGCCGTGTATTACTGTGCGAGAGA +>198|IGHV5-10-1 ENST00000632950|IGHV5-10-1|5'UTR|IG|IGH|None|00 +AGTCTCCTTCACCACCCAGCTGGGATCTCAGGGCTTCCTTTTCTGTCCTCCTCCAGG +>199|IGHV5-10-1 ENST00000632950|IGHV5-10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAAGTGCAGCTGGTGCAGTCCGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAGGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCAGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGAGGATTGATCCTAGTGACTCTTATACCAACTACAGCCCGTCCTTCCAAGGCCACGTCACCATCTCAGCTGACAAGTCCATCAGCACTGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>200|IGHV5-51 ENST00000390626|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>201|IGHV5-51 ENST00000390626|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGA +>202|IGHV5-51 ENST00000620764|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>203|IGHV5-51 ENST00000620764|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>204|IGHV6-1 ENST00000390593|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>205|IGHV6-1 ENST00000390593|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>206|IGHV6-1 ENST00000633299|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>207|IGHV6-1 ENST00000633299|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>208|IGHV7-4-1 ENST00000631943|IGHV7-4-1|5'UTR|IG|IGH|None|00 +ACAACCACACCCCTCCTAAGAAGAAGCCCCTAGACCACAGCTCCACACC +>209|IGHV7-4-1 ENST00000631943|IGHV7-4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAATCTGGGTCTGAGTTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGAATTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACACCAACACTGGGAACCCAACGTATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCTTGGACACCTCTGTCAGCACGGCATATCTGCAGATCTGCAGCCTAAAGGCTGAGGACACTGCCGTGTATTACTGTGCGAGAGA +>210|IGHV7-81 ENST00000390639|IGHV7-81|5'UTR|IG|IGH|None|00 +ACCCAACAACAACATCCCTCCTTGGGAGAATCCCCTAGAGCACAGCTCCTCACC +>211|IGHV7-81 ENST00000390639|IGHV7-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTCTTCTTGGTGGCAGCAGCAACAGGTACCTACTCCCAGGTGCAGCTGGTGCAGTCTGGCCATGAGGTGAAGCAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACAGTTTCACCACCTATGGTATGAATTGGGTGCCACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGTTCAACACCTACACTGGGAACCCAACATATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCATGGACACCTCTGCCAGCACAGCATACCTGCAGATCAGCAGCCTAAAGGCTGAGGACATGGCCATGTATTACTGTGCGAGA +>212|IGKC ENST00000390237|IGKC|C-REGION|IG|IGK|None|00 +GAACTGTGGCTGCACCATCTGTCTTCATCTTCCCGCCATCTGATGAGCAGTTGAAATCTGGAACTGCCTCTGTTGTGTGCCTGCTGAATAACTTCTATCCCAGAGAGGCCAAAGTACAGTGGAAGGTGGATAACGCCCTCCAATCGGGTAACTCCCAGGAGAGTGTCACAGAGCAGGACAGCAAGGACAGCACCTACAGCCTCAGCAGCACCCTGACGCTGAGCAAAGCAGACTACGAGAAACACAAAGTCTACGCCTGCGAAGTCACCCATCAGGGCCTGAGCTCGCCCGTCACAAAGAGCTTCAACAGGGGAGAGTGT +>213|IGKJ1 ENST00000390242|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGCCAAGGGACCAAGGTGGAAATCAAAC +>214|IGKJ2 ENST00000390241|IGKJ2|J-REGION|IG|IGK|None|00 +TGTGCAGTTTTGGCCAGGGGACCAAGCTGGAGATCAAAC +>215|IGKJ3 ENST00000390240|IGKJ3|J-REGION|IG|IGK|None|00 +ATTCACTTTCGGCCCTGGGACCAAAGTGGATATCAAAC +>216|IGKJ4 ENST00000390239|IGKJ4|J-REGION|IG|IGK|None|00 +CTCACTTTCGGCGGAGGGACCAAGGTGGAGATCAAAC +>217|IGKJ5 ENST00000390238|IGKJ5|J-REGION|IG|IGK|None|00 +GATCACCTTCGGCCAAGGGACACGACTGGAGATTAAAC +>218|IGKV1-12 ENST00000480492|IGKV1-12|5'UTR|IG|IGK|None|00 +AGGCTGATCACACCCTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>219|IGKV1-12 ENST00000480492|IGKV1-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>220|IGKV1-16 ENST00000479981|IGKV1-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>221|IGKV1-16 ENST00000479981|IGKV1-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGAGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAAGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>222|IGKV1-17 ENST00000490686|IGKV1-17|5'UTR|IG|IGK|None|00 +AGGAATCAGTCCCACTCAGGACACAGC +>223|IGKV1-17 ENST00000490686|IGKV1-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGGTGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCGCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>224|IGKV1-27 ENST00000498435|IGKV1-27|5'UTR|IG|IGK|None|00 +GTGCAGAAGTCTCTCTCAGTCAGGACACAGC +>225|IGKV1-27 ENST00000498435|IGKV1-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGACTCCTGCTGCTCTGGCTCCCAGATACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTATCAGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAATCAGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCAAAAGTATAACAGTGCCCCT +>226|IGKV1-33 ENST00000473726|IGKV1-33|5'UTR|IG|IGK|None|00 +GTGCAGGAGTCAGTCCCAACCAGGACACAGC +>227|IGKV1-33 ENST00000473726|IGKV1-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>228|IGKV1-37 ENST00000465170|IGKV1-37|5'UTR|IG|IGK|None|00 +AGGCTGGTCACACCCCGTGCAGCAGTCAGTCCCAGTCAGGACACAGC +>229|IGKV1-37 ENST00000465170|IGKV1-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCT +>230|IGKV1-39 ENST00000498574|IGKV1-39|5'UTR|IG|IGK|None|00 +GGGCTGGTCGCACCCTGTGCAGGAGTCAGTCTCAGTCAGGACACAGC +>231|IGKV1-39 ENST00000498574|IGKV1-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCT +>232|IGKV1-5 ENST00000496168|IGKV1-5|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCCCTGAAGCCTTATTAATAGGCTGGTCACACTTTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>233|IGKV1-5 ENST00000496168|IGKV1-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAAATGTGACATCCAGATGACCCAGTCTCCTTCCACCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGAGTATTAGTAGCTGGTTGGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATAAGGCGTCTAGTTTAGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACCATCAGCAGCCTGCAGCCTGATGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTATTCT +>234|IGKV1-6 ENST00000464162|IGKV1-6|5'UTR|IG|IGK|None|00 +GCAGGAGTCAGACCCACTCAGGACACAGC +>235|IGKV1-6 ENST00000464162|IGKV1-6|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTTGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTACAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGCACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAAGATTACAATTACCCT +>236|IGKV1-8 ENST00000495489|IGKV1-8|5'UTR|IG|IGK|None|00 +AGGCTGGACACACTTCATGCAGGAGTCAGACCCTGTCAGGACACAGCATAGAC +>237|IGKV1-8 ENST00000495489|IGKV1-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATCCTCATTCTCTGCATCTACAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTACCCT +>238|IGKV1-9 ENST00000493819|IGKV1-9|5'UTR|IG|IGK|None|00 +AGACTTCTTAATAGGCTGGTCACACCTGTGCAGGAGTCAGTCCCAGTCAGGACACAGC +>239|IGKV1-9 ENST00000493819|IGKV1-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTTCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGCTTAATAGTTACCCT +>240|IGKV1/OR2-108 ENST00000453673|IGKV1/OR2-108|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCGAGGTGCCAGATGTGACATCCAGGTGACCCAGTCTCCATCTTCCCTGTCTGCGTCTGTAGGAGACAGAGTCACCATCACCTGCCGGGCAAGTCAGGGCATTAGCAATGGGTTATCCTGGTATCAGCAGAAACCAGGGCAAGCCCCTACGCTCCTGATCTATGCTGCATCCAGTTTGCAGTCGGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCTACAGGATTATACTACCCCATT +>241|IGKV1D-12 ENST00000377032|IGKV1D-12|5'UTR|IG|IGK|None|00 +AGACCCACTCAGGACACAGC +>242|IGKV1D-12 ENST00000377032|IGKV1D-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>243|IGKV1D-13 ENST00000611391|IGKV1D-13|5'UTR|IG|IGK|None|00 +GAGTCAGACCCACTCAGGACACAGC +>244|IGKV1D-13 ENST00000611391|IGKV1D-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTTCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGCAGTGCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGATGCCTCCAGTTTGGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTTTAATAGTTACCCT +>245|IGKV1D-16 ENST00000492446|IGKV1D-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>246|IGKV1D-16 ENST00000492446|IGKV1D-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGAGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>247|IGKV1D-17 ENST00000483379|IGKV1D-17|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGCTGCTGAGTTACTGAGATGAGCCAGCCCTGCAGCTGCGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCATAGCCTCCTGCCCTGAAGCCTTATTAATAGGCTGGACACACTTCATGGAGGAATCAGTCCCACTCAGGACACAGC +>248|IGKV1D-17 ENST00000483379|IGKV1D-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTAACATCCAGATGACCCAGTCTCCATCTGCCATGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGGCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGTCCCTAAGCACCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>249|IGKV1D-33 ENST00000390265|IGKV1D-33|5'UTR|IG|IGK|None|00 +ATGTTCGCAGAGCACAGCCCCCTGCCCTGAAGACTTATTAATAGGCTGGTCGCACCCTGTGCAGGAGTCAGTCCCAACCAGGACACAGC +>250|IGKV1D-33 ENST00000390265|IGKV1D-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>251|IGKV1D-37 ENST00000509129|IGKV1D-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCTCC +>252|IGKV1D-39 ENST00000448155|IGKV1D-39|5'UTR|IG|IGK|None|00 +GTCAGTCTCAGTCAGGACACAGC +>253|IGKV1D-39 ENST00000448155|IGKV1D-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCTCC +>254|IGKV1D-42 ENST00000390278|IGKV1D-42|5'UTR|IG|IGK|None|00 +AGTCCCAGTCAGGACACAGC +>255|IGKV1D-42 ENST00000390278|IGKV1D-42|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGTCAGATTTGACATCCAGATGACCCAGTCTCCATCTTTCCTGTCTGCATCTGTAGGAGACAGAGTCAGTATCATTTGCTGGGCAAGTGAGGGCATTAGCAGTAATTTAGCCTGGTATCTGCAGAAACCAGGGAAATCCCCTAAGCTCTTCCTCTATGATGCAAAAGATTTGCACCCTGGGGTCTCATCGAGGTTCAGTGGCAGGGGATCTGGGACGGATTTCACTCTCACCATCATCAGCCTGAAGCCTGAAGATTTTGCAGCTTATTACTGTAAACAGGACTTCAGTTACCCTCC +>256|IGKV1D-43 ENST00000468879|IGKV1D-43|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAACCAGCCCTGCAGCTGTGCCCAGCCTGCCTTGCCCCCTGCTAATTTGCATGTTCCCAGAGCACATCCTCCTACCCTGAAGACTTATTAATGCGCTGGTCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>257|IGKV1D-43 ENST00000468879|IGKV1D-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTGCCCGCTCAGCGCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATTCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCTGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGCAAAAGCCCCTAAGCTCTTCATCTATTATGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTACCCCT +>258|IGKV1D-8 ENST00000471857|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>259|IGKV1D-8 ENST00000471857|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>260|IGKV1D-8 ENST00000628219|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>261|IGKV1D-8 ENST00000628219|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGTCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGTTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>262|IGKV2-24 ENST00000484817|IGKV2-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>263|IGKV2-24 ENST00000484817|IGKV2-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCACCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGATTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCATGCAAGCTACACAATTTCCT +>264|IGKV2-28 ENST00000482769|IGKV2-28|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>265|IGKV2-28 ENST00000482769|IGKV2-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>266|IGKV2-30 ENST00000468494|IGKV2-30|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>267|IGKV2-30 ENST00000468494|IGKV2-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACCGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>268|IGKV2D-24 ENST00000462693|IGKV2D-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>269|IGKV2D-24 ENST00000462693|IGKV2D-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCGCCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTTCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGGTTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCACGCAAGCTACACAATTTCCT +>270|IGKV2D-26 ENST00000390268|IGKV2D-26|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACT +>271|IGKV2D-26 ENST00000390268|IGKV2D-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCTTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGCAGAGATTGTGATGACCCAGACTCCACTCTCCTTGTCTATCACCCCTGGAGAGCAGGCCTCCATGTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTGATGGATACACCTATTTGTATTGGTTTCTGCAGAAAGCCAGGCCAGTCTCCACGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATTTTGGAGTTTATTACTGCATGCAAGATGCACAAGATCCT +>272|IGKV2D-28 ENST00000453166|IGKV2D-28|5'UTR|IG|IGK|None|00 +TTGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>273|IGKV2D-28 ENST00000453166|IGKV2D-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>274|IGKV2D-29 ENST00000491977|IGKV2D-29|5'UTR|IG|IGK|None|00 +GATCAGGACTTCTCAGTTCATCTTCTCACC +>275|IGKV2D-29 ENST00000491977|IGKV2D-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGATACCTGGATCCAGTGCAGATATTGTGATGACCCAGACTCCACTCTCTCTGTCCGTCACCCCTGGACAGCCGGCCTCCATCTCCTGCAAGTCTAGTCAGAGCCTCCTGCATAGTGATGGAAAGACCTATTTGTATTGGTACCTGCAGAAGCCAGGCCAGCCTCCACAGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAAGTATACAGCTTCCT +>276|IGKV2D-30 ENST00000474213|IGKV2D-30|5'UTR|IG|IGK|None|00 +TGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>277|IGKV2D-30 ENST00000474213|IGKV2D-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACTGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>278|IGKV3-11 ENST00000483158|IGKV3-11|5'UTR|IG|IGK|None|00 +GTCAGAGCCCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>279|IGKV3-11 ENST00000483158|IGKV3-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAACAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCCT +>280|IGKV3-15 ENST00000390252|IGKV3-15|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>281|IGKV3-15 ENST00000390252|IGKV3-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGTATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCAGCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCT +>282|IGKV3-20 ENST00000492167|IGKV3-20|5'UTR|IG|IGK|None|00 +CCTGGGTCAGAGCTCTGGAGAAGAGCTGCTCAGTTAGGACCCAGAGGGAACC +>283|IGKV3-20 ENST00000492167|IGKV3-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGGCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>284|IGKV3-7 ENST00000390247|IGKV3-7|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCCCTGGGAAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>285|IGKV3-7 ENST00000390247|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCAGAGAAATTGTAATGACACAGTCTCCACCCACCCTGTCTTTGTCTCCAGGGGAAAGAGTCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAACCTGGTATCAGCAGAAACCTGGCCAGGCGCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTAGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCT +>286|IGKV3/OR2-268 ENST00000421835|IGKV3/OR2-268|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCACAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>287|IGKV3D-11 ENST00000390277|IGKV3D-11|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>288|IGKV3D-11 ENST00000390277|IGKV3D-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGCCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCATCC +>289|IGKV3D-15 ENST00000417279|IGKV3D-15|5'UTR|IG|IGK|None|00 +GGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>290|IGKV3D-15 ENST00000417279|IGKV3D-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCATCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCATCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCTCC +>291|IGKV3D-20 ENST00000390270|IGKV3D-20|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCCGCCCTGCAGTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>292|IGKV3D-20 ENST00000390270|IGKV3D-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCGGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCTGGCGCCCAGGCTCCTCATCTATGATGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>293|IGKV3D-7 ENST00000443397|IGKV3D-7|5'UTR|IG|IGK|None|00 +GAGGAACTGCTCAGTTAGGACCCAG +>294|IGKV3D-7 ENST00000443397|IGKV3D-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAACCATGGAAGCCCCAGCACAGCTTCTTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>295|IGKV4-1 ENST00000390243|IGKV4-1|5'UTR|IG|IGK|None|00 +TTTGGCTCTTGATTTACATTGGGTACTTTCACAACCCACTGCTCATGAAATTTGCTTTTGTACTCACTGGTTGTTTTTGCATAGGCCCCTCCAGGCCACGACCAGCTGTTTGGATTTTATAAACGGGCCGTTTGCATTGTGAACTGAGCTACAACAGGCAGGCAGGGGCAGCAAG +>296|IGKV4-1 ENST00000390243|IGKV4-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTTGCAGACCCAGGTCTTCATTTCTCTGTTGCTCTGGATCTCTGGTGCCTACGGGGACATCGTGATGACCCAGTCTCCAGACTCCCTGGCTGTGTCTCTGGGCGAGAGGGCCACCATCAACTGCAAGTCCAGCCAGAGTGTTTTATACAGCTCCAACAATAAGAACTACTTAGCTTGGTACCAGCAGAAACCAGGACAGCCTCCTAAGCTGCTCATTTACTGGGCATCTACCCGGGAATCCGGGGTCCCTGACCGATTCAGTGGCAGCGGGTCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGGCTGAAGATGTGGCAGTTTATTACTGTCAGCAATATTATAGTACTCCT +>297|IGKV5-2 ENST00000390244|IGKV5-2|5'UTR|IG|IGK|None|00 +ATAAAATCTGTGCTGTCAAACTGATTAGGAACTGACTACCACCTGCAGGTCAGGGCCAAGGTT +>298|IGKV5-2 ENST00000390244|IGKV5-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGGTCCCAGGTTCACCTCCTCAGCTTCCTCCTCCTTTGGATCTCTGATACCAGGGCAGAAACGACACTCACGCAGTCTCCAGCATTCATGTCAGCGACTCCAGGAGACAAAGTCAACATCTCCTGCAAAGCCAGCCAAGACATTGATGATGATATGAACTGGTACCAACAGAAACCAGGAGAAGCTGCTATTTTCATTATTCAAGAAGCTACTACTCTCGTTCCTGGAATCCCACCTCGATTCAGTGGCAGCGGGTATGGAACAGATTTTACCCTCACAATTAATAACATAGAATCTGAGGATGCTGCATATTACTTCTGTCTACAACATGATAATTTCCCT +>299|IGKV6-21 ENST00000390256|IGKV6-21|5'UTR|IG|IGK|None|00 +ATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>300|IGKV6-21 ENST00000390256|IGKV6-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTTGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCTTCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAACGTATTACTGTCATCAGAGTAGTAGTTTACCT +>301|IGKV6D-21 ENST00000436451|IGKV6D-21|5'UTR|IG|IGK|None|00 +GGTATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>302|IGKV6D-21 ENST00000436451|IGKV6D-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTCGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAGCGTATTACTGTCATCAGAGTAGTAGTTTACCT +>303|IGKV6D-41 ENST00000390271|IGKV6D-41|5'UTR|IG|IGK|None|00 +AGCAAAACTGAAGTCAAAACACTGAG +>304|IGKV6D-41 ENST00000390271|IGKV6D-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCCCGTTGCAATTCCTGCGGCTTCTGCTCCTCTGGGTTCCAGCCTCCAGGGGTGATGTTGTGATGACACAGTCTCCAGCTTTCCTCTCTGTGACTCCAGGGGAGAAAGTCACCATCACCTGCCAGGCCAGTGAAGGCATTGGCAACTACTTATACTGGTACCAGCAGAAACCAGATCAAGCCCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCTTTACCATCAGTAGCCTGGAAGCTGAAGATGCTGCAACATATTACTGTCAGCAGGGCAATAAGCACCCT +>305|IGLC1 ENST00000390321|IGLC1|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCCAACCCCACTGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTCCAAGCCAACAAGGCCACACTAGTGTGTCTGATCAGTGACTTCTACCCGGGAGCTGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCAAACCCTCCAAACAGAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>306|IGLC2 ENST00000390323|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTATCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>307|IGLC3 ENST00000390325|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAAAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>308|IGLC7 ENST00000390331|IGLC7|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCGTAAGTGACTTCAACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGTGGGAGTGGAGACCACCAAACCCTCCAAACAAAGCAACAACAAGTATGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCGGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTGCAGAATGCTCT +>309|IGLJ1 ENST00000390320|IGLJ1|J-REGION|IG|IGL|None|00 +TTATGTCTTCGGAACTGGGACCAAGGTCACCGTCCTAG +>310|IGLJ2 ENST00000390322|IGLJ2|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTCATGAGCAG +>311|IGLJ2 ENST00000390322|IGLJ2|J-REGION|IG|IGL|None|00 +TGTGGTATTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>312|IGLJ3 ENST00000390324|IGLJ3|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTC +>313|IGLJ3 ENST00000390324|IGLJ3|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>314|IGLJ4 ENST00000390326|IGLJ4|J-REGION|IG|IGL|None|00 +GTATTTGGTGGAGGAACCCAGCTGATCATTTTA +>315|IGLJ5 ENST00000390327|IGLJ5|J-REGION|IG|IGL|None|00 +CAGAGAGGGTTTTTGTATGAGCCTGTGTCACAGCACTGGGTGTTTGGTGAGGGGACCGAGCTGACCGTCCTA +>316|IGLJ6 ENST00000390328|IGLJ6|J-REGION|IG|IGL|None|00 +GGAGGGTTTGTGTGCAGGGTTATATCACAGTGTAATGTGTTCGGCAGTGGCACCAAGGTGACCGTCCTCG +>317|IGLJ7 ENST00000390330|IGLJ7|J-REGION|IG|IGL|None|00 +TCACTGTGTGCTGTGTTCGGAGGAGGCACCCAGCTGACCGTCCTCG +>318|IGLV1-36 ENST00000390301|IGLV1-36|5'UTR|IG|IGL|None|00 +GCTGCGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>319|IGLV1-36 ENST00000390301|IGLV1-36|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCCCCTCTCTTCCTCACCCTCATCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCGGTGTCTGAAGCCCCCAGGCAGAGGGTCACCATCTCCTGTTCTGGAAGCAGCTCCAACATCGGAAATAATGCTGTAAACTGGTACCAGCAGCTCCCAGGAAAGGCTCCCAAACTCCTCATCTATTATGATGATCTGCTGCCCTCAGGGGTCTCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>320|IGLV1-40 ENST00000390299|IGLV1-40|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAAGAGGCAGCACTCAGGACAATCTCCAGC +>321|IGLV1-40 ENST00000390299|IGLV1-40|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTCCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATCGGGGCAGGTTATGATGTACACTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCCAGTCCTATGACAGCAGCCTGAGTGGTTC +>322|IGLV1-44 ENST00000390297|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>323|IGLV1-44 ENST00000390297|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>324|IGLV1-44 ENST00000628287|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>325|IGLV1-44 ENST00000628287|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTC +>326|IGLV1-47 ENST00000390294|IGLV1-47|5'UTR|IG|IGL|None|00 +GGGGAAGCTCAGCTTCAGCTGTGGTAGAGAAGACAGGATTCAGGACAATCTCCAGC +>327|IGLV1-47 ENST00000390294|IGLV1-47|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCGGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATTATGTATACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCGGTCCGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAGTGGT +>328|IGLV1-50 ENST00000390291|IGLV1-50|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAGGAGGCAGCACTCAGGACAATCTCCAGC +>329|IGLV1-50 ENST00000390291|IGLV1-50|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTTCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATTGGGGCGGGTTATGTTGTACATTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCAATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGACTCCAGTCTGAGGATGAGGCTGATTATTACTGCAAAGCATGGGATAACAGCCTGAATGCT +>330|IGLV1-51 ENST00000390290|IGLV1-51|5'UTR|IG|IGL|None|00 +TGAGCGCAGAAGGCAGGACTCGGGACAATCTTCATC +>331|IGLV1-51 ENST00000390290|IGLV1-51|L-REGION+V-REGION|IG|IGL|None|00 +ATGACCTGCTCCCCTCTCCTCCTCACCCTTCTCATTCACTGCACAGGGTCCTGGGCCCAGTCTGTGTTGACGCAGCCGCCCTCAGTGTCTGCGGCCCCAGGACAGAAGGTCACCATCTCCTGCTCTGGAAGCAGCTCCAACATTGGGAATAATTATGTATCCTGGTACCAGCAGCTCCCAGGAACAGCCCCCAAACTCCTCATTTATGACAATAATAAGCGACCCTCAGGGATTCCTGACCGATTCTCTGGCTCCAAGTCTGGCACGTCAGCCACCCTGGGCATCACCGGACTCCAGACTGGGGACGAGGCCGATTATTACTGCGGAACATGGGATAGCAGCCTGAGTGCTGG +>332|IGLV10-54 ENST00000390287|IGLV10-54|5'UTR|IG|IGL|None|00 +GGGAATCTGCACC +>333|IGLV10-54 ENST00000390287|IGLV10-54|L-REGION+V-REGION|IG|IGL|None|00 +ATGCCCTGGGCTCTGCTCCTCCTGACCCTCCTCACTCACTCTGCAGTGTCAGTGGTCCAGGCAGGGCTGACTCAGCCACCCTCGGTGTCCAAGGGCTTGAGACAGACCGCCACACTCACCTGCACTGGGAACAGCAACATTGTTGGCAACCAAGGAGCAGCTTGGCTGCAGCAGCACCAGGGCCACCCTCCCAAACTCCTATCCTACAGGAATAACAACCGGCCCTCAGGGATCTCAGAGAGATTCTCTGCATCCAGGTCAGGAAACACAGCCTCCCTGACCATTACTGGACTCCAGCCTGAGGACGAGGCTGACTATTACTGCTCAGCATTGGACAGCAGCCTCAGTGCTC +>334|IGLV11-55 ENST00000390286|IGLV11-55|5'UTR|IG|IGL|None|00 +GCTGTGTCCACT +>335|IGLV11-55 ENST00000390286|IGLV11-55|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCCTGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCGGCCCGTGCTGACTCAGCCGCCCTCCCTGTCTGCATCCCCGGGAGCAACAGCCAGACTCCCCTGCACCCTGAGCAGTGACCTCAGTGTTGGTGGTAAAAACATGTTCTGGTACCAGCAGAAGCTAGGGAGCTCTCCCAGGTTATTCCTGTATCACTACTCAGACTCAGACAAGCAGCTGGGACCTGGGGTCCCCAGTCGAGTCTCTGGCTCCAAGGAGACCTCAAGTAACACAGCGTTTTTGCTCATCTCTGGGCTCCAGCCTGAGGACGAGGCCGATTATTACTGCCAGGTGTACGAAAGTAGTGCTAAT +>336|IGLV2-11 ENST00000390314|IGLV2-11|5'UTR|IG|IGL|None|00 +TGCTGGGGTCTCAGGAGGCAGCACTCTCGGGACGTCTCCACC +>337|IGLV2-11 ENST00000390314|IGLV2-11|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCAGCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCGCTCAGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGATGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCTGCTCATATGCAGGCAGCTACACTTTCCACA +>338|IGLV2-14 ENST00000390312|IGLV2-14|5'UTR|IG|IGL|None|00 +GCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACATCTCCACC +>339|IGLV2-14 ENST00000390312|IGLV2-14|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTCATATACAAGCAGCAGCACTCTCCACAGTG +>340|IGLV2-18 ENST00000390310|IGLV2-18|5'UTR|IG|IGL|None|00 +GAATATCTCCACC +>341|IGLV2-18 ENST00000390310|IGLV2-18|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCCCTCCGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTAGTTATAACCGTGTCTCCTGGTACCAGCAGCCCCCAGGCACAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGGTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTTATATACAAGCAGCAGCACTTTC +>342|IGLV2-23 ENST00000390306|IGLV2-23|5'UTR|IG|IGL|None|00 +TCTCTGAGCCCAGGCCCACGTGAGGGTGGGGTGAGGAGAGGAGCCCAGGATGCTGATTTTCATGGAGGCCCCGCCCTCCTCTGAGGCAAAGGGGATAAGACAGGGCTGGGGCAGGGCCAGTGCTGGGGTCACAAGAGGCAGCGCTCTCGGGACGTCTCCACC +>343|IGLV2-23 ENST00000390306|IGLV2-23|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACTCTCCTCACTCAGGACACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGGAGTTATAACCTTGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGGCAGTAAGCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACAATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCTGCTCATATGCAG +>344|IGLV2-33 ENST00000390302|IGLV2-33|5'UTR|IG|IGL|None|00 +GGCTAGAGGCAGGCCCGGTGCTGGGGTCTCAAGGCAGCGCTCTCGGGACATCTCCACC +>345|IGLV2-33 ENST00000390302|IGLV2-33|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAATCTGCCCTGACTCAGCCTCCTTTTGTGTCCGGGGCTCCTGGACAGTCGGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGGGATTATGATCATGTCTTCTGGTACCAAAAGCGTCTCAGCACTACCTCCAGACTCCTGATTTACAATGTCAATACTCGGCCTTCAGGGATCTCTGACCTCTTCTCAGGCTCCAAGTCTGGCAACATGGCTTCCCTGACCATCTCTGGGCTCAAGTCCGAGGTTGAGGCTAATTATCACTGCAGCTTATATTCAAGTAGTTACACTTTC +>346|IGLV2-8 ENST00000620395|IGLV2-8|5'UTR|IG|IGL|None|00 +TCTCTAAGCCCAGGCCCAAGTGAGGGTGGGGTGAGAAGAGGAGCTCAGGATGCAGATTTGCATGGAGGTCCCGCCCTTCTCTGAGGCAGAGGGGATAAGACAGGGCTGGGGGCAGGCCCAGTGCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACGTCACCACC +>347|IGLV2-8 ENST00000620395|IGLV2-8|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTCCCTCCGCGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCGTCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCAGCTCATATGCAGGCAGCAACAATTTC +>348|IGLV3-1 ENST00000390319|IGLV3-1|5'UTR|IG|IGL|None|00 +AAGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGAGGTGCCTCAGCC +>349|IGLV3-1 ENST00000390319|IGLV3-1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGATCCCTCTCTTCCTCGGCGTCCTTGCTTACTGCACAGGATCCGTGGCCTCCTATGAGCTGACTCAGCCACCCTCAGTGTCCGTGTCCCCAGGACAGACAGCCAGCATCACCTGCTCTGGAGATAAATTGGGGGATAAATATGCTTGCTGGTATCAGCAGAAGCCAGGCCAGTCCCCTGTGCTGGTCATCTATCAAGATAGCAAGCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACAGCCACTCTGACCATCAGCGGGACCCAGGCTATGGATGAGGCTGACTATTACTGTCAGGCGTGGGACAGCAGCACTGCACACA +>350|IGLV3-10 ENST00000390315|IGLV3-10|5'UTR|IG|IGL|None|00 +GTGGGCTCAGGAGGCAGAGCTCTGGGAATCTCACC +>351|IGLV3-10 ENST00000390315|IGLV3-10|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTGCTCCCCCTCCTCACTTTCTGCACAGTCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAAACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGTCAGGCCAGGCCCCTGTGCTGGTCATCTATGAGGACAGCAAACGACCCTCCGGGATCCCTGAGAGATTCTCTGGCTCCAGCTCAGGGACAATGGCCACCTTGACTATCAGTGGGGCCCAGGTGGAGGATGAAGCTGACTACTACTGTTACTCAACAGACAGCAGTGGTAATCATAG +>352|IGLV3-12 ENST00000390313|IGLV3-12|5'UTR|IG|IGL|None|00 +GCCTCAGCC +>353|IGLV3-12 ENST00000390313|IGLV3-12|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTCCTCAGCCTCCTCGCTCACTGCACAGGCTCTGCGACCTCCTATGAGCTGACTCAGCCACACTCAGTGTCAGTGGCCACAGCACAGATGGCCAGGATCACCTGTGGGGGAAACAACATTGGAAGTAAAGCTGTGCACTGGTACCAGCAAAAGCCAGGCCAGGACCCTGTGCTGGTCATCTATAGCGATAGCAACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACCCAGGGAACACCGCCACCCTAACCATCAGCAGGATCGAGGCTGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGTAGTAGTGATCATCC +>354|IGLV3-16 ENST00000390311|IGLV3-16|5'UTR|IG|IGL|None|00 +TCTGTGGGTCCAGGAGGCACAGCTCTGGGAATCTCACC +>355|IGLV3-16 ENST00000390311|IGLV3-16|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCTAGGACAGATGGCCAGGATCACCTGCTCTGGAGAAGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGTTCCCTGTGCTGGTGATATATAAAGACAGCGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAATAGTCACATTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCTATCAGCAGACAGCAGTGGTACTTATCC +>356|IGLV3-19 ENST00000390309|IGLV3-19|5'UTR|IG|IGL|None|00 +AGCTGTGGGCTCAGAAGCAGAGTTCTGGGGTGTCTCCACC +>357|IGLV3-19 ENST00000390309|IGLV3-19|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCTGGCTCACTCTCCTCACTCTTTGCATAGGTTCTGTGGTTTCTTCTGAGCTGACTCAGGACCCTGCTGTGTCTGTGGCCTTGGGACAGACAGTCAGGATCACATGCCAAGGAGACAGCCTCAGAAGCTATTATGCAAGCTGGTACCAGCAGAAGCCAGGACAGGCCCCTGTACTTGTCATCTATGGTAAAAACAACCGGCCCTCAGGGATCCCAGACCGATTCTCTGGCTCCAGCTCAGGAAACACAGCTTCCTTGACCATCACTGGGGCTCAGGCGGAAGATGAGGCTGACTATTACTGTAACTCCCGGGACAGCAGTG +>358|IGLV3-21 ENST00000390308|IGLV3-21|5'UTR|IG|IGL|None|00 +GCACAGAGGAGCTGTGCCCTGGAATGGGGCCTGTACCTGTCCAAGGCTTGTGCCGTCCCCTGTGGGAGATGAGAAGCGTCCCTGCATTGGGCTCTTGGGGACCCGTCTTGGACATGAATCTCCTCCAGCAGCAGCCTCTGACTCTGCTGATTTGCATCATGGGCCGCTCTCTCCAGCAAGGGGATAAGAGAGGCCTGGGAGGAACCTGCTCAGTCTGGGCCTAAGGAAGCAGCACTGGTGGTGCCTCAGCC +>359|IGLV3-21 ENST00000390308|IGLV3-21|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGTTCTCCTCCTCGGCCTCCTCTCTCACTGCACAGGCTCTGTGACCTCCTATGTGCTGACTCAGCCACCCTCGGTGTCAGTGGCCCCAGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAGTGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCGTCTATGATGATAGCGACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACGGCCACCCTGACCATCAGCAGGGTCGAAGCCGGGGATGAGGCCGACTATTACTGTCAGGTGTGGGATAGTAGTAGTGATCATCCCACG +>360|IGLV3-22 ENST00000390307|IGLV3-22|5'UTR|IG|IGL|None|00 +AAGAGAGGCCTGGGAAGCCCAGCTGTGCTGTGGGCTCAGGAGGCAGAGCTGTGGGTGTCTCACC +>361|IGLV3-22 ENST00000390307|IGLV3-22|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGGCCACACTCCTGCTCCCACTCCTCAACCTCTACACAGGCTCTGTTGCCTCCTATGAGCTGACACAGCTACCCTCGGTGTCAGTGTCCCCAGGACAGACAGCCAGGATCACCTGCTCTGGAGATGTACTGGGGGAAAATTATGCTGACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGAGTTGGTGATATACGAAGATAGTGAGCGGTACCCTGGAATCCCTGAACGATTCTCTGGGTCCACCTCAGGGAACACGACCACCCTGACCATCAGCAGGGTCCTGACCGAAGACGAGGCTGACTATTACTGTTTGTCTGGGGATGAGGACAATCCCTCA +>362|IGLV3-25 ENST00000390305|IGLV3-25|5'UTR|IG|IGL|None|00 +GCTGTGCTGTGGGTCCAGGAGGCAGAACTCTGGGTGTCTCACC +>363|IGLV3-25 ENST00000390305|IGLV3-25|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTACTTCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAGACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAGCAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATATATAAAGACAGTGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAACAGTCACGTTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCAATCAGCAGACAGCAGTG +>364|IGLV3-27 ENST00000390304|IGLV3-27|5'UTR|IG|IGL|None|00 +GCTGTAGGCTCAGGAGGCAGAGCTCTGAATGTCTCACC +>365|IGLV3-27 ENST00000390304|IGLV3-27|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCATTCTCTGCACAGTCTCTGTGGCCTCCTATGAGCTGACACAGCCATCCTCAGTGTCAGTGTCTCCGGGACAGACAGCCAGGATCACCTGCTCAGGAGATGTACTGGCAAAAAAATATGCTCGGTGGTTCCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATTTATAAAGACAGTGAGCGGCCCTCAGGGATCCCTGAGCGATTCTCCGGCTCCAGCTCAGGGACCACAGTCACCTTGACCATCAGCGGGGCCCAGGTTGAGGATGAGGCTGACTATTACTGTTACTCTGCGGCTGACAACAAT +>366|IGLV3-32 ENST00000390303|IGLV3-32|5'UTR|IG|IGL|None|00 +GCTGTGGACTCAGAGGCAGAGCTCTGGGGCATTTCCATT +>367|IGLV3-32 ENST00000390303|IGLV3-32|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCCCCTGCTCGTCCTCACTCTCTGCACAGGCTCCGTTATTTCCTCTGGGCCAACTCAGGTGCCTGCAGTGTCTGTGGCCTTGGGACAAATGGCCAGGATCACCTGCCAGGGAGACAGCATGGAAGGCTCTTATGAACACTGGTACCAGCAGAAGCCAGGCCAGGCCCCCGTGCTGGTCATCTATGATAGCAGTGACCGGCCCTCAAGGATCCCTGAGCGATTCTCTGGCTCCAAATCAGGCAACACAACCACCCTGACCATCACTGGGGCCCAGGCTGAGGATGAGGCTGATTATTACTATCAGTTGATAGACAACCATGCTACTCAACT +>368|IGLV3-9 ENST00000390316|IGLV3-9|5'UTR|IG|IGL|None|00 +CTTGACTCTGCTGATTTGCATCACAGGCTGCTCTCTTCAGCAAGGGGATAAGAGAGGGCTGGAAGGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGGGGTGCCGCAGCC +>369|IGLV3-9 ENST00000390316|IGLV3-9|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGCTCTCCTTCTGAGCCTCCTTGCTCACTTTACAGGTTCTGTGGCCTCCTATGAGCTGACTCAGCCACTCTCAGTGTCAGTGGCCCTGGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAATGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCATCTATAGGGATAGCAACCGGCCCTCTGGGATCCCTGAGCGATTCTCTGGCTCCAACTCGGGGAACACGGCCACCCTGACCATCAGCAGAGCCCAAGCCGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGCAGCACTGCACACA +>370|IGLV4-3 ENST00000390318|IGLV4-3|5'UTR|IG|IGL|None|00 +CTCGAATAGAGCTCTTGGAAGTCCCTCCAACC +>371|IGLV4-3 ENST00000390318|IGLV4-3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGTCTCCTTCTACCTACTGCCCTTCATTTTCTCCACAGGTCTCTGTGCTCTGCCTGTGCTGACTCAGCCCCCGTCTGCATCTGCCTTGCTGGGAGCCTCGATCAAGCTCACCTGCACCCTAAGCAGTGAGCACAGCACCTACACCATCGAATGGTATCAACAGAGACCAGGGAGGTCCCCCCAGTATATAATGAAGGTTAAGAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCCGATCGCTTCATGGGCTCCAGTTCTGGGGCTGACCGCTACCTCACCTTCTCCAACCTCCAGTCTGACGATGAGGCTGAGTATCACTGTGGAGAGAGCCACACGATTGATGGCCAAGTCGGT +>372|IGLV4-60 ENST00000390284|IGLV4-60|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCACTCCTCCTCCTCTTCCCTCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCCTGTGCTGACTCAATCATCCTCTGCCTCTGCTTCCCTGGGATCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGTAGCTACATCATCGCATGGCATCAGCAGCAGCCAGGGAAGGCCCCTCGGTACTTGATGAAGCTTGAAGGTAGTGGAAGCTACAACAAGGGGAGCGGAGTTCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGACCGCTACCTCACCATCTCCAACCTCCAGTTTGAGGATGAGGCTGATTATTACTGTGAGACCTGGGACAGTAACACTCA +>373|IGLV4-69 ENST00000390282|IGLV4-69|5'UTR|IG|IGL|None|00 +AGGGTGGGTAAGAAATACCTGCAACTGTCAGCCTCAGCAGAGCTCTGGGGAGTCTGCACC +>374|IGLV4-69 ENST00000390282|IGLV4-69|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCTTGGACCCCACTCCTCTTCCTCACCCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCTTGTGCTGACTCAATCGCCCTCTGCCTCTGCCTCCCTGGGAGCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGCAGCTACGCCATCGCATGGCATCAGCAGCAGCCAGAGAAGGGCCCTCGGTACTTGATGAAGCTTAACAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGAGCGCTACCTCACCATCTCCAGCCTCCAGTCTGAGGATGAGGCTGACTATTACTGTCAGACCTGGGGCACTGGCATTCA +>375|IGLV5-37 ENST00000390300|IGLV5-37|5'UTR|IG|IGL|None|00 +CCACC +>376|IGLV5-37 ENST00000390300|IGLV5-37|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTTCTTCTCTTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCCTCCTCCGCATCTCCTGGAGAATCCGCCAGACTCACCTGCACCTTGCCCAGTGACATCAATGTTGGTAGCTACAACATATACTGGTACCAGCAGAAGCCAGGGAGCCCTCCCAGGTATCTCCTGTACTACTACTCAGACTCAGATAAGGGCCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAGCCAATACAGGGATTTTACTCATCTCCGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCCAAGCAATGCTTCT +>377|IGLV5-39 ENST00000630493|IGLV5-39|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGCCTGTGCTGACTCAGCCAACCTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGATTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCTTCCCCGGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAACCAATGCAGGCCTTTTACTCATCTCTGGGCTCCAGTCTGAAGATGAGGCTGACTATTACTGTGCCATTTGGTACAGCAGCACTTCT +>378|IGLV5-45 ENST00000390296|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>379|IGLV5-45 ENST00000390296|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGTGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>380|IGLV5-45 ENST00000626489|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>381|IGLV5-45 ENST00000626489|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>382|IGLV5-52 ENST00000390289|IGLV5-52|5'UTR|IG|IGL|None|00 +CCACC +>383|IGLV5-52 ENST00000390289|IGLV5-52|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCTTCTCCTTCTCGTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCATCTTCCCATTCTGCATCTTCTGGAGCATCAGTCAGACTCACCTGCATGCTGAGCAGTGGCTTCAGTGTTGGGGACTTCTGGATAAGGTGGTACCAACAAAAGCCAGGGAACCCTCCCCGGTATCTCCTGTACTACCACTCAGACTCCAATAAGGGCCAAGGCTCTGGAGTTCCCAGCCGCTTCTCTGGATCCAACGATGCATCAGCCAATGCAGGGATTCTGCGTATCTCTGGGCTCCAGCCTGAGGATGAGGCTGACTATTACTGTGGTACATGGCACAGCAACTCTAAGACTCA +>384|IGLV6-57 ENST00000390285|IGLV6-57|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCACTACTTCTCACCCTCCTCGCTCACTGCACAGGTTCTTGGGCCAATTTTATGCTGACTCAGCCCCACTCTGTGTCGGAGTCTCCGGGGAAGACGGTAACCATCTCCTGCACCGGCAGCAGTGGCAGCATTGCCAGCAACTATGTGCAGTGGTACCAGCAGCGCCCGGGCAGTGCCCCCACCACTGTGATCTATGAGGATAACCAAAGACCCTCTGGGGTCCCTGATCGGTTCTCTGGCTCCATCGACAGCTCCTCCAACTCTGCCTCCCTCACCATCTCTGGACTGAAGACTGAGGACGAGGCTGACTACTACTGTCAGTCTTATGATAGCAGCAATCA +>385|IGLV7-43 ENST00000390298|IGLV7-43|5'UTR|IG|IGL|None|00 +TCTGGCGCCAGGGGTCCCTTCCAATATCAGCACC +>386|IGLV7-43 ENST00000390298|IGLV7-43|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCTCAGACTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGCTTCCAGCACTGGAGCAGTCACCAGTGGTTACTATCCAAACTGGTTCCAGCAGAAACCTGGACAAGCACCCAGGGCACTGATTTATAGTACAAGCAACAAACACTCCTGGACCCCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACACTGTCAGGTGTGCAGCCTGAGGACGAGGCTGAGTATTACTGCCTGCTCTACTATGGTGGTGCTCAG +>387|IGLV7-46 ENST00000390295|IGLV7-46|5'UTR|IG|IGL|None|00 +TCTGGCACCAGGGGTCCCTTCCAATATCAGCACC +>388|IGLV7-46 ENST00000390295|IGLV7-46|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCCCAGGCTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGGCTCCAGCACTGGAGCTGTCACCAGTGGTCATTATCCCTACTGGTTCCAGCAGAAGCCTGGCCAAGCCCCCAGGACACTGATTTATGATACAAGCAACAAACACTCCTGGACACCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACCCTTTTGGGTGCGCAGCCTGAGGATGAGGCTGAGTATTACTGCTTGCTCTCCTATAGTGGTGCTCGG +>389|IGLV8-61 ENST00000390283|IGLV8-61|5'UTR|IG|IGL|None|00 +GAGGAAAACAAACCCCAGCTGGGAAGCCTGAGAACACTTAGCCTTC +>390|IGLV8-61 ENST00000390283|IGLV8-61|L-REGION+V-REGION|IG|IGL|None|00 +ATGAGTGTCCCCACCATGGCCTGGATGATGCTTCTCCTCGGACTCCTTGCTTATGGATCAGGAGTGGATTCTCAGACTGTGGTGACCCAGGAGCCATCGTTCTCAGTGTCCCCTGGAGGGACAGTCACACTCACTTGTGGCTTGAGCTCTGGCTCAGTCTCTACTAGTTACTACCCCAGCTGGTACCAGCAGACCCCAGGCCAGGCTCCACGCACGCTCATCTACAGCACAAACACTCGCTCTTCTGGGGTCCCTGATCGCTTCTCTGGCTCCATCCTTGGGAACAAAGCTGCCCTCACCATCACGGGGGCCCAGGCAGATGATGAATCTGATTATTACTGTGTGCTGTATATGGGTAGTGGCATTTC +>391|IGLV9-49 ENST00000427632|IGLV9-49|5'UTR|IG|IGL|None|00 +GAGAGACTGAAGAACCCAGCATTGCAGCAGCTCCACC +>392|IGLV9-49 ENST00000427632|IGLV9-49|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCTCTGCTCCTCACCCTCCTCAGTCTCCTCACAGGGTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCTGCATCAGCCTCCCTGGGAGCCTCGGTCACACTCACCTGCACCCTGAGCAGCGGCTACAGTAATTATAAAGTGGACTGGTACCAGCAGAGACCAGGGAAGGGCCCCCGGTTTGTGATGCGAGTGGGCACTGGTGGGATTGTGGGATCCAAGGGGGATGGCATCCCTGATCGCTTCTCAGTCTTGGGCTCAGGCCTGAATCGGTACCTGACCATCAAGAACATCCAGGAAGAGGATGAGAGTGACTACCACTGTGGGGCAGACCATGGCAGTGGGAGCAACTTCGTG +>393|TRAC ENST00000611116|TRAC|C-REGION|TR|TRA|None|00 +ATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>394|TRAJ1 ENST00000390536|TRAJ1|J-REGION|TR|TRA|None|00 +GTATGAAAGTATTACCTCCCAGTTGCAATTTGGCAAAGGAACCAGAGTTTCCACTTCTCCCC +>395|TRAJ10 ENST00000390527|TRAJ10|J-REGION|TR|TRA|None|00 +ATACTCACGGGAGGAGGAAACAAACTCACCTTTGGGACAGGCACTCAGCTAAAAGTGGAACTCA +>396|TRAJ11 ENST00000390526|TRAJ11|J-REGION|TR|TRA|None|00 +TGAATTCAGGATACAGCACCCTCACCTTTGGGAAGGGGACTATGCTTCTAGTCTCTCCAG +>397|TRAJ12 ENST00000390525|TRAJ12|J-REGION|TR|TRA|None|00 +GGATGGATAGCAGCTATAAATTGATCTTCGGGAGTGGGACCAGACTGCTGGTCAGGCCTG +>398|TRAJ13 ENST00000390524|TRAJ13|J-REGION|TR|TRA|None|00 +TGAATTCTGGGGGTTACCAGAAAGTTACCTTTGGAACTGGAACAAAGCTCCAAGTCATCCCAA +>399|TRAJ14 ENST00000390523|TRAJ14|J-REGION|TR|TRA|None|00 +ATTTATAGCACATTCATCTTTGGGAGTGGGACAAGATTATCAGTAAAACCTG +>400|TRAJ16 ENST00000390521|TRAJ16|J-REGION|TR|TRA|None|00 +GGTTTTCAGATGGCCAGAAGCTGCTCTTTGCAAGGGGGACCATGTTAAAGGTGGATCTTA +>401|TRAJ17 ENST00000390520|TRAJ17|J-REGION|TR|TRA|None|00 +TGATCAAAGCTGCAGGCAACAAGCTAACTTTTGGAGGAGGAACCAGGGTGCTAGTTAAACCAA +>402|TRAJ18 ENST00000390519|TRAJ18|J-REGION|TR|TRA|None|00 +CCGACAGAGGCTCAACCCTGGGGAGGCTATACTTTGGAAGAGGAACTCAGTTGACTGTCTGGCCTG +>403|TRAJ19 ENST00000390518|TRAJ19|J-REGION|TR|TRA|None|00 +GCTATCAAAGATTTTACAATTTCACCTTTGGAAAGGGATCCAAACATAATGTCACTCCAA +>404|TRAJ2 ENST00000390535|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGAACAATTGATAAACTCACATTTGGGAAAGGGACCCATGTATTCATTATATCTG +>405|TRAJ20 ENST00000390517|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTAACGACTACAAGCTCAGCTTTGGAGCCGGAACCACAGTAACTGTAAGAGCAA +>406|TRAJ21 ENST00000390516|TRAJ21|J-REGION|TR|TRA|None|00 +TACAACTTCAACAAATTTTACTTTGGATCTGGGACCAAACTCAATGTAAAACCAA +>407|TRAJ22 ENST00000390515|TRAJ22|J-REGION|TR|TRA|None|00 +TTTCTTCTGGTTCTGCAAGGCAACTGACCTTTGGATCTGGGACACAATTGACTGTTTTACCTG +>408|TRAJ23 ENST00000390514|TRAJ23|J-REGION|TR|TRA|None|00 +TGATTTATAACCAGGGAGGAAAGCTTATCTTCGGACAGGGAACGGAGTTATCTGTGAAACCCA +>409|TRAJ24 ENST00000390513|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGACAGCTGGGGGAAATTCCAGTTTGGAGCAGGGACCCAGGTTGTGGTCACCCCAG +>410|TRAJ25 ENST00000390512|TRAJ25|J-REGION|TR|TRA|None|00 +CAGAAGGACAAGGCTTCTCCTTTATCTTTGGGAAGGGGACAAGGCTGCTTGTCAAGCCAA +>411|TRAJ26 ENST00000390511|TRAJ26|J-REGION|TR|TRA|None|00 +GGGATAACTATGGTCAGAATTTTGTCTTTGGTCCCGGAACCAGATTGTCCGTGCTGCCCT +>412|TRAJ27 ENST00000390510|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATGCAGGCAAATCAACCTTTGGGGATGGGACTACGCTCACTGTGAAGCCAA +>413|TRAJ28 ENST00000390509|TRAJ28|J-REGION|TR|TRA|None|00 +CATACTCTGGGGCTGGGAGTTACCAACTCACTTTCGGGAAGGGGACCAAACTCTCGGTCATACCAA +>414|TRAJ29 ENST00000390508|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAACACACCTCTTGTCTTTGGAAAGGGCACAAGACTTTCTGTGATTGCAA +>415|TRAJ3 ENST00000390534|TRAJ3|J-REGION|TR|TRA|None|00 +GGGGTACAGCAGTGCTTCCAAGATAATCTTTGGATCAGGGACCAGACTCAGCATCCGGCCAA +>416|TRAJ30 ENST00000390507|TRAJ30|J-REGION|TR|TRA|None|00 +TGAACAGAGATGACAAGATCATCTTTGGAAAAGGGACACGACTTCATATTCTCCCCA +>417|TRAJ31 ENST00000390506|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAACAATGCCAGACTCATGTTTGGAGATGGAACTCAGCTGGTGGTGAAGCCCA +>418|TRAJ32 ENST00000390505|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGTGGTGCTACAAACAAGCTCATCTTTGGAACTGGCACTCTGCTTGCTGTCCAGCCAA +>419|TRAJ33 ENST00000390504|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTAATCTGGGGCGCTGGGACCAAGCTAATTATAAAGCCAG +>420|TRAJ34 ENST00000390503|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTATAACACCGACAAGCTCATCTTTGGGACTGGGACCAGATTACAAGTCTTTCCAA +>421|TRAJ35 ENST00000390502|TRAJ35|J-REGION|TR|TRA|None|00 +GATAGGCTTTGGGAATGTGCTGCATTGCGGGTCCGGCACTCAAGTGATTGTTTTACCAC +>422|TRAJ36 ENST00000614481|TRAJ36|J-REGION|TR|TRA|None|00 +TCAAACTGGGGCAAACAACCTCTTCTTTGGGACTGGAACGAGACTCACCGTTATTCCCT +>423|TRAJ37 ENST00000612375|TRAJ37|J-REGION|TR|TRA|None|00 +TGGCTCTAGCAACACAGGCAAACTAATCTTTGGGCAAGGGACAACTTTACAAGTAAAACCAG +>424|TRAJ38 ENST00000390499|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGCTGGCAACAACCGTAAGCTGATTTGGGGATTGGGAACAAGCCTGGCAGTAAATCCGA +>425|TRAJ39 ENST00000390498|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGCAACATGCTCACCTTTGGAGGGGGAACAAGGTTAATGGTCAAACCCC +>426|TRAJ4 ENST00000390533|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTTTCTGGTGGCTACAATAAGCTGATTTTTGGAGCAGGGACCAGGCTGGCTGTACACCCAT +>427|TRAJ40 ENST00000390497|TRAJ40|J-REGION|TR|TRA|None|00 +ACTACCTCAGGAACCTACAAATACATCTTTGGAACAGGCACCAGGCTGAAGGTTTTAGCAA +>428|TRAJ41 ENST00000390496|TRAJ41|J-REGION|TR|TRA|None|00 +GAACTCAAATTCCGGGTATGCACTCAACTTCGGCAAAGGCACCTCGCTGTTGGTCACACCCC +>429|TRAJ42 ENST00000390495|TRAJ42|J-REGION|TR|TRA|None|00 +TGAATTATGGAGGAAGCCAAGGAAATCTCATCTTTGGAAAAGGCACTAAACTCTCTGTTAAACCAA +>430|TRAJ43 ENST00000390494|TRAJ43|J-REGION|TR|TRA|None|00 +ACAATAACAATGACATGCGCTTTGGAGCAGGGACCAGACTGACAGTAAAACCAA +>431|TRAJ44 ENST00000390493|TRAJ44|J-REGION|TR|TRA|None|00 +TAAATACCGGCACTGCCAGTAAACTCACCTTTGGGACTGGAACAAGACTTCAGGTCACGCTCG +>432|TRAJ45 ENST00000390492|TRAJ45|J-REGION|TR|TRA|None|00 +TGTATTCAGGAGGAGGTGCTGACGGACTCACCTTTGGCAAAGGGACTCATCTAATCATCCAGCCCT +>433|TRAJ46 ENST00000390491|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAGAAAAGCAGCGGAGACAAGCTGACTTTTGGGACCGGGACTCGTTTAGCAGTTAGGCCCA +>434|TRAJ47 ENST00000390490|TRAJ47|J-REGION|TR|TRA|None|00 +TGGAATATGGAAACAAACTGGTCTTTGGCGCAGGAACCATTCTGAGAGTCAAGTCCT +>435|TRAJ48 ENST00000390489|TRAJ48|J-REGION|TR|TRA|None|00 +TATCTAACTTTGGAAATGAGAAATTAACCTTTGGGACTGGAACAAGACTCACCATCATACCCA +>436|TRAJ49 ENST00000390488|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACCGGTAACCAGTTCTATTTTGGGACAGGGACAAGTTTGACGGTCATTCCAA +>437|TRAJ5 ENST00000390532|TRAJ5|J-REGION|TR|TRA|None|00 +TGGACACGGGCAGGAGAGCACTTACTTTTGGGAGTGGAACAAGACTCCAAGTGCAACCAA +>438|TRAJ50 ENST00000390487|TRAJ50|J-REGION|TR|TRA|None|00 +TGAAAACCTCCTACGACAAGGTGATATTTGGGCCAGGGACAAGCTTATCAGTCATTCCAA +>439|TRAJ52 ENST00000390486|TRAJ52|J-REGION|TR|TRA|None|00 +CTAATGCTGGTGGTACTAGCTATGGAAAGCTGACATTTGGACAAGGGACCATCTTGACTGTCCATCCAA +>440|TRAJ53 ENST00000390485|TRAJ53|J-REGION|TR|TRA|None|00 +AGAATAGTGGAGGTAGCAACTATAAACTGACATTTGGAAAAGGAACTCTCTTAACCGTGAATCCAA +>441|TRAJ54 ENST00000390484|TRAJ54|J-REGION|TR|TRA|None|00 +TAATTCAGGGAGCCCAGAAGCTGGTATTTGGCCAAGGAACCAGGCTGACTATCAACCCAA +>442|TRAJ56 ENST00000390483|TRAJ56|J-REGION|TR|TRA|None|00 +TTATACTGGAGCCAATAGTAAGCTGACATTTGGAAAAGGAATAACTCTGAGTGTTAGACCAG +>443|TRAJ57 ENST00000390482|TRAJ57|J-REGION|TR|TRA|None|00 +TAACTCAGGGCGGATCTGAAAAGCTGGTCTTTGGAAAGGGAACGAAACTGACAGTAAACCCAT +>444|TRAJ58 ENST00000390481|TRAJ58|J-REGION|TR|TRA|None|00 +TTTAAGAAACCAGTGGCTCTAGGTTGACCTTTGGGGAAGGAACACAGCTCACAGTGAATCCTG +>445|TRAJ59 ENST00000390480|TRAJ59|J-REGION|TR|TRA|None|00 +GGAAGGAAGGAAACAGGAAATTTACATTTGGAATGGGGACGCAAGTGAGAGTGA +>446|TRAJ6 ENST00000390531|TRAJ6|J-REGION|TR|TRA|None|00 +TGCATCAGGAGGAAGCTACATACCTACATTTGGAAGAGGAACCAGCCTTATTGTTCATCCGT +>447|TRAJ61 ENST00000390479|TRAJ61|J-REGION|TR|TRA|None|00 +GGTACCGGGTTAATAGGAAACTGACATTTGGAGCCAACACTAGAGGAATCATGAAACTCA +>448|TRAJ7 ENST00000390530|TRAJ7|J-REGION|TR|TRA|None|00 +TGACTATGGGAACAACAGACTCGCTTTTGGGAAGGGGAACCAAGTGGTGGTCATACCAA +>449|TRAJ8 ENST00000390529|TRAJ8|J-REGION|TR|TRA|None|00 +TGAACACAGGCTTTCAGAAACTTGTATTTGGAACTGGCACCTGACTTCTGGTCAGTCCAA +>450|TRAJ9 ENST00000390528|TRAJ9|J-REGION|TR|TRA|None|00 +GGAAATACTGGAGGCTTCAAAACTATCTTTGGAGCAGGAACAAGACTATTTGTTAAAGCAA +>451|TRAV1-1 ENST00000542354|TRAV1-1|5'UTR|TR|TRA|None|00 +CTTCTGCAGACTACAGTGGCTCAGGAACCGGGGATGCAGTGCCAGGCTCATGGTATCCTGCAGCAG +>452|TRAV1-1 ENST00000542354|TRAV1-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGCTTTCCTTCTCTATGTTTCCATGAAGATGGGAGGCACTGCAGGACAAAGCCTTGAGCAGCCCTCTGAAGTGACAGCTGTGGAAGGAGCCATTGTCCAGATAAACTGCACGTACCAGACATCTGGGTTTTATGGGCTGTCCTGGTACCAGCAACATGATGGCGGAGCACCCACATTTCTTTCTTACAATGCTCTGGATGGTTTGGAGGAGACAGGTCGTTTTTCTTCATTCCTTAGTCGCTCTGATAGTTATGGTTACCTCCTTCTACAGGAGCTCCAGATGAAAGACTCTGCCTCTTACTTCTGCGCTGTGAGAGA +>453|TRAV1-2 ENST00000390423|TRAV1-2|5'UTR|TR|TRA|None|00 +CCCACATGAAGTGTCTACCTTCTGCAGACTCCAATGGCTCAGGAACTGGGAATGCAGTGCCAGGCTCGTGGTATCCTGCAGCAG +>454|TRAV1-2 ENST00000390423|TRAV1-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGTTTTCCTTCTTTATGTTTCCATGAAGATGGGAGGCACTACAGGACAAAACATTGACCAGCCCACTGAGATGACAGCTACGGAAGGTGCCATTGTCCAGATCAACTGCACGTACCAGACATCTGGGTTCAACGGGCTGTTCTGGTACCAGCAACATGCTGGCGAAGCACCTACATTTCTGTCTTACAATGTTCTGGATGGTTTGGAGGAGAAAGGTCGTTTTTCTTCATTCCTTAGTCGGTCTAAAGGGTACAGTTACCTCCTTTTGAAGGAGCTCCAGATGAAAGACTCTGCCTCTTACCTCTGTGCT +>455|TRAV10 ENST00000390432|TRAV10|5'UTR|TR|TRA|None|00 +AGTCAACTTCTGGGAGCAGATCTCTGCAGAATAAAA +>456|TRAV10 ENST00000390432|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCATCTGACGACCTTCTTGGTGATTTTGTGGCTTTATTTTTATAGGGGGAATGGCAAAAACCAAGTGGAGCAGAGTCCTCAGTCCCTGATCATCCTGGAGGGAAAGAACTGCACTCTTCAATGCAATTATACAGTGAGCCCCTTCAGCAACTTAAGGTGGTATAAGCAAGATACGGGGAGAGGTCCTGTTTCCCTGACAATCATGACTTTCAGTGAGAACACAAAGTCGAACGGAAGATATACAGCAACTCTGGATGCAGACACAAAGCAAAGCTCTCTGCACATCACAGCCTCCCAGCTCAGCGATTCAGCCTCCTACATCTGTGTGGTGAGCG +>457|TRAV12-1 ENST00000390433|TRAV12-1|5'UTR|TR|TRA|None|00 +ATG +>458|TRAV12-1 ENST00000390433|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGATATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACGGAAGGAGGTGGAGCAGGATCCTGGACCCTTCAATGTTCCAGAGGGAGCCACTGTCGCTTTCAACTGTACTTACAGCAACAGTGCTTCTCAGTCTTTCTTCTGGTACAGACAGGATTGCAGGAAAGAACCTAAGTTGCTGATGTCCGTATACTCCAGTGGTAATGAAGATGGAAGGTTTACAGCACAGCTCAATAGAGCCAGCCAGTATATTTCCCTGCTCATCAGAGACTCCAAGCTCAGTGATTCAGCCACCTACCTCTGTGTGGTGAACA +>459|TRAV12-2 ENST00000390437|TRAV12-2|5'UTR|TR|TRA|None|00 +AAAGCAGATTCTTTTTATGATTTTTAAAGTAGAAATATCCATTCTAGGTGCATTTTTTAAGGGTTTAAAATTTGAATCCTCAGTGAACCAGGGCAGAGAAGAATG +>460|TRAV12-2 ENST00000390437|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGAGTTTTACTAGTGATCCTGTGGCTTCAGTTGAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGAATTCTGGACCCCTCAGTGTTCCAGAGGGAGCCATTGCCTCTCTCAACTGCACTTACAGTGACCGAGGTTCCCAGTCCTTCTTCTGGTACAGACAATATTCTGGGAAAAGCCCTGAGTTGATAATGTTCATATACTCCAATGGTGACAAAGAAGATGGAAGGTTTACAGCACAGCTCAATAAAGCCAGCCAGTATGTTTCTCTGCTCATCAGAGACTCCCAGCCCAGTGATTCAGCCACCTACCTCTGTGCCGTGAACA +>461|TRAV12-3 ENST00000390442|TRAV12-3|5'UTR|TR|TRA|None|00 +ATTATTTTTTTTTCGTGTTTAAGGTTTGAATCCTCAGTGAACCAGGGCAGAAAAGA +>462|TRAV12-3 ENST00000390442|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGGATCCTGGACCACTCAGTGTTCCAGAGGGAGCCATTGTTTCTCTCAACTGCACTTACAGCAACAGTGCTTTTCAATACTTCATGTGGTACAGACAGTATTCCAGAAAAGGCCCTGAGTTGCTGATGTACACATACTCCAGTGGTAACAAAGAAGATGGAAGGTTTACAGCACAGGTCGATAAATCCAGCAAGTATATCTCCTTGTTCATCAGAGACTCACAGCCCAGTGATTCAGCCACCTACCTCTGTGCAATGAGCG +>463|TRAV13-1 ENST00000390436|TRAV13-1|5'UTR|TR|TRA|None|00 +GATCTTAATTGGGAAGAACAAGG +>464|TRAV13-1 ENST00000390436|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACATCCATTCGAGCTGTATTTATATTCCTGTGGCTGCAGCTGGACTTGGTGAATGGAGAGAATGTGGAGCAGCATCCTTCAACCCTGAGTGTCCAGGAGGGAGACAGCGCTGTTATCAAGTGTACTTATTCAGACAGTGCCTCAAACTACTTCCCTTGGTATAAGCAAGAACTTGGAAAAGGACCTCAGCTTATTATAGACATTCGTTCAAATGTGGGCGAAAAGAAAGACCAACGAATTGCTGTTACATTGAACAAGACAGCCAAACATTTCTCCCTGCACATCACAGAGACCCAACCTGAAGACTCGGCTGTCTACTTCTGTGCAGCAAGTA +>465|TRAV13-2 ENST00000390439|TRAV13-2|5'UTR|TR|TRA|None|00 +CGATGATGGAAGTAGCTCTTATGGCTGGAGATTGCAGGTTTATGACTGATCCTATTTGGGAAGAACAATG +>466|TRAV13-2 ENST00000390439|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCAGGCATTCGAGCTTTATTTATGTACTTGTGGCTGCAGCTGGACTGGGTGAGCAGAGGAGAGAGTGTGGGGCTGCATCTTCCTACCCTGAGTGTCCAGGAGGGTGACAACTCTATTATCAACTGTGCTTATTCAAACAGCGCCTCAGACTACTTCATTTGGTACAAGCAAGAATCTGGAAAAGGTCCTCAATTCATTATAGACATTCGTTCAAATATGGACAAAAGGCAAGGCCAAAGAGTCACCGTTTTATTGAATAAGACAGTGAAACATCTCTCTCTGCAAATTGCAGCTACTCAACCTGGAGACTCAGCTGTCTACTTTTGTGCAGAGAATA +>467|TRAV14/DV4 ENST00000390440|TRAV14/DV4|5'UTR|TR|TRA|None|00 +GCCAGGTTCACTTCACAGTACAGAGTCCTGAAAATAAAGAAGAAAATTTTTTTTTATCTAGAAAAAGAACCAAAC +>468|TRAV14/DV4 ENST00000390440|TRAV14/DV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGTCACTTTCTAGCCTGCTGAAGGTGGTCACAGCTTCACTGTGGCTAGGACCTGGCATTGCCCAGAAGATAACTCAAACCCAACCAGGAATGTTCGTGCAGGAAAAGGAGGCTGTGACTCTGGACTGCACATATGACACCAGTGATCCAAGTTATGGTCTATTCTGGTACAAGCAGCCCAGCAGTGGGGAAATGATTTTTCTTATTTATCAGGGGTCTTATGACCAGCAAAATGCAACAGAAGGTCGCTACTCATTGAATTTCCAGAAGGCAAGAAAATCCGCCAACCTTGTCATCTCCGCTTCACAACTGGGGGACTCAGCAATGTACTTCTGTGCAATGAGAGAGGG +>469|TRAV16 ENST00000390444|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCCCACCCTCATCTCAGTGCTTGTGATAATATTTATACTCAGAGGAACAAGAGCCCAGAGAGTGACTCAGCCCGAGAAGCTCCTCTCTGTCTTTAAAGGGGCCCCAGTGGAGCTGAAGTGCAACTATTCCTATTCTGGGAGTCCTGAACTCTTCTGGTATGTCCAGTACTCCAGACAACGCCTCCAGTTACTCTTGAGACACATCTCTAGAGAGAGCATCAAAGGCTTCACTGCTGACCTTAACAAAGGCGAGACATCTTTCCACCTGAAGAAACCATTTGCTCAAGAGGAAGACTCAGCCATGTATTACTGTGCTCTAAGTGG +>470|TRAV17 ENST00000390445|TRAV17|5'UTR|TR|TRA|None|00 +AGGACTGAGCTTGCCTGTGACTGGCTAGGGAGGAACCTGAGACTAGGGGACAGAAAGACTAGGGATTCACCCAGTAAAGAGAGCTCATCTGTGACTGAGGAGCCTTGCTCCATTTCAGGTCTTCTGTGATTTCAATAAGGAAGAAGA +>471|TRAV17 ENST00000390445|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAAACTCTCCTGGGAGTGTCTTTGGTGATTCTATGGCTTCAACTGGCTAGGGTGAACAGTCAACAGGGAGAAGAGGATCCTCAGGCCTTGAGCATCCAGGAGGGTGAAAATGCCACCATGAACTGCAGTTACAAAACTAGTATAAACAATTTACAGTGGTATAGACAAAATTCAGGTAGAGGCCTTGTCCACCTAATTTTAATACGTTCAAATGAAAGAGAGAAACACAGTGGAAGATTAAGAGTCACGCTTGACACTTCCAAGAAAAGCAGTTCCTTGTTGATCACGGCTTCCCGGGCAGCAGACACTGCTTCTTACTTCTGTGCTACGGACG +>472|TRAV18 ENST00000390446|TRAV18|5'UTR|TR|TRA|None|00 +GATTTTGTAGAAGATTCCGCCAAAGACTCAACAACATAAAGAAATATATATACCTTTCGGTTTGGATATCTCTCAACAAAACCTTCTACTGCTTCTCAGCCAGCC +>473|TRAV18 ENST00000390446|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGTCTGCTTCCTGCTCAGGACTTGTGATCTTGTTGATATTCAGAAGGACCAGTGGAGACTCGGTTACCCAGACAGAAGGCCCAGTTACCCTCCCTGAGAGGGCAGCTCTGACATTAAACTGCACTTATCAGTCCAGCTATTCAACTTTTCTATTCTGGTATGTCCAGTATCTAAACAAAGAGCCTGAGCTCCTCCTGAAAAGTTCAGAAAACCAGGAGACGGACAGCAGAGGTTTTCAGGCCAGTCCTATCAAGAGTGACAGTTCCTTCCACCTGGAGAAGCCCTCGGTGCAGCTGTCGGACTCTGCCGTGTACTACTGCGCTCTGAGAGA +>474|TRAV19 ENST00000390447|TRAV19|5'UTR|TR|TRA|None|00 +CAGAAGCCTCACACAGCCCAGTAACTTTGCTAGTACCTCTTGAGTGCAAGGTGGAGAATTAAGATCTGGATTTGAGACGGAGCACGGAACATTTCACTCAGGGGAAGAGCTATGAAC +>475|TRAV19 ENST00000390447|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGACTGCCAGCCTGTTGAGGGCAGTCATAGCCTCCATCTGTGTTGTATCCAGCATGGCTCAGAAGGTAACTCAAGCGCAGACTGAAATTTCTGTGGTGGAGAAGGAGGATGTGACCTTGGACTGTGTGTATGAAACCCGTGATACTACTTATTACTTATTCTGGTACAAGCAACCACCAAGTGGAGAATTGGTTTTCCTTATTCGTCGGAACTCTTTTGATGAGCAAAATGAAATAAGTGGTCGGTATTCTTGGAACTTCCAGAAATCCACCAGTTCCTTCAACTTCACCATCACAGCCTCACAAGTCGTGGACTCAGCAGTATACTTCTGTGCTCTGAGTGAGGC +>476|TRAV2 ENST00000390424|TRAV2|5'UTR|TR|TRA|None|00 +CATTTTGGCC +>477|TRAV2 ENST00000390424|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTGCAGAGCACTCTGGGGGCGGTGTGGCTAGGGCTTCTCCTCAACTCTCTCTGGAAGGTTGCAGAAAGCAAGGACCAAGTGTTTCAGCCTTCCACAGTGGCATCTTCAGAGGGAGCTGTGGTGGAAATCTTCTGTAATCACTCTGTGTCCAATGCTTACAACTTCTTCTGGTACCTTCACTTCCCGGGATGTGCACCAAGACTCCTTGTTAAAGGCTCAAAGCCTTCTCAGCAGGGACGATACAACATGACCTATGAACGGTTCTCTTCATCGCTGCTCATCCTCCAGGTGCGGGAGGCAGATGCTGCTGTTTACTACTGTGCTGTGGAGGA +>478|TRAV20 ENST00000390448|TRAV20|5'UTR|TR|TRA|None|00 +ACAGAAGTGGCGCCTCTGAGAAAAGAAGGTTGGAATTATCGTAATTTGTTTCTAGGCTGAGATACCAGC +>479|TRAV20 ENST00000390448|TRAV20|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAAATGTTGGAGTGTGCATTCATAGTCTTGTGGCTTCAGCTTGGCTGGTTGAGTGGAGAAGACCAGGTGACGCAGAGTCCCGAGGCCCTGAGACTCCAGGAGGGAGAGAGTAGCAGTCTCAACTGCAGTTACACAGTCAGCGGTTTAAGAGGGCTGTTCTGGTATAGGCAAGATCCTGGGAAAGGCCCTGAATTCCTCTTCACCCTGTATTCAGCTGGGGAAGAAAAGGAGAAAGAAAGGCTAAAAGCCACATTAACAAAGAAGGAAAGCTTTCTGCACATCACAGCCCCTAAACCTGAAGACTCAGCCACTTATCTCTGTGCTGTGCAGG +>480|TRAV21 ENST00000390449|TRAV21|5'UTR|TR|TRA|None|00 +AGAAGGA +>481|TRAV21 ENST00000390449|TRAV21|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACCCTCTTGGGCCTGCTTATCCTTTGGCTGCAGCTGCAATGGGTGAGCAGCAAACAGGAGGTGACGCAGATTCCTGCAGCTCTGAGTGTCCCAGAAGGAGAAAACTTGGTTCTCAACTGCAGTTTCACTGATAGCGCTATTTACAACCTCCAGTGGTTTAGGCAGGACCCTGGGAAAGGTCTCACATCTCTGTTGCTTATTCAGTCAAGTCAGAGAGAGCAAACAAGTGGAAGACTTAATGCCTCGCTGGATAAATCATCAGGACGTAGTACTTTATACATTGCAGCTTCTCAGCCTGGTGACTCAGCCACCTACCTCTGTGCTGTGAGG +>482|TRAV22 ENST00000390450|TRAV22|5'UTR|TR|TRA|None|00 +GGCTTTGTCGGGTGGAGCTGATTGGTTGCAGGAGCAGCAACAGTTCCAGAGCCAAGTCATGACACCGACCTCCCCAAGGTTTAGTTAAATATATCTTATGGTGAAAATGCCCGGAGCAAGAAGGCAAAGCATC +>483|TRAV22 ENST00000390450|TRAV22|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGATATTGGGAGCTCTGCTGGGGCTCTTGAGTGCCCAGGTTTGCTGTGTGAGAGGAATACAAGTGGAGCAGAGTCCTCCAGACCTGATTCTCCAGGAGGGAGCCAATTCCACGCTGCGGTGCAATTTTTCTGACTCTGTGAACAATTTGCAGTGGTTTCATCAAAACCCTTGGGGACAGCTCATCAACCTGTTTTACATTCCCTCAGGGACAAAACAGAATGGAAGATTAAGCGCCACGACTGTCGCTACGGAACGCTACAGCTTATTGTACATTTCCTCTTCCCAGACCACAGACTCAGGCGTTTATTTCTGTGCTGTGGAGC +>484|TRAV23/DV6 ENST00000390451|TRAV23/DV6|5'UTR|TR|TRA|None|00 +CTGGAAGACCACCTGGGCTGTCATTGAGCTCTGGTGCCAGGAGGA +>485|TRAV23/DV6 ENST00000390451|TRAV23/DV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCTTAGGAGCATCATTTTTAGTTCTGTGGCTTCAACTATGCTGGGTGAGTGGCCAACAGAAGGAGAAAAGTGACCAGCAGCAGGTGAAACAAAGTCCTCAATCTTTGATAGTCCAGAAAGGAGGGATTTCAATTATAAACTGTGCTTATGAGAACACTGCGTTTGACTACTTTCCATGGTACCAACAATTCCCTGGGAAAGGCCCTGCATTATTGATAGCCATACGTCCAGATGTGAGTGAAAAGAAAGAAGGAAGATTCACAATCTCCTTCAATAAAAGTGCCAAGCAGTTCTCATCGCATATCATGGATTCCCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGCA +>486|TRAV24 ENST00000390453|TRAV24|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGAATCCTTTGGCAGCCCCATTACTAATCCTCTGGTTTCATCTTGACTGCGTGAGCAGCATACTGAACGTGGAACAAAGTCCTCAGTCACTGCATGTTCAGGAGGGAGACAGCACCAATTTCACCTGCAGCTTCCCTTCCAGCAATTTTTATGCCTTACACTGGTACAGATGGGAAACTGCAAAAAGCCCCGAGGCCTTGTTTGTAATGACTTTAAATGGGGATGAAAAGAAGAAAGGACGAATAAGTGCCACTCTTAATACCAAGGAGGGTTACAGCTATTTGTACATCAAAGGATCCCAGCCTGAAGACTCAGCCACATACCTCTGTGCCTTTA +>487|TRAV25 ENST00000390454|TRAV25|5'UTR|TR|TRA|None|00 +ACTATTTCTATTGATCTGGAAGAAGCTTGTACCAGGCAACCCATTTAGGAGAAGTTGGATGAAGAGGGAGAGGGAG +>488|TRAV25 ENST00000390454|TRAV25|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTACTCATCACATCAATGTTGGTCTTATGGATGCAATTGTCACAGGTGAATGGACAACAGGTAATGCAAATTCCTCAGTACCAGCATGTACAAGAAGGAGAGGACTTCACCACGTACTGCAATTCCTCAACTACTTTAAGCAATATACAGTGGTATAAGCAAAGGCCTGGTGGACATCCCGTTTTTTTGATACAGTTAGTGAAGAGTGGAGAAGTGAAGAAGCAGAAAAGACTGACATTTCAGTTTGGAGAAGCAAAAAAGAACAGCTCCCTGCACATCACAGCCACCCAGACTACAGATGTAGGAACCTACTTCTGTGCAGGG +>489|TRAV26-1 ENST00000390455|TRAV26-1|5'UTR|TR|TRA|None|00 +AGGAACATGACTAAACCTGGGGAGGAAGACATAGAAAAGCAACTGCTCTATCATTGGCTGACAAGATCCTGACAACAACACAATGAGAGCTGCACTCCTTGCAAGTCTTTACTAGTAGCTGTTGCTTCTGTTCTCTGGAAATTCTTTAAACCTAGAATCAGACACAAAAACTGAACTCTGGGTCCACAATCCTCATTTGTCCTTGAAGT +>490|TRAV26-1 ENST00000390455|TRAV26-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCTGGTGGCAAGAGTAACTGTGTTTCTGACCTTTGGAACTATAATTGATGCTAAGACCACCCAGCCCACCTCCATGGATTGCGCTGAAGGAAGAGCTGCAAACCTGCCTTGTAATCACTCTACCATCAGTGGAAATGAGTATGTGTATTGGTATCGACAGATTCACTCCCAGGGGCCACAGTATATCATTCATGGTCTAAAAAACAATGAAACCAATGAAATGGCCTCTCTGATCATCACAGAAGACAGAAAGTCCAGCACCTTGATCCTGCCCCACGCTACGCTGAGAGACACTGCTGTGTACTATTGCATCGTCAGAGTCG +>491|TRAV26-2 ENST00000390460|TRAV26-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTTGGTGACAAGCATTACTGTACTCCTATCTTTGGGTATTATGGGTGATGCTAAGACCACACAGCCAAATTCAATGGAGAGTAACGAAGAAGAGCCTGTTCACTTGCCTTGTAACCACTCCACAATCAGTGGAACTGATTACATACATTGGTATCGACAGCTTCCCTCCCAGGGTCCAGAGTACGTGATTCATGGTCTTACAAGCAATGTGAACAACAGAATGGCCTCTCTGGCAATCGCTGAAGACAGAAAGTCCAGTACCTTGATCCTGCACCGTGCTACCTTGAGAGATGCTGCTGTGTACTACTGCATCCTGAGAGAC +>492|TRAV27 ENST00000390457|TRAV27|5'UTR|TR|TRA|None|00 +AAGCACTCTTCTAGCCCAGAGAAGTCTGTTCCAGGACGGGCTCTTTCAGGAGCAGCTAAAGTCAGGGGCCATGTCCACCATGTGATAGAAAGACAAG +>493|TRAV27 ENST00000390457|TRAV27|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTCCTGAAATTCTCCGTGTCCATTCTTTGGATTCAGTTGGCATGGGTGAGCACCCAGCTGCTGGAGCAGAGCCCTCAGTTTCTAAGCATCCAAGAGGGAGAAAATCTCACTGTGTACTGCAACTCCTCAAGTGTTTTTTCCAGCTTACAATGGTACAGACAGGAGCCTGGGGAAGGTCCTGTCCTCCTGGTGACAGTAGTTACGGGTGGAGAAGTGAAGAAGCTGAAGAGACTAACCTTTCAGTTTGGTGATGCAAGAAAGGACAGTTCTCTCCACATCACTGCAGCCCAGACTGGTGATACAGGCCTCTACCTCTGTGCAGGAG +>494|TRAV29/DV5 ENST00000390458|TRAV29/DV5|5'UTR|TR|TRA|None|00 +ATATGTAAAATGAAGGGTCTGTGGAAGGACATGAATAAAGCACAGGAGGTTGAAGTCAGATTTGCAGCTTTCTAGGCAGGAGATAAGACAATCTGCATCTTCACAGGAGGG +>495|TRAV29/DV5 ENST00000390458|TRAV29/DV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCATGCTCCTGGGGGCATCAGTGCTGATTCTGTGGCTTCAGCCAGACTGGGTAAACAGTCAACAGAAGAATGATGACCAGCAAGTTAAGCAAAATTCACCATCCCTGAGCGTCCAGGAAGGAAGAATTTCTATTCTGAACTGTGACTATACTAACAGCATGTTTGATTATTTCCTATGGTACAAAAAATACCCTGCTGAAGGTCCTACATTCCTGATATCTATAAGTTCCATTAAGGATAAAAATGAAGATGGAAGATTCACTGTTTTCTTAAACAAAAGTGCCAAGCACCTCTCTCTGCACATTGTGCCCTCCCAGCCTGGAGACTCTGCAGTGTACTTCTGTGCAGCAAGCG +>496|TRAV3 ENST00000390425|TRAV3|5'UTR|TR|TRA|None|00 +CCGGTGTCGGGAAGCACCAGTGCCCTGAGGAAGGGCCATTTCCAAAAGCCCTGTGCTGACACAGGGTTGCTGGTTCCTCTTCAAGAGCCCACTCTCTGGGGTGGGGCCATATCTCCAGCAGAGGTGGGCTGGAAAGGACCCCCCCAATCCCGCCCGCCGTGAGCTTAGCTGGAGCC +>497|TRAV3 ENST00000390425|TRAV3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCTCTGCACCCATCTCGATGCTTGCGATGCTCTTCACATTGAGTGGGCTGAGAGCTCAGTCAGTGGCTCAGCCGGAAGATCAGGTCAACGTTGCTGAAGGGAATCCTCTGACTGTGAAATGCACCTATTCAGTCTCTGGAAACCCTTATCTTTTTTGGTATGTTCAATACCCCAACCGAGGCCTCCAGTTCCTTCTGAAATACATCACAGGGGATAACCTGGTTAAAGGCAGCTATGGCTTTGAAGCTGAATTTAACAAGAGCCAAACCTCCTTCCACCTGAAGAAACCATCTGCCCTTGTGAGCGACTCCGCTTTGTACTTCTGTGCTGTGAGAGACA +>498|TRAV30 ENST00000557168|TRAV30|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTCTCCTGAAAGTGCTTTCAGGCACCTTGTTGTGGCAGTTGACCTGGGTGAGAAGCCAACAACCAGTGCAGAGTCCTCAAGCCGTGATCCTCCGAGAAGGGGAAGATGCTGTCATCAACTGCAGTTCCTCCAAGGCTTTATATTCTGTACACTGGTACAGGCAGAAGCATGGTGAAGCACCCGTCTTCCTGATGATATTACTGAAGGGTGGAGAACAGAAGGGTCATGACAAAATATCTGCTTCATTTAATGAAAAAAAGCAGCAAAGCTCCCTGTACCTTACGGCCTCCCAGCTCAGTTACTCAGGAACCTACTTCTGCGGCACAGAGA +>499|TRAV34 ENST00000390461|TRAV34|5'UTR|TR|TRA|None|00 +AATAGCTAAGGG +>500|TRAV34 ENST00000390461|TRAV34|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTGTTCTGCAAGTACTCCTAGGGATATTGGGGTTCCAAGCAGCCTGGGTCAGTAGCCAAGAACTGGAGCAGAGTCCTCAGTCCTTGATCGTCCAAGAGGGAAAGAATCTCACCATAAACTGCACGTCATCAAAGACGTTATATGGCTTATACTGGTATAAGCAAAAGTATGGTGAAGGTCTTATCTTCTTGATGATGCTACAGAAAGGTGGGGAAGAGAAAAGTCATGAAAAGATAACTGCCAAGTTGGATGAGAAAAAGCAGCAAAGTTCCCTGCATATCACAGCCTCCCAGCCCAGCCATGCAGGCATCTACCTCTGTGGAGCAGACA +>501|TRAV35 ENST00000390462|TRAV35|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTTGAACATTTATTAATAATCTTGTGGATGCAGCTGACATGGGTCAGTGGTCAACAGCTGAATCAGAGTCCTCAATCTATGTTTACCCAGGAAGGAGAAGATGTCTCCATGAACTGCACTTCTTCAAGCATATTTAACACCTGACTATGGTACAAGCAGGACCCTGGGGAAGGTCCTGTCCTCTTGATAGCCTTATATAAGGCTGGTGAATTGACCTCAAATGGAAGACTGACTGCTCAGTTTGGTATAACCAGAAAGGACAGCTTCCTGAATATCTCAGCATCCATACCTAGTGATGTAGGCATCTACTTCTGTGCTGGGCAG +>502|TRAV36/DV7 ENST00000390463|TRAV36/DV7|5'UTR|TR|TRA|None|00 +ACTTGATAACTGAAGG +>503|TRAV36/DV7 ENST00000390463|TRAV36/DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAGTGTCCACAGGCTTTACTAGCTATCTTTTGGCTTCTACTGAGCTGGGTGAGCAGTGAAGACAAGGTGGTACAAAGCCCTCTATCTCTGGTTGTCCACGAGGGAGACACCGTAACTCTCAATTGCAGTTATGAAGTGACTAACTTTCGAAGCCTACTATGGTACAAGCAGGAAAAGAAAGCTCCCACATTTCTATTTATGCTAACTTCAAGTGGAATTGAAAAGAAGTCAGGAAGACTAAGTAGCATATTAGATAAGAAAGAACTTTTCAGCATCCTGAACATCACAGCCACCCAGACCGGAGACTCGGCCATCTACCTCTGTGCTGTGGAGG +>504|TRAV38-1 ENST00000390464|TRAV38-1|5'UTR|TR|TRA|None|00 +AGC +>505|TRAV38-1 ENST00000390464|TRAV38-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACACGAGTTAGCTTGCTGTGGGCAGTCGTGGTCTCCACCTGTCTTGAATCCGGCATGGCCCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACTGTGACCCTGAGTTGCACATATGACACCAGTGAGAATAATTATTATTTGTTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACGGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGACACTGCGATGTATTTCTGTGCTTTCATGAAGCA +>506|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|5'UTR|TR|TRA|None|00 +AGATCAGAAGAGGAGGCTTCTCACCCTGCAGCAGGGACCTGTGAGC +>507|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCATGCCCTGGCTTCCTGTGGGCACTTGTGATCTCCACCTGTCTTGAATTTAGCATGGCTCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACCGTGACCCTGAGCTGCACATATGACACCAGTGAGAGTGATTATTATTTATTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACAGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGATGCCGCGATGTATTTCTGTGCTTATAGGAGCG +>508|TRAV39 ENST00000390466|TRAV39|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAAGCTACTAGCAATGATTCTGTGGCTTCAACTAGACCGGTTAAGTGGAGAGCTGAAAGTGGAACAAAACCCTCTGTTCCTGAGCATGCAGGAGGGAAAAAACTATACCATCTACTGCAATTATTCAACCACTTCAGACAGACTGTATTGGTACAGGCAGGATCCTGGGAAAAGTCTGGAATCTCTGTTTGTGTTGCTATCAAATGGAGCAGTGAAGCAGGAGGGACGATTAATGGCCTCACTTGATACCAAAGCCCGTCTCAGCACCCTCCACATCACAGCTGCCGTGCATGACCTCTCTGCCACCTACTTCTGTGCCGTGGACA +>509|TRAV4 ENST00000390426|TRAV4|5'UTR|TR|TRA|None|00 +CTGGGCTCATTGCAGCTCAGACACAGCAAAAGAGCCTAGAACCTGGGTCCTAGTTTGCACCTAGAAT +>510|TRAV4 ENST00000390426|TRAV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCAAGTGGCGAGAGTGATCGTGTTCCTGACCCTGAGTACTTTGAGCCTTGCTAAGACCACCCAGCCCATCTCCATGGACTCATATGAAGGACAAGAAGTGAACATAACCTGTAGCCACAACAACATTGCTACAAATGATTATATCACGTGGTACCAACAGTTTCCCAGCCAAGGACCACGATTTATTATTCAAGGATACAAGACAAAAGTTACAAACGAAGTGGCCTCCCTGTTTATCCCTGCCGACAGAAAGTCCAGCACTCTGAGCCTGCCCCGGGTTTCCCTGAGCGACACTGCTGTGTACTACTGCCTCGTGGGTGACA +>511|TRAV40 ENST00000390467|TRAV40|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCCTCTCTGGACTTTCTAATTCTGATCTTAATGTTTGGAGGAACCAGCAGCAATTCAGTCAAGCAGACGGGCCAAATAACCGTCTCGGAGGGAGCATCTGTGACTATGAACTGCACATACACATCCACGGGGTACCCTACCCTTTTCTGGTATGTGGAATACCCCAGCAAACCTCTGCAGCTTCTTCAGAGAGAGACAATGGAAAACAGCAAAAACTTCGGAGGCGGAAATATTAAAGACAAAAACTCCCCCATTGTGAAATATTCAGTCCAGGTATCAGACTCAGCCGTGTACTACTGTCTTCTGGGAGA +>512|TRAV41 ENST00000390468|TRAV41|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTGAAGATCCGGCAATTTTTGTTGGCTATTTTGTGGCTTCAGCTAAGCTGTGTAAGTGCCGCCAAAAATGAAGTGGAGCAGAGTCCTCAGAACCTGACTGCCCAGGAAGGAGAATTTATCACAATCAACTGCAGTTACTCGGTAGGAATAAGTGCCTTACACTGGCTGCAACAGCATCCAGGAGGAGGCATTGTTTCCTTGTTTATGCTGAGCTCAGGGAAGAAGAAGCATGGAAGATTAATTGCCACAATAAACATACAGGAAAAGCACAGCTCCCTGCACATCACAGCCTCCCATCCCAGAGACTCTGCCGTCTACATCTGTGCTGTCAGA +>513|TRAV5 ENST00000390427|TRAV5|5'UTR|TR|TRA|None|00 +GTGGGGAGAACA +>514|TRAV5 ENST00000390427|TRAV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATTTGCTGGATTTTCGTTCCTGTTTTTGTGGCTGCAGCTGGACTGTATGAGTAGAGGAGAGGATGTGGAGCAGAGTCTTTTCCTGAGTGTCCGAGAGGGAGACAGCTCCGTTATAAACTGCACTTACACAGACAGCTCCTCCACCTACTTATACTGGTATAAGCAAGAACCTGGAGCAGGTCTCCAGTTGCTGACGTATATTTTTTCAAATATGGACATGAAACAAGACCAAAGACTCACTGTTCTATTGAATAAAAAGGATAAACATCTGTCTCTGCGCATTGCAGACACCCAGACTGGGGACTCAGCTATCTACTTCTGTGCAGAGAGTA +>515|TRAV6 ENST00000390428|TRAV6|5'UTR|TR|TRA|None|00 +AAACAGA +>516|TRAV6 ENST00000390428|TRAV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTTTGGCTGAGAAGCCTGGGTCTACATTTCAGGCCACATTTGGGGAGACGAATGGAGTCATTCCTGGGAGGTGTTTTGCTGATTTTGTGGCTTCAAGTGGACTGGGTGAAGAGCCAAAAGATAGAACAGAATTCCGAGGCTCTGAACATTCAGGAGGGTAAAACGGCCACCCTGACCTGCAACTATACAAACTATTCTCCAGCATACTTACAGTGGTACCGACAAGATCCAGGAAGAGGCCCTGTTTTCTTGCTACTCATACGTGAAAATGAGAAAGAAAAAAGGAAAGAAAGACTGAAGGTCACCTTTGATACCACCCTTAAACAGAGTTTGTTTCATATCACAGCCTCCCAGCCTGCAGACTCAGCTACCTACCTCTGTGCTCTAGACA +>517|TRAV7 ENST00000390429|TRAV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGATGCGGAGACCTGTCCTAATTATATTTTGTCTATGTCTTGGCTGGGCAAATGGAGAAAACCAGGTGGAGCACAGCCCTCATTTTCTGGGACCCCAGCAGGGAGACGTTGCCTCCATGAGCTGCACGTACTCTGTCAGTCGTTTTAACAATTTGCAGTGGTACAGGCAAAATACAGGGATGGGTCCCAAACACCTATTATCCATGTATTCAGCTGGATATGAGAAGCAGAAAGGAAGACTAAATGCTACATTACTGAAGAATGGAAGCAGCTTGTACATTACAGCCGTGCAGCCTGAAGATTCAGCCACCTATTTCTGTGCTGTAGATG +>518|TRAV8-1 ENST00000390430|TRAV8-1|5'UTR|TR|TRA|None|00 +CCAAAACAAGAGACTTGCCTAGCCCAACCTTCCTCACGCTCGCTATTCTCAAGACCTGGGTTCCAGCCACTTTCCTACTGGCCCCGAGGAGAATTTCCAAAGAGACGCCTGCAGTGTTTCCACAGCTCAGCC +>519|TRAV8-1 ENST00000390430|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGTTGCTCATACCAGTGCTGGGGATGATTTTTGCCCTGAGAGATGCCAGAGCCCAGTCTGTGAGCCAGCATAACCACCACGTAATTCTCTCTGAAGCAGCCTCACTGGAGTTGGGATGCAACTATTCCTATGGTGGAACTGTTAATCTCTTCTGGTATGTCCAGTACCCTGGTCAACACCTTCAGCTTCTCCTCAAGTACTTTTCAGGGGATCCACTGGTTAAAGGCATCAAGGGCTTTGAGGCTGAATTTATAAAGAGTAAATTCTCCTTTAATCTGAGGAAACCCTCTGTGCAGTGGAGTGACACAGCTGAGTACTTCTGTGCCGTGAATGC +>520|TRAV8-2 ENST00000390434|TRAV8-2|5'UTR|TR|TRA|None|00 +GGCTGATGTAGCTCACTGATGTCTGTGTAGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGACTCCTTAAGAGAAAGCCTTTCTGTTTTGGAAACTTTTCAAAGCCAGGGACTTGTCCAGCCCAACCTCCCCATTGCTCCTAGCTCCCGAGGCTCAGGACCCCTGGCTTCTGTCCTCCCTGCTCAGGGTCCTGCAGCGTTGCCTCTGCTCAGCC +>521|TRAV8-2 ENST00000390434|TRAV8-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGACAGCCACGTCTCTGTCTCTGAAGGAACCCCGGTGCTGCTGAGGTGCAACTACTCATCTTCTTATTCACCGTCTCTCTTCTGGTATGTGCAACACCCCAACAAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGTTGTGAGTGA +>522|TRAV8-3 ENST00000390435|TRAV8-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGAGCTTATCCCACTGCTGGGGATACATTTTGTCCTGAGAACTGCCAGAGCCCAGTCAGTGACCCAGCCTGACATCCACATCACTGTCTCTGAAGGAGCCTCACTGGAGTTGAGATGTAACTATTCCTATGGGGCAACACCTTATCTCTTCTGGTATGTCCAGTCCCCCGGCCAAGGCCTCCAGCTGCTCCTGAAGTACTTTTCAGGAGACACTCTGGTTCAAGGCATTAAAGGCTTTGAGGCTGAATTTAAGAGGAGTCAATCTTCCTTCAATCTGAGGAAACCCTCTGTGCATTGGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGC +>523|TRAV8-4 ENST00000390438|TRAV8-4|5'UTR|TR|TRA|None|00 +TTTTGAAACCCTTCAAAGGCAGAGACTTGTCCAGCCTAACCTGCCTGCTGCTCCTAGCTCCTGAGGCTCAGGGCCCTTGGCTTCTGTCCGCTCTGCTCAGGGCCCTCCAGCGTGGCCACTGCTCAGCC +>524|TRAV8-4 ENST00000390438|TRAV8-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGGCAGCCACGTCTCTGTCTCTGAAGGAGCCCTGGTTCTGCTGAGGTGCAACTACTCATCGTCTGTTCCACCATATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGCTGTGAGTGA +>525|TRAV8-6 ENST00000390443|TRAV8-6|5'UTR|TR|TRA|None|00 +GTAGCTCGTTGATGTCTGTGTGGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGGCTCCTTAAGGGAAAGCCTCTTTCTGTTTCTGAAACTTTTCAAAGCCAGGGACTTGTCCAATCCAACCTCCTCACAGTTCCTAGCTCCTGAGGCTCAGCGCCCTTGGCTTCTGTCCGCCCAGCTTAAGGTCCTGCAGCATTGCCACTGCTCAGCC +>526|TRAV8-6 ENST00000390443|TRAV8-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGCGTTCCAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCTGTGACCCAGCTTGACAGCCAAGTCCCTGTCTTTGAAGAAGCCCCTGTGGAGCTGAGGTGCAACTACTCATCGTCTGTTTCAGTGTATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTATTTATCAGGATCCACCCTGGTTGAAAGCATCAACGGTTTTGAGGCTGAATTTAACAAGAGTCAAACTTCCTTCCACTTGAGGAAACCCTCAGTCCATATAAGCGACACGGCTGAGTACTTCTGTGCTGTGAGTGA +>527|TRAV8-7 ENST00000390456|TRAV8-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCTTAGTGGTCATTCTGCTGCTTGGAATGTTCTTCACACTGAGTAAAACCCAGTCGGTGACCCAGCTTGATGGCCACATCACTGTCTCTGAAGAAGCCCCTCTGGAACTGAAGTGCAACTATTCCTATAGTGGAGTTCCTTCTCTCTTCTGGTATGTCCAATACTCTAGCCAAAGCCTCCAGCTTCTCCTCAAAGACCTAACAAAGGCCACCCAGGTTAAAGGCATCAGAGGTTTTGAGGCTGAATTTAAGAAGAGCGAAACCTCCTTCTACCTGAGGAAACCATCAACCCATGTGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGACAGGAG +>528|TRAV9-1 ENST00000390431|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATTCTTCTCCAGGACCAGCGATTGCACTATTCTTAATGTTTGGGGGAATCAATGGAGATTCAGTGGTCCAGACAGAAGGCCAAGTGCTCCCCTCTGAAGGGGATTCCCTGATTGTGAACTGCTCCTATGAAACCACACAGTACCCTTCCCTTTTTTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCACCTGAAAGCCATGAAGGCCAATGACAAGGGAAGGAACAAAGGTTTTGAAGCCATGTACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGACTCAGTTCAAGAGTCAGACTCCGCTGTGTACTTCTGTGCTCTGAGTGA +>529|TRAV9-2 ENST00000390441|TRAV9-2|5'UTR|TR|TRA|None|00 +CACTGTGATTTCTTCATGTTAAGGATCAAGACCATTATTTGGGTAACACACTAAAG +>530|TRAV9-2 ENST00000390441|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGGCTTAGTATCTCTGATACTCTTACTGCTTGGAAGAACCCGTGGAGATTCAGTGACCCAGATGGAAGGGCCAGTGACTCTCTCAGAAGAGGCCTTCCTGACTATAAACTGCACGTACACAGCCACAGGATACCCTTCCCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCTACAGCTCCTCCTGAAAGCCACGAAGGCTGATGACAAGGGAAGCAACAAAGGTTTTGAAGCCACATACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGGCTCAGTTCAAGTGTCAGACTCAGCGGTGTACTTCTGTGCTCTGAGTGA +>531|TRBC1 ENST00000633705|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>532|TRBC1 ENST00000632136|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>533|TRBC2 ENST00000466254|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>534|TRBC2 ENST00000622053|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>535|TRBD1 ENST00000631435|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>536|TRBJ1-1 ENST00000634213|TRBJ1-1|J-REGION|TR|TRB|None|00 +TGAACACTGAAGCTTTCTTTGGACAAGGCACCAGACTCACAGTTGTAG +>537|TRBJ1-2 ENST00000631745|TRBJ1-2|J-REGION|TR|TRB|None|00 +CTAACTATGGCTACACCTTCGGTTCGGGGACCAGGTTAACCGTTGTAG +>538|TRBJ1-3 ENST00000633780|TRBJ1-3|J-REGION|TR|TRB|None|00 +CTCTGGAAACACCATATATTTTGGAGAGGGAAGTTGGCTCACTGTTGTAG +>539|TRBJ1-4 ENST00000632041|TRBJ1-4|J-REGION|TR|TRB|None|00 +CAACTAATGAAAAACTGTTTTTTGGCAGTGGAACCCAGCTCTCTGTCTTGG +>540|TRBJ1-5 ENST00000634000|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAGCAATCAGCCCCAGCATTTTGGTGATGGGACTCGACTCTCCATCCTAG +>541|TRBJ1-6 ENST00000632228|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAACGGGACCAGGCTCACTGTGACAG +>542|TRBJ1-6 ENST00000633713|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAATGGGACCAGGCTCACTGTGACAG +>543|TRBJ2-1 ENST00000390412|TRBJ2-1|J-REGION|TR|TRB|None|00 +CTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAG +>544|TRBJ2-2 ENST00000390413|TRBJ2-2|J-REGION|TR|TRB|None|00 +CGAACACCGGGGAGCTGTTTTTTGGAGAAGGCTCTAGGCTGACCGTACTGG +>545|TRBJ2-2P ENST00000390414|TRBJ2-2P|J-REGION|TR|TRB|None|00 +CTGAGAGGCGCTGCTGGGCGTCTGGGCGGAGGACTCCTGGTTCTGG +>546|TRBJ2-3 ENST00000390415|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCG +>547|TRBJ2-4 ENST00000390416|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGCCAAAAACATTCAGTACTTCGGCGCCGGGACCCGGCTCTCAGTGCTGG +>548|TRBJ2-5 ENST00000390417|TRBJ2-5|J-REGION|TR|TRB|None|00 +ACCAAGAGACCCAGTACTTCGGGCCAGGCACGCGGCTCCTGGTGCTCG +>549|TRBJ2-6 ENST00000390418|TRBJ2-6|J-REGION|TR|TRB|None|00 +CTCTGGGGCCAACGTCCTGACTTTCGGGGCCGGCAGCAGGCTGACCGTGCTGG +>550|TRBJ2-7 ENST00000390419|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACTTCGGGCCGGGCACCAGGCTCACGGTCACAG +>551|TRBJ2-7 ENST00000633660|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACGTCGGGCCGGGCACCAGGCTCACGGTCACAG +>552|TRBV10-1 ENST00000390364|TRBV10-1|5'UTR|TR|TRB|None|00 +ACTGAGAGCCCAACTTCAGTCTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>553|TRBV10-1 ENST00000390364|TRBV10-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACGAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGAAATCACCCAGAGCCCAAGACACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGGCGTGTCACCAGACTTGGAACCACAACAATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCCATTACTCATATGGTGTTCACGACACTAACAAAGGAGAAGTCTCAGATGGCTACAGTGTCTCTAGATCAAACACAGAGGACCTCCCCCTCACTCTGGAGTCTGCTGCCTCCTCCCAGACATCTGTATATTTCTGCGCCAGCAGTGAGTC +>554|TRBV10-2 ENST00000426318|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>555|TRBV10-2 ENST00000426318|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTACGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>556|TRBV10-2 ENST00000633575|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>557|TRBV10-2 ENST00000633575|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTATGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>558|TRBV10-3 ENST00000611462|TRBV10-3|5'UTR|TR|TRB|None|00 +ATGAGATCCTGGCCTGGACCTGAA +>559|TRBV10-3 ENST00000611462|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCACCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>560|TRBV10-3 ENST00000631471|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCATCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>561|TRBV11-1 ENST00000390367|TRBV11-1|5'UTR|TR|TRB|None|00 +CCTGCCCTGACCCTGCC +>562|TRBV11-1 ENST00000390367|TRBV11-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCACCAGGCTTCTCTGCTGGATGGCCCTCTGTCTCCTGGGGGCAGAACTCTCAGAAGCTGAAGTTGCCCAGTCCCCCAGATATAAGATTACAGAGAAAAGCCAGGCTGTGGCTTTTTGGTGTGATCCTATTTCTGGCCATGCTACCCTTTACTGGTACCGGCAGATCCTGGGACAGGGCCCGGAGCTTCTGGTTCAATTTCAGGATGAGAGTGTAGTAGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>563|TRBV11-3 ENST00000611787|TRBV11-3|5'UTR|TR|TRB|None|00 +AGTGACCCTGATCTGGCAAAGCTTCCATCCTGCCCTGACCCTGCC +>564|TRBV11-3 ENST00000611787|TRBV11-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGGCTCCTCTGCTGGGTGGCCTTCTGTCTCCTGGTGGAAGAACTCATAGAAGCTGGAGTGGTTCAGTCTCCCAGATATAAGATTATAGAGAAAAAACAGCCTGTGGCTTTTTGGTGCAATCCTATTTCTGGCCACAATACCCTTTACTGGTACCTGCAGAACTTGGGACAGGGCCCGGAGCTTCTGATTCGATATGAGAATGAGGAAGCAGTAGACGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGA +>565|TRBV12-3 ENST00000620569|TRBV12-3|5'UTR|TR|TRB|None|00 +TTCTTTGCTCATGCTCACAGAGGGCCTGGTCTAGAATATTCCACATCTGCTCTCACTCTGCC +>566|TRBV12-3 ENST00000620569|TRBV12-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCTTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCGAAGCATACAGATGCTGGAGTTATCCAGTCACCCCGCCATGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGCCACAACTCCCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>567|TRBV12-4 ENST00000617347|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>568|TRBV12-4 ENST00000617347|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>569|TRBV12-4 ENST00000631824|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>570|TRBV12-4 ENST00000631824|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>571|TRBV12-5 ENST00000621184|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>572|TRBV12-5 ENST00000621184|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGCACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>573|TRBV12-5 ENST00000632829|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>574|TRBV12-5 ENST00000632829|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGGACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>575|TRBV13 ENST00000614171|TRBV13|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTTAGTCCTGACCTGCCTGACTCTGCCTGGAACACCAGGCTCCTCTGCCGTGTCATGCTTTGTCTCCTGGGAGCAGGTTCAGTGGCTGCTGGAGTCATCCAGTCCCCAAGACATCTGATCAAAGAAAAGAGGGAAACAGCCACTCTGAAATGCTATCCTATCCCTAGACACGACACTGTCTACTGGTACCAGCAGGGTCCAGGTCAGGACCCCCAGTTCCTCATTTCGTTTTATGAAAAGATGCAGAGCGATAAAGGAAGCATCCCTGATCGATTCTCAGCTCAACAGTTCAGTGACTATCATTCTGAACTGAACATGAGCTCCTTGGAGCTGGGGGACTCAGCCCTGTACTTCTGTGCCAGCAGCTTAGG +>576|TRBV14 ENST00000617639|TRBV14|5'UTR|TR|TRB|None|00 +CCTTTTTCTCATGCTTGTAAGCTCCTTCATCTGGAAATGTGATTTACCTGGGTCCTGCC +>577|TRBV14 ENST00000617639|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGTTTCCAGGCTTCTCAGTTTAGTGTCCCTTTGTCTCCTGGGAGCAAAGCACATAGAAGCTGGAGTTACTCAGTTCCCCAGCCACAGCGTAATAGAGAAGGGCCAGACTGTGACTCTGAGATGTGACCCAATTTCTGGACATGATAATCTTTATTGGTATCGACGTGTTATGGGAAAAGAAATAAAATTTCTGTTACATTTTGTGAAAGAGTCTAAACAGGATGAGTCCGGTATGCCCAACAATCGATTCTTAGCTGAAAGGACTGGAGGGACGTATTCTACTCTGAAGGTGCAGCCTGCAGAACTGGAGGATTCTGGAGTTTATTTCTGTGCCAGCAGCCAAGA +>578|TRBV15 ENST00000616518|TRBV15|5'UTR|TR|TRB|None|00 +ACTCCCACCTCTCAACCCAGGAATCAGAGCCTGAGACAGACAGATGCTTCATTCCTGTATGGGGTGGTATTCCTGCC +>579|TRBV15 ENST00000616518|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTCCTGGGCTTCTCCACTGGATGGCCCTTTGTCTCCTTGGAACAGGTCATGGGGATGCCATGGTCATCCAGAACCCAAGATACCAGGTTACCCAGTTTGGAAAGCCAGTGACCCTGAGTTGTTCTCAGACTTTGAACCATAACGTCATGTACTGGTACCAGCAGAAGTCAAGTCAGGCCCCAAAGCTGCTGTTCCACTACTATGACAAAGATTTTAACAATGAAGCAGACACCCCTGATAACTTCCAATCCAGGAGGCCGAACACTTCTTTCTGCTTTCTTGACATCCGCTCACCAGGCCTGGGGGACGCAGCCATGTACCTGTGTGCCACCAGCAGAGA +>580|TRBV16 ENST00000620773|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCCAATATTCACCTGCATCACAATCCTTTGTCTGCTGGCTGCAGGTTCTCCTGGTGAAGAAGTCGCCCAGACTCCAAAACATCTTGTCAGAGGGGAAGGACAGAAAGCAAAATTATATTGTGCCCCAATAAAAGGACACAGTTATGTTTTTTGGTACCAACAGGTCCTGAAAAACGAGTTCAAGTTCTTGATTTCCTTCCAGAATGAAAATGTCTTTGATGAAACAGGTATGCCCAAGGAAAGATTTTCAGCTAAGTGCCTCCCAAATTCACCCTGTAGCCTTGAGATCCAGGCTACGAAGCTTGAGGATTCAGCAGTGTATTTTTGTGCCAGCAGCCAATC +>581|TRBV17 ENST00000619103|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACACTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>582|TRBV17 ENST00000631663|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACGCTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>583|TRBV18 ENST00000611520|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>584|TRBV18 ENST00000611520|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGACTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>585|TRBV18 ENST00000631559|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>586|TRBV18 ENST00000631559|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGAGTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>587|TRBV19 ENST00000390393|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>588|TRBV19 ENST00000390393|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTCTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>589|TRBV19 ENST00000632638|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>590|TRBV19 ENST00000632638|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTTTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>591|TRBV2 ENST00000455382|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>592|TRBV2 ENST00000455382|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCGCTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>593|TRBV2 ENST00000632828|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>594|TRBV2 ENST00000632828|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCACTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>595|TRBV20-1 ENST00000390394|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>596|TRBV20-1 ENST00000390394|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>597|TRBV20-1 ENST00000633466|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>598|TRBV20-1 ENST00000633466|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCTGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>599|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|5'UTR|TR|TRB|None|00 +GATCAGTCATCCCTCCTCGCTGGTGA +>600|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTAGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAACATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGCTCCGGAAACAGAGCCTCATGCTGATGGCAACTTCCAATGAGGGCTCCGAGGTCACATACGAGCAAGGCGTCAAGAAGGACAAGTTTCCCATCAACCATCCAAACCTGACCTTCTCCGCTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGA +>601|TRBV23-1 ENST00000390396|TRBV23-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCGGCTGTGCAGCCCTGTGTCTCCTGGCAGCAGACTCTTTTCATGCCAAAGTCACACAGACTCCAGGACATTTGGTCAAAGGAAAAGGACAGAAAACAAAGATGGATTGTACCCCCGAAAAAGGACATACTTTTGTTTATTGGTATCAACAGAATCAGAATAAAGAGTTTATGCTTTTGATTTCCTTTCAGAATGAACAAGTTCTTCAAGAAACGGAGATGCACAAGAAGCGATTCTCATCTCAATGCCCCAAGAACGCACCCTGCAGCCTGGCAATCCTGTCCTCAGAACCGGGAGACACGGCACTGTATCTCTGCGCCAGCAGTCAATC +>602|TRBV24-1 ENST00000390397|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>603|TRBV24-1 ENST00000390397|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACAGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>604|TRBV24-1 ENST00000633092|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>605|TRBV24-1 ENST00000633092|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACGGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>606|TRBV25-1 ENST00000610439|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>607|TRBV25-1 ENST00000610439|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>608|TRBV25-1 ENST00000390398|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>609|TRBV25-1 ENST00000390398|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>610|TRBV27 ENST00000390399|TRBV27|5'UTR|TR|TRB|None|00 +ACCTGGAGCCCCCAGAACTGGCAGACACCTGCCTGATGCTGCC +>611|TRBV27 ENST00000390399|TRBV27|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCCAGCTCCTTGGCTATGTGGTCCTTTGCCTTCTAGGAGCAGGCCCCCTGGAAGCCCAAGTGACCCAGAACCCAAGATACCTCATCACAGTGACTGGAAAGAAGTTAACAGTGACTTGTTCTCAGAATATGAACCATGAGTATATGTCCTGGTATCGACAAGACCCAGGGCTGGGCTTAAGGCAGATCTACTATTCAATGAATGTTGAGGTGACTGATAAGGGAGATGTTCCTGAAGGGTACAAAGTCTCTCGAAAAGAGAAGAGGAATTTCCCCCTGATCCTGGAGTCGCCCAGCCCCAACCAGACCTCTCTGTACTTCTGTGCCAGCAGTTTATC +>612|TRBV28 ENST00000390400|TRBV28|5'UTR|TR|TRB|None|00 +ATTCTTTCTTCAAAGCAGCC +>613|TRBV28 ENST00000390400|TRBV28|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTATG +>614|TRBV29-1 ENST00000422143|TRBV29-1|5'UTR|TR|TRB|None|00 +GAAGGAAAGATGAACTTGAGTTTCACTTCTTAGTGCCTTTTCTCAGGGGAGAGGCCATCACTTGAAG +>615|TRBV29-1 ENST00000422143|TRBV29-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGAGTCTTCTGCTCCTTCTCCTGGGACTAGGCTCTGTGTTCAGTGCTGTCATCTCTCAAAAGCCAAGCAGGGATATCTGTCAACGTGGAACCTCCCTGACGATCCAGTGTCAAGTCGATAGCCAAGTCACCATGATGTTCTGGTACCGTCAGCAACCTGGACAGAGCCTGACACTGATCGCAACTGCAAATCAGGGCTCTGAGGCCACATATGAGAGTGGATTTGTCATTGACAAGTTTCCCATCAGCCGCCCAAACCTAACATTCTCAACTCTGACTGTGAGCAACATGAGCCCTGAAGACAGCAGCATATATCTCTGCAGCGTTGAAGA +>616|TRBV3-1 ENST00000390387|TRBV3-1|5'UTR|TR|TRB|None|00 +AGACCAGAATCCTGCCCTGGGCCTTGCCTGGTCTGCCTCACTCTGCC +>617|TRBV3-1 ENST00000390387|TRBV3-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTCCTCTGCTGTGTGGTCTTCTGCCTCCTCCAAGCAGGTCCCTTGGACACAGCTGTTTCCCAGACTCCAAAATACCTGGTCACACAGATGGGAAACGACAAGTCCATTAAATGTGAACAAAATCTGGGCCATGATACTATGTATTGGTATAAACAGGACTCTAAGAAATTTCTGAAGATAATGTTTAGCTACAATAATAAGGAGCTCATTATAAATGAAACAGTTCCAAATCGCTTCTCACCTAAATCTCCAGACAAAGCTCACTTAAATCTTCACATCAATTCCCTGGAGCTTGGTGACTCTGCTGTGTATTTCTGTGCCAGCAGCCAAGA +>618|TRBV30 ENST00000417977|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>619|TRBV30 ENST00000417977|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTTCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>620|TRBV30 ENST00000631690|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>621|TRBV30 ENST00000631690|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTCCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>622|TRBV4-1 ENST00000390357|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>623|TRBV4-1 ENST00000390357|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>624|TRBV4-1 ENST00000632713|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>625|TRBV4-1 ENST00000632713|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCGAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>626|TRBV4-2 ENST00000390392|TRBV4-2|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>627|TRBV4-2 ENST00000390392|TRBV4-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGGCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAACTTTAAAGAACAGACTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGTGCCAGCAGCCAAGA +>628|TRBV4-3 ENST00000631427|TRBV4-3|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>629|TRBV4-3 ENST00000631427|TRBV4-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGTCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAGTCTTGAAGAACGGGTTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>630|TRBV5-1 ENST00000390381|TRBV5-1|5'UTR|TR|TRB|None|00 +CTCAGAGGACCAGTATCCCTCACAGGGTGACACCTGACCAGCTCTGTCCCACCTGGCCATGGGCTCCAGGTACCTCTGATGGGAAGACCTTTGTCTCTTGGGAACAAGTGAATCCTTGGCACAGGCCCAGTGGATTCTGCTGTGCAGAACAGAGAGCAGTGGACCTCAGGAGGCCTGCAAGGGGAGGACATAGGACAGTGACATCACAGTATGCCCCTCCCACCAGGAAAAGCAAGGCTGAGAATTTAGCTCTTTCCCAGGAGGACCAAGCCCTGAGCACAGACACAGTGCTGCCTGCCCCTTTGTGCC +>631|TRBV5-1 ENST00000390381|TRBV5-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTGCTCTGTTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTAAAGGCTGGAGTCACTCAAACTCCAAGATATCTGATCAAAACGAGAGGACAGCAAGTGACACTGAGCTGCTCCCCTATCTCTGGGCATAGGAGTGTATCCTGGTACCAACAGACCCCAGGACAGGGCCTTCAGTTCCTCTTTGAATACTTCAGTGAGACACAGAGAAACAAAGGAAACTTCCCTGGTCGATTCTCAGGGCGCCAGTTCTCTAACTCTCGCTCTGAGATGAATGTGAGCACCTTGGAGCTGGGGGACTCGGCCCTTTATCTTTGCGCCAGCAGCTTGG +>632|TRBV5-3 ENST00000390362|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTATTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>633|TRBV5-3 ENST00000634123|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTGTTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>634|TRBV5-4 ENST00000454561|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACACAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGCCCCACTGTGCC +>635|TRBV5-4 ENST00000454561|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGAGACTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>636|TRBV5-4 ENST00000633696|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACTCAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGGCCCACTGTGCC +>637|TRBV5-4 ENST00000633696|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATGATAGCTCTGAGCTGAATGTGAATGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>638|TRBV5-5 ENST00000390372|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>639|TRBV5-5 ENST00000390372|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>640|TRBV5-5 ENST00000632187|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>641|TRBV5-5 ENST00000632187|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGTAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>642|TRBV5-6 ENST00000390375|TRBV5-6|5'UTR|TR|TRB|None|00 +AAGCCCTGAATCAGATGCAGTGCTTCCTGTCCCTCTGTGCC +>643|TRBV5-6 ENST00000390375|TRBV5-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGCACTGCTTTGTCTCCTGGGAGCAGGCTTAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTAAGTCTGGGCATGACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGGAGGAAGAGAGACAGAGAGGCAACTTCCCTGATCGATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>644|TRBV5-7 ENST00000390378|TRBV5-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGTGCTGCTTTGTCCCCTAGGAGAAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCACGTGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTCCTCGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCAATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTAGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>645|TRBV5-8 ENST00000631639|TRBV5-8|5'UTR|TR|TRB|None|00 +TGGCCACTGAGGAAAGGGAAGAGAATGTTGCCTGGGACAGGAAAATATAGAAAATGAAGGCCCAGAACTCACTCGGCTCTTCCCCAGGAAGACCAAGCCCTGAATCAGGTGCAGTGCCGCCTGGCCCACTGTGCC +>646|TRBV5-8 ENST00000631639|TRBV5-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGACCCAGGCTCCTCTTCTGGGCACTGCTTTGTCTCCTCGGAACAGGCCCAGTGGAGGCTGGAGTCACACAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGCGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTACTGGTACCAACAGGCCCTGGGTCTGGGCCTCCAGTTCCTCCTTTGGTATGACGAGGGTGAAGAGAGAAACAGAGGAAACTTCCCTCCTAGATTTTCAGGTCGCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGAGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>647|TRBV6-1 ENST00000390353|TRBV6-1|5'UTR|TR|TRB|None|00 +GTTCCCCTATCACCGATGCACAGACCCAGAAGACCCCTCCATCCTGTAGCACCTGCC +>648|TRBV6-1 ENST00000390353|TRBV6-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAAGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTCCATGTACTGGTATCGACAAGACCCAGGCATGGGACTGAGGCTGATTTATTACTCAGCTTCTGAGGGTACCACTGACAAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATTAAACAAACGGGAGTTCTCGCTCAGGCTGGAGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTGAAGC +>649|TRBV6-2 ENST00000632016|TRBV6-2|5'UTR|TR|TRB|None|00 +TCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>650|TRBV6-2 ENST00000632016|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>651|TRBV6-2 ENST00000634383|TRBV6-2|5'UTR|TR|TRB|None|00 +AGAATGACGCCCTTGAAAGACGTGTTCCCTTTTCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>652|TRBV6-2 ENST00000634383|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>653|TRBV6-4 ENST00000390360|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>654|TRBV6-4 ENST00000390360|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGACTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGAGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>655|TRBV6-4 ENST00000633472|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>656|TRBV6-4 ENST00000633472|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGATTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGCGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>657|TRBV6-5 ENST00000390368|TRBV6-5|5'UTR|TR|TRB|None|00 +GAGAGTCCTGCTCCCCTTTCATCAATGCACAGATACAGAAGACCCCTCCGTCATGCAGCATCTGCC +>658|TRBV6-5 ENST00000390368|TRBV6-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGCCTCCTGTGCTGTGCAGCCTTGTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGAATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGCTGGTATCACTGACCAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGCTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>659|TRBV6-6 ENST00000390371|TRBV6-6|5'UTR|TR|TRB|None|00 +CAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>660|TRBV6-6 ENST00000390371|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGACAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>661|TRBV6-6 ENST00000633963|TRBV6-6|5'UTR|TR|TRB|None|00 +ATCAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>662|TRBV6-6 ENST00000633963|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGATAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGTATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>663|TRBV6-7 ENST00000390373|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTGATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>664|TRBV6-7 ENST00000631511|TRBV6-7|5'UTR|TR|TRB|None|00 +ATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>665|TRBV6-7 ENST00000631511|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTTATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>666|TRBV6-8 ENST00000390376|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCCGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>667|TRBV6-8 ENST00000632425|TRBV6-8|5'UTR|TR|TRB|None|00 +GAGAGTCCTGTTCCCCTTTTATCAATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>668|TRBV6-8 ENST00000632425|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCGGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>669|TRBV6-9 ENST00000634093|TRBV6-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACTTGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCGCATTCATTACTCAGTTGCTGCTGGTATCACTGACAAAGGAGAAGTCCCCGATGGCTACAATGTATCCAGATCAAACACAGAGGATTTCCCGCTCAGGCTGGAGTCAGCTGCTCCCTCCCAGACATCTGTATACTTCTGTGCCAGCAGTTATTC +>670|TRBV7-1 ENST00000547918|TRBV7-1|5'UTR|TR|TRB|None|00 +CTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>671|TRBV7-1 ENST00000547918|TRBV7-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGCTCCTCTGCTGGGCAGCCATATGTCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGTCCCTGAGACACAAGGTAGCAAAGAAGGGAAAGGATGTAGCTCTCAGATATGATCCAATTTCAGGTCATAATGCCCTTTATTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTCCAATTTACTTCCAAGGCAAGGATGCAGCAGACAAATCGGGGCTTCCCCGTGATCGGTTCTCTGCACAGAGGTCTGAGGGATCCATCTCCACTCTGAAGTTCCAGCGCACACAGCAGGGGGACTTGGCTGTGTATCTCTGTGCCAGCAGCTCAGC +>672|TRBV7-2 ENST00000631392|TRBV7-2|5'UTR|TR|TRB|None|00 +CCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>673|TRBV7-2 ENST00000631392|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>674|TRBV7-2 ENST00000634605|TRBV7-2|5'UTR|TR|TRB|None|00 +ACAGTGATCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>675|TRBV7-2 ENST00000634605|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>676|TRBV7-3 ENST00000390361|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>677|TRBV7-3 ENST00000390361|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAAGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAAAGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCCGCGTATCTCCGTGCCAGCAGCTTAAC +>678|TRBV7-3 ENST00000631882|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>679|TRBV7-3 ENST00000631882|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAATATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAACGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCGGGGGGACTCAGCCGTGTATCTCTGTGCCAGCAGCTTAAC +>680|TRBV7-4 ENST00000390369|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>681|TRBV7-4 ENST00000633313|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGTGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>682|TRBV7-6 ENST00000390374|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGTCCTGACCCTGCC +>683|TRBV7-6 ENST00000390374|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>684|TRBV7-6 ENST00000633265|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGGCCTGACCCTGCC +>685|TRBV7-6 ENST00000633265|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCGTCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>686|TRBV7-7 ENST00000390377|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>687|TRBV7-8 ENST00000632560|TRBV7-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCTAGGTACAAAGTCGCAAAGAGAGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTTTTGGTACCAACAGGCCCTGGGGCAGGGGCCAGAGTTTCTGACTTATTTCCAGAATGAAGCTCAACTAGACAAATCGGGGCTGCCCAGTGATCGCTTCTTTGCAGAAAGGCCTGAGGGATCCGTCTCCACTCTGAAGATCCAGCGCACACAGCAGGAGGACTCCGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>688|TRBV7-9 ENST00000612787|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGAACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>689|TRBV7-9 ENST00000632021|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGGACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>690|TRBV9 ENST00000390363|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>691|TRBV9 ENST00000390363|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCACTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>692|TRBV9 ENST00000633328|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>693|TRBV9 ENST00000633328|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCAGTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>694|TRDC ENST00000390477|TRDC|C-REGION|TR|TRD|None|00 +GAAGTCAGCCTCATACCAAACCATCCGTTTTTGTCATGAAAAATGGAACAAATGTCGCTTGTCTGGTGAAGGAATTCTACCCCAAGGATATAAGAATAAATCTCGTGTCATCCAAGAAGATAACAGAGTTTGATCCTGCTATTGTCATCTCTCCCAGTGGGAAGTACAATGCTGTCAAGCTTGGTAAATATGAAGATTCAAATTCAGTGACATGTTCAGTTCAACACGACAATAAAACTGTGCACTCCACTGACTTTGAAGTGAAGACAGATTCTACAGATCACGTAAAACCAAAGGAAACTGAAAACACAAAGCAACCTTCAAAGAGCTGCCATAAACCCAAAGCCATAGTTCATACCGAGAAGGTGAACATGATGTCCCTCACAGTGCTTGGGCTACGAATGCTGTTTGCAAAGACTGTTGCCGTCAATTTTCTCTTGACTGCCAAGTTATTTTTCTTG +>695|TRDD1 ENST00000415118|TRDD1|D-REGION|TR|TRD|None|00 +GAAATAGT +>696|TRDD2 ENST00000434970|TRDD2|D-REGION|TR|TRD|None|00 +CCTTCCTAC +>697|TRDD3 ENST00000448914|TRDD3|D-REGION|TR|TRD|None|00 +ACTGGGGGATACG +>698|TRDJ1 ENST00000390473|TRDJ1|J-REGION|TR|TRD|None|00 +ACACCGATAAACTCATCTTTGGAAAAGGAACCCGTGTGACTGTGGAACCAA +>699|TRDJ2 ENST00000390475|TRDJ2|J-REGION|TR|TRD|None|00 +CTTTGACAGCACAACTCTTCTTTGGAAAGGGAACACAACTCATCGTGGAACCAG +>700|TRDJ3 ENST00000390476|TRDJ3|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTCGGAACTGGCATCAAACTCTTCGTGGAGCCCC +>701|TRDJ4 ENST00000390474|TRDJ4|J-REGION|TR|TRD|None|00 +CCAGACCCCTGATCTTTGGCAAAGGAACCTATCTGGAGGTACAACAAC +>702|TRDV1 ENST00000390452|TRDV1|5'UTR|TR|TRD|None|00 +CAAAGAGCTACATGCCAC +>703|TRDV1 ENST00000390452|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTGTTCTCCAGCCTGCTGTGTGTATTTGTGGCCTTCAGCTACTCTGGATCAAGTGTGGCCCAGAAGGTTACTCAAGCCCAGTCATCAGTATCCATGCCAGTGAGGAAAGCAGTCACCCTGAACTGCCTGTATGAAACAAGTTGGTGGTCATATTATATTTTTTGGTACAAGCAACTTCCCAGCAAAGAGATGATTTTCCTTATTCGCCAGGGTTCTGATGAACAGAATGCAAAAAGTGGTCGCTATTCTGTCAACTTCAAGAAAGCAGCGAAATCCGTCGCCTTAACCATTTCAGCCTTACAGCTAGAAGATTCAGCAAAGTACTTTTGTGCTCTTGGGGAACT +>704|TRDV2 ENST00000390469|TRDV2|5'UTR|TR|TRD|None|00 +ATTAGCAGGCAGCAGGCCCTGCGAGCCTCCTGTGATCAGCTAGATTTCTCTGGGGAATGAAACAGCTGCTGATAGGGACTGACTTCCTCAGTCACAAGTGTTTCACAAGTGTGTTGGTTCAGAGGAGGGACCAGGCAGAAGGTGGTTGAGAGGCAGAGCTGCCCCTGAGTGAGCC +>705|TRDV2 ENST00000390469|TRDV2|L-REGION+V-REGION|TR|TRD|None|00 +ATGCAGAGGATCTCCTCCCTCATCCATCTCTCTCTCTTCTGGGCAGGAGTCATGTCAGCCATTGAGTTGGTGCCTGAACACCAAACAGTGCCTGTGTCAATAGGGGTCCCTGCCACCCTCAGGTGCTCCATGAAAGGAGAAGCGATCGGTAACTACTATATCAACTGGTACAGGAAGACCCAAGGTAACACAATGACTTTCATATACCGAGAAAAGGACATCTATGGCCCTGGTTTCAAAGACAATTTCCAAGGTGACATTGATATTGCAAAGAACCTGGCTGTACTTAAGATACTTGCACCATCAGAGAGAGATGAAGGGTCTTACTACTGTGCCTGTGACACC +>706|TRDV3 ENST00000535880|TRDV3|5'UTR|TR|TRD|None|00 +TCTTTCATTAGAACCGTCAGATAGTCTCTGAGATCTTAGGAACCCTGTTTTGTTGTATATCCTCTGCCCTGATATGAAGAAAAG +>707|TRDV3 ENST00000535880|TRDV3|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTACTGTGGGCTTTAGCTTTTTGTTTTTCTACAGGGGCACGCTGTGTGACAAAGTAACCCAGAGTTCCCCGGACCAGACGGTGGCGAGTGGCAGTGAGGTGGTACTGCTCTGCACTTACGACACTGTATATTCAAATCCAGATTTATTCTGGTACCGGATAAGGCCAGATTATTCCTTTCAGTTTGTCTTTTATGGGGATAACAGCAGATCAGAAGGTGCAGATTTTACTCAAGGACGGTTTTCTGTGAAACACATTCTGACCCAGAAAGCCTTTCACTTGGTGATCTCTCCAGTAAGGACTGAAGACAGTGCCACTTACTACTGTGCCTTTAG +>708|TRGC1 ENST00000443402|TRGC1|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCAATTGCTGAAACAAAGCTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCTGATGTTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAAAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAGTTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCATCACAATGGATCCCAAAGACAATTGTTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACATGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>709|TRGC2 ENST00000436911|TRGC2|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCGATTGCTGAAACAAAACTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCAGATATTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAGAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAATTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCACCACAGTGGATCCCAAATACAATTATTCAAAGGATGCAAATGATGTCATCACAATGGATCCCAAAGACAATTGGTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACACGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>710|TRGJ1 ENST00000390337|TRGJ1|J-REGION|TR|TRG|None|00 +GAATTATTATAAGAAACTCTTTGGCAGTGGAACAACACTTGTTGTCACAG +>711|TRGJP ENST00000390338|TRGJP|J-REGION|TR|TRG|None|00 +GGGCAAGAGTTGGGCAAAAAAATCAAGGTATTTGGTCCCGGAACAAAGCTTATCATTACAG +>712|TRGJP1 ENST00000390339|TRGJP1|J-REGION|TR|TRG|None|00 +ATACCACTGGTTGGTTCAAGATATTTGCTGAAGGGACTAAGCTCATAGTAACTTCACCTG +>713|TRGJP2 ENST00000390334|TRGJP2|J-REGION|TR|TRG|None|00 +ATAGTAGTGATTGGATCAAGACGTTTGCAAAAGGGACTAGGCTCATAGTAACTTCGCCTG +>714|TRGV1 ENST00000390348|TRGV1|5'UTR|TR|TRG|None|00 +TACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>715|TRGV1 ENST00000390348|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGATATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCTGACTGGGTCATCTGCTGAAATCACCTGTGATCTTCCTGGAGCAAGTACCTTATACATCCACTGGTACCTGCACCAGGAGGGGAAGGCCCCACAGTGTCTTCTGTACTATGAACCCTACTACTCCAGGGTTGTGCTGGAATCAGGAATCACTCCAGGAAAGTATGACACTGGAAGCACAAGGAGCAATTGGAATTTGAGACTGCAAAATCTAATTAAAAATGATTCTGGGTTCTATTACTGTGCCACCTGGGACAGG +>716|TRGV10 ENST00000390341|TRGV10|5'UTR|TR|TRG|None|00 +ACTTTCCTGCCTTCTCCTTGGGTACACCGCCCCGAAGACAGGATGTCACTGCTGGAAGCATTTGCCTTCTCCTCCTGGGCTCCTGAGTTGCTGTCCGAACATTTCAGTCTAGCTGCGTGACCAAAATCATTCTTCAATGTTTCCCTCTTCTACTGTCAG +>717|TRGV10 ENST00000390341|TRGV10|L-REGION+V-REGION|TR|TRG|None|00 +ATGTTCATTGGAAATTCTCCTCTTTTACTTACAGTTGGACTTGGATTATCAAAAGTGGAGCAGTTCCAGCTATCCATTTCCACGGAAGTCAAGAAAAGTATTGACATACCTTGCAAGATATCGAGCACAAGGTTTGAAACAGATGTCATTCACTGGTACCGGCAGAAACCAAATCAGGCTTTGGAGCACCTGATCTATATTGTCTCAACAAAATCCGCAGCTCGACGCAGCATGGGTAAGACAAGCAACAAAGTGGAGGCAAGAAAGAATTCTCAAACTCTCACTTCAATCCTTACCATCAAGTCCGTAGAGAAAGAAGACATGGCCGTTTACTACTGTGCTGCGTGGGATTA +>718|TRGV2 ENST00000426402|TRGV2|5'UTR|TR|TRG|None|00 +GGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCCCTCTGCTTGTGTCTCAGGAAGACCACCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGAACCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>719|TRGV2 ENST00000426402|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTAACGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCAGTACTATGACTCCTACAACTCCAAGGTTGTGTTGGAATCAGGAGTCAGTCCAGGGAAGTATTATACTTACGCAAGCACAAGGAACAACTTGAGATTGATACTGCGAAATCTAATTGAAAATGACTTTGGGGTCTATTACTGTGCCACCTGGGACGGG +>720|TRGV3 ENST00000390346|TRGV3|5'UTR|TR|TRG|None|00 +CTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGTCTCAGGAAACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCGTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>721|TRGV3 ENST00000390346|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCAGACTGGGTCATCTGCTGAAATCACTTGCGATCTTACTGTAACAAATACCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCACCGCAAGGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGAGACTGCAAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>722|TRGV4 ENST00000390345|TRGV4|5'UTR|TR|TRG|None|00 +GGCCTGAGCTCTCCTGGCCCCTGGCTCTCTTCTGCAGAGGGCCTGCTCTCAGCTGCCACAAGAGGGCGCCGGAGAACGGACCTGAGCAAGAGAGGCAGGAGCTCCTCTGCAGGTCCTCCCAGGCACCAATCCTTCTGGGAGGGAGGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCTCTCTGCTTGTGTCTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCTCAGAGAGGAAGGC +>723|TRGV4 ENST00000390345|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTACCGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACACCTCCAGCGTTGTGTTGGAATCAGGAATCAGCCCAGGGAAGTATGATACTTACGGAAGCACAAGGAAGAACTTGAGAATGATACTGCGAAATCTTATTGAAAATGACTCTGGAGTCTATTACTGTGCCACCTGGGATGGG +>724|TRGV5 ENST00000390344|TRGV5|5'UTR|TR|TRG|None|00 +TTCTGGGAGGAAGGCTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGACTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCGGAGTTTTAAGAGGATCTTCTGCTCCTCCTCATCTGGTCCCTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>725|TRGV5 ENST00000390344|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGGGAACGAAGTCAGTCACGAGGCCGACTAGGTCATCTGCTGAAATCACTTGTGACCTTACTGTAATAAATGCCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCAACTCAAAGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGATACTACGAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>726|TRGV8 ENST00000390343|TRGV8|5'UTR|TR|TRG|None|00 +CTACTGTCTTCTGTGTTAGGGATCACTTCCTTGTTGAGTGGGACCTGAGTTTTGAGAGGGTCTTCTGCTCCTCTTCGTCTGGTCCCTTACTTCCAAGACCCCAGAGAGGAAGGC +>727|TRGV8 ENST00000390343|TRGV8|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTTGGCTCTAGCTCTGCTTCTAGCTTTCCTGCCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACAAAGTCAGTCACCAGGCCAACTGGGTCATCAGCTGTAATCACTTGTGATCTTCCTGTAGAAAATGCCGTCTACACCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACAACTCCAGGGTTGTGTTGGAATCAGGAATCAGTCGAGAAAAGTATCATACTTATGCAAGCACAGGGAAGAGCCTTAAATTTATACTGGAAAATCTAATTGAACGTGACTCTGGGGTCTATTACTGTGCCACCTGGGATAGG +>728|TRGV9 ENST00000444775|TRGV9|5'UTR|TR|TRG|None|00 +AAAAAAATTCAAGTCAATCCATAGAAGTGGGTCGTGGAATTCCAGGCAGAAAGTGACTAAATGAAGATGGAAGGACAGGGAGGGGGTGGCCACATCACAGAGAACCTCTTATCCTAAGAACTCTGGACTTCATCTTCAGAGGCAAGGTAGAGAGAGCAAGGACTTTAGAGCAGGAAAAGGACCAGGTCAGTCTAGTGGCCATGGGGAAGGTGGGTGGGAGGGGCCGAGATGGGATGTATGGAGGTGCGTGAGGTGGAGGCAGTGGTGAGCCAGGAAATGTTTAGGACGTAGAATCCTCAGGAATTAGAGTGCGGTGAATTAGAGGGGAGAATTGAGGCTGATGCTCAAGCTCCTGGCTTGGGCAATGTGGGTAGTTATGTCATACAGGGAACTCGGAAGAAGATATGGTTTGGGGGAAGGGAATGAGTTCACTCTGGCTATGAGCAGACTTTGTTTGAGATCCCATGTCAGACGTACTTGAAAATGTCCAAGAGTTAGCTGGATATGGGTACAGACAGCTTTCGATTTAACTGAGGTCCGACTTAAGATTTTTTTTTACTTTATGATGGTGCAAAAGTGACACGCATTTGGTAGAAAACATAATTTGACCTTTGCTGTTTCCCCAGGACAGTGATATAAGGTTATGATACTCTCTTGCGATGCTGGGCAGTGGCAGTGAGCTGCAGCTCCCAGTGGGTAAATTAAGCATGGAAATCTGGAACACAGCAGCTTTTAAGGGATGCACTGGGGAGAGCAGTTTGTAAAAATACCTTGGGACGGATTAAATGTCTTGGCTTAGAGAAAGAACAACAGACAATAGGAAACTGTCATTGAGGAGAAGCCGGGATTCAGGAGATGTACATTATTCAGGTAGCTGAGGGAGGGGACAGGAACCTGAATCTTCAACAGAAGCAAACAAACTGGGATGGAGGGCCCAGCCTCATGAAGGTGACCAGAAGGACCCGGTGCTGCAGGCTGTGTGGGTAGCTGAGCAGAGCTAAGCGGCTTGACGGACCAACATCTCTCCAGCTGGTTGAAGACAAGCTCTCAGAAGACAATGCTGCATGTCACAGCCCCAGCAACCAACAACACCAGCCTGACAACTTGCTGGGGTGGCCGCCTTGTGGTCTGAGGTGGCCGTCTAAACTATGTGGTCTGATCTCAGGCTGCAGACCTTGCAGGACTGTCTTCACACAGACTGGAAGTGCTAACAGGTGGTGAGGACACCGCTTTACAACGATGCAGGGGGCCCCATGTCACCCTCACCCATGGGAAGTTTGACTTGGTGGACTCAGCCAAGCCACAGAGGTCTAACGCTTCTCTGCGGTGATTTCAGGCTGCCCTGGCAGAAAGCACAGTGCCTGCAGAC +>729|TRGV9 ENST00000444775|TRGV9|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTCACTGCTCCACACATCAACGCTGGCAGTCCTTGGGGCTCTGTGTGTATATGGTGCAGGTCACCTAGAGCAACCTCAAATTTCCAGTACTAAAACGCTGTCAAAAACAGCCCGCCTGGAATGTGTGGTGTCTGGAATAACAATTTCTGCAACATCTGTATATTGGTATCGAGAGAGACCTGGTGAAGTCATACAGTTCCTGGTGTCCATTTCATATGACGGCACTGTCAGAAAGGAATCCGGCATTCCGTCAGGCAAATTTGAGGTGGATAGGATACCTGAAACGTCTACATCCACTCTCACCATTCACAATGTAGAGAAACAGGACATAGCTACCTACTACTGTGCCTTGTGGGAGGTG +>730|TRBD2 GRCh38-release94|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTAGCGGGAGGG +>731|TRAJ15 GRCh38-release94|TRAJ15|J-REGION|TR|TRA|None|00 +CCAACCAGGCAGGAACTGCTCTGATCTTTGGGAAGGGAACCACCTTATCAGTGAGTTCCA +>732|IGLV6-57 GRCh38-release94|IGLV6-57|5'UTR|IG|IGL|None|00 +TCTGAGGATACGCGTGACAGATAAGAAGGGCTGGTGGGATCAGTCCTGGTGGTAGCTCAGGAAGCAGAGCCTGGAGCATCTCCACT +>733|TRBV11-2 GRCh38-release94|TRBV11-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCGGCCCTCTGTCTCCTGGGAGCAGAACTCACAGAAGCTGGAGTTGCCCAGTCTCCCAGATATAAGATTATAGAGAAAAGGCAGAGTGTGGCTTTTTGGTGCAATCCTATATCTGGCCATGCTACCCTTTACTGGTACCAGCAGATCCTGGGACAGGGCCCAAAGCTTCTGATTCAGTTTCAGAATAACGGTGTAGTGGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAACCTGCAAAGCTTGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGC +>734|IGKV2D-40 GRCh38-release94|IGKV2D-40|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTC +>735|TRGV11 AC244625.2|TRGV11|L-REGION+V-REGION|TR|TRG|None|00 +ATGCCACTGGTAGTAGCTGTTATCTTCTTCTCCCTCTGGGTTTTTGCACTTGGGCAGTTGGAACAACCTGAAATATCTATTTCCAGACCAGCAAATAAGAGTGCCCACATATCTTGGAAGGCATCCATCCAAGGCTTTAGCAGTAAAATCATACACTGGTACTGGCAGAAACCAAACAAAGGCTTAGAATATTTATTACATGTCTTCTTGACAATCTCTGCTCAAGATTGCTCAGGTGGGAAGACTAAGAAACTTGAGGTAAGTAAAAATGCTCACACTTCCACTTCCACTTTGAAAATAAAGTTCTTAGAGAAAGAAGATGAGGTGGTGTACCACTGTGCCTGCTGGATTAGGCAC +>736|IGHV1-8 AC_000146.1|IGHV1-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAAGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCAGTTATGATATCAACTGGGTGCGACAGGCCACTGGACAAGGGCTTGAGTGGATGGGATGGATGAACCCTAACAGTGGTAACACAGGCTATGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGAACACCTCCATAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGG +>737|IGHJ6 GRCh38-release94|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACGGTATGGACGTCTGGGGCCAAGGGACCACGGTCACCGTCTCCTCAG +>738|TRBV20-1 GRCh38-release94|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>739|TRBV7-7 GRCh38-release94|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATTCTGTTTCCACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>740|IGHV4-30-4 GRCh38-release94|IGHV4-30-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGATTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCAGACACGGCCGTGTATTACTGT +>741|IGKV1-NL1 GRCh38-release94|IGKV1-NL1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGCTCTATGCTGCATCCAGATTGGAAAGTGGGGTCCCATCCAGGTTCAGTGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGT +>742|IGHV4-38-2 GRCh38-release94|IGHV4-38-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGCACCTGTGGTTTTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTTACTCCATCAGCAGTGGTTACTACTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCCGTGTATTACTGT diff --git a/lib/rust/vdj_ann_ref/vdj_refs_5.0/mouse/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_5.0/mouse/fasta/regions.fa new file mode 100644 index 0000000..a66b964 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_5.0/mouse/fasta/regions.fa @@ -0,0 +1,1286 @@ +>1|IGHA ENSMUST00000178282|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGGTAAACCCACCAATGTCAGCGTGTCTGTGATCATGTCAGAGGGAGATGGCATCTGCTAC +>2|IGHA ENSMUST00000194738|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGAACGTCAAGAGCCACTTTCCTATGTGCTACTGGACCAGTCAGAAGACATCCTGGAGGAAGAGGCCCCAGGTGCCAGCCTGTGGCCCACCACTGTGACCTTCCTCACCCTCTTCCTACTGAGCTTGTTCTACAGCACAGCACTCACTGTTACAACTGTTCGAGGCCCGTTTGGCAGCAAAGAGGTCCCCCAGTAC +>3|IGHD ENSMUST00000192250|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGATGCTACCACCTCCTGCCTGAGTCAGACGGTCCTTCCAGGAGACCTGATGGTCCTGCCCTTGCC +>4|IGHD ENSMUST00000194162|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGCATAGTCAACACCATCCAACACTCGTGTATCATGGATGAGCAAAGTGACAGCTACATGGACTTAGAGGAGGAGAACGGCCTGTGGCCCACAATGTGCACCTTCGTGGCCCTCTTCCTGCTCACACTGCTCTACAGTGGCTTCGTCACCTTCATCAAGGTGAAG +>5|IGHD1-1 ENSMUST00000103439|IGHD1-1|D-REGION|IG|IGH|None|00 +TTTATTACTACGGTAGTAGCTAC +>6|IGHD2-3 ENSMUST00000177839|IGHD2-3|D-REGION|IG|IGH|None|00 +TCTATGATGGTTACTAC +>7|IGHD2-4 ENSMUST00000179560|IGHD2-4|D-REGION|IG|IGH|None|00 +TCTACTATGATTACGAC +>8|IGHD2-5 ENSMUST00000178549|IGHD2-5|D-REGION|IG|IGH|None|00 +CCTACTATAGTAACTAC +>9|IGHD2-7 ENSMUST00000177965|IGHD2-7|D-REGION|IG|IGH|None|00 +TCTACTATGGTTACGAC +>10|IGHD2-8 ENSMUST00000180001|IGHD2-8|D-REGION|IG|IGH|None|00 +TCTACTATGGTAACTAC +>11|IGHD3-1 ENSMUST00000180266|IGHD3-1|D-REGION|IG|IGH|None|00 +GGCACAGCTCGGGCTAC +>12|IGHD3-2 ENSMUST00000179883|IGHD3-2|D-REGION|IG|IGH|None|00 +AGACAGCTCAGGCTAC +>13|IGHD4-1 ENSMUST00000179520|IGHD4-1|D-REGION|IG|IGH|None|00 +CTAACTGGGAC +>14|IGHD5-2 ENSMUST00000179166|IGHD5-2|D-REGION|IG|IGH|None|00 +GAATACCTAC +>15|IGHD5-5 ENSMUST00000178815|IGHD5-5|D-REGION|IG|IGH|None|00 +GACTACCTAC +>16|IGHD5-7 ENSMUST00000178483|IGHD5-7|D-REGION|IG|IGH|None|00 +AGGCAGCTAGCCTCTGCAGTGCCACAACC +>17|IGHD5-8 ENSMUST00000178909|IGHD5-8|D-REGION|IG|IGH|None|00 +AGACAGCTAGCCTCTGCAGTGCCACAACC +>18|IGHE ENSMUST00000137336|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGGTAACACCTCCCTCCATCCCTCC +>19|IGHE ENSMUST00000223335|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGAGCTAGACCTCCAGGACCTATGTATTGAAGAGGTGGAGGGCGAGGAGCTGGAAGAGCTGTGGACCAGTATTTGTGTCTTCATCACCCTGTTCCTGCTCAGTGTGAGCTATGGGGCCACTGTCACCGTCCTCAAGGTGAAGTGGGTCTTCTCCACACCGATGCAGGATACACCCCAGACCTTCCAAGACTATGCCAACATCTTCCAGACCAGGGCA +>20|IGHG1 ENSMUST00000103420|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGTAAA +>21|IGHG1 ENSMUST00000194304|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGGCTGCAACTGGACGAGACCTGTGCTGAGGCCCAGGACGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGTGTGTGCTACAGCGCTGCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCGGTGGTGGAGCTGAAGCAGACACTGGTTCCTGAATACAAGAACATGATTGGGCAAGCACCC +>22|IGHG2B ENSMUST00000103418|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>23|IGHG2B ENSMUST00000192188|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGGCTAGACCTGGATGATATCTGTGCTGAGGCCAAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCAGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>24|IGHG2C ENSMUST00000103416|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGGCTAGACCTGGATGATGTCTGTACTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACAACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGTTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCTGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>25|IGHG2C ENSMUST00000195192|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGTAAA +>26|IGHG3 ENSMUST00000103423|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGGTAAA +>27|IGHG3 ENSMUST00000223179|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGAGCTGGAACTGAATGAGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>28|IGHJ1 ENSMUST00000103430|IGHJ1|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATGTCTGGGGCACAGGGACCACGGTCACCGTCTCCTCAG +>29|IGHJ2 ENSMUST00000192746|IGHJ2|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAAGGCACCACTCTCACAGTCTCCTCAG +>30|IGHJ3 ENSMUST00000103428|IGHJ3|J-REGION|IG|IGH|None|00 +CCTGGTTTGCTTACTGGGGCCAAGGGACTCTGGTCACTGTCTCTGCAG +>31|IGHJ4 ENSMUST00000103427|IGHJ4|J-REGION|IG|IGH|None|00 +ATTACTATGCTATGGACTACTGGGGTCAAGGAACCTCAGTCACCGTCTCCTCAG +>32|IGHM ENSMUST00000103426|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGGTAAACCCACACTGTACAATGTCTCCCTGATCATGTCTGACACAGGCGGCACCTGCTAT +>33|IGHM ENSMUST00000177715|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGAGGGGGAGGTGAATGCTGAGGAGGAAGGCTTTGAGAACCTGTGGACCACTGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGCACCACCGTCACCCTGTTCAAGGTGAAA +>34|IGHV1-11 ENSMUST00000191801|IGHV1-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCCAGATCACCCTCTTTCTGGTGGCAGCAATTACATGTGCCTACTCCCAGATCCAGCTGCAACAGTCAGGAGCTGAGCTGGCGAGTCCTGGGGCATCAGTGACACTGTCCTGCAAGGCTTCTGGCTACACATTTACTGACCATATTATGAATTGGGTAAAAAAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAGGATTTATCCAGTAAGTGGTGAAACTAACTACAATCAAAAGTTCATGGGCAAGGCCACATTCTCTGTAGACCGGTCCTCCAGCACAGTGTACATGGTGTTGAACAGCCTGACATCTGAGGACCCTGCTGTCTATTACTGTGGAAGG +>35|IGHV1-12 ENSMUST00000109711|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>36|IGHV1-12 ENSMUST00000109711|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>37|IGHV1-12 ENSMUST00000195469|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>38|IGHV1-12 ENSMUST00000195469|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGCTTATCTACAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTTACCAGTTACAATATGCACTGGGTAAAGCAGACACCTAGACAGGGCCTGGAATGGATTGGAGCTATTTATCCAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>39|IGHV1-15 ENSMUST00000192077|IGHV1-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAATTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGACGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGGGTGAAGCAGACACCTGTGCATGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTGGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCATACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>40|IGHV1-18 ENSMUST00000194350|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCCTCTTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATACCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGGACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTATCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACACTGCAGTCTATTACTGTGCAAGA +>41|IGHV1-19 ENSMUST00000193855|IGHV1-19|5'UTR|IG|IGH|None|00 +AACAACACATGTCCAATGTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>42|IGHV1-19 ENSMUST00000193855|IGHV1-19|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGTAAGGCTTCTGGATACACATTCACTGACTACTATATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGTTATTAATCCTTACAACGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTTGACAAGTCCTCCAGCACAGCCTACATGGAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>43|IGHV1-20 ENSMUST00000194968|IGHV1-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGCAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGATTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGATGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCGGAGCCTGACATCTGAGGACTCTGCAGTCTATTATTGTGCAAGA +>44|IGHV1-22 ENSMUST00000103507|IGHV1-22|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGAAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTAACCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAAACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCGGAGGATTCTGCAGTCTATTACTGTGCAAGA +>45|IGHV1-23 ENSMUST00000194625|IGHV1-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGTGTGAAGCAGACACCTGTGCACGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTTGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>46|IGHV1-24 ENSMUST00000191861|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCGGCTGCAGCAGTCTGGACCTAAGGTAGTGAATGCTGGGGCTTCCGTGAAGCTGTCCTGCAAGTCTTCTGGTTACTCATTCAGTAGATACAAAATGGAATGTGTGAAACAGAGCCATGGAAAGAGCCTTGAGTGGATTGAACATATTAATCTTTTCAAAGGTGTTACTAACTACAATGGAAAGTTCAAAAGCAAGGCCACATTGACTGTAGACATATCCTCTAGCACAGCCTATATGGAGCTTAGCAGATTGACATCTGAAGACTCAGAGGTATATTACTGTGCAAGA +>47|IGHV1-26 ENSMUST00000103510|IGHV1-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAATCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATACACGTTCACTGACTACTACATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>48|IGHV1-31 ENSMUST00000195735|IGHV1-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTATCTGGATCTTTCTCTTCCTTCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAGAGCCATGGAAATATCCTCGATTGGATTGGATATATTTATCCTTACAATGGTGTTTCTAGCTACAACCAGAAATTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCTAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>49|IGHV1-34 ENSMUST00000103512|IGHV1-34|5'UTR|IG|IGH|None|00 +GTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>50|IGHV1-34 ENSMUST00000103512|IGHV1-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGTTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTTATCCTAACAATGGTGGTAATGGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>51|IGHV1-36 ENSMUST00000191862|IGHV1-36|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGCCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATTCACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACTTGTTTATCCTTACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGGAGCTAAACAGCCTGACTTCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>52|IGHV1-37 ENSMUST00000193950|IGHV1-37|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGTAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCTGAGCCTGACATCTGAGGACTTTGCAGTCTATTATTGTGCAAGA +>53|IGHV1-39 ENSMUST00000103515|IGHV1-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTCTCAGGAACTGCAGGTGTCCACTCTGAGTTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGCGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGACTACAACATGAACTGGGTGAAGCAGAGCAATGGAAAGAGCCTTGAGTGGATTGGAGTAATTAATCCTAACTATGGTACTACTAGCTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACCAATCTTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>54|IGHV1-4 ENSMUST00000103493|IGHV1-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTTCCTGTTGTCAGTAACTTCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAGACCTGGTGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACACGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTGAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>55|IGHV1-42 ENSMUST00000191868|IGHV1-42|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAACTGGATCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGAACTGGGTGAAGCAAAGTCCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTACCTACAACCAGAAGTTCAAGGCCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>56|IGHV1-43 ENSMUST00000195417|IGHV1-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCAAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAAAGTTCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTAACTGTAGACAAGTCATCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCTGTCTATTACTGTGCAAGA +>57|IGHV1-47 ENSMUST00000194865|IGHV1-47|5'UTR|IG|IGH|None|00 +ATAAGATCAGTCTTCTCTATAATCACTGAGTGCAGAGGACCTCACA +>58|IGHV1-47 ENSMUST00000194865|IGHV1-47|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCGTGGATCTCTATCATCCTCTTCCTAGTGGCAACAGCTATAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTAGTGAAGCCTGGAGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACTACCTATCCTATAGAGTGGATGAAGCAGAATCATGGAAAGAGCCTAGAGTGGATTGGAAATTTTCATCCTTACAATGATGATACTAAGTACAATGAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGAAAAATCCTCTAGCACAGTCTACTTGGAGCTCAGCCGATTAACATCTGATGACTCTGCTGTTTATTACTGTGCAAGG +>59|IGHV1-49 ENSMUST00000192724|IGHV1-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGGTCTTTCTCTTCCTCCTGTCAGGAACTGCAGGAGTCCACTCACAGCGTGAGCTGCAGCAGTCTGGAGCTGAGTTGGTGAGACCTGGGTCCTCAGTGAAGTTGTCCTGCAAGGATTCTTACTTTGCCTTCATGGCCAGTGCTATGCACTGGGTGAAGCAAAGACCTGGACATGGCCTGGAATGGATAGGATCTTTTACTATGTACAGTGATGCTACTGAGTACAGTGAAAACTTCAAGGGCAAGGCCACATTGACTGCAAACACATCCTCGAGCACAGCCTACATGGAACTCAGCAGCCTCACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>60|IGHV1-5 ENSMUST00000191803|IGHV1-5|5'UTR|IG|IGH|None|00 +GATCAGTATCCTCTTCACAGTCACTGAAAACATTGACTCTAATC +>61|IGHV1-5 ENSMUST00000191803|IGHV1-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTAACTGGATACTTCCTTTTATTCTGTCGGTAACTTCAGGGGTCTACTCAGAGGTTCAGCTCCAGCAGTCTGGGACTGTGCTGGCAAGGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGACTTCTGGCTACACATTTACCAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATAGGGGCTATTTATCCTGGAAATAGTGATACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCAAACTGACTGCAGTCACATCCGCCAGCACTGCCTACATGGAGCTCAGCAGCCTGACAAATGAGGACTCTGCGGTCTATTACTGTACAAGA +>62|IGHV1-50 ENSMUST00000103521|IGHV1-50|5'UTR|IG|IGH|None|00 +CTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCGCC +>63|IGHV1-50 ENSMUST00000103521|IGHV1-50|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCTCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGCTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>64|IGHV1-52 ENSMUST00000192554|IGHV1-52|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCATTGGGTGAAGCAGAGGCCTATACAAGGCCTTGAATGGATTGGTAACATTGACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>65|IGHV1-53 ENSMUST00000103523|IGHV1-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGACTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAAATATTAATCCTAGCAATGGTGGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>66|IGHV1-54 ENSMUST00000103525|IGHV1-54|5'UTR|IG|IGH|None|00 +AGTCCCTGAACACACTGACTCTCACC +>67|IGHV1-54 ENSMUST00000103525|IGHV1-54|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCAGAGTCTTTATCTTTCTCCTATCAGTAACTGCAGGTGTTCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGATACGCCTTCACTAATTACTTGATAGAGTGGGTAAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGTGATTAATCCTGGAAGTGGTGGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCAACACTGACTGCAGACAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>68|IGHV1-55 ENSMUST00000103526|IGHV1-55|5'UTR|IG|IGH|None|00 +CACCACACAAAAAAGCATAAGATCACTGTTCTCTCTACAGTTACTAAGCACACAGGATCTCACC +>69|IGHV1-55 ENSMUST00000103526|IGHV1-55|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCATTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATAACCTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAGATATTTATCCTGGTAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>70|IGHV1-56 ENSMUST00000194071|IGHV1-56|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGTTGGGTCTTTCTTTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTCCTGGCTATACCTTCACCAGCCACTGGATGCAGTGGGTAAGACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>71|IGHV1-58 ENSMUST00000103529|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGATCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTCCAGCTTCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGTCCTCAGTGAAGATGTCCTGCAAGACTTCTGGATATACATTCACAAGCTACGGTATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTGGAATGGATTGGATATATTTATATTGGAAATGGTTATACTGAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTTCAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAATCTATTTCTGTGCAAGA +>72|IGHV1-59 ENSMUST00000195359|IGHV1-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATTGTCCTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGACTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTAAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGTGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>73|IGHV1-61 ENSMUST00000103531|IGHV1-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGGATTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAATGGATTGGTAACATTTACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>74|IGHV1-62-1 ENSMUST00000103503|IGHV1-62-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACAGAGTTGGGTCTTACTCTTCCTCCTGTCAGAAACTGCAGGTGTCCACTGCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACAGCAGAGAACTCTGCAATCTATCTGTGCAAGG +>75|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|5'UTR|IG|IGH|None|00 +GAACACACTGACTCAAACC +>76|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>77|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>78|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTTCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCAGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>79|IGHV1-63 ENSMUST00000103534|IGHV1-63|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCGGGGTCTTTATCTTTCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACCTTCACTAACTACTGGATAGGTTGGGCAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGATATTTACCCTGGAGGTGGTTATACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGTTCAGCAGCCTGACATCTGAGGACTCTGCCATCTATTACTGTGCAAGA +>80|IGHV1-64 ENSMUST00000103535|IGHV1-64|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACAGTTCTCTCTACAGTTACTGAGCACACAGGACCTCACA +>81|IGHV1-64 ENSMUST00000103535|IGHV1-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTATATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTAAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACTTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAATGATTCATCCTAATAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>82|IGHV1-66 ENSMUST00000103537|IGHV1-66|5'UTR|IG|IGH|None|00 +ATGATCAGTGTCCTCTCTACACAGTCCCTGACGACACTGACTCTAACC +>83|IGHV1-66 ENSMUST00000103537|IGHV1-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACAGCTTCACAAGCTACTATATACACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGTGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACGGCAGACACATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTAACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>84|IGHV1-69 ENSMUST00000199933|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGATGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGTCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>85|IGHV1-7 ENSMUST00000103496|IGHV1-7|5'UTR|IG|IGH|None|00 +GCATCCTCTCCACAGACACTGAAAACTCTGACTCAAC +>86|IGHV1-7 ENSMUST00000103496|IGHV1-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTCCCTGTTGTCAGTAATAGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAAACCTGGGGCCTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTGAGCAGCCTGACATATGAGGACTCTGCAGTCTATTACTGTGCAAGA +>87|IGHV1-71 ENSMUST00000196690|IGHV1-71|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>88|IGHV1-72 ENSMUST00000103541|IGHV1-72|5'UTR|IG|IGH|None|00 +AGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>89|IGHV1-72 ENSMUST00000103541|IGHV1-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>90|IGHV1-74 ENSMUST00000196587|IGHV1-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGCCAAGGCCTTGAGTGGATTGGAAGGATTCATCCTTCTGATAGTGATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAATA +>91|IGHV1-75 ENSMUST00000103544|IGHV1-75|5'UTR|IG|IGH|None|00 +CCTGACGACACTGACTCTAACC +>92|IGHV1-75 ENSMUST00000103544|IGHV1-75|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTACAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTTTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTTACTGTAGACAAATCCTCCAGCACAGCCTACATGTTGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>93|IGHV1-76 ENSMUST00000197537|IGHV1-76|5'UTR|IG|IGH|None|00 +CGACACTGATTCTAACC +>94|IGHV1-76 ENSMUST00000197537|IGHV1-76|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTGTCAGGTCCAGCTGAAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACTTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGCAAGGATTTATCCTGGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGAAAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCTGTCTATTTCTGTGCAAGA +>95|IGHV1-77 ENSMUST00000198777|IGHV1-77|5'UTR|IG|IGH|None|00 +AAACAACCTATGATCAGTGTCCTCTCCACAGTCTCTGAACACCCTTACTCAAACC +>96|IGHV1-77 ENSMUST00000198777|IGHV1-77|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTCCAGCTGAAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAAGATTGGTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>97|IGHV1-78 ENSMUST00000199373|IGHV1-78|5'UTR|IG|IGH|None|00 +GTCCCTGAACACACTGACTGTAACA +>98|IGHV1-78 ENSMUST00000199373|IGHV1-78|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTCTCTCTTCTTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGTTCAGCTGCAACAGTCTGACGCTGAGTTGGTGAAACCTGGAGCTTCAGTGAAGATATCCTGCAAGGTTTCTGGCTACACCTTCACTGACCATACTATTCACTGGATGAAGCAGAGGCCTGAACAGGGCCTGGAATGGATTGGATATATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>99|IGHV1-80 ENSMUST00000103547|IGHV1-80|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTTGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAAGCTTCTGGCTACGCATTCAGTAGCTACTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACAGATTTATCCTGGAGATGGTGATACTAACTACAACGGAAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>100|IGHV1-81 ENSMUST00000103548|IGHV1-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGATCTTTCTCTTCATCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGGCGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTATGGTATAAGCTGGGTGAAGCAGAGAACTGGACAGGGCCTTGAGTGGATTGGAGAGATTTATCCTAGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCGTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>101|IGHV1-82 ENSMUST00000196991|IGHV1-82|5'UTR|IG|IGH|None|00 +CTTCTCCACAGTCCCAGAACACACTCACTCTAACC +>102|IGHV1-82 ENSMUST00000196991|IGHV1-82|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTGTATCTTTCTCTTCCTCCTGTCAGTAACTGAAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAGGCTTCTGGCTACGCATTCAGTAGCTCCTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACGGATTTATCCTGGAGATGGAGATACTAACTACAATGGGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTACTTCTGTGCAAGA +>103|IGHV1-84 ENSMUST00000103551|IGHV1-84|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTTTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGATCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGCGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>104|IGHV1-85 ENSMUST00000103552|IGHV1-85|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTACGATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCGTACATGGAGCTCCACAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>105|IGHV1-9 ENSMUST00000193893|IGHV1-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGACCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGATGAAGCCTGGGGCCTCAGTGAAGCTTTCCTGCAAGGCTACTGGCTACACATTCACTGGCTACTGGATAGAGTGGGTAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGAGATTTTACCTGGAAGTGGTAGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACATTCACTGCAGATACATCCTCCAACACAGCCTACATGCAACTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>106|IGHV10-1 ENSMUST00000103492|IGHV10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGCTGTTGGGGCTGAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGGTCATTGAAACTCTCATGTGCAGCCTCTGGATTCAGCTTCAATACCTACGCCATGAACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAATAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCAGAAAGCATGCTCTATCTGCAAATGAACAACTTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGACA +>107|IGHV10-3 ENSMUST00000103495|IGHV10-3|5'UTR|IG|IGH|None|00 +GACAATATAACATTGAAC +>108|IGHV10-3 ENSMUST00000103495|IGHV10-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGTGTTGGGGCTTAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGATCATTGAAACTCTCATGTGCCGCCTCTGGTTTCACCTTCAATACCTATGCCATGCACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAGTAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCACAAAGCATGCTCTATCTGCAAATGAACAACCTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGAGA +>109|IGHV11-1 ENSMUST00000103466|IGHV11-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGAAGGCTTGGTGCCACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGCTTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCTGAGGACACAGCCACGTATTTCTGTATGAGATA +>110|IGHV11-2 ENSMUST00000103468|IGHV11-2|5'UTR|IG|IGH|None|00 +ATGCAAATAGGGCCTCTTTCTACTCATGAAACGCAGACCAACCTATCCTTGCAGTTCAGACAGAGGAGCTTGGCTCTGGTTCCCAAGACCTCTTACTCACTTCTCAAC +>111|IGHV11-2 ENSMUST00000103468|IGHV11-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGGAGGCTTGGTGCAACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGATTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCGGAGGACACAGCCACGTATTTCTGTATGAGATA +>112|IGHV12-3 ENSMUST00000103485|IGHV12-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGCTGGGATTTGTGTGCCTGGTGACAGTCCTTCCTGGTAGCCTGTCTCAGATGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCCTCACAGTCACTCTTCCTTACCTGCTCTATTACTGGTTTCCCCATCACCAGTGGTTACTACTGGATCTGGATCCGTCAGTCACCTGGGAAACCCCTAGAATGGATGGGGTACATCACTCATAGTGGGGAAACTTTCTACAACCCATCTCTCCAGAGCCCCATCTCCATTACTAGAGAAACGTCAAAGAACCAGTTCTTCCTCCAATTGAACTCTGTGACCACAGAGGACACAGCCATGTATTACTGTGCAGGAGACAG +>113|IGHV13-2 ENSMUST00000125484|IGHV13-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGACTGAGCTGGGTATTTCTTGTGGCTCTTTTGAACGGTGTCCAGTGTCAGGTGCAGCTTGTAGAGACCGGGGGAGGCTTGGTGAGGCCTGGAAATTCTCTGAAACTCTCCTGTGTTACCTCGGGATTCACTTTCAGTAACTACCGGATGCACTGGCTTCGCCAGCCTCCAGGGAAGAGGCTGGAGTGGATTGCTGTAATTACAGTCAAATCTGATAATTATGGAGCAAATTATGCAGAGTCTGTGAAAGGCAGATTCGCCATTTCAAGAGATGATTCAAAAAGCAGTGTCTACCTAGAGATGAACAGATTAAGAGAGGAAGACACTGCCACTTATTTTTGTAGTAGACA +>114|IGHV14-1 ENSMUST00000103463|IGHV14-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGATACTGAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATGACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>115|IGHV14-2 ENSMUST00000103467|IGHV14-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGATCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAAGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGACTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGAAACTAAATATGCCCCGAAATTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTGCTAGA +>116|IGHV14-3 ENSMUST00000103469|IGHV14-3|5'UTR|IG|IGH|None|00 +ATATGAGCCCTATATTCTCTACAGACACTGAATCTCAAGGTCCTTACA +>117|IGHV14-3 ENSMUST00000103469|IGHV14-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATTCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGTGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAAACACCTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGCGAATGGTAATACTAAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATAACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCATCTATTACTGTGCTAGA +>118|IGHV14-4 ENSMUST00000195706|IGHV14-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTATAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTTAACATTAAAGACGACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGATGGATTGATCCTGAGAATGGTGATACTGAATATGCCTCGAAGTTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>119|IGHV15-2 ENSMUST00000195337|IGHV15-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGATCACTCTCCATCTGCTGGCAGCAGCTACAGGTATCCAATCCCAGGTTCACCTACAACAGTCTGGTTCTGAACTGAGGAGTCCTGGGTCTTCAGTAAAGCTGTCATGCAAGGATTTTGATTCAGAAGTCTTCCCTATTGCTTATATGAGTTGGGTAAGGCAGAAGCCTGGGCATGGATTTGAATGGATTGGAGGCATACTCCCAAGTATTGGTAGAACAATCTATGGAGAGAAGTTTGAGGACAAAGCCACATTGGATGCAGACACACTGTCCAACACAGCCTACTTGGAGCTCAACAGTCTGACATCCGAGGACTCTGCTATCTACTACTGTGCAAGG +>120|IGHV16-1 ENSMUST00000195641|IGHV16-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTTAGTTGGGCTTTCCTTGTTATTTTAAAAGGCATACAGGGTGAGGTGCAGCTGGTGGAATCTGGAGGCAGCTTGGGACAGCCTGGAGGGTCCACTAAACTCTCTTGTGAAGAAGCATCTGGATTCACTTTCAGTGATCATTGGATGGACTGGTTTCGCCAAGCCCCAGGCATGAGGCTAGAATGGTTAGCAAATACAAACCATGATGAGAGTGGAAAAGGCTATGCAGAGTCTGTGAAAGACAGATTCTCCATCTCCAGAGACAATTCTGAGAACTTATTGTATCTACAAATGAACAGTCTGAGAAACGAAGACACGGCTCTGTATTATTGTGCCAGAGA +>121|IGHV2-2 ENSMUST00000103443|IGHV2-2|5'UTR|IG|IGH|None|00 +GC +>122|IGHV2-2 ENSMUST00000103443|IGHV2-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCTTGGGGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCAGCTTTCATATCCAGACTGAGCATCAGCAAGGACAATTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACAGCCATATATTACTGTGCCAGAAA +>123|IGHV2-3 ENSMUST00000178229|IGHV2-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCACTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCAGGGTTCTCATTAACCAGCTATGGTGTAAGCTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGACGGGAGCACAAATTATCATTCAGCTCTCATATCCAGACTGAGCATCAGCAAGGATAACTCCAAGAGCCAAGTTTTCTTAAAACTGAACAGTCTGCAAACTGATGACACAGCCACGTACTACTGTGCCAA +>124|IGHV2-4 ENSMUST00000103447|IGHV2-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCTGCTTTCATATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>125|IGHV2-5 ENSMUST00000195707|IGHV2-5|5'UTR|IG|IGH|None|00 +ATCCTTGCTCATTGTTTCCTTTTATCCTTTCAGAAACCTCCCCCAATGCAAAGCAGCCCTCAGGCAGAGGATAAAAGCCCACACAAAGCTGAGAAGCCCCATCCTCTTCTCATAGAGCCTCCATCAGAGC +>126|IGHV2-5 ENSMUST00000195707|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATAACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGAGGTGGAAGCACAGACTACAATGCAGCTTTCATGTCCAGACTGAGCATCACCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>127|IGHV2-6 ENSMUST00000179657|IGHV2-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTTCTCTGCCTGGTGACTTTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACCGTCTCAGGGTTCTCATTAACCAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGTAGTGATATGGAGTGATGGAAGCACAACCTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTCCAAACTGATGACACAGCCATGTACTACTGTGCCAGACA +>128|IGHV2-6-8 ENSMUST00000192911|IGHV2-6-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTATCCTTTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGTTGGAAGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAGTGA +>129|IGHV2-7 ENSMUST00000103456|IGHV2-7|5'UTR|IG|IGH|None|00 +AGAGC +>130|IGHV2-7 ENSMUST00000103456|IGHV2-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTCCTCTGCCTGGTGACCTTTCCAAGCTGTGTCCTGTCACAAGTGCAGATGAAGGAGTCAGGACCTGACCTTGTGCAGCCATCACAGACTCTGTCTCTCACCTGCACTGTCTCTGGGTTCTCATTAAGTAGCTATGGTGTACATTGGTTTCGCAAGCCTCCGAGAAAGGGATTGGAATGGTTGGGAGGAATATGGTCTGGTGGAAGCATATACTATACTCCAGCTCTCAGTTCCCGACTGAGTGTCAGCAGGGACACCTCTAAGAGCCAAGTTTTCTTTAAAATGAGCAGTCTGCAAAGTGAAGACACGGCTGTGTACCACTGTGCCAGATA +>131|IGHV2-9 ENSMUST00000103451|IGHV2-9|5'UTR|IG|IGH|None|00 +CCCCATCAGAGC +>132|IGHV2-9 ENSMUST00000103451|IGHV2-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGTTCCTCTGCCTGGTTGCATTTCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACTTGCACTGTCTCTGGGTTTTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGGTGGAAGCACAAATTATAATTCAGCTCTCATGTCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAAACA +>133|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|5'UTR|IG|IGH|None|00 +ATAGAGCCTCCATCAGAGC +>134|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTGCCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGCTATAAGCTGGGTTCGCCAGCCACCAGGAAAGGGTCTGGAGTGGCTTGGAGTAATATGGACTGGTGGAGGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGTCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCAGGTACTACTGTGCCAGAAA +>135|IGHV3-1 ENSMUST00000103478|IGHV3-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGCGTGCTGATTCTTTTGTGGCTGTTCACAGCCTTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCATGGTGAAACCTTCTCAGTCACTTTCCCTCACCTGCACTGTCACTGGCTACTCCATCACCAGTGGTTATGACTGGCACTGGATCCGACATTTTCCAGGAAACAAACTGGAGTGGATGGGCTACATAAGCTACAGTGGTAGCACTAACTACAACCCATCCCTCAAAAGTCGAATCTCCATCACTCATGACACATCTAAGAACCATTTCTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>136|IGHV3-3 ENSMUST00000191693|IGHV3-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAATGTTGAGTGTTCTGTACCTGTTGTCAGCCCTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTAGCCTGGTGAGACCTTCTCAGACACTCTCCCTTACCTGCACTGTTACTGGCTTCTCCATCAACAGTGATTGTTACTGGATCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTACATCGGGTACACATTCTACAGTGGTATCACTTACTACAACCCATCTCTTGAAAGTCGAACGTACATAACGCGTGACACATCTAAGAACCAGTTCTCACTGAAGTTGAGTTCTGTGACTACTGAGGACACAGCCACTTACTACTGTGCGAGAGA +>137|IGHV3-4 ENSMUST00000193408|IGHV3-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGTTGATTCTTGTGTACCTGTTGACAGCCCTTCCTGGTATCTTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGCCCTGGTGAAGCCTTCTCAGACAGTGTCCCTCACCTGCACTGTCACTGGCTACTCTATCACTAATGGTAATCACTGGTGGAACTGGATCCGGCAGGTTTCAGGAAGCAAACTGGAGTGGATAGGGTACATAAGCTCCAGTGGTAGCACTGACAGCAATCCATCTCTCAAAAGTCGAATCTCCATCACTAGAGACACTTCCAAGAACCAGTTATTCCTGCAGTTGAACTCTGTGACTACTGAAGATATAGCCACATATTACTGTGCAAGAGA +>138|IGHV3-5 ENSMUST00000195619|IGHV3-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAATGTTCACTCTTCTGTACCTGTTGACAGTCGTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCTTCTCAGACAGTGTTCCTCACCTGCACTGTCACTGGCATTTCCATCACCACTGGAAATTACAGGTGGAGCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTGGATAGGGTACATATACTACAGTGGTACCATTACCTACAATCCATCTCTCACAAGTCGAACCACCATCACTAGAGACACTCCCAAGAACCAGTTCTTCCTGGAAATGAACTCTTTGACTGCTGAGGACACAGCCACATACTACTGTGCACGAGA +>139|IGHV3-6 ENSMUST00000195124|IGHV3-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAGTGTTGAGTCTGTTGTACCTGTTGACAGCCATTCCTGGTATCCTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGGCCTCGTGAAACCTTCTCAGTCTCTGTCTCTCACCTGCTCTGTCACTGGCTACTCCATCACCAGTGGTTATTACTGGAACTGGATCCGGCAGTTTCCAGGAAACAAACTGGAATGGATGGGCTACATAAGCTACGATGGTAGCAATAACTACAACCCATCTCTCAAAAATCGAATCTCCATCACTCGTGACACATCTAAGAACCAGTTTTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>140|IGHV3-8 ENSMUST00000103483|IGHV3-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGTGTTAAGTCTTCTGTACCTGTTGACAGCCCTTCCGGGTATCCTGTCAGAGGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGCAAAACCTTCTCAGACTCTGTCCCTCACCTGTTCTGTCACTGGCTACTCCATCACCAGTGATTACTGGAACTGGATCCGGAAATTCCCAGGGAATAAACTTGAGTACATGGGGTACATAAGCTACAGTGGTAGCACTTACTACAATCCATCTCTCAAAAGTCGAATCTCCATAACTCGAGACACATCCAAGAACCAGTATTACCTGCAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGATACACAGTGTGGAGTCTTCAGTGTAGGCCCAGACATAAACCTCCTTGTA +>141|IGHV4-1 ENSMUST00000103464|IGHV4-1|5'UTR|IG|IGH|None|00 +GAAGCAAAGGGGATCAGCCCGAGATTCTCATTCAGTGATCAACACTGAACACACATCCCTTACC +>142|IGHV4-1 ENSMUST00000103464|IGHV4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTTTGGGCTGATTTTTTTTATTGTTGCTCTTTTAAAAGGGGTCCAGTGTGAGGTGAAGCTTCTCCAGTCTGGAGGTGGCCTGGTGCAGCCTGGAGGATCCCTGAAACTCTCCTGTGCAGCCTCAGGAATCGATTTTAGTAGATACTGGATGAGTTGGGTTCGGCGGGCTCCAGGGAAAGGACTAGAATGGATTGGAGAAATTAATCCAGATAGCAGTACAATAAACTATGCACCATCTCTAAAGGATAAATTCATCATCTCCAGAGACAACGCCAAAAATACGCTGTACCTGCAAATGAGCAAAGTGAGATCTGAGGACACAGCCCTTTATTACTGTGCAAGACC +>143|IGHV5-12 ENSMUST00000103450|IGHV5-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTGGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATTACATGTATTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAATGGTGGTGGTAGCACCTATTATCCAGACACTGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCCGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>144|IGHV5-12-4 ENSMUST00000195381|IGHV5-12-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCATATTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTCGTGGAGTCTGGGGGAGGTTTAGTGAAGCCTGGACAGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACTATTACATGTCTTGGGTTCACCAGACTCCGGAGAAGAGGCTGGAGTGGGTTGCATACATTAGTAGTAGTGGTGTTAGCACCTATTATCCAGACAATGTAAAGGGCCGATTCGCCATCTCCAGAGACAATGCCAAGAACACCCTTTACCTGCAAATGACCAGTCTGAAGTCAGAGGACACGGCCTTGTATTACTGTGCAAGAGG +>145|IGHV5-15 ENSMUST00000192877|IGHV5-15|5'UTR|IG|IGH|None|00 +CACTCATC +>146|IGHV5-15 ENSMUST00000192877|IGHV5-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCAGGCTCAGCTTACTTATTTTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTACGGAATGGCGTGGGTTCGACAGGCTCCAAGGAAGGGGCCTGAGTGGGTAGCATTCATTAGTAATTTGGCATATAGTATCTACTATGCAGACACTGTGACGGGCCGATTCACCATCTCTAGAGAGAATGCCAAGAACACCCTGTACCTGGAAATGAGCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGACA +>147|IGHV5-16 ENSMUST00000193652|IGHV5-16|5'UTR|IG|IGH|None|00 +ATCAGGACTGAACACAGACCAGTCACC +>148|IGHV5-16 ENSMUST00000193652|IGHV5-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTCAGGCTCAGCTCAGTTTTTCTTGTTCTTATTTTAAAAGGAGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGAGGGAGGCTTAGTGCAGCCTGGAAGTTCCATGAAACTCTCCTGCACAGCCTCTGGATTCACTTTCAGTGACTATTACATGGCTTGGGTCCGCCAGGTTCCAGAAAAGGGTCTAGAATGGGTTGCAAACATTAATTATGATGGTAGTAGCACCTACTATCTGGACTCCTTGAAGAGCCGTTTCATCATCTCGAGAGACAATGCAAAGAACATTCTATACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCACGTATTACTGTGCAAGAGA +>149|IGHV5-17 ENSMUST00000103459|IGHV5-17|5'UTR|IG|IGH|None|00 +TGGATTCCCAGGTCCTCACATTCAGTGATCAGCACTGAACACAGACCACTCACC +>150|IGHV5-17 ENSMUST00000103459|IGHV5-17|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTCCAGGCTCAATTTAGTTTTCCTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATGGAATGCACTGGGTTCGTCAGGCTCCAGAGAAGGGGCTGGAGTGGGTTGCATACATTAGTAGTGGCAGTAGTACCATCTACTATGCAGACACAGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTTCCTGCAAATGACCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGG +>151|IGHV5-2 ENSMUST00000195468|IGHV5-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCGGGCTCAGCTTGGTTTTCCTTGTCCTTATTTTAAAAAGTGTACAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGAGTCCCTGAAACTCTCCTGTGAATCCAATGAATACGAATTCCCTTCCCATGACATGTCTTGGGTCCGCAAGACTCCGGAGAAGAGGCTGGAGTTGGTCGCAGCCATTAATAGTGATGGTGGTAGCACCTACTATCCAGACACCATGGAGAGACGATTCATCATCTCCAGAGACAATACCAAGAAGACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACAGCCTTGTATTACTGTGCAAGACA +>152|IGHV5-4 ENSMUST00000103444|IGHV5-4|5'UTR|IG|IGH|None|00 +TGACAGAGGAGGCCGGTCCTGGATTCGAGTTCCTCACATTCAGTGATGAGCACTGAACACGGACCCCTCACC +>153|IGHV5-4 ENSMUST00000103444|IGHV5-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCGGAAAAGAGGCTGGAGTGGGTCGCAACCATTAGTGATGGTGGTAGTTACACCTACTATCCAGACAATGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACAACCTGTACCTGCAAATGAGCCATCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGAGA +>154|IGHV5-6 ENSMUST00000103446|IGHV5-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGACTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGGCATGTCTTGGGTTCGCCAGACTCCAGACAAGAGGCTGGAGTGGGTCGCAACCATTAGTAGTGGTGGTAGTTACACCTACTATCCAGACAGTGTGAAGGGGCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>155|IGHV5-9 ENSMUST00000103448|IGHV5-9|5'UTR|IG|IGH|None|00 +GGAGGCAGGTCCTAGATTTGAGTTCCTCACATTCAGTGATCAGCACTGAACACGGAACCCTCACC +>156|IGHV5-9 ENSMUST00000103448|IGHV5-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTTGGGCTGAGCTTGATTTTCCTTGTCCTAATTTTAAAAGGTGTCCAGTGTGAAGTGATGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATACCATGTCTTGGGTTCGCCAGACTCCGGAGAAGAGGCTGGAGTGGGTCGCAACCATTAGTGGTGGTGGTGGTAACACCTACTATCCAGACAGTGTGAAGGGTCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACGGCCTTGTATTACTGTGCAAGACA +>157|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|5'UTR|IG|IGH|None|00 +CTGGAATTGATTCCTAGTTCCTCACGTTCAGTG +>158|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGTACTGAACACAGACCCCTCACCATGAACTTCGGGCTCAGATTGATTTTCCTTGTCCTTACTTTAAAAGGTGTCCAGTGTGACGTGAAGCTGGTGGAGTCTGGGGAAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAGTGGTGGTGATTACATCTACTATGCAGACACTGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAGGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTACAAGAGA +>159|IGHV6-3 ENSMUST00000103486|IGHV6-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGAGACTGAGCTGTGCTTTTATTATTGTTCTTTTAAAAGGGGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTCAGTAACTACTGGATGAACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTCAAATTAGATTGAAATCTGATAATTATGCAACACATTATGCGGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAACTTAAGGGCTGAAGACACTGGAATTTATTACTGCACAGG +>160|IGHV6-4 ENSMUST00000191918|IGHV6-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGAACTGAGCTGTGTTTTCATTGTTGTTCTCTTAAAAGGTGTCCAGAGTGATGTGAACCTGGAAGTGTCTGGAGGAGGCTTAGTTAAACCTGGAGGATCCATGCAACTCTTTTGTGTAGCCTCTGGATTTACTTTTGTAGATGGCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGTCTTGAGTGGGTTGCTGAAATTGCAAACAAAGCTAATAATTATGCAACATATTATCCCGAGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTTCAAAAGTAGTGTCTACCTGCATATGAACAGCTTAAGAGCCGAAGATACAGGCATTTATTACTGTACAAGG +>161|IGHV6-5 ENSMUST00000193936|IGHV6-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGGAACTGAACTGTGTTTTCATTGTTGTCCTCTTAAAAGGTGTCCAGAGTGAAGTGAAAATTGAGGAGTCAGGAGGAGGCTTGGTCCAACCTGGAGGATCCATGAAACTCTCTTGTGCAGCCTCTGGATTCACTTTCAGTGATTACAGGATGGACTGGGTCCACCACTCTACAGAGAATGGGTTGGAGTGGGTTGCTGAAATTAGAAACAAAGCTAGTAATTATGCAACATATTATGTGGAGTCTGTGAATGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGATACTGGCATTTATTACTGTACAAGG +>162|IGHV6-6 ENSMUST00000103489|IGHV6-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAACTGTGTATTCATAGTTTTTCTCTTAAAAGGTGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCTTGTGCTGCCTCTGGATTCACTTTTAGTGACGCCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTGAAATTAGAAACAAAGCTAATAATCATGCAACATACTATGCTGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGACACTGGCATTTATTACTGTACCAGG +>163|IGHV6-7 ENSMUST00000193397|IGHV6-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAGCTGTGTATTCATTTTTTTTCTCTTAAAAGGTGTCCAGTGTGAGGAGAAGCTGGATGAGTCTGGAGGAGGCTTGGTGCAACCTGGGAGGTCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTTACTAACTCCTGGATGAACTGGTTCTGCCAGTCTCCAGAGAAAGGACTGGAGTGGGTAGCACAAATTAAAAGCAAACCTTATAATTATGAAACATATTATTCAGATTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTATACCTGCAAATGAACAACTTAAGAGCTGAAGACACGGGCATCTATTACTGTACATGG +>164|IGHV7-1 ENSMUST00000103474|IGHV7-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGTTAAACTGGGTTTTTCTTTTAACACTTTTACATGGTATCCAGTGTGAGGTGAAGCTGGTGGAATCTGGAGGAGGCTTGGTACAGTCTGGGCGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCAGTGATTTCTACATGGAGTGGGTCCGCCAAGCTCCAGGGAAGGGACTGGAGTGGATTGCTGCAAGTAGAAACAAAGCTAATGATTATACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCATCGTCTCCAGAGACACTTCCCAAAGCATCCTCTACCTTCAGATGAATGCCCTGAGAGCTGAGGACACTGCCATTTATTACTGTGCAAGAGATGCA +>165|IGHV7-2 ENSMUST00000193133|IGHV7-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGTTTAACATCATTATCTTCACAGTAACACCTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGAAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCACTGATTTCTACATGAACTGGGTCTGCCAGCCTCCAAGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGACTACAGTGCATCTATGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAACACACTGAGAACTGAGGACAGTGCCACTTATTACTGTGCAAGAGATACA +>166|IGHV7-3 ENSMUST00000103461|IGHV7-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGCTGAACTGGATTTTCCTTGTAACACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGTCTCTCCTGTGCAGCTTCTGGATTCACCTTCACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAATGCCCTGAGAGCTGAGGACAGTGCCACTTATTACTGTGCAAGATATA +>167|IGHV7-4 ENSMUST00000192499|IGHV7-4|5'UTR|IG|IGH|None|00 +ATGAACCTAGTCTTGATTTCCCCAGCCTTCAGTTCCCAGATTCAGTGATCAGCCTTGAACACAGACCTGTCACC +>168|IGHV7-4 ENSMUST00000192499|IGHV7-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGGTGAACTGGATTCTACTTGTAGCACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGATGGAATCTGGAGGAGGCTTGGTACAGCCTGGGGCTTCTCTGAGACTCTCCTGTGCAGCTTCTGGATTCACCTTTACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACCTGAGTGGTTGGCTTTGATTAGAAACAAAGCTAATGGTTACACAACAGAGTATACTGCATCTGTTAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAACATCCTCTATCTTCAAATGAACACCCTGAGGGCTGAGGACAGTGCCACTTATTACTGTGTAAAAGCTGTA +>169|IGHV8-11 ENSMUST00000103536|IGHV8-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGCTACTGATTGTTCCTGCATATGTCCTCTCCCAGATTACTCAGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTAGGCTGGATTCATCAGCCTTCAGGGAATGGTCTGGAGTGGCTGGCACACATTTGGTGGAATGATAATAAGTACTATAACACAGCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCGCCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>170|IGHV8-12 ENSMUST00000199266|IGHV8-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTGCTGCTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGTCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGAAAGGGTCTGGAGTGGCTGGCACACATTTACTGGGATGATGACAAGCGCTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAGAAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAAGAG +>171|IGHV8-2 ENSMUST00000195037|IGHV8-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGACTTACATTCTCATTCCTGCTGCTGCTGCCTGTCCCTGCATATGTCCTATCTCAGGTTACTCTGAAAGTGTCTGGCCCTGGGATATTGCAGCCATCACAGACTCTCAGCCTGGCCTGTACTTTCTCTGGGATTTCACTGAGTACTTCTGGTATGGGTTTGAGCTGGCTTCGTAAGCCCTCAGGGAAGGCTTTAGAGTGGCTGGCAAGCATTTGGAATAATGATAACTACTACAACCCATCTTTGAAGAGCCGGCTCACAATCTCCAAGGAGACCTCCAACTACCAAGTATTCCTTAAACTCACCAGTGTGGACACTGCAGATTCTGCCACATACTACGGTGCTTGGAGAGA +>172|IGHV8-4 ENSMUST00000192298|IGHV8-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTATGTCTTCATTCCTGCTGCTGGTTGTCCCTATATATGTTCTGTCCCAGATTACTCTGAAACAGTCTGGCCCTGGGATAGTGCAGCCATCCCAGCCCGTCAGACTTACTTGCACTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATAGGTGTAACCTGGATTCGTCAGCCCTCAGGGAAGGGTCTGGAGTGGCTGGCAACCATTTGGTGGGATGATGATAACCGCTACAACCCATCTCTAAAGAGCAGGCTCGCAGTCTCCAAAGACACCTCCAACAACCAAGCATTCCTGAATATCATCACTGTGGAAACTGCAGATACTGCCATATACTACTGTGCT +>173|IGHV8-5 ENSMUST00000194257|IGHV8-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCTTGCTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTAATATGGGTATAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTAGAGTGGCTGGCACACATTTGGTGGAATGATGATAAGTACTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCAAATAG +>174|IGHV8-6 ENSMUST00000193145|IGHV8-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCGCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGTACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGATCTGGAGTGGCTGGCACACATTTATTGGGATGATGACAAGCACTATAACCCATCCTTGAAGAGCCAGCTCAGAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGTAGATACTGCCACATACTACTGTGCTCGA +>175|IGHV8-8 ENSMUST00000192591|IGHV8-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGTTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTTTGGTATGGGTGTAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTGGTGGGATGATGATAAGTACTATAACCCAGCCCTGAAGAGTCGGCTCACAATCTCCAAGGATACCTCCAAAAACCAGGTATTCCTCAAGATCGCCAATGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>176|IGHV9-1 ENSMUST00000195884|IGHV9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATAGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCATGATATACACCGACACTGGAGAGCCAACATATGCTGAAGAGTTCAAGGGACGGTTTGCCTTCTCTTTGGAGACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGTAAGA +>177|IGHV9-2 ENSMUST00000103472|IGHV9-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATGGCAGCTGCCCAAAGGGCTCAAGCACAGATCCAGTTCGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGTGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCTGGATAAACACCTACTCTGGAGAGCCAACATATGCTGACGACTTCAAGGGACGGTTTGCCTTTTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>178|IGHV9-3 ENSMUST00000103473|IGHV9-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGTTGGCTGTGGAACTTGCTATTCCTGATGGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTACAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACCTATGGAATGAGCTGGGTGAAACAGGCTCCAGGAAAGGGTTTAAAGTGGATGGGCTGGATAAACACCTACTCTGGAGTGCCAACATATGCTGATGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>179|IGHV9-4 ENSMUST00000194159|IGHV9-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCTGTGGAACTTGCTATTTCTCATGGCAGCAGCTCAAAGTATCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACTGCTGGAATGCAGTGGGTGCAAAAGATGCCAGGAAAGGGTTTTAAGTGGATTGGCTGGATAAACACCCACTCTGGAGAGCCAAAATATGCAGAAGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTACAGATAAGCAACCTCAAAAATGAGGACACGGCTACGTATTTCTGTGCGAGA +>180|IGKC ENSMUST00000103410|IGKC|C-REGION|IG|IGK|None|00 +GGGCTGATGCTGCACCAACTGTATCCATCTTCCCACCATCCAGTGAGCAGTTAACATCTGGAGGTGCCTCAGTCGTGTGCTTCTTGAACAACTTCTACCCCAAAGACATCAATGTCAAGTGGAAGATTGATGGCAGTGAACGACAAAATGGCGTCCTGAACAGTTGGACTGATCAGGACAGCAAAGACAGCACCTACAGCATGAGCAGCACCCTCACGTTGACCAAGGACGAGTATGAACGACATAACAGCTATACCTGTGAGGCCACTCACAAGACATCAACTTCACCCATTGTCAAGAGCTTCAACAGGAATGAGTGT +>181|IGKJ1 ENSMUST00000103405|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGTGGAGGCACCAAGCTGGAAATCAAAC +>182|IGKJ2 ENSMUST00000198234|IGKJ2|J-REGION|IG|IGK|None|00 +TGTACACGTTCGGAGGGGGGACCAAGCTGGAAATAAAAC +>183|IGKJ3 ENSMUST00000199487|IGKJ3|J-REGION|IG|IGK|None|00 +AATCACATTCAGTGATGGGACCAGACTGGAAATAAAAC +>184|IGKJ4 ENSMUST00000103408|IGKJ4|J-REGION|IG|IGK|None|00 +ATTCACGTTCGGCTCGGGGACAAAGTTGGAAATAAAAC +>185|IGKJ5 ENSMUST00000199459|IGKJ5|J-REGION|IG|IGK|None|00 +GCTCACGTTCGGTGCTGGGACCAAGCTGGAGCTGAAAC +>186|IGKV1-110 ENSMUST00000103321|IGKV1-110|5'UTR|IG|IGK|None|00 +GATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>187|IGKV1-110 ENSMUST00000103321|IGKV1-110|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCCTTGTACACAGTAATGGAAACACCTATTTACATTGGTACCTGCAGAAGCCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTTCTGCTCTCAAAGTACACATGTTCCTCC +>188|IGKV1-117 ENSMUST00000103317|IGKV1-117|5'UTR|IG|IGK|None|00 +ACTGATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>189|IGKV1-117 ENSMUST00000103317|IGKV1-117|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTTTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCATTGTACATAGTAATGGAAACACCTATTTAGAATGGTACCTGCAGAAACCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTACTGCTTTCAAGGTTCACATGTTCCTCC +>190|IGKV1-122 ENSMUST00000103314|IGKV1-122|5'UTR|IG|IGK|None|00 +GTCTCCTCAGGCTCCCTCCTCAAA +>191|IGKV1-122 ENSMUST00000103314|IGKV1-122|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGCTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGGTCTAGTCAGAGCCTTGAAAACAGTAATGGAAACACCTATTTGAACTGGTACCTCCAGAAACCAGGCCAGTCTCCACAGCTCCTGATCTACAGGGTTTCCAACCGATTTTCTGGGGTCCTAGACAGGTTCAGTGGTAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTTCTGCCTCCAAGTTACACATGTCCCTCC +>192|IGKV1-131 ENSMUST00000103306|IGKV1-131|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGCTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTACATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCGCCTATTCTATCTGGTATCCAAACTGGACCCTGGCATCCCTGACAGTTTCAGTGGCAGTGGATCAGAGACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCCTGCAAGGTACACATTTTCCTCT +>193|IGKV1-132 ENSMUST00000103305|IGKV1-132|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGTTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTGTCTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCACCTAATGTATCAGGTGTCCAAACTGGACCCTGGCATCCCTGACAGGTTCAGTGGCAGTGGATCAGAAACAGATTTTACACTTAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCTTGCAAGGTACATATTATCCTCA +>194|IGKV1-133 ENSMUST00000103304|IGKV1-133|5'UTR|IG|IGK|None|00 +TATTTCCTCAAA +>195|IGKV1-133 ENSMUST00000103304|IGKV1-133|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAAACCTATTTGAATTGGTTATTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGAACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCGTGCAAGGTACACATTTTCCTCA +>196|IGKV1-135 ENSMUST00000103303|IGKV1-135|5'UTR|IG|IGK|None|00 +ACTGATCACTCTCCTATGTTCATTTCCTCAAA +>197|IGKV1-135 ENSMUST00000103303|IGKV1-135|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCGGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTAGATAGTGATGGAAAGACATATTTGAATTGGTTGTTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTGGCAAGGTACACATTTTCCTCA +>198|IGKV1-35 ENSMUST00000197820|IGKV1-35|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCACTCCATATTTATATTGTTGCTTTGGATTGTGGGAATCAGTGGTGACGTTGTGATGACCCAGACTCCACTCACTTTATCAGCTACCATTGGACAATCAGCCTCCGTCTCTTGCAGGTCAAGTCAGAGTCTCTTACATAGTAATGGAAACACATACTTGAATTGGTTTGTACAAAGGCCAGGCCCATCTCCACAGCTTCTAATTTATGGGGTGTTTGAACAGGAATCTGGGGTTCCTGACAGGTTCAGTGGCAGTGGGTCTGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCATGCAAGCTACCTATGAACCTCC +>199|IGKV1-88 ENSMUST00000103336|IGKV1-88|L-REGION+V-REGION|IG|IGK|None|00 +ATGAATTTGCCTGTTCATCTCTTGGTGCTTCTGTTGTTCTGGATTCCTGCTTCCAGAGGTGATGTTGTGGTGACTCAAACTCCACTCTCCCTGCCTGTCAGCTTTGGAGATCAAGTTTCTATCTCTTGCAGGTCTAGTCAGAGTCTTGCAAACAGTTATGGGAACACCTATTTGTCTTGGTACCTGCACAAGCCTGGCCAGTCTCCACAGCTCCTCATCTATGGGATTTCCAACAGATTTTCTGGGGTGCCAGACAGGTTCAGTGGCAGTGGTTCAGGGACAGATTTCACACTCAAGATCAGCACAATAAAGCCTGAGGACTTGGGAATGTATTACTGCTTACAAGGTACACATCAGCCTCC +>200|IGKV1-99 ENSMUST00000168090|IGKV1-99|5'UTR|IG|IGK|None|00 +GGCGCCTCATCAAA +>201|IGKV1-99 ENSMUST00000168090|IGKV1-99|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGCTGCCTGTTCTGCTAGTGGTGCTGCTATTGTTCACGAGTCCAGCCTCAAGCAGTGATGTTGTTCTGACCCAAACTCCACTCTCTCTGCCTGTCAATATTGGAGATCAAGCCTCTATCTCTTGCAAGTCTACTAAGAGTCTTCTGAATAGTGATGGATTCACTTATTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTAATATATTTGGTTTCTAATCGATTTTCTGGAGTTCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTTCCAGAGTAACTATCTTCCTCT +>202|IGKV10-94 ENSMUST00000103330|IGKV10-94|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGTGCAAGTCAGGGCATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAAGTTTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGACAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>203|IGKV10-95 ENSMUST00000198735|IGKV10-95|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTTTGTTTTCAAGGTACCAGATATGATATCCAGATGACACAGACTACTTCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTGAGGACATTAGCACTTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAGGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGGCAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>204|IGKV10-96 ENSMUST00000103328|IGKV10-96|5'UTR|IG|IGK|None|00 +CTCAGCCTGGAC +>205|IGKV10-96 ENSMUST00000103328|IGKV10-96|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTCAGGACATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTACTACACATCAAGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGAACAGATTATTCTCTCACCATTAGCAACCTGGAGCAAGAAGATATTGCCACTTACTTTTGCCAACAGGGTAATACGCTTCCTCC +>206|IGKV11-125 ENSMUST00000197406|IGKV11-125|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACACGAGGGCCCCTGCTGAGTTCCTTGGGTTCCTGTTGCTCTGGTTTTTAGGTGCCAGATGTGATGTCCAGATGATTCAGTCTCCATCCTCCCTGTCTGCATCTTTGGGAGACATAGTCACCATGACTTGCCAGGCAAGTCAGGGCACTAGCATTAATTTAAACTGGTTTCAGCAAAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGGTGCAAGCAACTTGGAAGATGGGGTCCCATCAAGGTTCAGTGGCAGTAGATATGGGACAGATTTCACTCTCACCATCAGCAGCCTGGAGGATGAAGATATGGCAACTTATTTCTGTCTACAGCATAGTTATCTCCCTCC +>207|IGKV12-38 ENSMUST00000198880|IGKV12-38|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAACTCCTGGGGTTGCTGCTGCTGTGGCTTACAGACGCAGGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTGGCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAACATTTACTACAGTTTAGCATGGTATCAGCAGAAGCAAGGGAAATCTCCTCAGCTCCTGATCTATAATGCAAACAGCTTGGAAGATGGTGTCCCATCGAGGTTCAGTGGCAGTGGATCTGGGACACAGTATTCTATGAAGATCAACAGCATGCAGCCTGAAGATACCGCAACTTATTTCTGTAAACAGGCTTATGACGTTCCTCC +>208|IGKV12-41 ENSMUST00000103369|IGKV12-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCTCACTCAGGTCCTGGCGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGGGAATATTCACAATTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGAACACAATATTCTCTCAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGAGTACTCCTCC +>209|IGKV12-44 ENSMUST00000103367|IGKV12-44|5'UTR|IG|IGK|None|00 +ATAGTCAGGTCACACCCTGTGCTGTAATCAGCATCACACTGAAAACACACAGAC +>210|IGKV12-44 ENSMUST00000103367|IGKV12-44|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGAAGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTTTTCTCTGAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATCATTATGGTACTCCTCC +>211|IGKV12-46 ENSMUST00000103365|IGKV12-46|5'UTR|IG|IGK|None|00 +GAGTCAGCCTCACACTGATCACACACAGAC +>212|IGKV12-46 ENSMUST00000103365|IGKV12-46|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGATGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGTATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTAATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATGCTGCAACAAACTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTATTCCCTCAAGATCAACAGCCTGCAGTCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGGGTACTCCTCC +>213|IGKV12-98 ENSMUST00000196839|IGKV12-98|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACATGCTCACTCAGCTCCTGGGATTACTGCTGCTCTGGTTTGCAGGTGGTAAATGTGACATTCAGATGACCCAGTCTCCTGCCTCCCAGTCTGCATCTCTGGGAGAAAGTGTCACCATCACATGCCTGGCAAGTCAGACCATTGGTACATGGTTAGCATGGTATCAGCAGAAACCAGGGAAATCTCCTCAGCTCCTGATTTATGCTGCAACCAGCTTGGCAGATGGGGTCCCATCAAGGTTCAGTGGTAGTGGATCTGGCACAAAATTTTCTTTCAAGATCAGCAGCCTACAGGCTGAAGATTTTGTAAGTTATTACTGTCAACAACTTTACAGTACTCCTCT +>214|IGKV13-84 ENSMUST00000103339|IGKV13-84|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTACTGCTGTTTGGAATCCCAGGCATGATATGTGACATCCAGATGACACAATCTTCATCCTCCTTTTCTGTATCTCTAGGAGACAGAGTCACCATTACTTGCAAGGCAAGTGAGGACATATATAATCGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>215|IGKV13-85 ENSMUST00000114212|IGKV13-85|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTCCTGCTGTTCAGAATCACAGGCATAATATGTGACATCCAGATGACACAATCTTCATCCTACTTGTCTGTATCTCTAGGAGGCAGAGTCACCATTACTTGCAAGGCAAGTGACCACATTAATAATTGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>216|IGKV14-100 ENSMUST00000199510|IGKV14-100|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCTTGCTCAGTTTCTTGCATTCTTGTTGCTTTGGTTTCCAGGTGCAAGATGTGACATCCTGATGACCCAATCTCCATCCTCCATGTCTGTATCTCTGGGAGACACAGTCAGCATCACTTGCCATGCAAGTCAGGGCATTAGCAGTAATATAGGGTGGTTGCAGCAGAAACCAGGGAAATCATTTAAGGGCCTGATCTATCATGGAACCAACTTGGAAGATGGAGTTCCATCAAGGTTCAGTGGCAGTGGATCTGGAGCAGATTATTCTCTCACCATCAGCAGCCTGGAATCTGAAGATTTTGCAGACTATTACTGTGTACAGTATGCTCAGTTTCCTCC +>217|IGKV14-111 ENSMUST00000103320|IGKV14-111|5'UTR|IG|IGK|None|00 +CAGCCAGGACTCAGC +>218|IGKV14-111 ENSMUST00000103320|IGKV14-111|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGACCCCTGCTCAGTTTCTTGGAATCTTGTTGCTCTGGTTTCCAGGTATCAAATGTGACATCAAGATGACCCAGTCTCCATCTTCCATGTATGCATCTCTAGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAATAGCTATTTAAGCTGGTTCCAGCAGAAACCAGGGAAATCTCCTAAGACCCTGATCTATCGTGCAAACAGATTGGTAGATGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTCACCATCAGCAGCCTGGAGTATGAAGATATGGGAATTTATTATTGTCTACAGTATGATGAGTTTCCTCC +>219|IGKV14-126 ENSMUST00000103310|IGKV14-126|5'UTR|IG|IGK|None|00 +TCAGC +>220|IGKV14-126 ENSMUST00000103310|IGKV14-126|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCCCCTGCTCAGTTTTTTGGGATCTTGTTGCTCTGGTTTCCAGGTATCAGATGTGACATCAAGATGACCCAGTCTCCATCCTCCATGTATGCATCGCTGGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAAAAGCTATTTAAGCTGGTACCAGCAGAAACCATGGAAATCTCCTAAGACCCTGATCTATTATGCAACAAGCTTGGCAGATGGGGTCCCATCAAGATTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTAACCATCAGCAGCCTGGAGTCTGACGATACAGCAACTTATTACTGTCTACAGCATGGTGAGAGCCCTCC +>221|IGKV14-130 ENSMUST00000196006|IGKV14-130|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGTTTCTTGGGATCTTGTTGCTCTGGTTCCCAGGTGCCAGATGTGAAATCCAGATGACCCAGTCTCCATCCTCTATGTCTGCATCTCTGGGAGACAGAATAACCATCACTTGCCAGGCAACTCAAGACATTGTTAAGAATTTAAACTGGTATCAGCAGAAACCAGGGAAACCCCCTTCATTCCTGATCTATTATGCAACTGAACTGGCAGAAGGGGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGACTATTCTCTGACAATCAGCAACCTGGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGTTTTATGAGTTTCCTCC +>222|IGKV15-103 ENSMUST00000103324|IGKV15-103|5'UTR|IG|IGK|None|00 +TCACTCTCAGTGAGGATACACCATCAGC +>223|IGKV15-103 ENSMUST00000103324|IGKV15-103|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCTTGCTGAGCTCCTGGGGCTGCTGCTGTTCTGCTTTTTAGGTGTGAGATGTGACATCCAGATGAACCAGTCTCCATCCAGTCTGTCTGCATCCCTTGGAGACACAATTACCATCACTTGCCATGCCAGTCAGAACATTAATGTTTGGTTAAGCTGGTACCAGCAGAAACCAGGAAATATTCCTAAACTATTGATCTATAAGGCTTCCAACTTGCACACAGGCGTCCCATCAAGGTTTAGTGGCAGTGGATCTGGAACAGGTTTCACATTAACCATCAGCAGCCTGCAGCCTGAAGACATTGCCACTTACTACTGTCAACAGGGTCAAAGTTATCCTCT +>224|IGKV16-104 ENSMUST00000103323|IGKV16-104|5'UTR|IG|IGK|None|00 +AATCAGTTCCTGCCAGGACACAGTTTAGAT +>225|IGKV16-104 ENSMUST00000103323|IGKV16-104|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCCAGGTTCAGGTTCTGGGGCTCCTTCTGCTCTGGATATCAGGTGCCCAGTGTGATGTCCAGATAACCCAGTCTCCATCTTATCTTGCTGCATCTCCTGGAGAAACCATTACTATTAATTGCAGGGCAAGTAAGAGCATTAGCAAATATTTAGCCTGGTATCAAGAGAAACCTGGGAAAACTAATAAGCTTCTTATCTACTCTGGATCCACTTTGCAATCTGGAATTCCATCAAGGTTCAGTGGCAGTGGATCTGGTACAGATTTCACTCTCACCATCAGTAGCCTGGAGCCTGAAGATTTTGCAATGTATTACTGTCAACAGCATAATGAATACCCGTAC +>226|IGKV17-121 ENSMUST00000197515|IGKV17-121|5'UTR|IG|IGK|None|00 +AAGGCC +>227|IGKV17-121 ENSMUST00000197515|IGKV17-121|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGTTCTCACTAGCTCTTCTCCTCAGTCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCATGGCTATAGGAGAAAAAGTCACCATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGTACAGATTTTGTTTTTACAATTGAAAACATGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACTTGCCTCT +>228|IGKV17-127 ENSMUST00000200586|IGKV17-127|5'UTR|IG|IGK|None|00 +AAGGCC +>229|IGKV17-127 ENSMUST00000200586|IGKV17-127|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGCTCTCACTAGCTCCTCTCCTCAGCCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCGTGGCTACAGGAGAAAAAGTCACTATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGCACAGATTTTGTTTTTACAATTGAAAACACGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACATGCCTCT +>230|IGKV18-36 ENSMUST00000200160|IGKV18-36|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACTCCAGCTTCATTTCTTTGCCTCCTTTTACTGTGGACCACGGCTGTCACTGGAGAAACAACACAGGCTCCAGCTTCTCTGAGTTTTTCTCTTGGTGAAACAGCAACACTGTCATGCAGGTCCAGTGAGAGTGTTGGCAGCTACTTAGCCTGGTACCAGCAGAAAGCAGAGCAAGTTCCCCGGCTCCTTATCCATAGTGCCTCCACTAGGGCCGGTGGTGTCCCAGTCCGGTTCAGTGGCACTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGTCTAGAACCTGAAGATGCTGCAGTTTACTACTGTCAACCTTTCAAAAGTTGGTCATA +>231|IGKV19-93 ENSMUST00000196863|IGKV19-93|5'UTR|IG|IGK|None|00 +AGGAGACGTTGTAGAA +>232|IGKV19-93 ENSMUST00000196863|IGKV19-93|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGACCGTCTATTCAGTTCCTGGGGCTCTTGTTGTTCTGGCTTCATGGTGCTCAGTGTGACATCCAGATGACACAGTCTCCATCCTCACTGTCTGCATCTCTGGGAGGCAAAGTCACCATCACTTGCAAGGCAAGCCAAGACATTAACAAGTATATAGCTTGGTACCAACACAAGCCTGGAAAAGGTCCTAGGCTGCTCATACATTACACATCTACATTACAGCCAGGCATCCCATCAAGGTTCAGTGGAAGTGGGTCTGGGAGAGATTATTCCTTCAGCATCAGCAACCTGGAGCCTGAAGATATTGCAACTTATTATTGTCTACAGTATGATAATCTTCTACC +>233|IGKV2-109 ENSMUST00000103322|IGKV2-109|5'UTR|IG|IGK|None|00 +CAAGTTCGCAGA +>234|IGKV2-109 ENSMUST00000103322|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCATTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAAGCCAGGCCAGTCTCCTCAGCTCCTGATTTATCAGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTAGCAGTGGGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTGCTCAAAATCTAGAACTTCCTCC +>235|IGKV2-112 ENSMUST00000103318|IGKV2-112|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCTCTCTTCAGTTCCTGGGGGTGCTTATGTTCTGGATCTCTGGAGTCAGTGGGGATATTGTGATAACCCAGGATGAACTCTCCAATCCTGTCACTTCTGGAGAATCAGTTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTATATAAGGATGGGAAGACATACTTGAATTGGTTTCTGCAGAGACCAGGACAATCTCCTCAGCTCCTGATCTATTTGATGTCCACCCGTGCATCAGGAGTCTCAGACCGGTTTAGTGGCAGTGGGTCAGGAACAGATTTCACCCTGGAAATCAGTAGAGTGAAGGCTGAGGATGTGGGTGTGTATTACTGTCAACAACTTGTAGAGTATCCTC +>236|IGKV2-137 ENSMUST00000103302|IGKV2-137|5'UTR|IG|IGK|None|00 +GGCTACTTTTCACACAGCTGCACCAAGCAGGGGATTTGCATATTGCTCCCTTGGGAGGATCTCTCCTGCAGGTCCAAGACAAAAGCTAGCCTCCATTTCTGTCTTGACTACTCAAGACTTTTTGTATCAAGTTCTCAGA +>237|IGKV2-137 ENSMUST00000103302|IGKV2-137|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCCTAGCTGAGTTCCTGGGGCTGCTTGTGCTCTGGATCCCTGGAGCCATTGGGGATATTGTGATGACTCAGGCTGCACCCTCTGTACCTGTCACTCCTGGAGAGTCAGTATCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTGCATAGTAATGGCAACACTTACTTGTATTGGTTCCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACTGCTTTCACACTGAGAATCAGTAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTATGCAACATCTAGAATATCCTTT +>238|IGKV20-101-2 ENSMUST00000200406|IGKV20-101-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGCTCTAGTTCAGCTCCTAGGGATGCTGATGCTCTGGCTCCAAGGCATGAGCTGTAATATCCAGGTGATCCAGTCACCATTTCTGTCTGCATCTGTGGGAGAGAGGGTCACAATCAGCTGCAAGACACATCAGCATATTAACAGTTCCATAGCCTGGTACCAGCAAAAAGTTGGAAAAGCTCCCATACTCCTGATAAGAGATGCAAGTTTTTCTCTAACAGACACCCCATCAAGGTTCACTGGGAATGGATTTGGCACAGATTTCACACTCAGCATCAGCAGTATGCAGTCTCAAGATGGTGCCACATATTTCTGCCAGCAGCATTTTCACTATTAC +>239|IGKV3-1 ENSMUST00000103404|IGKV3-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTCACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGAGCCACCATCTCCTGCAGAGCCAGTGAAAGTGTTGAATATTATGGCACAAGTTTAATGCAGTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACGTAGAATCTGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTGTGGAGGAGGATGATATTGCAATGTATTTCTGTCAGCAAAGTAGGAAGGTTCCTTC +>240|IGKV3-10 ENSMUST00000196940|IGKV3-10|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTAACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTGATCCTGTGGAGGCTGATGATGCTGCAACCTATTACTGTCAGCAAAATAATGAGGATCCTCC +>241|IGKV3-12 ENSMUST00000103396|IGKV3-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGTTATGGGTACTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCAAAAGTGTCAGTACATCTGGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCACAGTAGGGAGCTTCCTCC +>242|IGKV3-2 ENSMUST00000103403|IGKV3-2|5'UTR|IG|IGK|None|00 +TCTCTTCCAGTTCTCAGAG +>243|IGKV3-2 ENSMUST00000103403|IGKV3-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGAAAGACACACTCCTGCTATGGGTCCTGCTTCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAGAGCCAGCGAAAGTGTTGATAATTATGGCATTAGTTTTATGAACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCAAGGATCCGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTATGGAGGAGGATGATACTGCAATGTATTTCTGTCAGCAAAGTAAGGAGGTTCCTCC +>244|IGKV3-3 ENSMUST00000103402|IGKV3-3|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGAGCCACTATCTTCTGCAGAGCCAGCCAGAGTGTCGATTATAATGGAATTAGTTATATGCACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAAGATGCTGCAACCTATTACTGTCAGCAAAGTATTGAGGATCCTCC +>245|IGKV3-4 ENSMUST00000103401|IGKV3-4|5'UTR|IG|IGK|None|00 +G +>246|IGKV3-4 ENSMUST00000103401|IGKV3-4|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACAATCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAAGGCCAGCCAAAGTGTTGATTATGATGGTGATAGTTATATGAACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAATCTAGAATCTGGGATCCCAGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>247|IGKV3-5 ENSMUST00000103400|IGKV3-5|5'UTR|IG|IGK|None|00 +ATCCTCTCTTCCAGCTCTCAGAG +>248|IGKV3-5 ENSMUST00000103400|IGKV3-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTAATCCTGTGGAGGCTGATGATGTTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>249|IGKV3-7 ENSMUST00000197560|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCCAAAGTGTCAGTACATCTAGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCAAGTATGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATACTGCAACATATTACTGTCAGCACAGTTGGGAGATTCCTCC +>250|IGKV3-9 ENSMUST00000103398|IGKV3-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACCCACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGGGCCACCATATCCTGCCAAGCCAGCGAAAGTGTCAGTTTTGCTGGTACAAGTTTAATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGAGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGAGTCAGACTTCACTCTCACCATCGATCCTGTGGAGGAAGATGATGCTGCAATGTATTACTGTATGCAAAGTATGGAAGATCCTCC +>251|IGKV4-50 ENSMUST00000103363|IGKV4-50|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTATCTCAGTTGTAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGAAGGTCACCATGAGCTGCAGGGCCAGCTCAAGTGTAAATTACATGTACTGGTACCAGCAGAAGTCAGATGCCTCCCCCAAACTATGGATTTATTACACATCCAACCTGGCTCCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGAACTCTTATTCTCTCACAATCAGCAGCATGGAGGGTGAAGATGCTGCCACTTATTACTGCCAGCAGTTTACTAGTTCCCCATCCA +>252|IGKV4-51 ENSMUST00000103345|IGKV4-51|5'UTR|IG|IGK|None|00 +GCAGGAATTAGCCAGGGACTAAAATTCAAAGACACA +>253|IGKV4-51 ENSMUST00000103345|IGKV4-51|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCATTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCCCCCAAACTCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGGCTGGGATCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAAATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>254|IGKV4-53 ENSMUST00000198328|IGKV4-53|5'UTR|IG|IGK|None|00 +AAAAACACA +>255|IGKV4-53 ENSMUST00000198328|IGKV4-53|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCATGTGCAGATTTTCAGCTTCATGCTAATCAGTGTCACAGTCATATTGTCCAGTGGAGAAATTGTGCTCACCCAGTCTCCAGCACTCATGGCTGCATCTCCAGGGGAGAAGGTCACCATCACCTGCAGTGTCAGCTCAAGTATAAGTTCCAGCAACTTGCACTGGTACCAGCAGAAGTCAGAAACCTCCCCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGTCAACAGTGGAGTAGTTACCCACTCA +>256|IGKV4-54 ENSMUST00000199437|IGKV4-54|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACAGGTACCAGCAGAAGCCAGGATCCTCACCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAATATCATAGTTACCCACCCA +>257|IGKV4-55 ENSMUST00000103359|IGKV4-55|5'UTR|IG|IGK|None|00 +AGCTAGGGACCAAAGTTCAAAGACAAA +>258|IGKV4-55 ENSMUST00000103359|IGKV4-55|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCCTGATTTATGACACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTTACCCACCCA +>259|IGKV4-57 ENSMUST00000103357|IGKV4-57|L-REGION+V-REGION|IG|IGK|None|00 +ATGCATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATAACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTTCCAGCAGAAGCCAGGCACTTCTCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAAAGGAGTAGTTACCCACCCA +>260|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|5'UTR|IG|IGK|None|00 +AAATTCAAATACACA +>261|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCTGGTGCAGATTTTCAGCTTCTTGCTAATCAGTGCCTCAGTTGCAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGGGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGTGCCTCCCCCAAACTCTGGATTTATAGCACATCCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCACTCA +>262|IGKV4-58 ENSMUST00000197448|IGKV4-58|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCAGTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGCAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGCGCTTCCCCCAAACCCTTGATTCATAGGACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCGTGGAGGCTGAAGATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>263|IGKV4-59 ENSMUST00000103354|IGKV4-59|5'UTR|IG|IGK|None|00 +AAAATTCAAAGACAAA +>264|IGKV4-59 ENSMUST00000103354|IGKV4-59|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATATCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>265|IGKV4-61 ENSMUST00000199160|IGKV4-61|5'UTR|IG|IGK|None|00 +ATTAGCTAGGGACCAAAATTCAAAGACAGA +>266|IGKV4-61 ENSMUST00000199160|IGKV4-61|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATATCCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATCGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTATCATAGTTACCCACCCA +>267|IGKV4-62 ENSMUST00000198345|IGKV4-62|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGCCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGCTCCTCCCCCAGACTCTGGATTTATGACACATCCAACCTGGTTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTAGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCATCCA +>268|IGKV4-63 ENSMUST00000196595|IGKV4-63|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGAGAAAATGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAAGCACCTCCCCCAAACTCTGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCAGGTCGCTTCAGTGGCAGTGGGTCTGGAAACTCTTACTCTCTCACGATCAGCAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTTTTCAGGGGAGTGGGTACCCACTCA +>269|IGKV4-68 ENSMUST00000103350|IGKV4-68|5'UTR|IG|IGK|None|00 +AGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>270|IGKV4-68 ENSMUST00000103350|IGKV4-68|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATGAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCACTCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAAGATCCTCCCCCAAACCCTGGATTTATCTCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>271|IGKV4-69 ENSMUST00000103349|IGKV4-69|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTTAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTCTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCGCCCAAACCCTGGATTTATGACACATCCAACCTGGCTTCTGGATTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCATAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>272|IGKV4-70 ENSMUST00000103348|IGKV4-70|5'UTR|IG|IGK|None|00 +AATTAGCTAGGGACCAAAATTCAAAGACAAA +>273|IGKV4-70 ENSMUST00000103348|IGKV4-70|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTATAAGTTACATGCACTGGTACCAGCAGAAGCCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>274|IGKV4-71 ENSMUST00000196201|IGKV4-71|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTATTCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCTGGATTTATTTAACATTCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCTCAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>275|IGKV4-72 ENSMUST00000103346|IGKV4-72|5'UTR|IG|IGK|None|00 +TACTTATGAGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>276|IGKV4-72 ENSMUST00000103346|IGKV4-72|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTGTTCTCTCCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACAATGACTTGCAGGGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATGCCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGAGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>277|IGKV4-74 ENSMUST00000103344|IGKV4-74|5'UTR|IG|IGK|None|00 +GCAGTAATTAGCTAGGGACCAAAATTCAAAGGAAAA +>278|IGKV4-74 ENSMUST00000103344|IGKV4-74|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAACGGGTCACCATGACCTGCACTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCACCAGTATCATCGTTCCCCACCCA +>279|IGKV4-78 ENSMUST00000103343|IGKV4-78|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCATGACCTGCAGTGCCAGATCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTTTTACTGCCAGCAGTACAGTGGTTACCCATCCA +>280|IGKV4-79 ENSMUST00000103342|IGKV4-79|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCTTGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCTCTTATTTCTGCCATCAGTGGAGTAGTTACCCACCCC +>281|IGKV4-80 ENSMUST00000103341|IGKV4-80|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGGAGATCACCCTAACCTGCAGTGCCAGCTCGAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACTTCTCCCAAACTCTTGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTTCTCGCTTCAGTGGCAGTGGGTCTGGGACCTTTTATTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCGATTATTACTGCCATCAGTGGAGTAGTTATCCA +>282|IGKV4-81 ENSMUST00000197966|IGKV4-81|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGTTAATCAGTGTCTCAGTCATAATGTCCAGAGGAGAAAATGTGCTGACCCAGTCTCCAGCAATCATGGCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCTAGTAACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCTACCAAATTCTGGATTTATAGGACATCCAACCTGGCTTCAGAAGTCCCAGCTCCCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTTACAATCAGCAGCGTGGAGGCCGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTGGTTACCCACCCA +>283|IGKV4-86 ENSMUST00000200454|IGKV4-86|5'UTR|IG|IGK|None|00 +CACTAATTAGCCAGAGACCAAAATCCAAATACACA +>284|IGKV4-86 ENSMUST00000200454|IGKV4-86|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACTTTCGGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTGTCCAGAGGAGAAATTGTGCTCACTCAGTCTCCAGCCATCACAGCTGCATCTCTGGGGCAAAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAACCATGGATTTATGAAATATCCAAACTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCATTTATTACTGCCAGCAGTGGAATTATCCTCTTA +>285|IGKV4-90 ENSMUST00000103334|IGKV4-90|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTCATATTGACCAATGGAGAAATTTTGCTCACCCAGTCTCCAGCAATCATAGCTGCATCTCCTGGGGAGAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGAACTGGTACCAGCAGAAACCAGGATCCTCCCCCAAAATATGGATTTATGGTATATCCAACCTGGCTTCTGGAGTTCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACATCTTTCTCTTTCACAATCAACAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTCAGCAAAGGAGTAGTTACCCACCCA +>286|IGKV4-91 ENSMUST00000103333|IGKV4-91|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGATGCAGATTATCAGCTTGCTGCTAATCAGTGTCACAGTCATAGTGTCTAATGGAGAAATTGTGCTCACCCAGTCTCCAACCACCATGGCTGCATCTCCCGGGGAGAAGATCACTATCACCTGCAGTGCCAGCTCAAGTATAAGTTCCAATTACTTGCATTGGTATCAGCAGAAGCCAGGATTCTCCCCTAAACTCTTGATTTATAGGACATCCAATCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATTGGCACCATGGAGGCTGAAGATGTTGCCACTTACTACTGCCAGCAGGGTAGTAGTATACCACGCA +>287|IGKV4-92 ENSMUST00000103332|IGKV4-92|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATATGTGGGTGCAGATTTTCAGCTTACTGCTAATCTGTGTCACAGTGTCAAAGGGAGAAATGGTTCTCACCCAGTCTCCAGTATCCATAACTGCATCTCGAGGGGAGAAGGTCACCATCACCTGCCGTGCCAGCTCAAGTATAAGTTCCAATTACTTACACTGGTACCAGCAGAAGCCAGGATCCTCCCCTAAACTTTTGATTTATAGGACATCCATCCTGGCATCTGGAGTCCTAGACAGCTTCAGTGGCAGTGGGTCTGAGAGCTCTTACACTCTGACAATCAGCTGCATGCAGGACGAAGTTGCTGCCACTTACTATTGTCAGCAGGGGAGTAGTAGCCCACCA +>288|IGKV5-37 ENSMUST00000103372|IGKV5-37|5'UTR|IG|IGK|None|00 +GAAAGCTTAAAG +>289|IGKV5-37 ENSMUST00000103372|IGKV5-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATTCACACCTCATATCCTTGGACTTCTGCTTTTCTGGATTTCAGCCTCCACAGGTGACATCCTGCTGACCCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGAAACAGTCAGTCTTTCCTGTAGGGCCAGCCAGAGTATTTACAAGAACCTACACTGGTATCAACAGAAATCACATCGGTCTCCAAGGCTTCTCATCAAGTATGCTTCTGATTCCATCTCTGGGATCCCCTCCAGGTTCACTGGCAGTGGATCAGGGACAGATTACACTCTCAGTATCAACAGTGTGAAGCCCGAAGATGAAGGAATATATTACTGTCTTCAAGGTTACAGCACACCTTC +>290|IGKV5-39 ENSMUST00000197290|IGKV5-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCACTTCTCAGCTCCTTGGACTTTTGCTTTTCTGGACTTCAGCCTCCAGATGTGACATTGTGATGACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCTCTCTTTCCTGCAGGGCCAGCCAGAGTATTAGCGACTACTTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAATATGCTTCCCAATCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGTCAGATTTCACTCTCAGTATCAACAGTGTGGAACCTGAAGATGTTGGAGTGTATTACTGTCAAAATGGTCACAGCTTTCCTCC +>291|IGKV5-43 ENSMUST00000103368|IGKV5-43|5'UTR|IG|IGK|None|00 +ATGAGCCACACAAACTCAGGGAAAGCTCGAAG +>292|IGKV5-43 ENSMUST00000103368|IGKV5-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATACTTGGACTTATGCTTTTTTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGCGTCAGTCTTTCCTGCAGGGCCAGCCAAAGTATTAGCAACAACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>293|IGKV5-45 ENSMUST00000103366|IGKV5-45|5'UTR|IG|IGK|None|00 +TGTGTCATGATCCACACAAACTCAGGGAAAGCTCGAAG +>294|IGKV5-45 ENSMUST00000103366|IGKV5-45|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATTCTTGGACTTATGCTTTTCTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCAGTCTTTCCTGCAGGGCCAGTCAAAGTATTAGCAACTACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>295|IGKV5-48 ENSMUST00000103364|IGKV5-48|5'UTR|IG|IGK|None|00 +GGAAAGTTTGAAG +>296|IGKV5-48 ENSMUST00000103364|IGKV5-48|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCCACACCTCAGTTCCTTGTATTTTTGCTTTTCTGGATTCCAGCCTCCAGAGGTGACATCTTGCTGACTCAGTCTCCAGCCATCCTGTCTGTGAGTCCAGGAGAAAGAGTCAGTTTCTCCTGCAGGGCCAGTCAGAGCATTGGCACAAGCATACACTGGTATCAGCAAAGAACAAATGGTTCTCCAAGGCTTCTCATAAAGTATGCTTCTGAGTCTATCTCTGGGATCCCTTCCAGGTTTAGTGGCAGTGGATCAGGGACAGATTTTACTCTTAGCATCAACAGTGTGGAGTCTGAAGATATTGCAGATTATTACTGTCAACAAAGTAATAGCTGGCCAAC +>297|IGKV6-13 ENSMUST00000198184|IGKV6-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGCTTCAAGATGGAGTCTCATACTCAGGCCTTTGTATTCGCGTTTCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCAATCGGTACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATATGCAGTCTGAAGACCTGGCAGATTATTTCTGCCAGCAATATAGCAGCTATCCTCT +>298|IGKV6-14 ENSMUST00000103394|IGKV6-14|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTCTTTGTATTCGTGTTGCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTTCGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAGTCTCCTAAAGCACTGATTTACTTGGCATCCAACCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAATCTGAAGACCTGGCAGATTATTTCTGTCTGCAACATTGGAATTATCCTCT +>299|IGKV6-15 ENSMUST00000103393|IGKV6-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGACTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCGTCACCTGCAAGGCCAGTCAGAATGTGGGTACTAATGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAAGCACTGATTTACTCGGCATCCTACCGGTACAGTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATGTGCAGTCTGAAGACTTGGCAGAGTATTTCTGTCAGCAATATAACAGCTATCCTCT +>300|IGKV6-17 ENSMUST00000103391|IGKV6-17|5'UTR|IG|IGK|None|00 +GAAATGCATCACACCAGCATGGGCATCAAA +>301|IGKV6-17 ENSMUST00000103391|IGKV6-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGTCTTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCTACCGGTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATCTGGGACGGATTTCACTTTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAACATTATAGTACTCCTCC +>302|IGKV6-20 ENSMUST00000103388|IGKV6-20|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>303|IGKV6-20 ENSMUST00000103388|IGKV6-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACACTGGGGTCCCCGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGAGTTACAGCTATCCTCC +>304|IGKV6-23 ENSMUST00000103386|IGKV6-23|5'UTR|IG|IGK|None|00 +TCAGACCAGCATGGGCATCAAG +>305|IGKV6-23 ENSMUST00000103386|IGKV6-23|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACACATTCTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGAAGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAGTCTGAAGACTTGGCAGATTATTTCTGTCAGCAATATAGCAGCTATCCTCT +>306|IGKV6-25 ENSMUST00000103383|IGKV6-25|5'UTR|IG|IGK|None|00 +TATGAAATGCATCGCACCAGCATGGGCATCAAG +>307|IGKV6-25 ENSMUST00000103383|IGKV6-25|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGCATTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAAAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTATACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCACTTTATTACTGTCAGCAACATTATAGCACTCCTCC +>308|IGKV6-29 ENSMUST00000197371|IGKV6-29|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>309|IGKV6-29 ENSMUST00000197371|IGKV6-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACCCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTCTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGGGTTACAGCTATCTTCC +>310|IGKV6-32 ENSMUST00000103377|IGKV6-32|5'UTR|IG|IGK|None|00 +GGCAGGCAAGGGCATCAAG +>311|IGKV6-32 ENSMUST00000103377|IGKV6-32|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTCACAGACCCAGGTCTTCGTATTTCTACTGCTCTGTGTGTCTGGTGCTCATGGGAGTATTGTGATGACCCAGACTCCCAAATTCCTGCTTGTATCAGCAGGAGACAGGGTTACCATAACCTGCAAGGCCAGTCAGAGTGTGAGTAATGATGTAGCTTGGTACCAACAGAAGCCAGGGCAGTCTCCTAAACTGCTGATATACTATGCATCCAATCGCTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATATGGGACGGATTTCACTTTCACCATCAGCACTGTGCAGGCTGAAGACCTGGCAGTTTATTTCTGTCAGCAGGATTATAGCTCTCCTCC +>312|IGKV7-33 ENSMUST00000197429|IGKV7-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTACTCATGTCCCTGCTGCTCTGCATGTCTGGTGCCTGTGCAGACATTGTGATGACTCAGTCTCCAACTTTCCTTGCTGTGACAGCAAGTAAGAAGGTCACCATTAGTTGCACGGCCAGTGAGAGCCTTTATTCAAGCAAACACAAGGTGCACTACTTGGCTTGGTACCAGAAGAAACCAGAGCAATCTCCTAAACTGCTGATATACGGGGCATCCAACCGATACATTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTGACCATCAGCAGTGTACAGGTTGAAGACCTCACACATTATTACTGTGCACAGTTTTACAGCTATCCTCT +>313|IGKV8-16 ENSMUST00000195945|IGKV8-16|5'UTR|IG|IGK|None|00 +GGCAGGGGAGCAAT +>314|IGKV8-16 ENSMUST00000195945|IGKV8-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCAGAGACCCATGTCCTCATATTTTTGCTGCTATGGGTGTCTGGTGCTTGTGGGGAAATTGTGTTGACCCAGTCTATACCATCCCTGACTGTGTCAGCAGGAGAGAGGGTCACTATCAGCTGCAAATCCAATCAGAATCTTTTATGGAGTGGAAACCAAAGGTACTGTTTGGTCTGGCACCAGTGGAAACCAGGGCAAACTCCTACACCGTTGATCACCTGGACATCTGATAGGTACTCTGGAGTCCCTGATCGTTTCATAGGCAGTGGATCTGTGACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGATGTGGCAGTTTATTTCTGTCAGCAGCATTTACACATTCCTCC +>315|IGKV8-18 ENSMUST00000103390|IGKV8-18|5'UTR|IG|IGK|None|00 +CATCAGTCAGGCAGGGGGGAGAAAG +>316|IGKV8-18 ENSMUST00000103390|IGKV8-18|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGATGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAATAACTACTTATCCTGGTACCAGCAGAAACAAGGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGATTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAGCACAATCATGGCAGCTTTCTCCCCC +>317|IGKV8-19 ENSMUST00000196599|IGKV8-19|5'UTR|IG|IGK|None|00 +GCAAG +>318|IGKV8-19 ENSMUST00000196599|IGKV8-19|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATGTCCCTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGACTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGACCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATTATAGTTATCCTCC +>319|IGKV8-21 ENSMUST00000103387|IGKV8-21|5'UTR|IG|IGK|None|00 +AGACAGGCAGTGGGAGCAAG +>320|IGKV8-21 ENSMUST00000103387|IGKV8-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATATTGCTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTGGCTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAATCCAGTCAGAGTCTGCTCAACAGTAGAACCCGAAAGAACTACTTGGCTTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGCAAGCAATCTTATAATCTTCC +>321|IGKV8-24 ENSMUST00000103384|IGKV8-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCAGGTCCTCATGTTTCTTCTGCTCTGGGTATCTGGTGCCTGTGCAGACATTGTGATGACACAGTCTCCATCCTCCCTGGCTATGTCAGTAGGACAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTAAATAGTAGCAATCAAAAGAACTATTTGGCCTGGTACCAGCAGAAACCAGGACAGTCTCCTAAACTTCTGGTATACTTTGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACAGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGATTACTTCTGTCAGCAACATTATAGCACTCCTCC +>322|IGKV8-26 ENSMUST00000103382|IGKV8-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGAACCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAAGAACTACTTGTCCTGGTACCAGCAGAAACAAAGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGGTTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAACACAATCATGGCAGCTTTCTCCCCCC +>323|IGKV8-27 ENSMUST00000197272|IGKV8-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCTTCCTCTCCCTGCTGCTCTGGGTATCTGGTACCTGTGGGAACATTATGATGACACAGTCGCCATCATCTCTGGCTGTGTCTGCAGGAGAAAAGGTCACTATGAGCTGTAAGTCCAGTCAAAGTGTTTTATACAGTTCAAATCAGAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGTGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTTACTCTTACCATCAGCAGTGTACAAGCTGAAGACCTGGCAGTTTATTACTGTCATCAATACCTCTCCTCG +>324|IGKV8-28 ENSMUST00000197525|IGKV8-28|5'UTR|IG|IGK|None|00 +GCAAG +>325|IGKV8-28 ENSMUST00000197525|IGKV8-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATCTCCTTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGAGTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACGGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACCGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATCATAGTTATCCTCC +>326|IGKV8-30 ENSMUST00000103378|IGKV8-30|5'UTR|IG|IGK|None|00 +AAG +>327|IGKV8-30 ENSMUST00000103378|IGKV8-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATGTTACTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTAGCTGTGTCAGTTGGAGAGAAGGTTACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTATATAGTAGCAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATTTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGAAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAATATTATAGCTATCCTCC +>328|IGKV8-34 ENSMUST00000196959|IGKV8-34|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTCCTCATGTTGCTGCTGCTATCGGTATCTGGTACCTGTGGAGACATTTTGATGACCCAGTCTCCATCCTCCCTGACTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTAGCTAGTGGCAACCAAAATAACTACTTGGCCTGGCACCAGCAGAAACCAGGACGATCTCCTAAAATGCTGATAATTTGGGCATCCACTAGGGTATCTGGAGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACGGATTTCACTCTGACCATCAACAGTGTGCAGGCTGAAGATCTGGCTGTTTATTACTGTCAGCAGTCCTACAGCGCTCCTAC +>329|IGKV9-120 ENSMUST00000103316|IGKV9-120|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCACAGATTTTTGGCTTCTTGTTGCTCTTGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGACATTGGTAGTAGCTTAAACTGGCTTCAGCAGGAACCAGATGGAACTATTAAACGCCTGATCTACGCCACATCCAGTTTAGATTCTGGTGTCCCCAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGTAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>330|IGKV9-123 ENSMUST00000103313|IGKV9-123|5'UTR|IG|IGK|None|00 +TTGTCATTGCATTCAGAACTCAGC +>331|IGKV9-123 ENSMUST00000103313|IGKV9-123|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATCAGGGCTCCTGCTCAGTTTCTTGGCATCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGATTCAGTCTCCATCGTCCATGTTTGCCTCTCTGGGAGACAGAGTCAGTCTCTCTTGTCGGGCTAGTCAGGGCATTAGAGGTAATTTAGACTGGTATCAGCAGAAACCAGGTGGAACTATTAAACTCCTGATCTACTCCACATCCAATTTAAATTCTGGTGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTAGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGCGTAATGCGTATCCTCT +>332|IGKV9-124 ENSMUST00000196768|IGKV9-124|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTTCCTGCTCACGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGAAATTAGTGGTTACTTAAGCTGGCTTCAGCAGAAACCAGATGGAACTATTAAACGCCTGATCTACGCCGCATCCACTTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTATCCTCC +>333|IGKV9-129 ENSMUST00000200578|IGKV9-129|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGCCGGGCAAGTCAGGACATTCATGGTTATTTAAACTTGTTTCAGCAGAAACCAGGTGAAACTATTAAACACCTGATCTATGAAACATCCAATTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCATTATCGGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>334|IGLC1 ENSMUST00000200568|IGLC1|C-REGION|IG|IGL|None|00 +GCCAGCCCAAGTCTTCGCCATCAGTCACCCTGTTTCCACCTTCCTCTGAAGAGCTCGAGACTAACAAGGCCACACTGGTGTGTACGATCACTGATTTCTACCCAGGTGTGGTGACAGTGGACTGGAAGGTAGATGGTACCCCTGTCACTCAGGGTATGGAGACAACCCAGCCTTCCAAACAGAGCAACAACAAGTACATGGCTAGCAGCTACCTGACCCTGACAGCAAGAGCATGGGAAAGGCATAGCAGTTACAGCTGCCAGGTCACTCATGAAGGTCACACTGTGGAGAAGAGTTTGTCCCGTGCTGACTGTTCC +>335|IGLC2 ENSMUST00000198182|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACTCTCACCGTGTTTCCACCTTCCTCTGAGGAGCTCAAGGAAAACAAAGCCACACTGGTGTGTCTGATTTCCAACTTTTCCCCGAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGGCAACAAGTTCATGGCCAGCAGCTTCCTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGTCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>336|IGLC3 ENSMUST00000200235|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACACTCACCATGTTTCCACCTTCCCCTGAGGAGCTCCAGGAAAACAAAGCCACACTCGTGTGTCTGATTTCCAATTTTTCCCCAAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGACAACAAGTACATGGCCAGCAGCTTCTTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGCCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>337|IGLC4 ENSMUST00000197046|IGLC4|C-REGION|IG|IGL|None|00 +GCCAACCCAAGGCTACACCCTCAGTTAATCTGTTCCCACCTTCCTCTGAAGAGCTCAAGACTAAAAAGGCCACACTGGTGTGTATGATCACTGAGTTCTACGCAGCTGCTGTGAGAGTGGCCTGGAAGGCAGATGGTACCCCTTTCACTCAGGGTGTAGAGACTACCCAGCCTCCCAAACAGAGGGACAACATGGCTAGCAGTTACCTGCTCTTCACAGCAGAAGCGTGGGAATCTCATAGCAGTTACAGCTGCCATGTCACTCATGAAGGGAACACTGTGGAGAAGAGTTTGTCCCGTGCTGAGTGTTCCTAG +>338|IGLJ1 ENSMUST00000199490|IGLJ1|J-REGION|IG|IGL|None|00 +CTGGGTGTTCGGTGGAGGAACCAAACTGACTGTCCTAG +>339|IGLJ2 ENSMUST00000197969|IGLJ2|J-REGION|IG|IGL|None|00 +TTATGTTTTCGGCGGTGGAACCAAGGTCACTGTCCTAG +>340|IGLJ3 ENSMUST00000200211|IGLJ3|J-REGION|IG|IGL|None|00 +GTTTATTTTCGGCAGTGGAACCAAGGTCACTGTCCTAG +>341|IGLJ3PSEUDOGENE ENSMUST00000200074|IGLJ3PSEUDOGENE|J-REGION|IG|IGL|None|00 +AGGTTCTTTTTCCTCAAATGGCCTATTGTATGCAGGAG +>342|IGLJ4 ENSMUST00000198313|IGLJ4|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGAGGTGGAACCAGATTGACTGTCCTAGATGA +>343|IGLV1 ENSMUST00000103746|IGLV1|5'UTR|IG|IGL|None|00 +GCTGACCAATATTGAAAAGAATAGACCTGGTTTGTGAATT +>344|IGLV1 ENSMUST00000103746|IGLV1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATTTCACTTATACTCTCTCTCCTGGCTCTCAGCTCAGGGGCCATTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGAAACAGTCACACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAACAACCGAGCTCCAGGTGTTCCTGCCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGAGGCAATATATTTCTGTGCTCTATGGTACAGCAACCATTTC +>345|IGLV2 ENSMUST00000197518|IGLV2|5'UTR|IG|IGL|None|00 +CTTGGTTTGTGAATT +>346|IGLV2 ENSMUST00000197518|IGLV2|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTTCACTTATACTCTCTCTCCTGGCTCTCTGCTCAGGAGCCAGTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGGAACAGTCATACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAGCAACCGAGCTCCAGGTGTTCCTGTCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGATGCAATGTATTTCTGTGCTCTATGGTACAGCACCCATTTC +>347|IGLV3 ENSMUST00000103751|IGLV3|5'UTR|IG|IGL|None|00 +GTACCTGCATT +>348|IGLV3 ENSMUST00000103751|IGLV3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTCTTCTTCTTTGTTCTTCATTGCTCAGGTTCTTTCTCCCAACTTGTGCTCACTCAGTCATCTTCAGCCTCTTTCTCCCTGGGAGCCTCAGCAAAACTCACGTGCACCTTGAGTAGTCAGCACAGTACGTACACCATTGAATGGTATCAGCAACAGCCACTCAAGCCTCCTAAGTATGTGATGGAGCTTAAGAAAGATGGAAGCCACAGCACAGGTGATGGGATTCCTGATCGCTTCTCTGGATCCAGCTCTGGTGCTGATCGCTACCTTAGCATTTCCAACATCCAGCCTGAAGATGAAGCAATATACATCTGTGGTGTGGGTGATACAATTAAGGAACAATTTGTGTAAC +>349|TRAC ENSMUST00000198398|TRAC|C-REGION|TR|TRA|None|00 +ACATCCAGAACCCAGAACCTGCTGTGTACCAGTTAAAAGATCCTCGGTCTCAGGACAGCACCCTCTGCCTGTTCACCGACTTTGACTCCCAAATCAATGTGCCGAAAACCATGGAATCTGGAACGTTCATCACTGACAAAACTGTGCTGGACATGAAAGCTATGGATTCCAAGAGCAATGGGGCCATTGCCTGGAGCAACCAGACAAGCTTCACCTGCCAAGATATCTTCAAAGAGACCAACGCCACCTACCCCAGTTCAGACGTTCCCTGTGATGCCACGTTGACTGAGAAAAGCTTTGAAACAGATATGAACCTAAACTTTCAAAACCTGTCAGTTATGGGACTCCGAATCCTCCTGCTGAAAGTAGCCGGATTTAACCTGCTCATGACGCTGAGGCTGTGGTCCAGT +>350|TRAJ11 ENSMUST00000103730|TRAJ11|J-REGION|TR|TRA|None|00 +TGACTCGGGATACAACAAACTCACTTTTGGAAAGGGCACGGTGCTTCTAGTCTCTCCAG +>351|TRAJ12 ENSMUST00000103729|TRAJ12|J-REGION|TR|TRA|None|00 +GGGACTGGAGGCTATAAAGTGGTCTTTGGAAGTGGGACTCGATTGCTGGTAAGCCCTG +>352|TRAJ13 ENSMUST00000103728|TRAJ13|J-REGION|TR|TRA|None|00 +CAAATTCTGGGACTTACCAGAGGTTTGGAACTGGGACAAAACTCCAAGTCGTTCCAA +>353|TRAJ15 ENSMUST00000103726|TRAJ15|J-REGION|TR|TRA|None|00 +CCTACCAGGGAGGCAGAGCTCTGATATTTGGAACAGGAACCACGGTATCAGTCAGCCCCA +>354|TRAJ16 ENSMUST00000103725|TRAJ16|J-REGION|TR|TRA|None|00 +GCAACTTCAAGTGGCCAGAAGCTGGTTTTTGGCCAGGGGACCATATTAAAGGTGTACCTGC +>355|TRAJ17 ENSMUST00000103724|TRAJ17|J-REGION|TR|TRA|None|00 +TGACTAACAGTGCAGGGAACAAGCTAACTTTTGGAATCGGAACCAGGGTGCTGGTCAGGCCAG +>356|TRAJ18 ENSMUST00000103723|TRAJ18|J-REGION|TR|TRA|None|00 +TAGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTTGGAGCTGGGACTCAGCTGATTGTCATACCTG +>357|TRAJ19 ENSMUST00000103722|TRAJ19|J-REGION|TR|TRA|None|00 +ATCTATCGAGGTTTTCATAAGTTCAGCTCTGGAATAGAATCCAAGCATAATGTAAGTCCTA +>358|TRAJ2 ENSMUST00000103738|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGACTAAGTGGTAAATTAACATTCGGGGAAGGGACCCAAGTGACGGTAATATCTG +>359|TRAJ20 ENSMUST00000103721|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTGGTAACTACAAGCTCGGTGTTGAGTCAGTAACCATGATGTCTGTAAGAGCAGG +>360|TRAJ21 ENSMUST00000103720|TRAJ21|J-REGION|TR|TRA|None|00 +TGTCTAATTACAACGTGCTTTACTTCGGATCTGGCACCAAACTCACTGTAGAGCCAA +>361|TRAJ22 ENSMUST00000103719|TRAJ22|J-REGION|TR|TRA|None|00 +CATCTTCTGGCAGCTGGCAACTCATCTTTGGATCTGGAACCCAACTGACAGTTATGCCTG +>362|TRAJ23 ENSMUST00000103718|TRAJ23|J-REGION|TR|TRA|None|00 +TGAATTATAACCAGGGGAAGCTTATCTTTGGACAGGGAACCAAGTTATCTATCAAGCCCA +>363|TRAJ24 ENSMUST00000103717|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGCCAGTTTGGGGAAACTGCAGTTTGGAACAGGAACCCAGGTTGTGGTGACCCCAG +>364|TRAJ25 ENSMUST00000103716|TRAJ25|J-REGION|TR|TRA|None|00 +GAAGGACAAAAGTCTCCTCTGTCTTTGGGACAGGGAGAAGGCTGCTGGTGAAGCCAA +>365|TRAJ26 ENSMUST00000103715|TRAJ26|J-REGION|TR|TRA|None|00 +GAAATAACTATGCCCAGGGATTAACCTTCGGTCTTGGCACCAGAGTATCTGTGTTTCCCT +>366|TRAJ27 ENSMUST00000103714|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATACAGGCAAATTAACCTTTGGGGATGGGACCGTGCTCACAGTGAAGCCAA +>367|TRAJ28 ENSMUST00000103713|TRAJ28|J-REGION|TR|TRA|None|00 +TCTACCAGGCACTGGGAGTAACAGGCTCACTTTTGGGAAAGGCACCAAATTCTCACTCATCCCGA +>368|TRAJ29 ENSMUST00000103712|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAGCAGGGAGCTTGTCTTAGGAAGGGAAGCAAGGCTTTCTATGATTGAAA +>369|TRAJ3 ENSMUST00000103737|TRAJ3|J-REGION|TR|TRA|None|00 +GGAATTCAGCTATAGCTCTAAACTAATCTTTGGAGCTGAAACCAAACTCAGAAATCCACCATATAC +>370|TRAJ30 ENSMUST00000103711|TRAJ30|J-REGION|TR|TRA|None|00 +TGACACAAATGCTTACAAAGTCATCTTTGGAAAAGGGACACATCTTCATGTTCTCCCTA +>371|TRAJ31 ENSMUST00000103710|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAGCAATAACAGAATCTTCTTTGGTGATGGGACGCAGCTGGTGGTGAAGCCCA +>372|TRAJ32 ENSMUST00000103709|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGGAGCAGTGGCAACAAGCTCATCTTTGGAATTGGGACTCTGCTTTCTGTCAAGCCAA +>373|TRAJ33 ENSMUST00000103708|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTGATCTGGGGCTCTGGGACCAAGCTAATTATAAAGCCAG +>374|TRAJ34 ENSMUST00000103707|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTCCAATACCAACAAAGTCGTCTTTGGAACAGGGACCAGATTACAAGTATTACCAA +>375|TRAJ35 ENSMUST00000103706|TRAJ35|J-REGION|TR|TRA|None|00 +GCAGACAGGCTTTGCAAGTGCGCTGACATTTGGATCTGGCACAAAAGTCATTCCATGTCTACCAT +>376|TRAJ37 ENSMUST00000103705|TRAJ37|J-REGION|TR|TRA|None|00 +TAACAGGCAATACCGGAAAACTCATCTTTGGACTGGGGACAACTTTACAAGTGCAACCAG +>377|TRAJ38 ENSMUST00000103704|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGTTGGTGACAACAGTAAGCTGATTTGGGGCTTGGGGACAAGTCTGGTAGTAAATCCAA +>378|TRAJ39 ENSMUST00000103703|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGTGCCAAGCTCACATTCGGAGGGGGAACAAGGTTAACGGTCAGACCCG +>379|TRAJ4 ENSMUST00000103736|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTATCTGGTAGCTTCAATAAGTTGACCTTTGGAGCAGGGACCAGACTGGCTGTGTGCCCAT +>380|TRAJ40 ENSMUST00000103702|TRAJ40|J-REGION|TR|TRA|None|00 +GTTAATACAGGAAACTACAAATACGTCTTTGGAGCAGGTACCAGACTGAAGGTTATAGCAC +>381|TRAJ41 ENSMUST00000103701|TRAJ41|J-REGION|TR|TRA|None|00 +GGTCTCAAACACTAGCTCCATGTTGGCAGAAGCACCTCATTATTGGTCACACCCG +>382|TRAJ42 ENSMUST00000103700|TRAJ42|J-REGION|TR|TRA|None|00 +AATTCTGGAGGAAGCAATGCAAAGCTAACCTTCGGGAAAGGCACTAAACTCTCTGTTAAATCAA +>383|TRAJ43 ENSMUST00000103699|TRAJ43|J-REGION|TR|TRA|None|00 +GCAATAACAACAATGCCCCACGATTTGGAGCGGGAACCAAATTATCAGTAAAACCAA +>384|TRAJ44 ENSMUST00000103698|TRAJ44|J-REGION|TR|TRA|None|00 +GTTACTGGCAGTGGTGGAAAACTCACTTTGGGGGCTGGAACAAGACTTCAGGTCAACCTTG +>385|TRAJ45 ENSMUST00000103697|TRAJ45|J-REGION|TR|TRA|None|00 +TGAATACAGAAGGTGCAGATAGACTCACCTTTGGGAAAGGAACTCAGCTGATCATCCAGCCCT +>386|TRAJ46 ENSMUST00000103696|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAAGACAGCAGTGTAGACATGCTGGCTTTGGGGATGGGGATGAACTTGGAGTGAGCACAAA +>387|TRAJ47 ENSMUST00000197949|TRAJ47|J-REGION|TR|TRA|None|00 +TGGACTATGCAAACAAGATGATCTTTGGCTTGGGAACCATTTTGAGAGTCAGACCTC +>388|TRAJ48 ENSMUST00000200046|TRAJ48|J-REGION|TR|TRA|None|00 +GCCAACTATGGAAATGAGAAAATAACTTTTGGGGCTGGAACCAAACTCACCATTAAACCCA +>389|TRAJ49 ENSMUST00000199452|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACGGGTTACCAGAACTTCTATTTTGGGAAAGGAACAAGTTTGACTGTCATTCCAA +>390|TRAJ5 ENSMUST00000103735|TRAJ5|J-REGION|TR|TRA|None|00 +GGGGACACAGGTTGTGGGGCAGCTCACTTTCGGGAGGGGGACAAGACTCCAAGTTTATGCAA +>391|TRAJ50 ENSMUST00000103693|TRAJ50|J-REGION|TR|TRA|None|00 +TAGCATCCTCCTCCTTCAGCAAGCTGGTGTTTGGGCAGGGGACATCCTTATCAGTCGTTCCAA +>392|TRAJ52 ENSMUST00000103691|TRAJ52|J-REGION|TR|TRA|None|00 +CTAACACTGGAGCTAACACTGGAAAGCTCACGTTTGGACACGGCACCATCCTTAGGGTCCATCCAA +>393|TRAJ53 ENSMUST00000103690|TRAJ53|J-REGION|TR|TRA|None|00 +GGAACAGTGGAGGCAGCAATTACAAACTGACATTTGGGAAAGGAACTCTCTTAACTGTGACTCCAA +>394|TRAJ56 ENSMUST00000103689|TRAJ56|J-REGION|TR|TRA|None|00 +TGGCTACTGGAGGCAATAATAAGCTGACTTTTGGTCAAGGAACCGTTCTGAGTGTTATACCAG +>395|TRAJ57 ENSMUST00000196977|TRAJ57|J-REGION|TR|TRA|None|00 +TGAATCAAGGAGGGTCTGCGAAGCTCATCTTTGGGGAGGGGACAAAGCTGACAGTGAGCTCAT +>396|TRAJ58 ENSMUST00000103687|TRAJ58|J-REGION|TR|TRA|None|00 +TGCAGCAAGGCACTGGGTCTAAGCTGTCATTTGGGAAGGGGGCAAAGCTCACAGTGAGTCCAG +>397|TRAJ59 ENSMUST00000197589|TRAJ59|J-REGION|TR|TRA|None|00 +CTACTAAAAAGAGAAGATAAAGCTACCTTTGCAACTGGAGGGTATGAAGCTGAGGAAGACCT +>398|TRAJ6 ENSMUST00000103734|TRAJ6|J-REGION|TR|TRA|None|00 +AACCTCAGGAGGAAACTACAAACCTACGTTTGGGAAAGGGACCAGCCTCGTGGTTCATCCAT +>399|TRAJ7 ENSMUST00000103733|TRAJ7|J-REGION|TR|TRA|None|00 +GGACTACAGCAACAACAGACTTACTTTGGGGAAGGGAACCCAGGTGGTGGTGTTACCAA +>400|TRAJ9 ENSMUST00000103731|TRAJ9|J-REGION|TR|TRA|None|00 +AGCAACATGGGCTACAAACTTACCTTCGGGACAGGAACAAGCTTGTTGGTTGATCCAA +>401|TRAV1 ENSMUST00000103567|TRAV1|5'UTR|TR|TRA|None|00 +GCTCAGGAGCTGGGGACTCAGTGTCAGGCTGGTGGTGTC +>402|TRAV1 ENSMUST00000103567|TRAV1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGCAGATGTGGGGGTTTGTTCTCTATCTCTTCCTGACGGTGGGAGGTGCTGCAGGACAGGGTGTGGAGCAGCCTGCCAAATTGATGTCTGTGGAGGGAACCTTTGCTCGGGTCAACTGCACATACAGCACCTCAGGGTTCAACGGGTTATCCTGGTACCAGCAACGTGAAGGCCAAGCCCCTGTATTTCTTTCTTATGTTGTTTTGGATGGTTTGAAGGACAGTGGGCATTTCTCCACTTTCCTGAGCCGCTCGAATGGGTACAGTTACCTGCTTCTGACAGAGCTCCAGATCAAAGACTCTGCCTCATACCTCTGTGCTGTGAGGGA +>403|TRAV10 ENSMUST00000103583|TRAV10|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>404|TRAV10 ENSMUST00000103583|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTATGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACATGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCTTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>405|TRAV10D ENSMUST00000103646|TRAV10D|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>406|TRAV10D ENSMUST00000103646|TRAV10D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>407|TRAV10N ENSMUST00000103612|TRAV10N|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAAAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTACAGTTTTATTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>408|TRAV11 ENSMUST00000103585|TRAV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGCG +>409|TRAV11D ENSMUST00000103648|TRAV11D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGC +>410|TRAV12-1 ENSMUST00000200115|TRAV12-1|5'UTR|TR|TRA|None|00 +GTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCT +>411|TRAV12-1 ENSMUST00000200115|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTCCTCAGTTCTCGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACCGAGGGGTTGCCTGTGAAGCTGAACTGCACCTATCAGACTACTTATTTAACTATTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTCAGGTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>412|TRAV12-2 ENSMUST00000180972|TRAV12-2|5'UTR|TR|TRA|None|00 +GTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>413|TRAV12-2 ENSMUST00000180972|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAACAATGGAGACTCTGTGACCCAGACAGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGAGTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTTTTGAAGAGCTTCACAGACAACAAGAGGCCCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTTTGAGTGA +>414|TRAV12-3 ENSMUST00000103657|TRAV12-3|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTTTGAGGAGATCCTGCAGTAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCTATGAAC +>415|TRAV12-3 ENSMUST00000103657|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGGCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGAGATGGAGACTCAGTGACCCAGAAGGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATGCTTTCCTTTTCTGGTATGTGCACTATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>416|TRAV12D-1 ENSMUST00000181360|TRAV12D-1|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>417|TRAV12D-1 ENSMUST00000181360|TRAV12D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTGCTTACTCAGATGTTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTAAACTACTCCTGCGGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>418|TRAV12D-2 ENSMUST00000197007|TRAV12D-2|5'UTR|TR|TRA|None|00 +GAGACTGTGCAGACAGAGGCCCTTGTCTGTGAGTGAGGAGTGTGAGGAGATTCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAGGGACCAAGTGTCATTTCTTCCATGAAC +>419|TRAV12D-2 ENSMUST00000197007|TRAV12D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAGCAATGGAGACTCAGTGACCCAGACAGAAGGCCTGGTCACTCTCACCAAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCTACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTTCTGTGCTTTGAGTGA +>420|TRAV12D-3 ENSMUST00000177703|TRAV12D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>421|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|5'UTR|TR|TRA|None|00 +CTGAAC +>422|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>423|TRAV13-1 ENSMUST00000103651|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGAGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCATAGTGGGAGACTGACATCCACTACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>424|TRAV13-2 ENSMUST00000103658|TRAV13-2|5'UTR|TR|TRA|None|00 +TGACACAACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCATCCACACAAGCACC +>425|TRAV13-2 ENSMUST00000103658|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGTTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACATCCTGGGGGAAGACTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAACGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATAGATC +>426|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>427|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCGGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>428|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|5'UTR|TR|TRA|None|00 +CCACCCTGACACCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>429|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>430|TRAV13D-2 ENSMUST00000197954|TRAV13D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCAGCTGCAGTGGTTTTACCAAAGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAGGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTATAGATC +>431|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>432|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAATGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>433|TRAV13D-4 ENSMUST00000196079|TRAV13D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACACAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATGGAAC +>434|TRAV13N-1 ENSMUST00000198359|TRAV13N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCATCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>435|TRAV13N-3 ENSMUST00000179580|TRAV13N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAACGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>436|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|5'UTR|TR|TRA|None|00 +GACTGGTTGCAGAAGAAGGAGGGGACACTTCAACAGCCACCCTGACACCACAGCCCAGGAGCTGGTTACTTGCTTCTGTCTCCAGCAGCTACACAAGCACC +>437|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>438|TRAV14-1 ENSMUST00000198297|TRAV14-1|5'UTR|TR|TRA|None|00 +CACCTGAGTTTCCCCCAAGCTTCAGTCTAGGAGGA +>439|TRAV14-1 ENSMUST00000198297|TRAV14-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATTCTGACAGCATCATTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGAAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGGAACCACAGTTCTGACCTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAACAGTTCCCTGGGGAAGGCCCTGCACTTCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAACCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCATAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>440|TRAV14-2 ENSMUST00000179267|TRAV14-2|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAAGAGGA +>441|TRAV14-2 ENSMUST00000179267|TRAV14-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACCATCAGTTCCCTGGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGTTCTCCTTGCACATCGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>442|TRAV14-3 ENSMUST00000103589|TRAV14-3|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAGGAGAA +>443|TRAV14-3 ENSMUST00000103589|TRAV14-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCATTTTTACTTCTAGGCCTTCACCTATCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTAAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCCACTTACTTCTGTGCAGCAAGTG +>444|TRAV14D-1 ENSMUST00000181038|TRAV14D-1|5'UTR|TR|TRA|None|00 +GTGGGAGACAAAAGGTCACCTGAGTTCCCTTCAAGCTTCAGTCTAGGAGGA +>445|TRAV14D-1 ENSMUST00000181038|TRAV14D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCAACGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCACTCCTGATATCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>446|TRAV14D-2 ENSMUST00000196802|TRAV14D-2|5'UTR|TR|TRA|None|00 +GGAGCCTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGGCCACCTGAGTTCCCCCAAGCTTCAGTCTAGGAGGA +>447|TRAV14D-2 ENSMUST00000196802|TRAV14D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACTGGCAGTTCCCTAGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>448|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|5'UTR|TR|TRA|None|00 +CTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGACCACAGAGTTTCTCCCAAGCTTCAGTCTAGGAGGA +>449|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTTCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGTCCCGCTCTCCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATTGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>450|TRAV14N-3 ENSMUST00000103652|TRAV14N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATTGTTTTTACTTCTAGGTCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTTCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAATCTCTCCTTGCACATCAAAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>451|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|5'UTR|TR|TRA|None|00 +GCTGAGGCAGAGCAGACACACTCATGCAGAGGACAGTGTGTCAC +>452|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCCAGAAAGTGATTCAGGTCTGGTCAACAACAAGCAGGCAGGAGGGCGAAAAACTCACACTGGACTGTTCATATAAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTGCTTATTCGACAAATGCCTTCTACTATTGCAATAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACGCAAATCCATCAGCCTTGTCATTTCAACCTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>453|TRAV15-2-DV6-2 ENSMUST00000103660|TRAV15-2-DV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGGACATGTGTCACATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGTCAACAGGCAGCAGTCAGTGGGGAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTCCTACCTTATTCTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGATACTCAGAACCAGAGGAGCGGCCACTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>454|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|5'UTR|TR|TRA|None|00 +GCACTTAGACACTGATCTCTGAGCTGAGGCAGAGCAGACACACTC +>455|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGACAGTGTGTCACATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>456|TRAV15D-2-DV6D-2 ENSMUST00000199800|TRAV15D-2-DV6D-2|5'UTR|TR|TRA|None|00 +GAGCTGAGGCAGAGCAGACACACTCATGCAGAGGGACATGTGTCAC +>457|TRAV15D-2-DV6D-2 ENSMUST00000199800|TRAV15D-2-DV6D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGCCAACAGGCAGCAGTCAGTGGGGAGAAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTTCTACCGTATTTTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGACACTCAGAACCAGAGGAGCGGCCGCTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>458|TRAV15N-1 ENSMUST00000197433|TRAV15N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>459|TRAV16 ENSMUST00000103667|TRAV16|5'UTR|TR|TRA|None|00 +CACAAAGTATAGATTAAGATCTGGTTGAGAGAGGACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>460|TRAV16 ENSMUST00000103667|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGCTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGAAGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACTGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>461|TRAV16D-DV11 ENSMUST00000103606|TRAV16D-DV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCTCCATTTTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCAGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCGGCAGTATATTTCTGTGCTATGAGAGAGGG +>462|TRAV16N ENSMUST00000199280|TRAV16N|5'UTR|TR|TRA|None|00 +ATAGATTAAGATCTGGTTGAGAGAGAACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>463|TRAV16N ENSMUST00000199280|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>464|TRAV17 ENSMUST00000103672|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGTTCCCAGTGACCATTCTGCTGCTCAGCGCGTTCTTCTCACTGAGAGGAAACAGTGCCCAGTCCGTGGACCAGCCTGATGCTCATGTCACGCTCTCTGAAGGAGCCTCCCTGGAGCTCAGATGCAGTTATTCATACAGTGCAGCACCTTACCTCTTCTGGTACGTGCAGTATCCTGGCCAGAGCCTCCAGTTTCTCCTCAAATACATCACAGGAGACACCGTTGTTAAAGGCACCAAGGGCTTTGAGGCCGAGTTTAGGAAGAGTAACTCCTCTTTCAACCTGAAGAAATCCCCAGCCCATTGGAGCGACTCAGCCAAGTACTTCTGTGCACTGGAGGG +>465|TRAV18 ENSMUST00000103673|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGAAACTCTCTGTGTTGCTCCTTTGGAATCAAGTGGCCCGTGTGGCCACTCAACGGCTGGAGCAGAGTCCTCGGTTTCTGAGTATCCAGGAGGGGCAAGATTTCACTGCACGCTGCAGCTCCTCAACCACCTTCCCCCAACTTTACTGGTACCGACAGGTCCCCAGGGAAGGTCCTGTCATCCTGGTGACATTGGTCAAGAGTGGAGAGGTAAAGGAGCAGAGGAGGATGACTGCTAAGTTTGGTGAAGCAAGAAAGAACAGCTCCCTATTCATCGCCAGAGCTCAGCCTGGAGACGCAGGCATCTACTTCTGTACAGGAA +>466|TRAV19 ENSMUST00000103674|TRAV19|5'UTR|TR|TRA|None|00 +AAAGGGAATAAAGTCAGGACAGGAAGATGAAATCTGAGTTGCAGTTCCCTGAGTAGAAGGAGAGACAACTCAAAGCTTCAGAGAAGAC +>467|TRAV19 ENSMUST00000103674|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGACTGGCTTCCTGAAGGCCTTGCTGTTGGTTCTGTGCCTGCGGCCAGAATGGGTAAAGAGTCAACAGAAGACTAGTGGCCAGCAAGTTAAACAAAGCTCTCCATCGCTGACTGTTCAAGAGGGAGGGATATCGATCCTGAATTGTGACTACGAGAATGATATGTTTGACTATTTTGCCTGGTACAAAAAATACCCTGACAACAGCCCCACACTCCTGATATCCGTACGCTCAAATGTGGATAAGAGGGAAGACGGAAGACTCACAGTTTTCTTGAACAAAAGCGGCAAACACTTCTCACTGCACATCACAGCCTCCCAGCCTGAAGACACAGCAGTGTACCTCTGCGCAGCAGGTG +>468|TRAV2 ENSMUST00000196939|TRAV2|5'UTR|TR|TRA|None|00 +CAGTGGCTTCTGAGTCTCCTCCTTGGTTCGTATTCTGGTCTAAGCTCAGATTCAGCAAAGAATCTGGAATCTGGGCCTGTGCTTACAAAGAGAAT +>469|TRAV2 ENSMUST00000196939|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCAGGTGGCAAAAGTGACTGTGCTCCTGATCTTGGTCTCATGGAGCCTTGCCAAGACCACCCAGCCCCCCTCCATGGAGGCCTATGAAGGGCAAGAAGTGAACGTGTCCTGCAGCCATACAAACATTGCTACAAGCGAGTACATCTACTGGTACCGACAGGTTCCCCACCAGGGACCACAGTTTATCATTCAAGGATATAAGGACTATGTGGTAAATGAAGTGGCATCTCTGTTTATCTCTGCTGACCGGAAGCTCAGCACTCTGAGCCTGCCCTGGGTTTCCCTGAGAGATGCTGCTGTGTATTACTGCATTGTGACTGACA +>470|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|5'UTR|TR|TRA|None|00 +ACAGATCTGAGCTCATCCATTTGCTCTTAACT +>471|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGATGTGTGAGTGGAATTGCCATTCTCCTGGCTTTGGGTATTGCGGGTGATGCTAAGACTACACAACCAGATTCAATGGAAAGTACTGAAGGAGAAACGGTGCACTTGCCTTGTAGCCACGCCACAATCAGTGGAAACGAGTACATCTATTGGTACCGACAGGTTCCTCTTCAGGGTCCAGAATATGTGACTCACGGTCTACAACAAAATACAACCAATAGTATGGCTTTCCTGGCTATTGCCTCTGACAGAAAGTCAAGCACCTTGATCCTGCCTCATGTCAGCCTGAGAGACGCGGCTGTGTACCACTGTATCCTGAGAGTAG +>472|TRAV3-1 ENSMUST00000103569|TRAV3-1|5'UTR|TR|TRA|None|00 +GGCATCTTGTCTGGCTGAAGGCCACAGTCCAGAGGGAGAGCA +>473|TRAV3-1 ENSMUST00000103569|TRAV3-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTGCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCATTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTCCTGGTACAAGCAAGAGGCGGGGGCAGGTCTTCAGTTGCTTATGAGTGTCCTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>474|TRAV3-3 ENSMUST00000181768|TRAV3-3|5'UTR|TR|TRA|None|00 +GAAGATGCCTCAGTGCTGTGGAGGTGATCACAGAGGCATCTTGTCTGGCTGAAGGTCAGAGTCTGGAGGGAGAGCA +>475|TRAV3-3 ENSMUST00000181768|TRAV3-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCACCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAAGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGCGTACTTCTGCGCAGTCAGTG +>476|TRAV3-4 ENSMUST00000103670|TRAV3-4|5'UTR|TR|TRA|None|00 +CAGTAGCCTTCTGTGCAGACAGGTGAAGTAGCCTCAGTGCTGTGGAGAACAGAGGAGGTGAGCTGATCACAGAGGCATCTTGTCTGGCTGAAGGCCAGAGTCTGGAGGGAGAGCA +>477|TRAV3-4 ENSMUST00000103670|TRAV3-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACAGTGGCTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGTTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCTTTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTACTGGTACAAGCAAGAGCCAGGGGCAGGTCTTCAGTTGCTTATGAGTGTCTTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCTGTGTACTTCTGCGCAGTCAGTG +>478|TRAV3D-3 ENSMUST00000196023|TRAV3D-3|5'UTR|TR|TRA|None|00 +ACACAGCTGAAGATGCCTCCGTGTTGTGGAGGTGATCACAGAGGCATCCTGTCTGGCTAAAGGTCAGAGTCTGGAGGGAGCGCA +>479|TRAV3D-3 ENSMUST00000196023|TRAV3D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCATCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAGGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACAACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>480|TRAV4-2 ENSMUST00000103637|TRAV4-2|5'UTR|TR|TRA|None|00 +CCCTGCTGACTGTTGGAAATCAGCAGCTTGACAGGGTCA +>481|TRAV4-2 ENSMUST00000103637|TRAV4-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAGCCCGGGAACTGTGCTGGGGCTGCTGTTGGTGCCGCTATGCTGGGTAAGAGGAATGCCGGTGGAACAGAATCCTCCAGCCCTGAGTCTTTATGAAGGAGCTGAGTCTGGTCTGAGATGCAATTTTTCTACCACCATGAAAGGTGTCCAGTGGTTTCAACAAAATCACAGAGGCAGACTTATCACTCTGTTTTACCTGGCTCAAGGAACAAAGGAGAATGGAAGGTTAAAGTCAACATTCAATTCTAAGGAGCGCTACAGCACCCTGCACATCAAGGATGCACAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGTTGAGG +>482|TRAV4-3 ENSMUST00000103655|TRAV4-3|5'UTR|TR|TRA|None|00 +AGTCTGTAAGCACAAGTGTGTCTGGGCATAAGACACCCTTCAGAGCTGGAGAGAAGACAACCAGCGATTGGACAGGGGCC +>483|TRAV4-3 ENSMUST00000103655|TRAV4-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAACAAAGTCCCTCAGCGCTGAGTCTCCAAGAAGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCCGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATCAATCTTTTTTACCTGGTTCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTCGATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>484|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|5'UTR|TR|TRA|None|00 +GAGAAGACAACCAGCGATTGGACAGGGGCC +>485|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGGCTGTGCAGTGGTTCCAACAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAACATTCAATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>486|TRAV4D-3 ENSMUST00000103592|TRAV4D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAGCAAAGTCCCTCAGCGCTGAGTCTCCAAGAGGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCTGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATGAATCTTTTTTACCTGGTGCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTTGATTCTAAGGAGAGCTACAGCACCCTGCACATTAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>487|TRAV4D-4 ENSMUST00000103600|TRAV4D-4|5'UTR|TR|TRA|None|00 +ATCCCAGCGATTGGACAGGGGCC +>488|TRAV4D-4 ENSMUST00000103600|TRAV4D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACTACCACCATGAGGGCTGTGCAGTGGTTCCGAAAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>489|TRAV5-1 ENSMUST00000103570|TRAV5-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGCTATTCATGCTTTATTTATTTTCTTCTGGCTACAGATGGACTGGAAGAGCCAAGGTGAGCAGGTGGAACAGCTCCCTTCCTCCCTGATTGTCCAGGAGGGAGCCAGTGTTCTGATCAACTGCTCCTACACAGACAGTGCCTCTGTCTACTTCCCTTGGTATAAGCAAGAGCCTGGGAAGCGTCTTCAGTTCATCATAGACATCCGTTCAAATATGGAAAGAAAGCAGACTCAAAGACTCACCCTTTTATTTGATAAGAAAACCAAACACCTTTCCCTGCACATTACAGCCACTCAGCCTGGAGACTCAGCCATCTACTTCTGCTCAGCAAGTA +>490|TRAV5-4 ENSMUST00000103664|TRAV5-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGCGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCAGTTATGAAGACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGATCCAAGAACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>491|TRAV5D-4 ENSMUST00000179701|TRAV5D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGTGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCACTTATGAGAACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGACCCAAGGACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>492|TRAV6-1 ENSMUST00000103571|TRAV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGCTTTAGTGACTGTGATGCTGTTTGTGTTTGGGAGGACCCATGGAGACTCAGTAACCCAGATGCAAGGTCAAGTGACCCTCTCAGAAGACGACTTCCTATTTATAAACTGTACTTATTCAACCACATGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAACAAGGGAATCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACAACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCTGCTGTGTACTACTGTGTTCTGGGTGA +>493|TRAV6-2 ENSMUST00000198058|TRAV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACACTTCTCCAGCTTTAGTGACTGTGATGCTGCTGTTCATGCTTGAGAGGACACATGGAAATTCAGTGACCCAGATGCAAGGTCAAGTGACCCTTTCAGAAGAGGAGTTTCTATTTATAAACTGTACCTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAATAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>494|TRAV6-3 ENSMUST00000180549|TRAV6-3|5'UTR|TR|TRA|None|00 +ATCATTTCTTCATGTGAAGAGTTGAGAGCATCACTCTGGTGACACTGAAG +>495|TRAV6-3 ENSMUST00000180549|TRAV6-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGAGA +>496|TRAV6-4 ENSMUST00000180711|TRAV6-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCAGCACTCTACACTGAAC +>497|TRAV6-4 ENSMUST00000180711|TRAV6-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTAACTGTGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACATACCCAACTCTTTTGTGGTATGTCCAATATCTTGGACAAGGTCCACAGCTCCTTCTGAAAGTGACAACTGCCAACAATAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>498|TRAV6-5 ENSMUST00000181210|TRAV6-5|5'UTR|TR|TRA|None|00 +AAAATATTTGTATTCACACACTCCAGTGGCTCAGAAA +>499|TRAV6-5 ENSMUST00000181210|TRAV6-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>500|TRAV6-6 ENSMUST00000103584|TRAV6-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTTGGAAGGACCCACGGAGATTCCGTGACTCAAACAGAAGGCCCAGTGACCGTCTCAGAAAGCGAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGCTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>501|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|5'UTR|TR|TRA|None|00 +AC +>502|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTAAGAATCATGAACACTGTCGAGATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGGCCACAGCTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCTTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>503|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|5'UTR|TR|TRA|None|00 +ACACTGAAG +>504|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGTGA +>505|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCATCACTCTACACTGAAC +>506|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTGACTGCGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACGTACCCAACTCTTTTCTGGTATGTCCAATATCCTGGACAAGGTCCACAGCTCCTTCTGAAAGTCACAACTGCCAACAACAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACCTCCTTCCACTTACAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>507|TRAV6D-5 ENSMUST00000180687|TRAV6D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGGATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCGGTGACTCAGACAAAAGGTCCAGTGACATTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACGTATGATAAAGGGACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>508|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|5'UTR|TR|TRA|None|00 +CTGTCGAGATGGGTCTAAAG +>509|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>510|TRAV6N-5 ENSMUST00000103611|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>511|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|5'UTR|TR|TRA|None|00 +ACTTTCTAGATGACACTAAAG +>512|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTGGGAAGGACCCATGGAGATTCCGTGACTCAAACAGAAGGCCAAGTGACTGTCTCAGAAAGCAAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGGTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGCGCTCTGAGTGA +>513|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|5'UTR|TR|TRA|None|00 +CTGTCGAG +>514|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>515|TRAV7-1 ENSMUST00000198019|TRAV7-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTCCTTGTGTGTTTCACTAGTGGTCCTGTGGCTTCAGCTACACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTAATTCTCAGTATTTCTGGTGGTACAGACAGCATTCTGGGGAAGGCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGACAAGAAGGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTATCCCTGCACATCAAAGACTCCCAACCCAGTGACTCTGCTCTCTACTTCTGTGCAGTGAGCA +>516|TRAV7-2 ENSMUST00000103636|TRAV7-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGC +>517|TRAV7-3 ENSMUST00000177622|TRAV7-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAACTTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAGGAAGAGAGA +>518|TRAV7-3 ENSMUST00000177622|TRAV7-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>519|TRAV7-4 ENSMUST00000181728|TRAV7-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>520|TRAV7-4 ENSMUST00000181728|TRAV7-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCAATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>521|TRAV7-5 ENSMUST00000200609|TRAV7-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGCAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACGTTCAGTGATGGTACTTCTAACAACTTCAGGTGGTACAGACAGCATTCTGCGAAAGGCCTTGAGGTGCTAGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGATTTACAGCTCACCTCAATAGAGCCAACTTGCATGTTTCCCTACACATCAGAGAACCACAACCCAGTGACTCTGCTGTCTACCTCTGTGCAGTGAGCA +>522|TRAV7-6 ENSMUST00000103641|TRAV7-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>523|TRAV7-6 ENSMUST00000103641|TRAV7-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGGTCTCCCTCAACTGCAGTTTCAGCGACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCAAAGCACTAATATCCATCTTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAAAGACTCCCAGCCCAGTGACTCCGCTGTCTACCTCTGTGCAGTGAGCA +>524|TRAV7D-2 ENSMUST00000200127|TRAV7D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGCA +>525|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAAATTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAAGAAGAGAGA +>526|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCGCTACACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>527|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>528|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTTACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>529|TRAV7D-5 ENSMUST00000197128|TRAV7D-5|5'UTR|TR|TRA|None|00 +ATG +>530|TRAV7D-5 ENSMUST00000197128|TRAV7D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGAAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTTCTTCTGACAACTTCAGGTGGTACAGACAGCATTCTGGGAAAGGCCTTGAGGTGCTGGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGTTTTACAGCTCACCTCAATAGAGCCAGCCTGCATGTTTTCCTACACATCAGAGAGCCGCAACCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>531|TRAV7N-4 ENSMUST00000103609|TRAV7N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAAGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTATTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAAGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGTTAGTGAGCA +>532|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>533|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGTCCTCCCTCAACTGCACTTTCAGCAACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCGAAGCACTAATATCCATATTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCCGTCTACCTCTGTGCAGTGAGCA +>534|TRAV8-1 ENSMUST00000103643|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGTTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATTCGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>535|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|5'UTR|TR|TRA|None|00 +AAACCAACCACCTTGAACAGGCCTGGAGCTGTATCTCTTGCGATCTGATCTTCATAGGGAAGA +>536|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGATGGTGTCACTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATCTGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCGAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>537|TRAV8D-2 ENSMUST00000198439|TRAV8D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCGAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTATACAACTGTTGTACACTGGTACAGGCAAGACTCAGGCAGAGGCCCTGCCCTGATAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTAAGAGCCACCCTTGACACCTCCAGCCAAAGTAGCTCTCTGTCCATCACTGCTGCTCAGTGTGAAGACACTGCTGTGTACTTCTGTGCTACAGATG +>538|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|5'UTR|TR|TRA|None|00 +CTGTCCTAGGAACCAGGTTCCACTTCAGGGTGCAGCACAGCCTTTCCTGTGACATCAATAAAGCAAGAAAA +>539|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCAAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTACACAACTGTTGTTCAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTCAGAGCCACCCTTGACACTTCCAGCCAGAGCAGCTCCCTGTCCATCACTGGTACTCTAGCTACAGACACTGCTGTGTACTTCTGTGCTACTGATG +>540|TRAV9-1 ENSMUST00000103581|TRAV9-1|5'UTR|TR|TRA|None|00 +TCTTTCCTGCACGAGCCAGGTTTTTCCAGAAAGGCACCAGAGCTGTTTCCAGTGTGCAGCC +>541|TRAV9-1 ENSMUST00000103581|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCATGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCGAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>542|TRAV9-2 ENSMUST00000103654|TRAV9-2|5'UTR|TR|TRA|None|00 +TTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCCTACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCTTTTCCAAGGCTCAGCC +>543|TRAV9-2 ENSMUST00000103654|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCTGCTGTGTACTTCTGTGTTTTGAGCG +>544|TRAV9-4 ENSMUST00000103662|TRAV9-4|5'UTR|TR|TRA|None|00 +TGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>545|TRAV9-4 ENSMUST00000103662|TRAV9-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCACTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACGCCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCATCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>546|TRAV9D-1 ENSMUST00000178426|TRAV9D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCGTGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCAAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>547|TRAV9D-2 ENSMUST00000199746|TRAV9D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTCCTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGTTCTGAGCG +>548|TRAV9D-3 ENSMUST00000178252|TRAV9D-3|5'UTR|TR|TRA|None|00 +ATCTCATCCCTCTTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGTTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCTGCTTTCCTGCCTGTCCTGTTCCAGAGTTTCTCCACAACAGAGCTGCAGCCTTCTCAAGGCTCAGTC +>549|TRAV9D-3 ENSMUST00000178252|TRAV9D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTCTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTTTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATCCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTGGGCTGTGTACTTCTGTGCTGTGAGCA +>550|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>551|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>552|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>553|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAACAGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>554|TRBC1 ENSMUST00000192856|TRBC1|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGCAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGGATTACCTCAGCATCCTATCAACAAGGGGTCTTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAAGCCACCCTGTATGCTGTGCTTGTCAGTACACTGGTGGTGATGGCTATGGTCAAAAGAAAGAATTCA +>555|TRBC2 ENSMUST00000103299|TRBC2|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGAAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGAATCACTTCAGCATCCTATCATCAGGGGGTTCTGTCTGCAACCATCCTCTATGAGATCCTACTGGGGAAGGCCACCCTATATGCTGTGCTGGTCAGTGGCCTGGTGCTGATGGCCATGGTCAAGAAAAAAAATTCC +>556|TRBD1 ENSMUST00000178537|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>557|TRBD2 ENSMUST00000178862|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTGGGGGGGC +>558|TRBJ1-1 ENSMUST00000103284|TRBJ1-1|J-REGION|TR|TRB|None|00 +CAAACACAGAAGTCTTCTTTGGTAAAGGAACCAGACTCACAGTTGTAG +>559|TRBJ1-2 ENSMUST00000103285|TRBJ1-2|J-REGION|TR|TRB|None|00 +CAAACTCCGACTACACCTTCGGCTCAGGGACCAGGCTTTTGGTAATAG +>560|TRBJ1-3 ENSMUST00000192366|TRBJ1-3|J-REGION|TR|TRB|None|00 +TTCTGGAAATACGCTCTATTTTGGAGAAGGAAGCCGGCTCATTGTTGTAG +>561|TRBJ1-4 ENSMUST00000103287|TRBJ1-4|J-REGION|TR|TRB|None|00 +TTTCCAACGAAAGATTATTTTTCGGTCATGGAACCAAGCTGTCTGTCCTGG +>562|TRBJ1-5 ENSMUST00000103288|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAACAACCAGGCTCCGCTTTTTGGAGAGGGGACTCGACTCTCTGTTCTAG +>563|TRBJ1-6 ENSMUST00000103289|TRBJ1-6|J-REGION|TR|TRB|None|00 +TTCCTATAATTCGCCCCTCTACTTTGCGGCAGGCACCCGGCTCACTGTGACAG +>564|TRBJ1-7 ENSMUST00000193061|TRBJ1-7|J-REGION|TR|TRB|None|00 +CCTGTGTTGGATGACCATGGTCTTGGAAAGGAACTTAGGTATAAGA +>565|TRBJ2-1 ENSMUST00000103293|TRBJ2-1|J-REGION|TR|TRB|None|00 +TAACTATGCTGAGCAGTTCTTCGGACCAGGGACACGACTCACCGTCCTAG +>566|TRBJ2-2 ENSMUST00000103294|TRBJ2-2|J-REGION|TR|TRB|None|00 +CAAACACCGGGCAGCTCTACTTTGGTGAAGGCTCAAAGCTGACAGTGCTGG +>567|TRBJ2-3 ENSMUST00000103295|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGTGCAGAAACGCTGTATTTTGGCTCAGGAACCAGACTGACTGTTCTCG +>568|TRBJ2-4 ENSMUST00000103296|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGTCAAAACACCTTGTACTTTGGTGCGGGCACCCGACTATCGGTGCTAG +>569|TRBJ2-5 ENSMUST00000103297|TRBJ2-5|J-REGION|TR|TRB|None|00 +AACCAAGACACCCAGTACTTTGGGCCAGGCACTCGGCTCCTCGTGTTAG +>570|TRBJ2-7 ENSMUST00000103298|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTATGAACAGTACTTCGGTCCCGGCACCAGGCTCACGGTTTTAG +>571|TRBV1 ENSMUST00000103262|TRBV1|5'UTR|TR|TRB|None|00 +GGATTCTCTTCTCTTGCCTGATGCCCTGCATGCCCCACAGAGATAGAGAGAACCTGAGGTCTCAGAG +>572|TRBV1 ENSMUST00000103262|TRBV1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGCAGTTTTGCATTCTGTGCCTCTGTGTACTCATGGCTTCTGTGGCTACAGACCCCACAGTGACTTTGCTGGAGCAAAACCCAAGGTGGCGTCTGGTACCACGTGGTCAAGCTGTGAACCTACGCTGCATCTTGAAGAATTCCCAGTATCCCTGGATGAGCTGGTATCAGCAGGATCTCCAAAAGCAACTACAGTGGCTGTTCACTCTGCGGAGTCCTGGGGACAAAGAGGTCAAATCTCTTCCCGGTGCTGATTACCTGGCCACACGGGTCACTGATACGGAGCTGAGGCTGCAAGTGGCCAACATGAGCCAGGGCAGAACCTTGTACTGCACCTGCAGTGCAGA +>573|TRBV10 ENSMUST00000103265|TRBV10|5'UTR|TR|TRB|None|00 +TCTGATAGCTGCAGTAGGTAGGGCTTATTTGCCCTGCCTTGACCCAACT +>574|TRBV10 ENSMUST00000103265|TRBV10|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGTAGGCTCCTAAGCTGTGTGGCCTTCTGCCTCTTGGGAATAGGCCCTTTGGAGACGGCTGTTTTCCAGACTCCAAACTATCATGTCACACAGGTGGGAAATGAAGTGTCTTTCAATTGTAAGCAAACTCTGGGCCACGATACTATGTATTGGTACAAGCAAGACTCTAAGAAATTGCTGAAGATTATGTTTAGCTACAATAATAAGCAACTCATTGTAAACGAAACAGTTCCAAGGCGCTTCTCACCTCAGTCTTCAGATAAAGCTCATTTGAATCTTCGAATCAAGTCTGTAGAGCCGGAGGACTCTGCTGTGTATCTCTGTGCCAGCAGCTAAGA +>575|TRBV12-1 ENSMUST00000103267|TRBV12-1|5'UTR|TR|TRB|None|00 +GCATCCTGAGAAGAAGC +>576|TRBV12-1 ENSMUST00000103267|TRBV12-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGTCCTCGCTGATTCTGCCTGGGGCATCACCCTGCTATCTTGGGTTACTGTCTTTCTCTTGGGAACAAGTTCAGCAGATTCTGGGGTTGTCCAGTCTCCAAGACACATAATCAAAGAAAAGGGAGGAAGGTCCGTTCTGACGTGTATTCCCATCTCTGGACATAGCAATGTGGTCTGGTACCAGCAGACTCTGGGGAAGGAATTAAAGTTCCTTATTCAGCATTATGAAAAGGTGGAGAGAGACAAAGGATTCCTACCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAAATGAACATGAGTGCCTTGGAACTGGAGGACTCTGCTATGTACTTCTGTGCCAGCTCTCTC +>577|TRBV12-2 ENSMUST00000103269|TRBV12-2|5'UTR|TR|TRB|None|00 +CCTGAGAGGAAGC +>578|TRBV12-2 ENSMUST00000103269|TRBV12-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAGTTCAGCAAATTCTGGGGTTGTCCAGTCTCCAAGATACATAATCAAAGGAAAGGGAGAAAGGTCCATTCTAAAATGTATTCCCATCTCTGGACATCTCTCTGTGGCCTGGTATCAACAGACTCAGGGGCAGGAACTAAAGTTCTTCATTCAGCATTATGATAAAATGGAGAGAGATAAAGGAAACCTGCCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAGATGAACATGAGTGCCTTGGAGCTAGAGGACTCTGCCGTGTACTTCTGTGCCAGCTCTCTC +>579|TRBV13-1 ENSMUST00000194399|TRBV13-1|5'UTR|TR|TRB|None|00 +AACATACAAGAGCCTGACTTGGTCGCGAG +>580|TRBV13-1 ENSMUST00000194399|TRBV13-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTTCTGGTCTTGAGCCTCCTGTGTACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCTAGAAACAAGGTGACAGTAACAGGAGGAAACGTGACATTGAGCTGTCGCCAGACTAATAGCCACAACTACATGTACTGGTATCGGCAGGACACTGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGCTGGCAACCTTCAAATAGGAGATGTCCCTGATGGGTACAAGGCCACCAGAACAACGCAAGAAGACTTCTTCCTCCTGCTGGAATTGGCTTCTCCCTCTCAGACATCTTTGTACTTCTGTGCCAGCAGTGATG +>581|TRBV13-2 ENSMUST00000103270|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>582|TRBV13-3 ENSMUST00000103271|TRBV13-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGACTCTTCTTTGTGGTTTTGATTCTCCTGTGTGCAAAACACATGGAGGCTGCAGTCACCCAAAGTCCAAGAAGCAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTCACCAGACTAATAACCATGACTATATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTACTCATATGTCGCTGACAGCACGGAGAAAGGAGATATCCCTGATGGGTACAAGGCCTCCAGACCAAGCCAAGAGAATTTCTCTCTCATTCTGGAGTTGGCTTCCCTTTCTCAGACAGCTGTATATTTCTGTGCCAGCAGTGATG +>583|TRBV14 ENSMUST00000103272|TRBV14|5'UTR|TR|TRB|None|00 +CCTCCTCTGCCCTCAATCTGCC +>584|TRBV14 ENSMUST00000103272|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTTCTTGGCTGGGCAGTGTTCTGTCTCCTTGACACAGTACTGTCTGAAGCTGGAGTCACCCAGTCTCCCAGATATGCAGTCCTACAGGAAGGGCAAGCTGTTTCCTTTTGGTGTGACCCTATTTCTGGACATGATACCCTTTACTGGTATCAGCAGCCCAGAGACCAGGGGCCCCAGCTTCTAGTTTACTTTCGGGATGAGGCTGTTATAGATAATTCACAGTTGCCCTCGGATCGATTTTCTGCTGTGAGGCCTAAAGGAACTAACTCCACTCTCAAGATCCAGTCTGCAAAGCAGGGCGACACAGCCACCTATCTCTGTGCCAGCAGTTTCT +>585|TRBV15 ENSMUST00000103273|TRBV15|5'UTR|TR|TRB|None|00 +GTCACATCAGTGCTCATCCCACT +>586|TRBV15 ENSMUST00000103273|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCATCCAGACCCTCTGTTGTGTGATCTTTTATGTTCTGATAGCAAATCACACAGATGCTGGAGTTACCCAGACACCCAGACATGAGGTGGCAGAGAAAGGACAAACAATAATCCTGAAGTGTGAGCCAGTTTCAGGCCACAATGACCTTTTCTGGTACAGACAGACCAAGATACAGGGACTAGAGTTGCTGAGCTACTTCCGCAGCAAGTCTCTTATGGAAGATGGTGGGGCTTTCAAGGATCGATTCAAAGCTGAGATGCTAAATTCATCCTTCTCCACTCTGAAGATTCAACCTACAGAACCCAAGGACTCAGCTGTGTATCTGTGTGCCAGCAGTTTAGC +>587|TRBV16 ENSMUST00000103274|TRBV16|5'UTR|TR|TRB|None|00 +TCTCGTGCTTACGTGGAGTTTCTATGAGTGAAGCCACTGCCTCATCTTGCC +>588|TRBV16 ENSMUST00000103274|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCCCCAGGCTCCTTTTCTGTCTGGTTCTTTGCTTCTTGAGAGCAGAACCAACAAATGCTGGTGTCATCCAAACACCTAGGCACAAGGTGACAGGGAAGGGACAAGAAGCAACTCTGTGGTGTGAGCCAATTTCAGGACATAGTGCTGTTTTCTGGTACAGACAGACCATTGTGCAGGGCCTGGAGTTCCTGACTTACTTTCGAAATCAAGCTCCTATAGATGATTCAGGGATGCCCAAGGAACGATTCTCAGCTCAGATGCCCAATCAGTCGCACTCAACTCTGAAGATCCAGAGCACGCAACCCCAGGACTCAGCGGTGTATCTTTGTGCAAGCAGCTTAGA +>589|TRBV17 ENSMUST00000103275|TRBV17|5'UTR|TR|TRB|None|00 +CAAATATTCCTTTCCTGTTCTGGACCATCC +>590|TRBV17 ENSMUST00000103275|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATCCTAGACTTCTTTGCTGTGTGATCTTCTGTCTTCTTGCAGCCACTTTTGTGGATACTACGGTTAAGCAGAACCCAAGATACAAGCTTGCAAGAGTTGGAAAACCAGTGAATTTGATCTGTTCTCAGACTATGAATCATGATACCATGTACTGGTACCAAAAGAAGCCAAACCAAGCACCAAAGCTTCTTCTTTTCTACTATGATAAGATTTTGAACAGGGAAGCTGACACTTTTGAGAAGTTCCAATCCAGTCGGCCTAACAATTCTTTCTGCTCTCTCTACATTGGCTCTGCAGGCCTAGAGTATTCTGCCATGTACCTCTGTGCTAGCAGTAGAGA +>591|TRBV19 ENSMUST00000103276|TRBV19|5'UTR|TR|TRB|None|00 +CCCCTCTTCTCAGAACTGGTGCAGATGCTTGGAGCCAGTGTCTGGCTCTCTGGTCTCCCTCTCCTTCTGCCACACCAGGAAGCTCCTTTTGAACATCTCAAGAGTCTTCCTACCATTCTAGTCATCATAGTTAGCCAGGTGGAGCCCCTGCATAGCGCGTCTCCTTGTTTCTCTTTTAACTAATGCCCAGAGCCAAAGAAAGTCCCTCCAAACT +>592|TRBV19 ENSMUST00000103276|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAACAAGTGGGTTTTCTGCTGGGTAACCCTTTGTCTCCTTACTGTAGAGACCACACATGGTGATGGTGGCATCATTACTCAGACACCCAAATTCCTGATTGGTCAGGAAGGGCAAAAACTGACCTTGAAATGTCAACAGAATTTCAATCATGATACAATGTACTGGTACCGACAGGATTCAGGGAAAGGATTGAGACTGATCTACTATTCAATAACTGAAAACGATCTTCAAAAAGGCGATCTATCTGAAGGCTATGATGCGTCTCGAGAGAAGAAGTCATCTTTTTCTCTCACTGTGACATCTGCCCAGAAGAACGAGATGGCCGTTTTTCTCTGTGCCAGCAGTATAG +>593|TRBV2 ENSMUST00000103263|TRBV2|5'UTR|TR|TRB|None|00 +GCACAAGAAACTGTCTGAGGAGACCCAAGAGGTAGCTGGGTATGGTCTAGGTCTGGGAGCCTATGCCCTGACAAGCATGAAGGGCAAAGAGGAAGTGTGAGCTGAAACCATCTACACAACAGGGAGCATCCAAGCAAAGCATTTTACAGGTCAGCAAAAGGCACCCAGACAGCCAGGATCCAAAGAGAAAGAGATCCTATCCTGTGTGACACTGCT +>594|TRBV2 ENSMUST00000103263|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCATTTTCCTCAGTTGCCTGGCCGTTTGTCTCCTGGTGGCAGGTCCAGTCGACCCGAAAATTATCCAGAAACCAAAATATCTGGTGGCAGTCACAGGGAGCGAAAAAATCCTGATATGCGAACAGTATCTAGGCCACAATGCTATGTATTGGTATAGACAAAGTGCTAAGAAGCCTCTAGAGTTCATGTTTTCCTACAGCTATCAAAAACTTATGGACAATCAGACTGCCTCAAGTCGCTTCCAACCTCAAAGTTCAAAGAAAAACCATTTAGACCTTCAGATCACAGCTCTAAAGCCTGATGACTCGGCCACATACTTCTGTGCCAGCAGCCAAGA +>595|TRBV20 ENSMUST00000103277|TRBV20|L-REGION+V-REGION|TR|TRB|None|00 +ATGTTACTGCTTCTATTACTTCTGGGGCCTGGCTGTGGGCTTGGAGCACTCGTCTATCAATATCCCAGAAGAACCATCTGTAAGAGTGGAACTTCCATGAGGATGGAGTGTCAAGCTGTGGGTTTTCAGGCAACTTCTGTAGCTTGGTATCGTCAATCGCCTCAAAAGACATTTGAACTGATAGCACTTTCTACTGTGAACTCAGCAATCAAATATGAACAAAATTTTACCCAGGAAAAATTTCCCATCAGTCATCCCAACTTATCCTTTTCATCTATGACAGTTTTAAATGCATATCTTGAAGACAGAGGCTTATATCTCTGTGGTGCTAGGGA +>596|TRBV21 ENSMUST00000195087|TRBV21|5'UTR|TR|TRB|None|00 +AGACAGCTAGCTGATCAGCACTCTCTATGAATCAACCATGCACTGCAAACTTTTCTACTGTGTGCCCTTTTATTCTGGACATCAAGCTCC +>597|TRBV23 ENSMUST00000193997|TRBV23|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTGCACGGCTCATTTGCTATGTAGCACTTTGCCTCCTGGGGGCAGGCTCTTTTGATGCTGCAGTTACACAGAAGCCAAGATATTTGATCAAAATGAAAGGCCAGGAAGCAGAGATGAAATGTATCCCTGAAAAGGGGCACACTGCTGTTTTCTGGTATCAACAAAAGCAGAGCAAAGAATTAAAGTTCCTGATTTACTTTCAGAATCAACAGCCTCTTGATCAAATAGACATGGTCAAGGAGAGATTCTCAGCTGTGTGCCCCTCCAGCTCACTCTGCAGCCTGGGAATCAGAACGTGCGAAGCAGAAGACTCAGCACTGTACTTGTGCTCCAGCAGTCAATC +>598|TRBV26 ENSMUST00000193064|TRBV26|5'UTR|TR|TRB|None|00 +TTTCGTACTTCTAAGCCACC +>599|TRBV26 ENSMUST00000193064|TRBV26|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCTACAAGGCTCCTCTGTTACACAGTACTTTGTCTCCTGGGTGCAAGAATTTTGAATTCAAAAGTCATTCAGACTCCAAGATATCTGGTGAAAGGGCAAGGACAAAAAGCAAAGATGAGGTGTATCCCTGAAAAGGGACATCCAGTTGTATTCTGGTATCAACAAAATAAGAACAATGAGTTTAAATTTTTGATTAACTTTCAGAATCAAGAAGTTCTTCAGCAAATAGACATGACTGAAAAACGATTCTCTGCTGAGTGTCCTTCAAACTCACCTTGCAGCCTAGAAATTCAGTCCTCTGAGGCAGGAGACTCAGCACTGTACCTCTGTGCCAGCAGTCTGTC +>600|TRBV29 ENSMUST00000103281|TRBV29|5'UTR|TR|TRB|None|00 +AAAACCACC +>601|TRBV29 ENSMUST00000103281|TRBV29|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAGTTAGGCTCATCTCTGCTGTGGTGCTGTGTTTCCTAGGAACAGGCCTTGTGGACATGAAAGTAACCCAGATGCCAAGATACCTGATCAAAAGAATGGGAGAGAATGTTTTGCTGGAATGTGGACAGGACATGAGCCATGAAACAATGTACTGGTATCGACAAGACCCTGGTCTGGGGCTACAGCTGATTTATATCTCATACGATGTTGATAGTAACAGCGAAGGAGACATCCCTAAAGGATACAGGGTCTCACGGAAGAAGCGGGAGCATTTCTCCCTGATTCTGGATTCTGCTAAAACAAACCAGACATCTGTGTACTTCTGTGCTAGCAGTTTATC +>602|TRBV3 ENSMUST00000103264|TRBV3|5'UTR|TR|TRB|None|00 +GTCAGACCTTGCCTATGGGACCATAGGATGCTAGCATACCCCTCCTGTTTCTGATGTGCAGTCAGTCAAGCTAGGAGAAACTACATTCCTGCCGTGACCCTACT +>603|TRBV3 ENSMUST00000103264|TRBV3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTTCTAGGTTGGATAATTTTTAGTTTCTTGGAAGCAGGACACACAGGACCCAAAGTCTTACAGATCCCAAGTCATCAAATAATAGATATGGGGCAGATGGTGACCCTCAATTGTGACCCAGTTTCTAATCACCTATATTTTTATTGGTATAAACAGATTTTAGGACAGCAGATGGAGTTTCTGGTTAATTTCTACAATGGTAAAGTCATGGAGAAGTCTAAACTGTTTAAGGATCAGTTTTCAGTTGAAAGACCAGATGGTTCATATTTCACTCTGAAAATCCAACCCACAGCACTGGAGGACTCAGCTGTGTACTTCTGTGCCAGCAGCTTAGCCACA +>604|TRBV30 ENSMUST00000191646|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGACATTCCTGCTACTTCTTTGGAGCCAAGGTTCTGTATTCAGTGTCCTCCTCTACCAAAAGCCAAACAGGGACATCTGTCAAAGTGGCACTTCACTGAAAATCCAGTGTGTGGCTGACAGTCAAGTTGTTTCGATGTTTTGGTACCAACAGTTCCAGGAACAGAGCTTGATGCTCATGGCAACTGCAAATGAAGGCTCTGAAGCCACATACGAGAGTGGATTCACCAAGGACAAGTTTCCAATCAGCCGGCCAAACCTAACATTCTCAACGTTGACAGTGAACAATGCAAGGCCTGGAGACAGCAGTATCTATTTCTGTAGTTCTAGAGA +>605|TRBV31 ENSMUST00000193003|TRBV31|5'UTR|TR|TRB|None|00 +GGAGGGGCCTGTGCATCTCTGGCTTAGAAAAGGAAGTACAAGTGCAGAGTAGACAAGCCTAGACAAAGACCATCTTGAACT +>606|TRBV31 ENSMUST00000193003|TRBV31|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGTACTCTCTCCTTGCCTTTCTCCTGGGCATGTTCTTGGGTGTTAGTGCTCAGACTATCCATCAATGGCCAGTTGCCGAGATCAAGGCTGTGGGCAGCCCACTGTCTCTGGGGTGTACCATAAAGGGGAAATCAAGCCCTAACCTCTACTGGTACTGGCAGGCCACAGGAGGCACCCTCCAGCAACTCTTCTACTCTATTACTGTTGGCCAGGTAGAGTCGGTGGTGCAACTGAACCTCTCAGCTTCCAGGCCGAAGGACGACCAATTCATCCTAAGCACGGAGAAGCTGCTTCTCAGCCACTCTGGCTTCTACCTCTGTGCCTGGAGTCT +>607|TRBV5 ENSMUST00000103266|TRBV5|5'UTR|TR|TRB|None|00 +AATACCCGTCTGGAGCCTGATTCCACC +>608|TRBV5 ENSMUST00000103266|TRBV5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCTGCAGGCTTCTCCTCTATGTTTCCCTATGTCTTGTGGAAACAGCACTCATGAACACTAAAATTACTCAGTCACCAAGATATCTAATCCTGGGAAGAGCAAATAAGTCTTTGGAATGTGAGCAACATCTGGGACATAATGCTATGTACTGGTATAAACAGAGCGCTGAGAAGCCGCCAGAGCTCATGTTTCTCTACAATCTTAAACAGTTGATTCGAAATGAGACGGTGCCCAGTCGTTTTATACCTGAATGCCCAGACAGCTCCAAGCTACTTTTACATATATCTGCCGTGGATCCAGAAGACTCAGCTGTCTATTTTTGTGCCAGCAGCCAAGA +>609|TRDC ENSMUST00000196323|TRDC|C-REGION|TR|TRD|None|00 +AAAGCCAGCCTCCGGCCAAACCATCTGTTTTCATCATGAAAAATGGAACAAATGTTGCTTGTCTGGTGAAAGATTTCTACCCTAAAGAGGTGACTATAAGTCTCAGATCATCCAAGAAGATTGTGGAATTCGACCCTGCTATAGTCATCTCCCCCAGCGGGAAGTACAGTGCTGTCAAGCTTGGTCAGTATGGAGATTCGAATTCAGTGACATGTTCAGTTCAGCACAACAGTGAAACTGTGCACTCGACTGACTTTGAACCATATGCAAATTCTTTCAATAATGAAAAACTACCAGAACCTGAAAATGACACACAAATTTCAGAGCCTTGCTATGGCCCAAGAGTCACAGTTCACACTGAGAAGGTAAACATGATGTCCCTCACGGTGCTGGGCCTACGACTGCTGTTTGCCAAGACCATTGCCATCAATTTTCTCTTGACTGTTAAGTTATTCTTT +>610|TRDD1 ENSMUST00000196221|TRDD1|D-REGION|TR|TRD|None|00 +ATGGCATAT +>611|TRDD2 ENSMUST00000177564|TRDD2|D-REGION|TR|TRD|None|00 +ATCGGAGGGATACGAG +>612|TRDJ1 ENSMUST00000103682|TRDJ1|J-REGION|TR|TRD|None|00 +CTACCGACAAACTCGTCTTTGGACAAGGAACCCAAGTGACTGTGGAACCAA +>613|TRDJ2 ENSMUST00000103683|TRDJ2|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTTGGAACTGGCATAGAGCTCTTTGTGGAGCCCC +>614|TRDV1 ENSMUST00000103676|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGGGATGCGCCTTCAAGTGCTTGCTTGGCTATTGACATTTCAGGCTGCCTGGGTCAACACCCAAATGTTGCATCAGAGTCCTCAGTCTCTGACAATCCAAGAAGGAGATGAAGTCACCATGAGCTGCAATTTATCAACATCTTTATATGCCTTACTCTGGTATAGGCAGGGGGATGATGGCAGCCTCGTCTCCTTGGTGACATTACAGAAAGGAGGAGATGAGAAAAGTAAGGACAAAATAACCGCTAATCTGGATAAGAAAATGCAACAAAGTTCCCTGTGGATCCAAGCCTCCCAGCCCAGCCACTCAGGCACTTACCTCTGTGGAGGGAAAG +>615|TRDV2-1 ENSMUST00000197130|TRDV2-1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGCAGTCCTTAGCTCACTGTGGGCAGTTGTGATCACCACCTGTCTAGGAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAGTCGGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCACTCAGGGGGAGC +>616|TRDV2-2 ENSMUST00000103678|TRDV2-2|5'UTR|TR|TRD|None|00 +AGTGCTAGCGCAGCTGAGAGCAAGGACTGATCTGAAGCCGGCTTCTAGC +>617|TRDV2-2 ENSMUST00000103678|TRDV2-2|L-REGION+V-REGION|TR|TRD|None|00 +ATGGTACGGCCGTTCTTCCTGTGGGTGCTCTTCCTTTCCACTTCTCTTGAAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAATCAGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCTCTCATGGAGCGC +>618|TRDV4 ENSMUST00000103679|TRDV4|5'UTR|TR|TRD|None|00 +AGCAGATAAGGATTCTCACGGAGACAGAGACAGAGGTGAGGCTCAGCAGGGCAGCCCAGGAAAGCACCAGCCGATTACAAACTCATCCTCAGTGAAACT +>619|TRDV4 ENSMUST00000103679|TRDV4|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTTTGGAGATGTCCAGTCCTCTGCATATTCATCTTCAGTACAGGGACCTCTTTGGATGTATATTTGGAACCAGTTGCCAAAACTTTTACTGTTGTAGCTGGGGATCCTGCCTCCTTCTACTGCACTGTAACAGGAGGGGACATGAAGAATTATCATATGAGCTGGTATAAGAAGAATGGAACTAATGCTCTGTTTTTAGTATACAAGCTAAATAGCAATTCTACTGATGGTGGAAAGAGCAACCTCAAAGGGAAAATTAACATTTCAAAAAATCAGTTTATACTCGACATTCAGAAGGCAACAATGAAAGACGCTGGTACGTACTACTGTGGGTCAGATATC +>620|TRDV5 ENSMUST00000103685|TRDV5|5'UTR|TR|TRD|None|00 +CCCTCCTGTCCCCTCCCTAGACAAAGCAATAGGGATGGTTAAAGAGAGTCCAGCAGCCCTCCTCCACGCTGTGCCCCTGTACCGACTGGAAGG +>621|TRDV5 ENSMUST00000103685|TRDV5|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTGCCGCGACCCTTACCCTTCTGTTTGCCTACAAGGATGTGCTGTGCATCACGCTGACCCAGAGCTCCACTGACCAGACAGTGGCAAGCGGCACTGAAGTAACACTGCTCTGCACGTACAATGCGGATTCTCCAAACCCAGATTTATTTTGGTATCGCAAAAGGCCAGACAGATCCTTCCAGTTCATCCTTTATAGGGACGACACTAGTTCCCATGATGCAGATTTTGTTCAAGGTCGATTTTCTGTGAAGCACAGCAAGGCCAACAGAACCTTCCATCTGGTGATCTCTCCAGTGAGCCTTGAAGACAGCGCTACTTATTACTGTGCCTCGGGGTAT +>622|TRGJ1 ENSMUST00000200495|TRGJ1|J-REGION|TR|TRG|None|00 +ATAGCTCAGGTTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCCTCTG +>623|TRGJ2 ENSMUST00000197113|TRGJ2|J-REGION|TR|TRG|None|00 +ATAGCTCGGGCTTTCACAAGGTATTTGCAGAAGGAACAAAGCTCATAGTAATTCCCTCCG +>624|TRGJ3 ENSMUST00000103562|TRGJ3|J-REGION|TR|TRG|None|00 +ATAGTTGGGACTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCTTCTG +>625|TRGJ4 ENSMUST00000184430|TRGJ4|J-REGION|TR|TRG|None|00 +TCAGGCACATCATGGGTCAAGATATTTGCCAAAGGGACAAAGCTCGTAGTAATTCCCCCAG +>626|TRGV2 ENSMUST00000103563|TRGV2|5'UTR|TR|TRG|None|00 +AACAGATCATGACCAACCCTGGGGGAACCCACTGACTGCATTTTTCTGAGACTATAGCACAGTCCCACCCTCCAGCTGGTGACCTGAAATTCCAGCCTGCAGAGCACTTCCTGCCTCCCTGTGAAGCAGTCCAACCTTGGG +>627|TRGV2 ENSMUST00000103563|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGATGGTTCACCTCCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGAGACAGATGAGAATGTGCAAATATCCTGTATAGTTTATCTTCCATATTTCTCCAACACAGCTATACATTGGTACCGGCAAAAAACAAATCAACAGTTTGAGTATCTAATATATGTCGCAACAAACTACAATCAACGACCCTTAGGAGGGAAGCACAAAAAAATTGAAGCAAGTAAAGATTTTAAAAGTTCTACCTCAACCTTGGAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATGAG +>628|IGKV12-89 GRCm38-release94|IGKV12-89|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGTGTACCCACTCAGCTCCTGTTGCTGTGGCTTACAGTCGTAGTTGTCAGATGTGACATCCAGATGACTCAGTCTCCAGCTTCACTGTCTGCATCTGTGGGAGAAACTGTCACCATCACATGTGGAGCAAGTGAGAATATTTACGGTGCTTTAAATTGGTATCAGCGGAAACAGGGAAAATCTCCTCAGCTCCTGATCTATGGTGCAACCAACTTGGCAGATGGCATGTCATCGAGGTTCAGTGGCAGTGGATCTGGTAGACAGTATTCTCTCAAGATCAGTAGCCTGCATCCTGACGATGTTGCAACGTATTACTGTCAAAATGTGTTAAGTACTCCTCC +>629|IGHV12-1 AJ851868.3|IGHV12-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGACTACTAGGGTTTCTCCTGTGCTTGGCAGCAGCTCTAAAAAGTGTTCTGTCCCAGATTCAGCTTAAGGAGTCTGGACCTGCTGTCATCAAGCCATCACAGTCACTGTCTCTCACCTGCATAGTCTCTGGATTCTCCATCACAAGTAGTAGTTATTGCTGGCACTGGATCCGCCAGCCCCCAGGAAAGGGGTTAGAGTGGATGGGGCGCATATGTTATGAAGGTTCAATATACTATAGTCCATCCATCAAAAGCCGCAGCACCATCTCCAGAGACACATCTCTGAACAAATTCTTTATCCAGCTGAGCTCTGTGACAAATGAGGACACAGCCATGTACTACTGTTCC +>630|IGHV1-unknown1 LVXK01034187.1|IGHV1-unknown1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGGTCGTTCTCTTCCTCCTGTCATTAACTGCAGGTGTCTATGCCCAGGGTCAGATGCAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGACTTCTGGCTTCACCTTCAGCAGTAGCTATATAAGTTGGTTGAAGCAAAAGCCTGGACAGAGTCTTGAGTGGATTGCATGGATTTATGCTGGAACTGGTGGTACTAGCTATAATCAGAAGTTCACAGGCAAGGCCCAACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAATTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>631|TRAV4-4-DV10 GRCm38-release94|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGGGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGATTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGAGTGTGCAGTGGTTCCGACAGAATTCCAGGGGCAGCCTCATCAGTTTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>632|TRAV13-1 GRCm38-release94|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAATGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGAGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>633|TRBV12-2+TRBV13-2 GRCm38-release94|TRBV12-2+TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>634|TRAV16N GRCm38-release94|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>635|TRAV6N-5 GRCm38-release94|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>636|TRAV13N-4 GRCm38-release94|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGTGCTTCTCAATTAGGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>637|TRBV13-2 GRCm38-release94|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAGTTTTGTCTTTCTTTTTATAGAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>638|IGHG3 GRCm38-release94|IGHG3|C-REGION|IG|IGH|G3|00 +AGCTGGAACTGAATGGGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTGTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>639|IGHG2B GRCm38-release94|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCCGTGACCTCTGGGTGCCTGGTCAAGGGGTACTTCCCTGAGCCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGCACCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTGAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACACTTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTTCTTGACTCTGACGGTTCTTACTTCATATATAGCAAGCTCAATATGAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>640|IGHV8-9 GRCm38-release94|IGHV8-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCCCAGACCCTCAGTCTGACCTGTTCTTTCTCTGTGTTTTCACTGAGCACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTATTGGGATGAGGACAAGCACTATAAACCATCCTTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGCAGATACTGCCACATACTACTGT +>641|IGKV2-109 GRCm38-release94|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCCTTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAATCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGGTGTCCAATCTGGCCTCAGGAGTCCCAAACAGGTTCAGTGGCAGTGAGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGT +>642|IGKV4-56 GRCm38-release94|IGKV4-56|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGCAGAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGCAGAAAGTCACCATAACCTGCAGTGCCATCTCAAGTGTAAATTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATGCAACATCCAAACTGGCTCTTGGAGTCCCTGCTTGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGTGGCTGAAGATGCCACCTCTTATTTCTGT +>643|IGHV1-2 GRCm38-release94|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGATACTTCCTTTTATTATGTCAGTAACTGCAGGTGTCTACTCACAGGTTCAGCTCCAGCAGTCTGGGCCTGAGCTGGCAAGGCCTTGGGCTTCAGTGAAGATATCCTGCCAGGCTTTCTACACCTTTTCCAGAAGGGTGCACTTTGCCATTAGGGATACCAACTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATCGGGGCTATTTATCCTGGAAATGGTGATACTAGTTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGT diff --git a/lib/rust/vdj_ann_ref/vdj_refs_7.0/human/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_7.0/human/fasta/regions.fa new file mode 100644 index 0000000..af64537 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_7.0/human/fasta/regions.fa @@ -0,0 +1,1384 @@ +>1|IGHA1 ENST00000641837|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAACAGGGAGGGCCCCCAGTAC +>2|IGHA1 ENST00000633714|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>3|IGHA2 ENST00000390539|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGTAAACCCACCCACATCAATGTGTCTGTTGTCATGGCGGAGGCGGATGGCACCTGCTAC +>4|IGHA2 ENST00000497872|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGCTCTTGCTGTGTTGCAGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAAGAGGGAGGGCCCCCAGTAC +>5|IGHA2 ENST00000622473|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>6|IGHD ENST00000633698|IGHD|C-REGION|IG|IGH|D|00 +CACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTACCTGGCCATGACCCCCCTGATCCCTCAGAGCAAGGATGAGAACAGCGATGACTACACGACCTTTGATGATGTGGGCAGCCTGTGGACCACCCTGTCCACGTTTGTGGCCCTCTTCATCCTCACCCTCCTCTACAGCGGCATTGTCACTTTCATCAAGGTGAAG +>7|IGHD1-1 ENST00000633210|IGHD1-1|D-REGION|IG|IGH|None|00 +GGTACAACTGGAACGAC +>8|IGHD1-14 ENST00000631884|IGHD1-14|D-REGION|IG|IGH|None|00 +GGTATAACCGGAACCAC +>9|IGHD1-20 ENST00000632968|IGHD1-20|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACGAC +>10|IGHD1-26 ENST00000633009|IGHD1-26|D-REGION|IG|IGH|None|00 +GGTATAGTGGGAGCTACTAC +>11|IGHD1-7 ENST00000632304|IGHD1-7|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACTAC +>12|IGHD1/OR15-1B ENST00000604838|IGHD1/OR15-1B|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACAAC +>13|IGHD2-15 ENST00000632473|IGHD2-15|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTGGTGGTAGCTGCTACTCC +>14|IGHD2-2 ENST00000631803|IGHD2-2|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTAGTACCAGCTGCTATGCC +>15|IGHD2-21 ENST00000632619|IGHD2-21|D-REGION|IG|IGH|None|00 +AGCATATTGTGGTGGTGACTGCTATTCC +>16|IGHD2-8 ENST00000633504|IGHD2-8|D-REGION|IG|IGH|None|00 +AGGATATTGTACTAATGGTGTATGCTATACC +>17|IGHD2/OR15-2B ENST00000604102|IGHD2/OR15-2B|D-REGION|IG|IGH|None|00 +AGAATATTGTAATAGTACTACTTTCTATGCC +>18|IGHD3-10 ENST00000632609|IGHD3-10|D-REGION|IG|IGH|None|00 +GTATTACTATGGTTCGGGGAGTTATTA +>19|IGHD3-16 ENST00000633379|IGHD3-16|D-REGION|IG|IGH|None|00 +GTATTATGATTACGTTTGGGGGAGTTATCGTTATACC +>20|IGHD3-22 ENST00000633765|IGHD3-22|D-REGION|IG|IGH|None|00 +GTATTACTATGATAGTAGTGGTTATTACTAC +>21|IGHD3-3 ENST00000633353|IGHD3-3|D-REGION|IG|IGH|None|00 +GTATTACGATTTTTGGAGTGGTTATTATACC +>22|IGHD3-9 ENST00000632911|IGHD3-9|D-REGION|IG|IGH|None|00 +GTATTACGATATTTTGACTGGTTATTA +>23|IGHD3/OR15-3B ENST00000603935|IGHD3/OR15-3B|D-REGION|IG|IGH|None|00 +GTATTATGATTTTTGGACTGGTTATTATACC +>24|IGHD4-17 ENST00000633010|IGHD4-17|D-REGION|IG|IGH|None|00 +TGACTACGGTGACTAC +>25|IGHD4-23 ENST00000633030|IGHD4-23|D-REGION|IG|IGH|None|00 +TGACTACGGTGGTAACTCC +>26|IGHD4-4 ENST00000634085|IGHD4-4|D-REGION|IG|IGH|None|00 +TGACTACAGTAACTAC +>27|IGHD4/OR15-4B ENST00000603693|IGHD4/OR15-4B|D-REGION|IG|IGH|None|00 +TGACTATGGTGCTAACTAC +>28|IGHD5-12 ENST00000631895|IGHD5-12|D-REGION|IG|IGH|None|00 +GTGGATATAGTGGCTACGATTAC +>29|IGHD5-24 ENST00000632963|IGHD5-24|D-REGION|IG|IGH|None|00 +GTAGAGATGGCTACAATTAC +>30|IGHD5-5 ENST00000633968|IGHD5-5|D-REGION|IG|IGH|None|00 +GTGGATACAGCTATGGTTAC +>31|IGHD5/OR15-5B ENST00000604446|IGHD5/OR15-5B|D-REGION|IG|IGH|None|00 +GTGGATATAGTGTCTACGATTAC +>32|IGHD6-13 ENST00000632859|IGHD6-13|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCAGCTGGTAC +>33|IGHD6-19 ENST00000633159|IGHD6-19|D-REGION|IG|IGH|None|00 +GGGTATAGCAGTGGCTGGTAC +>34|IGHD6-25 ENST00000634070|IGHD6-25|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCGGCTAC +>35|IGHD6-6 ENST00000632542|IGHD6-6|D-REGION|IG|IGH|None|00 +GAGTATAGCAGCTCGTCC +>36|IGHD7-27 ENST00000632524|IGHD7-27|D-REGION|IG|IGH|None|00 +CTAACTGGGGA +>37|IGHE ENST00000390541|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>38|IGHE ENST00000641420|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGAGCTGGACGTGTGCGTGGAGGAGGCCGAGGGCGAGGCGCCGTGGACGTGGACCGGCCTCTGCATCTTCGCCGCACTCTTCCTGCTCAGCGTGAGCTACAGCGCCGCCATCACGCTCCTCATGGTGCAGCGGTTCCTCTCAGCCACGCGGCAGGGGAGGCCCCAGACCTCCCTCGACTACACCAACGTCCTCCAGCCCCACGCC +>39|IGHE ENST00000610670|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCGAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>40|IGHG1 ENST00000631402|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>41|IGHG1 ENST00000631466|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>42|IGHG1 ENST00000631539|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTACAGGAACATGATCGGACAGGGGGCC +>43|IGHG2 ENST00000641095|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACCACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCATCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATCAGGCAGGGGGCC +>44|IGHG2 ENST00000621803|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>45|IGHG3 ENST00000641136|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTATAGGAACATGATTGGGCAGGGGGCC +>46|IGHG3 ENST00000632774|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>47|IGHG4 ENST00000641978|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATAAGGCAGGGGGCC +>48|IGHG4 ENST00000618981|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGGTAAA +>49|IGHJ1 ENST00000634062|IGHJ1|J-REGION|IG|IGH|None|00 +GCTGAATACTTCCAGCACTGGGGCCAGGGCACCCTGGTCACCGTCTCCTCAG +>50|IGHJ2 ENST00000390564|IGHJ2|J-REGION|IG|IGH|None|00 +TACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>51|IGHJ2 ENST00000632178|IGHJ2|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>52|IGHJ3 ENST00000463911|IGHJ3|J-REGION|IG|IGH|None|00 +GATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>53|IGHJ3 ENST00000633896|IGHJ3|J-REGION|IG|IGH|None|00 +TGATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>54|IGHJ4 ENST00000461719|IGHJ4|J-REGION|IG|IGH|None|00 +TACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>55|IGHJ4 ENST00000631521|IGHJ4|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>56|IGHJ5 ENST00000488476|IGHJ5|J-REGION|IG|IGH|None|00 +AACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>57|IGHJ5 ENST00000633501|IGHJ5|J-REGION|IG|IGH|None|00 +ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>58|IGHJ6 ENST00000390560|IGHJ6|J-REGION|IG|IGH|None|00 +TACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>59|IGHJ6 ENST00000631705|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>60|IGHM ENST00000637539|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGAGGGGGAGGTGAGCGCCGACGAGGAGGGCTTTGAGAACCTGTGGGCCACCGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGTACCACCGTCACCTTGTTCAAGGTGAAA +>61|IGHM ENST00000626472|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTAC +>62|IGHV1-18 ENST00000633147|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>63|IGHV1-18 ENST00000633147|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>64|IGHV1-2 ENST00000633350|IGHV1-2|5'UTR|IG|IGH|None|00 +GAGAGCATCACCCAGCAACCACATCTGTCCTCTAGAGAATCCCCTGAGAGCTCCGTTCCTCACC +>65|IGHV1-2 ENST00000633350|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCCACAGGAGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCGGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCTGGGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACATGGAGCTGAGCAGGCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>66|IGHV1-24 ENST00000633490|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>67|IGHV1-24 ENST00000633490|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>68|IGHV1-3 ENST00000632977|IGHV1-3|5'UTR|IG|IGH|None|00 +CCACATCCCTCCTCAGAAGCCCCCAGAGCACAACGCCTCACC +>69|IGHV1-3 ENST00000632977|IGHV1-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTTTTGGTGGCAGCAGCCACAGGTGCCCACTCCCAGGTCCAGCTTGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGCATTGGGTGCGCCAGGCCCCCGGACAAAGGCTTGAGTGGATGGGATGGATCAACGCTGGCAATGGTAACACAAAATATTCACAGAAGTTCCAGGGCAGAGTCACCATTACCAGGGACACATCCGCGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAAGACACGGCTGTGTATTACTGTGCGAGAGA +>70|IGHV1-45 ENST00000631826|IGHV1-45|5'UTR|IG|IGH|None|00 +ATCACCCAACAACCACATCCCTCCTCTAGAGAATCCCCTGAAAGCACAGCTCCTCACC +>71|IGHV1-45 ENST00000631826|IGHV1-45|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGAATCCTCTTCTTGGTGGCAGCAGTCACAGATGCCTACTCCCAGATGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGACTGGGTCCTCAGTGAAGGTTTCCTGCAAGGCTTCCGGATACACCTTCACCTACCGCTACCTGCACTGGGTGCGACAGGCCCCCGGACAAGCGCTTGAGTGGATGGGATGGATCACACCTTTCAATGGTAACACCAACTACGCACAGAAATTCCAGGACAGAGTCACCATTACCAGGGACAGGTCTATGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACAGCCATGTATTACTGTGCAAGATA +>72|IGHV1-46 ENST00000632105|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>73|IGHV1-46 ENST00000632105|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>74|IGHV1-58 ENST00000632614|IGHV1-58|5'UTR|IG|IGH|None|00 +AGCATCATCCAGAAACCACATCCCTCCGCTAGAGAAGCCCCTGACGGCACAGTTCCTCACT +>75|IGHV1-58 ENST00000632614|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGAGGATCCTCTTCTTGGTGGGAGCAGCGACAGGTGCCCACTCCCAAATGCAGCTGGTGCAGTCTGGGCCTGAGGTGAAGAAGCCTGGGACCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATTCACCTTTACTAGCTCTGCTGTGCAGTGGGTGCGACAGGCTCGTGGACAACGCCTTGAGTGGATAGGATGGATCGTCGTTGGCAGTGGTAACACAAACTACGCACAGAAGTTCCAGGAAAGAGTCACCATTACCAGGGACATGTCCACAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCCGAGGACACGGCCGTGTATTACTGTGCGGCAGA +>76|IGHV1-69 ENST00000632882|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>77|IGHV1-69 ENST00000632882|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>78|IGHV1-69-2 ENST00000632209|IGHV1-69-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCCTCTTGGTGGCAGCAGCTACAGGCACCCACGCCGAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCTACAGTGAAAATCTCCTGCAAGGTTTCTGGATACACCTTCACCGACTACTACATGCACTGGGTGCAACAGGCCCCTGGAAAAGGGCTTGAGTGGATGGGACTTGTTGATCCTGAAGATGGTGAAACAATATACGCAGAGAAGTTCCAGGGCAGAGTCACCATAACCGCGGACACGTCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>79|IGHV1-69D ENST00000624687|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>80|IGHV1-69D ENST00000624687|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>81|IGHV1-69D ENST00000633446|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCAGATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>82|IGHV1-69D ENST00000633446|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTCCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>83|IGHV1/OR15-1 ENST00000604066|IGHV1/OR15-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACATCTTCACCGACTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGAGCTTGGGTGGATGGGACGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCAGAGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACACGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCACGTATTACTGTGCGAGAGA +>84|IGHV1/OR21-1 ENST00000622028|IGHV1/OR21-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGAATTGGAGGATCCTGTTTTTGGTGGTCATAGCTGCGGGTGCCCAGTCCCAGGTACAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCATCACCAGCTACTGTATGCACTGGGTGCACCAGGTCCATGCACAAGGGCTTGAGTGGATGGGATTGGTGTGCCCTAGTGATGGCAGCACAAGCTATGCACAGAAGTTCCAGGCCAGAGTCACCATAACCAGGGACACATCCATGAGCACAGCCTACATGGAGCTAAGCAGTCTGAGATCTGAGGACACGGCCATGTATTACTGTGTGAGAGA +>85|IGHV2-26 ENST00000632457|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>86|IGHV2-26 ENST00000632457|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATAC +>87|IGHV2-5 ENST00000560724|IGHV2-5|5'UTR|IG|IGH|None|00 +AGTGACTCCTGTGCCCCACC +>88|IGHV2-5 ENST00000560724|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTCCACGCTCCTGCTGCTGACCATCCCTTCATGGGTCTTGTCCCAGATCACCTTGAAGGAGTCTGGTCCTACGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAGTGGGTGTGGGCTGGATCCGTCAGCCCCCAGGAAAGGCCCTGGAGTGGCTTGCACTCATTTATTGGGATGATGATAAGCGCTACAGCCCATCTCTGAAGAGCAGGCTCACCATCACCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACACAGAC +>89|IGHV2-70 ENST00000617374|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAGGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGTGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACTCATTGATTGGGATGATGATAAATACTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>90|IGHV2-70 ENST00000632173|IGHV2-70|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCCCCACC +>91|IGHV2-70 ENST00000632173|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATGCTTTGTTCCATGCTCCTGCTACTGACTGTCCCGTCTTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTACTGGAATGCGTGTGAGCTGGATCCGTCGGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATACTGCAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>92|IGHV2-70D ENST00000632005|IGHV2-70D|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCTCCACC +>93|IGHV2-70D ENST00000632005|IGHV2-70D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGCGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATTCTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>94|IGHV2/OR16-5 ENST00000567458|IGHV2/OR16-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACGTTTTGCTCCACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACTCTCTCTGGGTTCTCACTCAGCACTTCTGGAATGGGTATGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCTCACATTTTTTTGAATGACAAAAAATCCTACAGCACGTCTCTGAAGAACAGGCTCATCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCATGGAGAG +>95|IGHV3-11 ENST00000634015|IGHV3-11|5'UTR|IG|IGH|None|00 +CTCCCTCTGCTGATAAAAACCAGCCGAGCCCAGACCCTGCAGCTCTGGGAGAAGAGCCCCAGCCCCAGAATTCCCAGGAGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>96|IGHV3-11 ENST00000634015|IGHV3-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTATAAAAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCAAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTAGTAGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>97|IGHV3-13 ENST00000631975|IGHV3-13|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTGTATTCAGTGATCAGGACTGAACACACAGGACTCACC +>98|IGHV3-13 ENST00000631975|IGHV3-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATATTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACGACATGCACTGGGTCCGCCAAGCTACAGGAAAAGGTCTGGAGTGGGTCTCAGCTATTGGTACTGCTGGTGACCCATACTATCCAGGCTCCGTGAAGGGCCGATTCACCATCTCCAGAGAAAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGGGGACACGGCTGTGTATTACTGTGCAAGAGA +>99|IGHV3-15 ENST00000632959|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>100|IGHV3-15 ENST00000632959|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACAGA +>101|IGHV3-16 ENST00000631755|IGHV3-16|5'UTR|IG|IGH|None|00 +AGCCCTGGGAGAGAAGCCCCAGCCCTGGGATTCTCAGGTGTTTCTATTGGGTCAACAGCAATAAACAAATTACC +>102|IGHV3-16 ENST00000631755|IGHV3-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGCCCGCAAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGTGGACTCCGTGAAGCGCCGATTCATCATCTCCAGAGACAATTCCAGGAACTCCCTGTATCTGCAAAAGAACAGACGGAGAGCCGAGGACATGGCTGTGTATTACTGTGTGAGA +>103|IGHV3-20 ENST00000632076|IGHV3-20|5'UTR|IG|IGH|None|00 +CCAGCCCTGAGATTCCCACGTGTTTCCATTCAGTGATCAGCACTGAACACAGAGGACTCGCC +>104|IGHV3-20 ENST00000632076|IGHV3-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGTGTGGTACGGCCTGGGGGGTCCCTGAGACTCTCCTTTGCAGCCTCTGGATTCACCTTTGATGATTATGGCATGAGCTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGAGTGGGTCTCTGGTATTAATTGGAATGGTGGTAGCACAGGTTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCCTTGTATCACTGTGCGAGAGA +>105|IGHV3-21 ENST00000632980|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>106|IGHV3-21 ENST00000632980|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>107|IGHV3-23 ENST00000632630|IGHV3-23|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCCAGCCCTGGGATTTTCAGGTGTTTTCATTTGGTGATCAGGACTGAACAGAGAGAACTCACC +>108|IGHV3-23 ENST00000632630|IGHV3-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGCTTTTTCTTGTGGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGCAGCTATGCCATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGCTATTAGTGGTAGTGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGGTTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTATATTACTGTGCGAAAGA +>109|IGHV3-30 ENST00000633400|IGHV3-30|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>110|IGHV3-30 ENST00000633400|IGHV3-30|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAAA +>111|IGHV3-33 ENST00000390615|IGHV3-33|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>112|IGHV3-33 ENST00000390615|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCGTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATGGTATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>113|IGHV3-33 ENST00000631807|IGHV3-33|5'UTR|IG|IGH|None|00 +CGAGCCCAGCACTGGAAGTCGCCGGTGTTTCCATTCGGTGATCATCACTGAACACAGAGGACTCACC +>114|IGHV3-33 ENST00000631807|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGCAATAAATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>115|IGHV3-35 ENST00000632225|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>116|IGHV3-35 ENST00000632225|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGAAA +>117|IGHV3-38 ENST00000631785|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>118|IGHV3-38 ENST00000631785|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATATA +>119|IGHV3-43 ENST00000633040|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>120|IGHV3-43 ENST00000633040|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGATA +>121|IGHV3-48 ENST00000632296|IGHV3-48|5'UTR|IG|IGH|None|00 +AGCTCTCAGAGAGGTGCCTTAGCCCTGGATTCCAAGGCATTTCCACTTGGTGATCAGCACTGAACACAGAGGACTCACC +>122|IGHV3-48 ENST00000632296|IGHV3-48|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGTGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGTTATGAAATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTGGTAGTACCATATACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTTTATTACTGTGCGAGAGA +>123|IGHV3-49 ENST00000632211|IGHV3-49|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCGTGAGATTCCCAGGAGTTTCCACTTGGTGATCAGCACTGAACACAGACCACCAACC +>124|IGHV3-49 ENST00000632211|IGHV3-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTTAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAATGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCAGGGCGGTCCCTGAGACTCTCCTGTACAGCTTCTGGATTCACCTTTGGTGATTATGCTATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTAGGTTTCATTAGAAGCAAAGCTTATGGTGGGACAACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGCATCGCCTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACTAGAGA +>125|IGHV3-53 ENST00000633426|IGHV3-53|5'UTR|IG|IGH|None|00 +AATACCAATCTCCCCCAGGACACTTCATCTGCACGGAGCCCGGCCTCTCCTCAGATGTCCCACCCCAGAGCTTGCTATATAGTCGGGGACATGCAAATAGGGCCCTCCCTCTGCTGATGAAAACCAGCCCAGCTGACCCTGCAGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>126|IGHV3-53 ENST00000633426|IGHV3-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTTGGCTGAGCTGGGTTTTCCTTGTTGCTATTTCAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGACTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>127|IGHV3-64 ENST00000631710|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>128|IGHV3-64 ENST00000631710|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGAGA +>129|IGHV3-64D ENST00000632099|IGHV3-64D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTCTGGCTGAGCTGGGTTCTCCTTGTTGCCATTTTAAAAGATGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTTCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATACTACGCAGACTCCGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAGCAGTCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGAAAGA +>130|IGHV3-66 ENST00000632846|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>131|IGHV3-66 ENST00000632846|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>132|IGHV3-7 ENST00000633988|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>133|IGHV3-7 ENST00000633988|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>134|IGHV3-72 ENST00000633602|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>135|IGHV3-72 ENST00000633602|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGAGA +>136|IGHV3-73 ENST00000631708|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>137|IGHV3-73 ENST00000631708|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGACA +>138|IGHV3-74 ENST00000633987|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>139|IGHV3-74 ENST00000633987|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>140|IGHV3/OR15-7 ENST00000558565|IGHV3/OR15-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGTTCTCTGAGACTCTCATGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGAGCTGGGTCCGCCAGGCTCAAGGGAAAGGGCTAGAGTTGGTAGGTTTAATAAGAAACAAAGCTAACAGTTACACGACAGAATATGCTGCGTCTGTGAAAGGCAGACTTACCATCTCAAGAGAGGATTCAAAGAACACGCTGTATCTGCAAATGAGCAACCTGAAAACCGAGGACTTGGCCGTGTATTACTGTGCTAGAGA +>141|IGHV3/OR16-10 ENST00000425181|IGHV3/OR16-10|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGCTATATTAAAAGGTGTCCAGTGTGAGGTTCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACATCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGGCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTTCGCCAGGCTCCAGGAAAAGGTCTGGAGTGGGTATCAGCTATTGGTACTGGTGGTGGCACATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACATGGCTGTGTATTACTGTGCAAGAGA +>142|IGHV3/OR16-12 ENST00000570121|IGHV3/OR16-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGAGCTCAGCTGGGTTTTCCTTGTTGCTATTTTACAAGGTGTCCACTGTGAGGTGCAGCTGGTAGAGTCTGGGAGAGGCTTGGCCCAGCCTGGGGGGTACCTAAAACTCTCCGGTGCAGCCTCTGGATTCACCGTCGGTAGCTGGTACATGAGCTGGATCCACCAGGCTCCAGGGAAGGGTCTGGAGTGGGTCTCATACATTAGTAGTAGTGGTTGTAGCACAAACTACGCAGACTCTGTGAAGGGCAGATTCACCATCTCCACAGACAACTCAAAGAACACGCTCTACCTGCAAATGAACAGCCTGAGAGTGGAGGACACGGCCGTGTATTACTGTGCAAGAGA +>143|IGHV3/OR16-13 ENST00000562905|IGHV3/OR16-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCAGACTCCATGAAGGGCCAATTCACCATCTCCAGAGACAATGCTAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACATGGCTGTGTATTACTGTACTAGAGA +>144|IGHV3/OR16-8 ENST00000565407|IGHV3/OR16-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAACTGGGTTTTCCTTGTTGCTATTATAAAAGGTGCCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTGTCCTGTCCAGCCTCTGGATTCACCTTCAGTAACCACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACATTAGTGGTGATAGTGGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGGGACAACGCCAATAACTCACCGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGA +>145|IGHV4-28 ENST00000632719|IGHV4-28|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCTGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>146|IGHV4-28 ENST00000632719|IGHV4-28|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTACAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGACACCCTGTCCCTCACCTGCGCTGTCTCTGGTTACTCCATCAGCAGTAGTAACTGGTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTACATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATGTCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGTGGACACGGCCGTGTATTACTGTGCGAGAAA +>147|IGHV4-31 ENST00000438142|IGHV4-31|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>148|IGHV4-31 ENST00000438142|IGHV4-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>149|IGHV4-34 ENST00000612474|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>150|IGHV4-34 ENST00000612474|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGAGG +>151|IGHV4-39 ENST00000633618|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>152|IGHV4-39 ENST00000633618|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGACA +>153|IGHV4-4 ENST00000631379|IGHV4-4|5'UTR|IG|IGH|None|00 +AAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCATGGACCTCCTGCACAAGAAC +>154|IGHV4-4 ENST00000631379|IGHV4-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCTCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGGGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGTTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>155|IGHV4-59 ENST00000619078|IGHV4-59|5'UTR|IG|IGH|None|00 +TTTTCACCTCTCCATACAAAGGCACCACCCACATGCAAATCCTCACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>156|IGHV4-59 ENST00000619078|IGHV4-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACATCTGTGGTTCTTCCTTCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>157|IGHV4-61 ENST00000632960|IGHV4-61|5'UTR|IG|IGH|None|00 +ACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>158|IGHV4-61 ENST00000632960|IGHV4-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCGTCAGCAGTGGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>159|IGHV4/OR15-8 ENST00000557788|IGHV4/OR15-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTTCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGTTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGCTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCCCCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACAGGGCCGTGTATTACTGTGCGAGAGA +>160|IGHV5-10-1 ENST00000632950|IGHV5-10-1|5'UTR|IG|IGH|None|00 +AGTCTCCTTCACCACCCAGCTGGGATCTCAGGGCTTCCTTTTCTGTCCTCCTCCAGG +>161|IGHV5-10-1 ENST00000632950|IGHV5-10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAAGTGCAGCTGGTGCAGTCCGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAGGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCAGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGAGGATTGATCCTAGTGACTCTTATACCAACTACAGCCCGTCCTTCCAAGGCCACGTCACCATCTCAGCTGACAAGTCCATCAGCACTGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>162|IGHV5-51 ENST00000620764|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>163|IGHV5-51 ENST00000620764|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>164|IGHV6-1 ENST00000633299|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>165|IGHV6-1 ENST00000633299|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>166|IGHV7-4-1 ENST00000631943|IGHV7-4-1|5'UTR|IG|IGH|None|00 +ACAACCACACCCCTCCTAAGAAGAAGCCCCTAGACCACAGCTCCACACC +>167|IGHV7-4-1 ENST00000631943|IGHV7-4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAATCTGGGTCTGAGTTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGAATTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACACCAACACTGGGAACCCAACGTATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCTTGGACACCTCTGTCAGCACGGCATATCTGCAGATCTGCAGCCTAAAGGCTGAGGACACTGCCGTGTATTACTGTGCGAGAGA +>168|IGHV7-81 ENST00000390639|IGHV7-81|5'UTR|IG|IGH|None|00 +ACCCAACAACAACATCCCTCCTTGGGAGAATCCCCTAGAGCACAGCTCCTCACC +>169|IGHV7-81 ENST00000390639|IGHV7-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTCTTCTTGGTGGCAGCAGCAACAGGTACCTACTCCCAGGTGCAGCTGGTGCAGTCTGGCCATGAGGTGAAGCAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACAGTTTCACCACCTATGGTATGAATTGGGTGCCACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGTTCAACACCTACACTGGGAACCCAACATATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCATGGACACCTCTGCCAGCACAGCATACCTGCAGATCAGCAGCCTAAAGGCTGAGGACATGGCCATGTATTACTGTGCGAGA +>170|IGKC ENST00000390237|IGKC|C-REGION|IG|IGK|None|00 +GAACTGTGGCTGCACCATCTGTCTTCATCTTCCCGCCATCTGATGAGCAGTTGAAATCTGGAACTGCCTCTGTTGTGTGCCTGCTGAATAACTTCTATCCCAGAGAGGCCAAAGTACAGTGGAAGGTGGATAACGCCCTCCAATCGGGTAACTCCCAGGAGAGTGTCACAGAGCAGGACAGCAAGGACAGCACCTACAGCCTCAGCAGCACCCTGACGCTGAGCAAAGCAGACTACGAGAAACACAAAGTCTACGCCTGCGAAGTCACCCATCAGGGCCTGAGCTCGCCCGTCACAAAGAGCTTCAACAGGGGAGAGTGT +>171|IGKJ1 ENST00000390242|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGCCAAGGGACCAAGGTGGAAATCAAAC +>172|IGKJ2 ENST00000390241|IGKJ2|J-REGION|IG|IGK|None|00 +TGTGCAGTTTTGGCCAGGGGACCAAGCTGGAGATCAAAC +>173|IGKJ3 ENST00000390240|IGKJ3|J-REGION|IG|IGK|None|00 +ATTCACTTTCGGCCCTGGGACCAAAGTGGATATCAAAC +>174|IGKJ4 ENST00000390239|IGKJ4|J-REGION|IG|IGK|None|00 +CTCACTTTCGGCGGAGGGACCAAGGTGGAGATCAAAC +>175|IGKJ5 ENST00000390238|IGKJ5|J-REGION|IG|IGK|None|00 +GATCACCTTCGGCCAAGGGACACGACTGGAGATTAAAC +>176|IGKV1-12 ENST00000632502|IGKV1-12|5'UTR|IG|IGK|None|00 +AGGCTGATCACACCCTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>177|IGKV1-12 ENST00000632502|IGKV1-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>178|IGKV1-16 ENST00000632011|IGKV1-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>179|IGKV1-16 ENST00000632011|IGKV1-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGAGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAAGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>180|IGKV1-17 ENST00000632229|IGKV1-17|5'UTR|IG|IGK|None|00 +AGGAATCAGTCCCACTCAGGACACAGC +>181|IGKV1-17 ENST00000632229|IGKV1-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGGTGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCGCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>182|IGKV1-27 ENST00000631531|IGKV1-27|5'UTR|IG|IGK|None|00 +GTGCAGAAGTCTCTCTCAGTCAGGACACAGC +>183|IGKV1-27 ENST00000631531|IGKV1-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGACTCCTGCTGCTCTGGCTCCCAGATACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTATCAGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAATCAGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCAAAAGTATAACAGTGCCCCT +>184|IGKV1-33 ENST00000632835|IGKV1-33|5'UTR|IG|IGK|None|00 +GTGCAGGAGTCAGTCCCAACCAGGACACAGC +>185|IGKV1-33 ENST00000632835|IGKV1-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>186|IGKV1-37 ENST00000632103|IGKV1-37|5'UTR|IG|IGK|None|00 +AGGCTGGTCACACCCCGTGCAGCAGTCAGTCCCAGTCAGGACACAGC +>187|IGKV1-37 ENST00000632103|IGKV1-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCT +>188|IGKV1-39 ENST00000631411|IGKV1-39|5'UTR|IG|IGK|None|00 +GGGCTGGTCGCACCCTGTGCAGGAGTCAGTCTCAGTCAGGACACAGC +>189|IGKV1-39 ENST00000631411|IGKV1-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCT +>190|IGKV1-5 ENST00000632205|IGKV1-5|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCCCTGAAGCCTTATTAATAGGCTGGTCACACTTTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>191|IGKV1-5 ENST00000632205|IGKV1-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAAATGTGACATCCAGATGACCCAGTCTCCTTCCACCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGAGTATTAGTAGCTGGTTGGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATAAGGCGTCTAGTTTAGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACCATCAGCAGCCTGCAGCCTGATGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTATTCT +>192|IGKV1-6 ENST00000632891|IGKV1-6|5'UTR|IG|IGK|None|00 +GCAGGAGTCAGACCCACTCAGGACACAGC +>193|IGKV1-6 ENST00000632891|IGKV1-6|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTTGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTACAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGCACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAAGATTACAATTACCCT +>194|IGKV1-8 ENST00000631614|IGKV1-8|5'UTR|IG|IGK|None|00 +AGGCTGGACACACTTCATGCAGGAGTCAGACCCTGTCAGGACACAGCATAGAC +>195|IGKV1-8 ENST00000631614|IGKV1-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATCCTCATTCTCTGCATCTACAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTACCCT +>196|IGKV1-9 ENST00000633273|IGKV1-9|5'UTR|IG|IGK|None|00 +AGACTTCTTAATAGGCTGGTCACACCTGTGCAGGAGTCAGTCCCAGTCAGGACACAGC +>197|IGKV1-9 ENST00000633273|IGKV1-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTTCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGCTTAATAGTTACCCT +>198|IGKV1/OR2-108 ENST00000453673|IGKV1/OR2-108|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCGAGGTGCCAGATGTGACATCCAGGTGACCCAGTCTCCATCTTCCCTGTCTGCGTCTGTAGGAGACAGAGTCACCATCACCTGCCGGGCAAGTCAGGGCATTAGCAATGGGTTATCCTGGTATCAGCAGAAACCAGGGCAAGCCCCTACGCTCCTGATCTATGCTGCATCCAGTTTGCAGTCGGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCTACAGGATTATACTACCCCATT +>199|IGKV1D-12 ENST00000377032|IGKV1D-12|5'UTR|IG|IGK|None|00 +AGACCCACTCAGGACACAGC +>200|IGKV1D-12 ENST00000377032|IGKV1D-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>201|IGKV1D-13 ENST00000611391|IGKV1D-13|5'UTR|IG|IGK|None|00 +GAGTCAGACCCACTCAGGACACAGC +>202|IGKV1D-13 ENST00000611391|IGKV1D-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTTCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGCAGTGCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGATGCCTCCAGTTTGGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTTTAATAGTTACCCT +>203|IGKV1D-16 ENST00000492446|IGKV1D-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>204|IGKV1D-16 ENST00000492446|IGKV1D-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGAGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>205|IGKV1D-17 ENST00000483379|IGKV1D-17|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGCTGCTGAGTTACTGAGATGAGCCAGCCCTGCAGCTGCGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCATAGCCTCCTGCCCTGAAGCCTTATTAATAGGCTGGACACACTTCATGGAGGAATCAGTCCCACTCAGGACACAGC +>206|IGKV1D-17 ENST00000483379|IGKV1D-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTAACATCCAGATGACCCAGTCTCCATCTGCCATGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGGCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGTCCCTAAGCACCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>207|IGKV1D-42 ENST00000390278|IGKV1D-42|5'UTR|IG|IGK|None|00 +AGTCCCAGTCAGGACACAGC +>208|IGKV1D-42 ENST00000390278|IGKV1D-42|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGTCAGATTTGACATCCAGATGACCCAGTCTCCATCTTTCCTGTCTGCATCTGTAGGAGACAGAGTCAGTATCATTTGCTGGGCAAGTGAGGGCATTAGCAGTAATTTAGCCTGGTATCTGCAGAAACCAGGGAAATCCCCTAAGCTCTTCCTCTATGATGCAAAAGATTTGCACCCTGGGGTCTCATCGAGGTTCAGTGGCAGGGGATCTGGGACGGATTTCACTCTCACCATCATCAGCCTGAAGCCTGAAGATTTTGCAGCTTATTACTGTAAACAGGACTTCAGTTACCCTCC +>209|IGKV1D-43 ENST00000468879|IGKV1D-43|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAACCAGCCCTGCAGCTGTGCCCAGCCTGCCTTGCCCCCTGCTAATTTGCATGTTCCCAGAGCACATCCTCCTACCCTGAAGACTTATTAATGCGCTGGTCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>210|IGKV1D-43 ENST00000468879|IGKV1D-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTGCCCGCTCAGCGCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATTCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCTGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGCAAAAGCCCCTAAGCTCTTCATCTATTATGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTACCCCT +>211|IGKV1D-8 ENST00000471857|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>212|IGKV1D-8 ENST00000471857|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>213|IGKV1D-8 ENST00000628219|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>214|IGKV1D-8 ENST00000628219|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGTCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGTTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>215|IGKV2-24 ENST00000633851|IGKV2-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>216|IGKV2-24 ENST00000633851|IGKV2-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCACCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGATTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCATGCAAGCTACACAATTTCCT +>217|IGKV2-28 ENST00000633682|IGKV2-28|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>218|IGKV2-28 ENST00000633682|IGKV2-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>219|IGKV2-30 ENST00000632910|IGKV2-30|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>220|IGKV2-30 ENST00000632910|IGKV2-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACCGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>221|IGKV2D-24 ENST00000462693|IGKV2D-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>222|IGKV2D-24 ENST00000462693|IGKV2D-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCGCCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTTCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGGTTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCACGCAAGCTACACAATTTCCT +>223|IGKV2D-26 ENST00000390268|IGKV2D-26|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACT +>224|IGKV2D-26 ENST00000390268|IGKV2D-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCTTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGCAGAGATTGTGATGACCCAGACTCCACTCTCCTTGTCTATCACCCCTGGAGAGCAGGCCTCCATGTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTGATGGATACACCTATTTGTATTGGTTTCTGCAGAAAGCCAGGCCAGTCTCCACGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATTTTGGAGTTTATTACTGCATGCAAGATGCACAAGATCCT +>225|IGKV2D-29 ENST00000491977|IGKV2D-29|5'UTR|IG|IGK|None|00 +GATCAGGACTTCTCAGTTCATCTTCTCACC +>226|IGKV2D-29 ENST00000491977|IGKV2D-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGATACCTGGATCCAGTGCAGATATTGTGATGACCCAGACTCCACTCTCTCTGTCCGTCACCCCTGGACAGCCGGCCTCCATCTCCTGCAAGTCTAGTCAGAGCCTCCTGCATAGTGATGGAAAGACCTATTTGTATTGGTACCTGCAGAAGCCAGGCCAGCCTCCACAGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAAGTATACAGCTTCCT +>227|IGKV2D-30 ENST00000474213|IGKV2D-30|5'UTR|IG|IGK|None|00 +TGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>228|IGKV2D-30 ENST00000474213|IGKV2D-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACTGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>229|IGKV3-11 ENST00000632088|IGKV3-11|5'UTR|IG|IGK|None|00 +GTCAGAGCCCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>230|IGKV3-11 ENST00000632088|IGKV3-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAACAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCCT +>231|IGKV3-15 ENST00000632887|IGKV3-15|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>232|IGKV3-15 ENST00000632887|IGKV3-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGTATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCAGCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCT +>233|IGKV3-20 ENST00000632822|IGKV3-20|5'UTR|IG|IGK|None|00 +CCTGGGTCAGAGCTCTGGAGAAGAGCTGCTCAGTTAGGACCCAGAGGGAACC +>234|IGKV3-20 ENST00000632822|IGKV3-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGGCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>235|IGKV3-7 ENST00000633250|IGKV3-7|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCCCTGGGAAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>236|IGKV3-7 ENST00000633250|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCAGAGAAATTGTAATGACACAGTCTCCACCCACCCTGTCTTTGTCTCCAGGGGAAAGAGTCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAACCTGGTATCAGCAGAAACCTGGCCAGGCGCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTAGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCT +>237|IGKV3/OR2-268 ENST00000421835|IGKV3/OR2-268|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCACAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>238|IGKV3D-11 ENST00000390277|IGKV3D-11|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>239|IGKV3D-11 ENST00000390277|IGKV3D-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGCCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCATCC +>240|IGKV3D-15 ENST00000417279|IGKV3D-15|5'UTR|IG|IGK|None|00 +GGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>241|IGKV3D-15 ENST00000417279|IGKV3D-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCATCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCATCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCTCC +>242|IGKV3D-20 ENST00000390270|IGKV3D-20|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCCGCCCTGCAGTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>243|IGKV3D-20 ENST00000390270|IGKV3D-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCGGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCTGGCGCCCAGGCTCCTCATCTATGATGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>244|IGKV3D-7 ENST00000627132|IGKV3D-7|5'UTR|IG|IGK|None|00 +GAGGAACTGCTCAGTTAGGACCCAG +>245|IGKV3D-7 ENST00000627132|IGKV3D-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAACCATGGAAGCCCCAGCACAGCTTCTTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>246|IGKV4-1 ENST00000390243|IGKV4-1|5'UTR|IG|IGK|None|00 +TTTGGCTCTTGATTTACATTGGGTACTTTCACAACCCACTGCTCATGAAATTTGCTTTTGTACTCACTGGTTGTTTTTGCATAGGCCCCTCCAGGCCACGACCAGCTGTTTGGATTTTATAAACGGGCCGTTTGCATTGTGAACTGAGCTACAACAGGCAGGCAGGGGCAGCAAG +>247|IGKV4-1 ENST00000390243|IGKV4-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTTGCAGACCCAGGTCTTCATTTCTCTGTTGCTCTGGATCTCTGGTGCCTACGGGGACATCGTGATGACCCAGTCTCCAGACTCCCTGGCTGTGTCTCTGGGCGAGAGGGCCACCATCAACTGCAAGTCCAGCCAGAGTGTTTTATACAGCTCCAACAATAAGAACTACTTAGCTTGGTACCAGCAGAAACCAGGACAGCCTCCTAAGCTGCTCATTTACTGGGCATCTACCCGGGAATCCGGGGTCCCTGACCGATTCAGTGGCAGCGGGTCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGGCTGAAGATGTGGCAGTTTATTACTGTCAGCAATATTATAGTACTCCT +>248|IGKV5-2 ENST00000632585|IGKV5-2|5'UTR|IG|IGK|None|00 +ATAAAATCTGTGCTGTCAAACTGATTAGGAACTGACTACCACCTGCAGGTCAGGGCCAAGGTT +>249|IGKV5-2 ENST00000632585|IGKV5-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGGTCCCAGGTTCACCTCCTCAGCTTCCTCCTCCTTTGGATCTCTGATACCAGGGCAGAAACGACACTCACGCAGTCTCCAGCATTCATGTCAGCGACTCCAGGAGACAAAGTCAACATCTCCTGCAAAGCCAGCCAAGACATTGATGATGATATGAACTGGTACCAACAGAAACCAGGAGAAGCTGCTATTTTCATTATTCAAGAAGCTACTACTCTCGTTCCTGGAATCCCACCTCGATTCAGTGGCAGCGGGTATGGAACAGATTTTACCCTCACAATTAATAACATAGAATCTGAGGATGCTGCATATTACTTCTGTCTACAACATGATAATTTCCCT +>250|IGKV6-21 ENST00000631699|IGKV6-21|5'UTR|IG|IGK|None|00 +ATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>251|IGKV6-21 ENST00000631699|IGKV6-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTTGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCTTCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAACGTATTACTGTCATCAGAGTAGTAGTTTACCT +>252|IGKV6D-21 ENST00000436451|IGKV6D-21|5'UTR|IG|IGK|None|00 +GGTATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>253|IGKV6D-21 ENST00000436451|IGKV6D-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTCGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAGCGTATTACTGTCATCAGAGTAGTAGTTTACCT +>254|IGKV6D-41 ENST00000390271|IGKV6D-41|5'UTR|IG|IGK|None|00 +AGCAAAACTGAAGTCAAAACACTGAG +>255|IGKV6D-41 ENST00000390271|IGKV6D-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCCCGTTGCAATTCCTGCGGCTTCTGCTCCTCTGGGTTCCAGCCTCCAGGGGTGATGTTGTGATGACACAGTCTCCAGCTTTCCTCTCTGTGACTCCAGGGGAGAAAGTCACCATCACCTGCCAGGCCAGTGAAGGCATTGGCAACTACTTATACTGGTACCAGCAGAAACCAGATCAAGCCCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCTTTACCATCAGTAGCCTGGAAGCTGAAGATGCTGCAACATATTACTGTCAGCAGGGCAATAAGCACCCT +>256|IGLC1 ENST00000390321|IGLC1|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCCAACCCCACTGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTCCAAGCCAACAAGGCCACACTAGTGTGTCTGATCAGTGACTTCTACCCGGGAGCTGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCAAACCCTCCAAACAGAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>257|IGLC2 ENST00000390323|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTATCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>258|IGLC3 ENST00000390325|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAAAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>259|IGLC7 ENST00000390331|IGLC7|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCGTAAGTGACTTCAACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGTGGGAGTGGAGACCACCAAACCCTCCAAACAAAGCAACAACAAGTATGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCGGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTGCAGAATGCTCT +>260|IGLJ1 ENST00000390320|IGLJ1|J-REGION|IG|IGL|None|00 +TTATGTCTTCGGAACTGGGACCAAGGTCACCGTCCTAG +>261|IGLJ2 ENST00000390322|IGLJ2|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTCATGAGCAG +>262|IGLJ2 ENST00000390322|IGLJ2|J-REGION|IG|IGL|None|00 +TGTGGTATTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>263|IGLJ3 ENST00000390324|IGLJ3|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTC +>264|IGLJ3 ENST00000390324|IGLJ3|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>265|IGLJ4 ENST00000390326|IGLJ4|J-REGION|IG|IGL|None|00 +GTATTTGGTGGAGGAACCCAGCTGATCATTTTA +>266|IGLJ5 ENST00000390327|IGLJ5|J-REGION|IG|IGL|None|00 +CAGAGAGGGTTTTTGTATGAGCCTGTGTCACAGCACTGGGTGTTTGGTGAGGGGACCGAGCTGACCGTCCTA +>267|IGLJ6 ENST00000390328|IGLJ6|J-REGION|IG|IGL|None|00 +GGAGGGTTTGTGTGCAGGGTTATATCACAGTGTAATGTGTTCGGCAGTGGCACCAAGGTGACCGTCCTCG +>268|IGLJ7 ENST00000390330|IGLJ7|J-REGION|IG|IGL|None|00 +TCACTGTGTGCTGTGTTCGGAGGAGGCACCCAGCTGACCGTCCTCG +>269|IGLV1-36 ENST00000618026|IGLV1-36|5'UTR|IG|IGL|None|00 +GCTGCGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>270|IGLV1-36 ENST00000618026|IGLV1-36|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCCCCTCTCTTCCTCACCCTCATCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCGGTGTCTGAAGCCCCCAGGCAGAGGGTCACCATCTCCTGTTCTGGAAGCAGCTCCAACATCGGAAATAATGCTGTAAACTGGTACCAGCAGCTCCCAGGAAAGGCTCCCAAACTCCTCATCTATTATGATGATCTGCTGCCCTCAGGGGTCTCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>271|IGLV1-40 ENST00000610349|IGLV1-40|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAAGAGGCAGCACTCAGGACAATCTCCAGC +>272|IGLV1-40 ENST00000610349|IGLV1-40|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTCCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATCGGGGCAGGTTATGATGTACACTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCCAGTCCTATGACAGCAGCCTGAGTGGTTC +>273|IGLV1-44 ENST00000390297|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>274|IGLV1-44 ENST00000390297|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>275|IGLV1-47 ENST00000390294|IGLV1-47|5'UTR|IG|IGL|None|00 +GGGGAAGCTCAGCTTCAGCTGTGGTAGAGAAGACAGGATTCAGGACAATCTCCAGC +>276|IGLV1-47 ENST00000390294|IGLV1-47|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCGGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATTATGTATACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCGGTCCGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAGTGGT +>277|IGLV1-50 ENST00000390291|IGLV1-50|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAGGAGGCAGCACTCAGGACAATCTCCAGC +>278|IGLV1-50 ENST00000390291|IGLV1-50|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTTCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATTGGGGCGGGTTATGTTGTACATTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCAATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGACTCCAGTCTGAGGATGAGGCTGATTATTACTGCAAAGCATGGGATAACAGCCTGAATGCT +>279|IGLV1-51 ENST00000390290|IGLV1-51|5'UTR|IG|IGL|None|00 +TGAGCGCAGAAGGCAGGACTCGGGACAATCTTCATC +>280|IGLV1-51 ENST00000390290|IGLV1-51|L-REGION+V-REGION|IG|IGL|None|00 +ATGACCTGCTCCCCTCTCCTCCTCACCCTTCTCATTCACTGCACAGGGTCCTGGGCCCAGTCTGTGTTGACGCAGCCGCCCTCAGTGTCTGCGGCCCCAGGACAGAAGGTCACCATCTCCTGCTCTGGAAGCAGCTCCAACATTGGGAATAATTATGTATCCTGGTACCAGCAGCTCCCAGGAACAGCCCCCAAACTCCTCATTTATGACAATAATAAGCGACCCTCAGGGATTCCTGACCGATTCTCTGGCTCCAAGTCTGGCACGTCAGCCACCCTGGGCATCACCGGACTCCAGACTGGGGACGAGGCCGATTATTACTGCGGAACATGGGATAGCAGCCTGAGTGCTGG +>281|IGLV10-54 ENST00000390287|IGLV10-54|5'UTR|IG|IGL|None|00 +GGGAATCTGCACC +>282|IGLV10-54 ENST00000390287|IGLV10-54|L-REGION+V-REGION|IG|IGL|None|00 +ATGCCCTGGGCTCTGCTCCTCCTGACCCTCCTCACTCACTCTGCAGTGTCAGTGGTCCAGGCAGGGCTGACTCAGCCACCCTCGGTGTCCAAGGGCTTGAGACAGACCGCCACACTCACCTGCACTGGGAACAGCAACATTGTTGGCAACCAAGGAGCAGCTTGGCTGCAGCAGCACCAGGGCCACCCTCCCAAACTCCTATCCTACAGGAATAACAACCGGCCCTCAGGGATCTCAGAGAGATTCTCTGCATCCAGGTCAGGAAACACAGCCTCCCTGACCATTACTGGACTCCAGCCTGAGGACGAGGCTGACTATTACTGCTCAGCATTGGACAGCAGCCTCAGTGCTC +>283|IGLV11-55 ENST00000390286|IGLV11-55|5'UTR|IG|IGL|None|00 +GCTGTGTCCACT +>284|IGLV11-55 ENST00000390286|IGLV11-55|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCCTGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCGGCCCGTGCTGACTCAGCCGCCCTCCCTGTCTGCATCCCCGGGAGCAACAGCCAGACTCCCCTGCACCCTGAGCAGTGACCTCAGTGTTGGTGGTAAAAACATGTTCTGGTACCAGCAGAAGCTAGGGAGCTCTCCCAGGTTATTCCTGTATCACTACTCAGACTCAGACAAGCAGCTGGGACCTGGGGTCCCCAGTCGAGTCTCTGGCTCCAAGGAGACCTCAAGTAACACAGCGTTTTTGCTCATCTCTGGGCTCCAGCCTGAGGACGAGGCCGATTATTACTGCCAGGTGTACGAAAGTAGTGCTAAT +>285|IGLV2-11 ENST00000390314|IGLV2-11|5'UTR|IG|IGL|None|00 +TGCTGGGGTCTCAGGAGGCAGCACTCTCGGGACGTCTCCACC +>286|IGLV2-11 ENST00000390314|IGLV2-11|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCAGCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCGCTCAGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGATGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCTGCTCATATGCAGGCAGCTACACTTTCCACA +>287|IGLV2-14 ENST00000390312|IGLV2-14|5'UTR|IG|IGL|None|00 +GCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACATCTCCACC +>288|IGLV2-14 ENST00000390312|IGLV2-14|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTCATATACAAGCAGCAGCACTCTCCACAGTG +>289|IGLV2-18 ENST00000390310|IGLV2-18|5'UTR|IG|IGL|None|00 +GAATATCTCCACC +>290|IGLV2-18 ENST00000390310|IGLV2-18|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCCCTCCGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTAGTTATAACCGTGTCTCCTGGTACCAGCAGCCCCCAGGCACAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGGTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTTATATACAAGCAGCAGCACTTTC +>291|IGLV2-23 ENST00000390306|IGLV2-23|5'UTR|IG|IGL|None|00 +TCTCTGAGCCCAGGCCCACGTGAGGGTGGGGTGAGGAGAGGAGCCCAGGATGCTGATTTTCATGGAGGCCCCGCCCTCCTCTGAGGCAAAGGGGATAAGACAGGGCTGGGGCAGGGCCAGTGCTGGGGTCACAAGAGGCAGCGCTCTCGGGACGTCTCCACC +>292|IGLV2-23 ENST00000390306|IGLV2-23|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACTCTCCTCACTCAGGACACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGGAGTTATAACCTTGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGGCAGTAAGCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACAATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCTGCTCATATGCAG +>293|IGLV2-33 ENST00000629472|IGLV2-33|5'UTR|IG|IGL|None|00 +GGCTAGAGGCAGGCCCGGTGCTGGGGTCTCAAGGCAGCGCTCTCGGGACATCTCCACC +>294|IGLV2-33 ENST00000629472|IGLV2-33|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAATCTGCCCTGACTCAGCCTCCTTTTGTGTCCGGGGCTCCTGGACAGTCGGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGGGATTATGATCATGTCTTCTGGTACCAAAAGCGTCTCAGCACTACCTCCAGACTCCTGATTTACAATGTCAATACTCGGCCTTCAGGGATCTCTGACCTCTTCTCAGGCTCCAAGTCTGGCAACATGGCTTCCCTGACCATCTCTGGGCTCAAGTCCGAGGTTGAGGCTAATTATCACTGCAGCTTATATTCAAGTAGTTACACTTTC +>295|IGLV2-8 ENST00000620395|IGLV2-8|5'UTR|IG|IGL|None|00 +TCTCTAAGCCCAGGCCCAAGTGAGGGTGGGGTGAGAAGAGGAGCTCAGGATGCAGATTTGCATGGAGGTCCCGCCCTTCTCTGAGGCAGAGGGGATAAGACAGGGCTGGGGGCAGGCCCAGTGCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACGTCACCACC +>296|IGLV2-8 ENST00000620395|IGLV2-8|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTCCCTCCGCGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCGTCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCAGCTCATATGCAGGCAGCAACAATTTC +>297|IGLV3-1 ENST00000390319|IGLV3-1|5'UTR|IG|IGL|None|00 +AAGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGAGGTGCCTCAGCC +>298|IGLV3-1 ENST00000390319|IGLV3-1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGATCCCTCTCTTCCTCGGCGTCCTTGCTTACTGCACAGGATCCGTGGCCTCCTATGAGCTGACTCAGCCACCCTCAGTGTCCGTGTCCCCAGGACAGACAGCCAGCATCACCTGCTCTGGAGATAAATTGGGGGATAAATATGCTTGCTGGTATCAGCAGAAGCCAGGCCAGTCCCCTGTGCTGGTCATCTATCAAGATAGCAAGCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACAGCCACTCTGACCATCAGCGGGACCCAGGCTATGGATGAGGCTGACTATTACTGTCAGGCGTGGGACAGCAGCACTGCACACA +>299|IGLV3-10 ENST00000390315|IGLV3-10|5'UTR|IG|IGL|None|00 +GTGGGCTCAGGAGGCAGAGCTCTGGGAATCTCACC +>300|IGLV3-10 ENST00000390315|IGLV3-10|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTGCTCCCCCTCCTCACTTTCTGCACAGTCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAAACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGTCAGGCCAGGCCCCTGTGCTGGTCATCTATGAGGACAGCAAACGACCCTCCGGGATCCCTGAGAGATTCTCTGGCTCCAGCTCAGGGACAATGGCCACCTTGACTATCAGTGGGGCCCAGGTGGAGGATGAAGCTGACTACTACTGTTACTCAACAGACAGCAGTGGTAATCATAG +>301|IGLV3-12 ENST00000390313|IGLV3-12|5'UTR|IG|IGL|None|00 +GCCTCAGCC +>302|IGLV3-12 ENST00000390313|IGLV3-12|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTCCTCAGCCTCCTCGCTCACTGCACAGGCTCTGCGACCTCCTATGAGCTGACTCAGCCACACTCAGTGTCAGTGGCCACAGCACAGATGGCCAGGATCACCTGTGGGGGAAACAACATTGGAAGTAAAGCTGTGCACTGGTACCAGCAAAAGCCAGGCCAGGACCCTGTGCTGGTCATCTATAGCGATAGCAACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACCCAGGGAACACCGCCACCCTAACCATCAGCAGGATCGAGGCTGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGTAGTAGTGATCATCC +>303|IGLV3-16 ENST00000390311|IGLV3-16|5'UTR|IG|IGL|None|00 +TCTGTGGGTCCAGGAGGCACAGCTCTGGGAATCTCACC +>304|IGLV3-16 ENST00000390311|IGLV3-16|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCTAGGACAGATGGCCAGGATCACCTGCTCTGGAGAAGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGTTCCCTGTGCTGGTGATATATAAAGACAGCGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAATAGTCACATTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCTATCAGCAGACAGCAGTGGTACTTATCC +>305|IGLV3-19 ENST00000390309|IGLV3-19|5'UTR|IG|IGL|None|00 +AGCTGTGGGCTCAGAAGCAGAGTTCTGGGGTGTCTCCACC +>306|IGLV3-19 ENST00000390309|IGLV3-19|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCTGGCTCACTCTCCTCACTCTTTGCATAGGTTCTGTGGTTTCTTCTGAGCTGACTCAGGACCCTGCTGTGTCTGTGGCCTTGGGACAGACAGTCAGGATCACATGCCAAGGAGACAGCCTCAGAAGCTATTATGCAAGCTGGTACCAGCAGAAGCCAGGACAGGCCCCTGTACTTGTCATCTATGGTAAAAACAACCGGCCCTCAGGGATCCCAGACCGATTCTCTGGCTCCAGCTCAGGAAACACAGCTTCCTTGACCATCACTGGGGCTCAGGCGGAAGATGAGGCTGACTATTACTGTAACTCCCGGGACAGCAGTG +>307|IGLV3-21 ENST00000390308|IGLV3-21|5'UTR|IG|IGL|None|00 +GCACAGAGGAGCTGTGCCCTGGAATGGGGCCTGTACCTGTCCAAGGCTTGTGCCGTCCCCTGTGGGAGATGAGAAGCGTCCCTGCATTGGGCTCTTGGGGACCCGTCTTGGACATGAATCTCCTCCAGCAGCAGCCTCTGACTCTGCTGATTTGCATCATGGGCCGCTCTCTCCAGCAAGGGGATAAGAGAGGCCTGGGAGGAACCTGCTCAGTCTGGGCCTAAGGAAGCAGCACTGGTGGTGCCTCAGCC +>308|IGLV3-21 ENST00000390308|IGLV3-21|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGTTCTCCTCCTCGGCCTCCTCTCTCACTGCACAGGCTCTGTGACCTCCTATGTGCTGACTCAGCCACCCTCGGTGTCAGTGGCCCCAGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAGTGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCGTCTATGATGATAGCGACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACGGCCACCCTGACCATCAGCAGGGTCGAAGCCGGGGATGAGGCCGACTATTACTGTCAGGTGTGGGATAGTAGTAGTGATCATCCCACG +>309|IGLV3-22 ENST00000390307|IGLV3-22|5'UTR|IG|IGL|None|00 +AAGAGAGGCCTGGGAAGCCCAGCTGTGCTGTGGGCTCAGGAGGCAGAGCTGTGGGTGTCTCACC +>310|IGLV3-22 ENST00000390307|IGLV3-22|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGGCCACACTCCTGCTCCCACTCCTCAACCTCTACACAGGCTCTGTTGCCTCCTATGAGCTGACACAGCTACCCTCGGTGTCAGTGTCCCCAGGACAGACAGCCAGGATCACCTGCTCTGGAGATGTACTGGGGGAAAATTATGCTGACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGAGTTGGTGATATACGAAGATAGTGAGCGGTACCCTGGAATCCCTGAACGATTCTCTGGGTCCACCTCAGGGAACACGACCACCCTGACCATCAGCAGGGTCCTGACCGAAGACGAGGCTGACTATTACTGTTTGTCTGGGGATGAGGACAATCCCTCA +>311|IGLV3-25 ENST00000390305|IGLV3-25|5'UTR|IG|IGL|None|00 +GCTGTGCTGTGGGTCCAGGAGGCAGAACTCTGGGTGTCTCACC +>312|IGLV3-25 ENST00000390305|IGLV3-25|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTACTTCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAGACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAGCAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATATATAAAGACAGTGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAACAGTCACGTTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCAATCAGCAGACAGCAGTG +>313|IGLV3-27 ENST00000390304|IGLV3-27|5'UTR|IG|IGL|None|00 +GCTGTAGGCTCAGGAGGCAGAGCTCTGAATGTCTCACC +>314|IGLV3-27 ENST00000390304|IGLV3-27|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCATTCTCTGCACAGTCTCTGTGGCCTCCTATGAGCTGACACAGCCATCCTCAGTGTCAGTGTCTCCGGGACAGACAGCCAGGATCACCTGCTCAGGAGATGTACTGGCAAAAAAATATGCTCGGTGGTTCCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATTTATAAAGACAGTGAGCGGCCCTCAGGGATCCCTGAGCGATTCTCCGGCTCCAGCTCAGGGACCACAGTCACCTTGACCATCAGCGGGGCCCAGGTTGAGGATGAGGCTGACTATTACTGTTACTCTGCGGCTGACAACAAT +>315|IGLV3-32 ENST00000627634|IGLV3-32|5'UTR|IG|IGL|None|00 +GCTGTGGACTCAGAGGCAGAGCTCTGGGGCATTTCCATT +>316|IGLV3-32 ENST00000627634|IGLV3-32|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCCCCTGCTCGTCCTCACTCTCTGCACAGGCTCCGTTATTTCCTCTGGGCCAACTCAGGTGCCTGCAGTGTCTGTGGCCTTGGGACAAATGGCCAGGATCACCTGCCAGGGAGACAGCATGGAAGGCTCTTATGAACACTGGTACCAGCAGAAGCCAGGCCAGGCCCCCGTGCTGGTCATCTATGATAGCAGTGACCGGCCCTCAAGGATCCCTGAGCGATTCTCTGGCTCCAAATCAGGCAACACAACCACCCTGACCATCACTGGGGCCCAGGCTGAGGATGAGGCTGATTATTACTATCAGTTGATAGACAACCATGCTACTCAACT +>317|IGLV3-9 ENST00000390316|IGLV3-9|5'UTR|IG|IGL|None|00 +CTTGACTCTGCTGATTTGCATCACAGGCTGCTCTCTTCAGCAAGGGGATAAGAGAGGGCTGGAAGGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGGGGTGCCGCAGCC +>318|IGLV3-9 ENST00000390316|IGLV3-9|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGCTCTCCTTCTGAGCCTCCTTGCTCACTTTACAGGTTCTGTGGCCTCCTATGAGCTGACTCAGCCACTCTCAGTGTCAGTGGCCCTGGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAATGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCATCTATAGGGATAGCAACCGGCCCTCTGGGATCCCTGAGCGATTCTCTGGCTCCAACTCGGGGAACACGGCCACCCTGACCATCAGCAGAGCCCAAGCCGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGCAGCACTGCACACA +>319|IGLV4-3 ENST00000390318|IGLV4-3|5'UTR|IG|IGL|None|00 +CTCGAATAGAGCTCTTGGAAGTCCCTCCAACC +>320|IGLV4-3 ENST00000390318|IGLV4-3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGTCTCCTTCTACCTACTGCCCTTCATTTTCTCCACAGGTCTCTGTGCTCTGCCTGTGCTGACTCAGCCCCCGTCTGCATCTGCCTTGCTGGGAGCCTCGATCAAGCTCACCTGCACCCTAAGCAGTGAGCACAGCACCTACACCATCGAATGGTATCAACAGAGACCAGGGAGGTCCCCCCAGTATATAATGAAGGTTAAGAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCCGATCGCTTCATGGGCTCCAGTTCTGGGGCTGACCGCTACCTCACCTTCTCCAACCTCCAGTCTGACGATGAGGCTGAGTATCACTGTGGAGAGAGCCACACGATTGATGGCCAAGTCGGT +>321|IGLV4-60 ENST00000390284|IGLV4-60|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCACTCCTCCTCCTCTTCCCTCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCCTGTGCTGACTCAATCATCCTCTGCCTCTGCTTCCCTGGGATCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGTAGCTACATCATCGCATGGCATCAGCAGCAGCCAGGGAAGGCCCCTCGGTACTTGATGAAGCTTGAAGGTAGTGGAAGCTACAACAAGGGGAGCGGAGTTCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGACCGCTACCTCACCATCTCCAACCTCCAGTTTGAGGATGAGGCTGATTATTACTGTGAGACCTGGGACAGTAACACTCA +>322|IGLV4-69 ENST00000390282|IGLV4-69|5'UTR|IG|IGL|None|00 +AGGGTGGGTAAGAAATACCTGCAACTGTCAGCCTCAGCAGAGCTCTGGGGAGTCTGCACC +>323|IGLV4-69 ENST00000390282|IGLV4-69|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCTTGGACCCCACTCCTCTTCCTCACCCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCTTGTGCTGACTCAATCGCCCTCTGCCTCTGCCTCCCTGGGAGCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGCAGCTACGCCATCGCATGGCATCAGCAGCAGCCAGAGAAGGGCCCTCGGTACTTGATGAAGCTTAACAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGAGCGCTACCTCACCATCTCCAGCCTCCAGTCTGAGGATGAGGCTGACTATTACTGTCAGACCTGGGGCACTGGCATTCA +>324|IGLV5-37 ENST00000628968|IGLV5-37|5'UTR|IG|IGL|None|00 +CCACC +>325|IGLV5-37 ENST00000628968|IGLV5-37|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTTCTTCTCTTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCCTCCTCCGCATCTCCTGGAGAATCCGCCAGACTCACCTGCACCTTGCCCAGTGACATCAATGTTGGTAGCTACAACATATACTGGTACCAGCAGAAGCCAGGGAGCCCTCCCAGGTATCTCCTGTACTACTACTCAGACTCAGATAAGGGCCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAGCCAATACAGGGATTTTACTCATCTCCGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCCAAGCAATGCTTCT +>326|IGLV5-39 ENST00000630493|IGLV5-39|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGCCTGTGCTGACTCAGCCAACCTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGATTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCTTCCCCGGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAACCAATGCAGGCCTTTTACTCATCTCTGGGCTCCAGTCTGAAGATGAGGCTGACTATTACTGTGCCATTTGGTACAGCAGCACTTCT +>327|IGLV5-45 ENST00000390296|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>328|IGLV5-45 ENST00000390296|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGTGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>329|IGLV5-45 ENST00000626489|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>330|IGLV5-45 ENST00000626489|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>331|IGLV5-52 ENST00000390289|IGLV5-52|5'UTR|IG|IGL|None|00 +CCACC +>332|IGLV5-52 ENST00000390289|IGLV5-52|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCTTCTCCTTCTCGTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCATCTTCCCATTCTGCATCTTCTGGAGCATCAGTCAGACTCACCTGCATGCTGAGCAGTGGCTTCAGTGTTGGGGACTTCTGGATAAGGTGGTACCAACAAAAGCCAGGGAACCCTCCCCGGTATCTCCTGTACTACCACTCAGACTCCAATAAGGGCCAAGGCTCTGGAGTTCCCAGCCGCTTCTCTGGATCCAACGATGCATCAGCCAATGCAGGGATTCTGCGTATCTCTGGGCTCCAGCCTGAGGATGAGGCTGACTATTACTGTGGTACATGGCACAGCAACTCTAAGACTCA +>333|IGLV6-57 ENST00000390285|IGLV6-57|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCACTACTTCTCACCCTCCTCGCTCACTGCACAGGTTCTTGGGCCAATTTTATGCTGACTCAGCCCCACTCTGTGTCGGAGTCTCCGGGGAAGACGGTAACCATCTCCTGCACCGGCAGCAGTGGCAGCATTGCCAGCAACTATGTGCAGTGGTACCAGCAGCGCCCGGGCAGTGCCCCCACCACTGTGATCTATGAGGATAACCAAAGACCCTCTGGGGTCCCTGATCGGTTCTCTGGCTCCATCGACAGCTCCTCCAACTCTGCCTCCCTCACCATCTCTGGACTGAAGACTGAGGACGAGGCTGACTACTACTGTCAGTCTTATGATAGCAGCAATCA +>334|IGLV7-43 ENST00000618644|IGLV7-43|5'UTR|IG|IGL|None|00 +TCTGGCGCCAGGGGTCCCTTCCAATATCAGCACC +>335|IGLV7-43 ENST00000618644|IGLV7-43|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCTCAGACTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGCTTCCAGCACTGGAGCAGTCACCAGTGGTTACTATCCAAACTGGTTCCAGCAGAAACCTGGACAAGCACCCAGGGCACTGATTTATAGTACAAGCAACAAACACTCCTGGACCCCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACACTGTCAGGTGTGCAGCCTGAGGACGAGGCTGAGTATTACTGCCTGCTCTACTATGGTGGTGCTCAG +>336|IGLV7-46 ENST00000390295|IGLV7-46|5'UTR|IG|IGL|None|00 +TCTGGCACCAGGGGTCCCTTCCAATATCAGCACC +>337|IGLV7-46 ENST00000390295|IGLV7-46|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCCCAGGCTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGGCTCCAGCACTGGAGCTGTCACCAGTGGTCATTATCCCTACTGGTTCCAGCAGAAGCCTGGCCAAGCCCCCAGGACACTGATTTATGATACAAGCAACAAACACTCCTGGACACCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACCCTTTTGGGTGCGCAGCCTGAGGATGAGGCTGAGTATTACTGCTTGCTCTCCTATAGTGGTGCTCGG +>338|IGLV8-61 ENST00000390283|IGLV8-61|5'UTR|IG|IGL|None|00 +GAGGAAAACAAACCCCAGCTGGGAAGCCTGAGAACACTTAGCCTTC +>339|IGLV8-61 ENST00000390283|IGLV8-61|L-REGION+V-REGION|IG|IGL|None|00 +ATGAGTGTCCCCACCATGGCCTGGATGATGCTTCTCCTCGGACTCCTTGCTTATGGATCAGGAGTGGATTCTCAGACTGTGGTGACCCAGGAGCCATCGTTCTCAGTGTCCCCTGGAGGGACAGTCACACTCACTTGTGGCTTGAGCTCTGGCTCAGTCTCTACTAGTTACTACCCCAGCTGGTACCAGCAGACCCCAGGCCAGGCTCCACGCACGCTCATCTACAGCACAAACACTCGCTCTTCTGGGGTCCCTGATCGCTTCTCTGGCTCCATCCTTGGGAACAAAGCTGCCCTCACCATCACGGGGGCCCAGGCAGATGATGAATCTGATTATTACTGTGTGCTGTATATGGGTAGTGGCATTTC +>340|IGLV9-49 ENST00000427632|IGLV9-49|5'UTR|IG|IGL|None|00 +GAGAGACTGAAGAACCCAGCATTGCAGCAGCTCCACC +>341|IGLV9-49 ENST00000427632|IGLV9-49|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCTCTGCTCCTCACCCTCCTCAGTCTCCTCACAGGGTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCTGCATCAGCCTCCCTGGGAGCCTCGGTCACACTCACCTGCACCCTGAGCAGCGGCTACAGTAATTATAAAGTGGACTGGTACCAGCAGAGACCAGGGAAGGGCCCCCGGTTTGTGATGCGAGTGGGCACTGGTGGGATTGTGGGATCCAAGGGGGATGGCATCCCTGATCGCTTCTCAGTCTTGGGCTCAGGCCTGAATCGGTACCTGACCATCAAGAACATCCAGGAAGAGGATGAGAGTGACTACCACTGTGGGGCAGACCATGGCAGTGGGAGCAACTTCGTG +>342|TRAC ENST00000611116|TRAC|C-REGION|TR|TRA|None|00 +ATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>343|TRAJ1 ENST00000390536|TRAJ1|J-REGION|TR|TRA|None|00 +GTATGAAAGTATTACCTCCCAGTTGCAATTTGGCAAAGGAACCAGAGTTTCCACTTCTCCCC +>344|TRAJ10 ENST00000390527|TRAJ10|J-REGION|TR|TRA|None|00 +ATACTCACGGGAGGAGGAAACAAACTCACCTTTGGGACAGGCACTCAGCTAAAAGTGGAACTCA +>345|TRAJ11 ENST00000390526|TRAJ11|J-REGION|TR|TRA|None|00 +TGAATTCAGGATACAGCACCCTCACCTTTGGGAAGGGGACTATGCTTCTAGTCTCTCCAG +>346|TRAJ12 ENST00000390525|TRAJ12|J-REGION|TR|TRA|None|00 +GGATGGATAGCAGCTATAAATTGATCTTCGGGAGTGGGACCAGACTGCTGGTCAGGCCTG +>347|TRAJ13 ENST00000390524|TRAJ13|J-REGION|TR|TRA|None|00 +TGAATTCTGGGGGTTACCAGAAAGTTACCTTTGGAACTGGAACAAAGCTCCAAGTCATCCCAA +>348|TRAJ14 ENST00000390523|TRAJ14|J-REGION|TR|TRA|None|00 +ATTTATAGCACATTCATCTTTGGGAGTGGGACAAGATTATCAGTAAAACCTG +>349|TRAJ16 ENST00000390521|TRAJ16|J-REGION|TR|TRA|None|00 +GGTTTTCAGATGGCCAGAAGCTGCTCTTTGCAAGGGGGACCATGTTAAAGGTGGATCTTA +>350|TRAJ17 ENST00000390520|TRAJ17|J-REGION|TR|TRA|None|00 +TGATCAAAGCTGCAGGCAACAAGCTAACTTTTGGAGGAGGAACCAGGGTGCTAGTTAAACCAA +>351|TRAJ18 ENST00000390519|TRAJ18|J-REGION|TR|TRA|None|00 +CCGACAGAGGCTCAACCCTGGGGAGGCTATACTTTGGAAGAGGAACTCAGTTGACTGTCTGGCCTG +>352|TRAJ19 ENST00000390518|TRAJ19|J-REGION|TR|TRA|None|00 +GCTATCAAAGATTTTACAATTTCACCTTTGGAAAGGGATCCAAACATAATGTCACTCCAA +>353|TRAJ2 ENST00000390535|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGAACAATTGATAAACTCACATTTGGGAAAGGGACCCATGTATTCATTATATCTG +>354|TRAJ20 ENST00000390517|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTAACGACTACAAGCTCAGCTTTGGAGCCGGAACCACAGTAACTGTAAGAGCAA +>355|TRAJ21 ENST00000390516|TRAJ21|J-REGION|TR|TRA|None|00 +TACAACTTCAACAAATTTTACTTTGGATCTGGGACCAAACTCAATGTAAAACCAA +>356|TRAJ22 ENST00000390515|TRAJ22|J-REGION|TR|TRA|None|00 +TTTCTTCTGGTTCTGCAAGGCAACTGACCTTTGGATCTGGGACACAATTGACTGTTTTACCTG +>357|TRAJ23 ENST00000390514|TRAJ23|J-REGION|TR|TRA|None|00 +TGATTTATAACCAGGGAGGAAAGCTTATCTTCGGACAGGGAACGGAGTTATCTGTGAAACCCA +>358|TRAJ24 ENST00000390513|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGACAGCTGGGGGAAATTCCAGTTTGGAGCAGGGACCCAGGTTGTGGTCACCCCAG +>359|TRAJ25 ENST00000390512|TRAJ25|J-REGION|TR|TRA|None|00 +CAGAAGGACAAGGCTTCTCCTTTATCTTTGGGAAGGGGACAAGGCTGCTTGTCAAGCCAA +>360|TRAJ26 ENST00000390511|TRAJ26|J-REGION|TR|TRA|None|00 +GGGATAACTATGGTCAGAATTTTGTCTTTGGTCCCGGAACCAGATTGTCCGTGCTGCCCT +>361|TRAJ27 ENST00000390510|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATGCAGGCAAATCAACCTTTGGGGATGGGACTACGCTCACTGTGAAGCCAA +>362|TRAJ28 ENST00000390509|TRAJ28|J-REGION|TR|TRA|None|00 +CATACTCTGGGGCTGGGAGTTACCAACTCACTTTCGGGAAGGGGACCAAACTCTCGGTCATACCAA +>363|TRAJ29 ENST00000390508|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAACACACCTCTTGTCTTTGGAAAGGGCACAAGACTTTCTGTGATTGCAA +>364|TRAJ3 ENST00000390534|TRAJ3|J-REGION|TR|TRA|None|00 +GGGGTACAGCAGTGCTTCCAAGATAATCTTTGGATCAGGGACCAGACTCAGCATCCGGCCAA +>365|TRAJ30 ENST00000390507|TRAJ30|J-REGION|TR|TRA|None|00 +TGAACAGAGATGACAAGATCATCTTTGGAAAAGGGACACGACTTCATATTCTCCCCA +>366|TRAJ31 ENST00000390506|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAACAATGCCAGACTCATGTTTGGAGATGGAACTCAGCTGGTGGTGAAGCCCA +>367|TRAJ32 ENST00000390505|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGTGGTGCTACAAACAAGCTCATCTTTGGAACTGGCACTCTGCTTGCTGTCCAGCCAA +>368|TRAJ33 ENST00000390504|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTAATCTGGGGCGCTGGGACCAAGCTAATTATAAAGCCAG +>369|TRAJ34 ENST00000390503|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTATAACACCGACAAGCTCATCTTTGGGACTGGGACCAGATTACAAGTCTTTCCAA +>370|TRAJ35 ENST00000390502|TRAJ35|J-REGION|TR|TRA|None|00 +GATAGGCTTTGGGAATGTGCTGCATTGCGGGTCCGGCACTCAAGTGATTGTTTTACCAC +>371|TRAJ36 ENST00000614481|TRAJ36|J-REGION|TR|TRA|None|00 +TCAAACTGGGGCAAACAACCTCTTCTTTGGGACTGGAACGAGACTCACCGTTATTCCCT +>372|TRAJ37 ENST00000612375|TRAJ37|J-REGION|TR|TRA|None|00 +TGGCTCTAGCAACACAGGCAAACTAATCTTTGGGCAAGGGACAACTTTACAAGTAAAACCAG +>373|TRAJ38 ENST00000390499|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGCTGGCAACAACCGTAAGCTGATTTGGGGATTGGGAACAAGCCTGGCAGTAAATCCGA +>374|TRAJ39 ENST00000390498|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGCAACATGCTCACCTTTGGAGGGGGAACAAGGTTAATGGTCAAACCCC +>375|TRAJ4 ENST00000390533|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTTTCTGGTGGCTACAATAAGCTGATTTTTGGAGCAGGGACCAGGCTGGCTGTACACCCAT +>376|TRAJ40 ENST00000390497|TRAJ40|J-REGION|TR|TRA|None|00 +ACTACCTCAGGAACCTACAAATACATCTTTGGAACAGGCACCAGGCTGAAGGTTTTAGCAA +>377|TRAJ41 ENST00000390496|TRAJ41|J-REGION|TR|TRA|None|00 +GAACTCAAATTCCGGGTATGCACTCAACTTCGGCAAAGGCACCTCGCTGTTGGTCACACCCC +>378|TRAJ42 ENST00000390495|TRAJ42|J-REGION|TR|TRA|None|00 +TGAATTATGGAGGAAGCCAAGGAAATCTCATCTTTGGAAAAGGCACTAAACTCTCTGTTAAACCAA +>379|TRAJ43 ENST00000390494|TRAJ43|J-REGION|TR|TRA|None|00 +ACAATAACAATGACATGCGCTTTGGAGCAGGGACCAGACTGACAGTAAAACCAA +>380|TRAJ44 ENST00000390493|TRAJ44|J-REGION|TR|TRA|None|00 +TAAATACCGGCACTGCCAGTAAACTCACCTTTGGGACTGGAACAAGACTTCAGGTCACGCTCG +>381|TRAJ45 ENST00000390492|TRAJ45|J-REGION|TR|TRA|None|00 +TGTATTCAGGAGGAGGTGCTGACGGACTCACCTTTGGCAAAGGGACTCATCTAATCATCCAGCCCT +>382|TRAJ46 ENST00000390491|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAGAAAAGCAGCGGAGACAAGCTGACTTTTGGGACCGGGACTCGTTTAGCAGTTAGGCCCA +>383|TRAJ47 ENST00000390490|TRAJ47|J-REGION|TR|TRA|None|00 +TGGAATATGGAAACAAACTGGTCTTTGGCGCAGGAACCATTCTGAGAGTCAAGTCCT +>384|TRAJ48 ENST00000390489|TRAJ48|J-REGION|TR|TRA|None|00 +TATCTAACTTTGGAAATGAGAAATTAACCTTTGGGACTGGAACAAGACTCACCATCATACCCA +>385|TRAJ49 ENST00000390488|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACCGGTAACCAGTTCTATTTTGGGACAGGGACAAGTTTGACGGTCATTCCAA +>386|TRAJ5 ENST00000390532|TRAJ5|J-REGION|TR|TRA|None|00 +TGGACACGGGCAGGAGAGCACTTACTTTTGGGAGTGGAACAAGACTCCAAGTGCAACCAA +>387|TRAJ50 ENST00000390487|TRAJ50|J-REGION|TR|TRA|None|00 +TGAAAACCTCCTACGACAAGGTGATATTTGGGCCAGGGACAAGCTTATCAGTCATTCCAA +>388|TRAJ52 ENST00000390486|TRAJ52|J-REGION|TR|TRA|None|00 +CTAATGCTGGTGGTACTAGCTATGGAAAGCTGACATTTGGACAAGGGACCATCTTGACTGTCCATCCAA +>389|TRAJ53 ENST00000390485|TRAJ53|J-REGION|TR|TRA|None|00 +AGAATAGTGGAGGTAGCAACTATAAACTGACATTTGGAAAAGGAACTCTCTTAACCGTGAATCCAA +>390|TRAJ54 ENST00000390484|TRAJ54|J-REGION|TR|TRA|None|00 +TAATTCAGGGAGCCCAGAAGCTGGTATTTGGCCAAGGAACCAGGCTGACTATCAACCCAA +>391|TRAJ56 ENST00000390483|TRAJ56|J-REGION|TR|TRA|None|00 +TTATACTGGAGCCAATAGTAAGCTGACATTTGGAAAAGGAATAACTCTGAGTGTTAGACCAG +>392|TRAJ57 ENST00000390482|TRAJ57|J-REGION|TR|TRA|None|00 +TAACTCAGGGCGGATCTGAAAAGCTGGTCTTTGGAAAGGGAACGAAACTGACAGTAAACCCAT +>393|TRAJ58 ENST00000390481|TRAJ58|J-REGION|TR|TRA|None|00 +TTTAAGAAACCAGTGGCTCTAGGTTGACCTTTGGGGAAGGAACACAGCTCACAGTGAATCCTG +>394|TRAJ59 ENST00000390480|TRAJ59|J-REGION|TR|TRA|None|00 +GGAAGGAAGGAAACAGGAAATTTACATTTGGAATGGGGACGCAAGTGAGAGTGA +>395|TRAJ6 ENST00000390531|TRAJ6|J-REGION|TR|TRA|None|00 +TGCATCAGGAGGAAGCTACATACCTACATTTGGAAGAGGAACCAGCCTTATTGTTCATCCGT +>396|TRAJ61 ENST00000390479|TRAJ61|J-REGION|TR|TRA|None|00 +GGTACCGGGTTAATAGGAAACTGACATTTGGAGCCAACACTAGAGGAATCATGAAACTCA +>397|TRAJ7 ENST00000390530|TRAJ7|J-REGION|TR|TRA|None|00 +TGACTATGGGAACAACAGACTCGCTTTTGGGAAGGGGAACCAAGTGGTGGTCATACCAA +>398|TRAJ8 ENST00000390529|TRAJ8|J-REGION|TR|TRA|None|00 +TGAACACAGGCTTTCAGAAACTTGTATTTGGAACTGGCACCTGACTTCTGGTCAGTCCAA +>399|TRAJ9 ENST00000390528|TRAJ9|J-REGION|TR|TRA|None|00 +GGAAATACTGGAGGCTTCAAAACTATCTTTGGAGCAGGAACAAGACTATTTGTTAAAGCAA +>400|TRAV1-1 ENST00000542354|TRAV1-1|5'UTR|TR|TRA|None|00 +CTTCTGCAGACTACAGTGGCTCAGGAACCGGGGATGCAGTGCCAGGCTCATGGTATCCTGCAGCAG +>401|TRAV1-1 ENST00000542354|TRAV1-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGCTTTCCTTCTCTATGTTTCCATGAAGATGGGAGGCACTGCAGGACAAAGCCTTGAGCAGCCCTCTGAAGTGACAGCTGTGGAAGGAGCCATTGTCCAGATAAACTGCACGTACCAGACATCTGGGTTTTATGGGCTGTCCTGGTACCAGCAACATGATGGCGGAGCACCCACATTTCTTTCTTACAATGCTCTGGATGGTTTGGAGGAGACAGGTCGTTTTTCTTCATTCCTTAGTCGCTCTGATAGTTATGGTTACCTCCTTCTACAGGAGCTCCAGATGAAAGACTCTGCCTCTTACTTCTGCGCTGTGAGAGA +>402|TRAV1-2 ENST00000390423|TRAV1-2|5'UTR|TR|TRA|None|00 +CCCACATGAAGTGTCTACCTTCTGCAGACTCCAATGGCTCAGGAACTGGGAATGCAGTGCCAGGCTCGTGGTATCCTGCAGCAG +>403|TRAV1-2 ENST00000390423|TRAV1-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGTTTTCCTTCTTTATGTTTCCATGAAGATGGGAGGCACTACAGGACAAAACATTGACCAGCCCACTGAGATGACAGCTACGGAAGGTGCCATTGTCCAGATCAACTGCACGTACCAGACATCTGGGTTCAACGGGCTGTTCTGGTACCAGCAACATGCTGGCGAAGCACCTACATTTCTGTCTTACAATGTTCTGGATGGTTTGGAGGAGAAAGGTCGTTTTTCTTCATTCCTTAGTCGGTCTAAAGGGTACAGTTACCTCCTTTTGAAGGAGCTCCAGATGAAAGACTCTGCCTCTTACCTCTGTGCT +>404|TRAV10 ENST00000390432|TRAV10|5'UTR|TR|TRA|None|00 +AGTCAACTTCTGGGAGCAGATCTCTGCAGAATAAAA +>405|TRAV10 ENST00000390432|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCATCTGACGACCTTCTTGGTGATTTTGTGGCTTTATTTTTATAGGGGGAATGGCAAAAACCAAGTGGAGCAGAGTCCTCAGTCCCTGATCATCCTGGAGGGAAAGAACTGCACTCTTCAATGCAATTATACAGTGAGCCCCTTCAGCAACTTAAGGTGGTATAAGCAAGATACGGGGAGAGGTCCTGTTTCCCTGACAATCATGACTTTCAGTGAGAACACAAAGTCGAACGGAAGATATACAGCAACTCTGGATGCAGACACAAAGCAAAGCTCTCTGCACATCACAGCCTCCCAGCTCAGCGATTCAGCCTCCTACATCTGTGTGGTGAGCG +>406|TRAV12-1 ENST00000390433|TRAV12-1|5'UTR|TR|TRA|None|00 +ATG +>407|TRAV12-1 ENST00000390433|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGATATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACGGAAGGAGGTGGAGCAGGATCCTGGACCCTTCAATGTTCCAGAGGGAGCCACTGTCGCTTTCAACTGTACTTACAGCAACAGTGCTTCTCAGTCTTTCTTCTGGTACAGACAGGATTGCAGGAAAGAACCTAAGTTGCTGATGTCCGTATACTCCAGTGGTAATGAAGATGGAAGGTTTACAGCACAGCTCAATAGAGCCAGCCAGTATATTTCCCTGCTCATCAGAGACTCCAAGCTCAGTGATTCAGCCACCTACCTCTGTGTGGTGAACA +>408|TRAV12-2 ENST00000390437|TRAV12-2|5'UTR|TR|TRA|None|00 +AAAGCAGATTCTTTTTATGATTTTTAAAGTAGAAATATCCATTCTAGGTGCATTTTTTAAGGGTTTAAAATTTGAATCCTCAGTGAACCAGGGCAGAGAAGAATG +>409|TRAV12-2 ENST00000390437|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGAGTTTTACTAGTGATCCTGTGGCTTCAGTTGAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGAATTCTGGACCCCTCAGTGTTCCAGAGGGAGCCATTGCCTCTCTCAACTGCACTTACAGTGACCGAGGTTCCCAGTCCTTCTTCTGGTACAGACAATATTCTGGGAAAAGCCCTGAGTTGATAATGTTCATATACTCCAATGGTGACAAAGAAGATGGAAGGTTTACAGCACAGCTCAATAAAGCCAGCCAGTATGTTTCTCTGCTCATCAGAGACTCCCAGCCCAGTGATTCAGCCACCTACCTCTGTGCCGTGAACA +>410|TRAV12-3 ENST00000390442|TRAV12-3|5'UTR|TR|TRA|None|00 +ATTATTTTTTTTTCGTGTTTAAGGTTTGAATCCTCAGTGAACCAGGGCAGAAAAGA +>411|TRAV12-3 ENST00000390442|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGGATCCTGGACCACTCAGTGTTCCAGAGGGAGCCATTGTTTCTCTCAACTGCACTTACAGCAACAGTGCTTTTCAATACTTCATGTGGTACAGACAGTATTCCAGAAAAGGCCCTGAGTTGCTGATGTACACATACTCCAGTGGTAACAAAGAAGATGGAAGGTTTACAGCACAGGTCGATAAATCCAGCAAGTATATCTCCTTGTTCATCAGAGACTCACAGCCCAGTGATTCAGCCACCTACCTCTGTGCAATGAGCG +>412|TRAV13-1 ENST00000390436|TRAV13-1|5'UTR|TR|TRA|None|00 +GATCTTAATTGGGAAGAACAAGG +>413|TRAV13-1 ENST00000390436|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACATCCATTCGAGCTGTATTTATATTCCTGTGGCTGCAGCTGGACTTGGTGAATGGAGAGAATGTGGAGCAGCATCCTTCAACCCTGAGTGTCCAGGAGGGAGACAGCGCTGTTATCAAGTGTACTTATTCAGACAGTGCCTCAAACTACTTCCCTTGGTATAAGCAAGAACTTGGAAAAGGACCTCAGCTTATTATAGACATTCGTTCAAATGTGGGCGAAAAGAAAGACCAACGAATTGCTGTTACATTGAACAAGACAGCCAAACATTTCTCCCTGCACATCACAGAGACCCAACCTGAAGACTCGGCTGTCTACTTCTGTGCAGCAAGTA +>414|TRAV13-2 ENST00000390439|TRAV13-2|5'UTR|TR|TRA|None|00 +CGATGATGGAAGTAGCTCTTATGGCTGGAGATTGCAGGTTTATGACTGATCCTATTTGGGAAGAACAATG +>415|TRAV13-2 ENST00000390439|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCAGGCATTCGAGCTTTATTTATGTACTTGTGGCTGCAGCTGGACTGGGTGAGCAGAGGAGAGAGTGTGGGGCTGCATCTTCCTACCCTGAGTGTCCAGGAGGGTGACAACTCTATTATCAACTGTGCTTATTCAAACAGCGCCTCAGACTACTTCATTTGGTACAAGCAAGAATCTGGAAAAGGTCCTCAATTCATTATAGACATTCGTTCAAATATGGACAAAAGGCAAGGCCAAAGAGTCACCGTTTTATTGAATAAGACAGTGAAACATCTCTCTCTGCAAATTGCAGCTACTCAACCTGGAGACTCAGCTGTCTACTTTTGTGCAGAGAATA +>416|TRAV14/DV4 ENST00000390440|TRAV14/DV4|5'UTR|TR|TRA|None|00 +GCCAGGTTCACTTCACAGTACAGAGTCCTGAAAATAAAGAAGAAAATTTTTTTTTATCTAGAAAAAGAACCAAAC +>417|TRAV14/DV4 ENST00000390440|TRAV14/DV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGTCACTTTCTAGCCTGCTGAAGGTGGTCACAGCTTCACTGTGGCTAGGACCTGGCATTGCCCAGAAGATAACTCAAACCCAACCAGGAATGTTCGTGCAGGAAAAGGAGGCTGTGACTCTGGACTGCACATATGACACCAGTGATCCAAGTTATGGTCTATTCTGGTACAAGCAGCCCAGCAGTGGGGAAATGATTTTTCTTATTTATCAGGGGTCTTATGACCAGCAAAATGCAACAGAAGGTCGCTACTCATTGAATTTCCAGAAGGCAAGAAAATCCGCCAACCTTGTCATCTCCGCTTCACAACTGGGGGACTCAGCAATGTACTTCTGTGCAATGAGAGAGGG +>418|TRAV16 ENST00000390444|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCCCACCCTCATCTCAGTGCTTGTGATAATATTTATACTCAGAGGAACAAGAGCCCAGAGAGTGACTCAGCCCGAGAAGCTCCTCTCTGTCTTTAAAGGGGCCCCAGTGGAGCTGAAGTGCAACTATTCCTATTCTGGGAGTCCTGAACTCTTCTGGTATGTCCAGTACTCCAGACAACGCCTCCAGTTACTCTTGAGACACATCTCTAGAGAGAGCATCAAAGGCTTCACTGCTGACCTTAACAAAGGCGAGACATCTTTCCACCTGAAGAAACCATTTGCTCAAGAGGAAGACTCAGCCATGTATTACTGTGCTCTAAGTGG +>419|TRAV17 ENST00000390445|TRAV17|5'UTR|TR|TRA|None|00 +AGGACTGAGCTTGCCTGTGACTGGCTAGGGAGGAACCTGAGACTAGGGGACAGAAAGACTAGGGATTCACCCAGTAAAGAGAGCTCATCTGTGACTGAGGAGCCTTGCTCCATTTCAGGTCTTCTGTGATTTCAATAAGGAAGAAGA +>420|TRAV17 ENST00000390445|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAAACTCTCCTGGGAGTGTCTTTGGTGATTCTATGGCTTCAACTGGCTAGGGTGAACAGTCAACAGGGAGAAGAGGATCCTCAGGCCTTGAGCATCCAGGAGGGTGAAAATGCCACCATGAACTGCAGTTACAAAACTAGTATAAACAATTTACAGTGGTATAGACAAAATTCAGGTAGAGGCCTTGTCCACCTAATTTTAATACGTTCAAATGAAAGAGAGAAACACAGTGGAAGATTAAGAGTCACGCTTGACACTTCCAAGAAAAGCAGTTCCTTGTTGATCACGGCTTCCCGGGCAGCAGACACTGCTTCTTACTTCTGTGCTACGGACG +>421|TRAV18 ENST00000390446|TRAV18|5'UTR|TR|TRA|None|00 +GATTTTGTAGAAGATTCCGCCAAAGACTCAACAACATAAAGAAATATATATACCTTTCGGTTTGGATATCTCTCAACAAAACCTTCTACTGCTTCTCAGCCAGCC +>422|TRAV18 ENST00000390446|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGTCTGCTTCCTGCTCAGGACTTGTGATCTTGTTGATATTCAGAAGGACCAGTGGAGACTCGGTTACCCAGACAGAAGGCCCAGTTACCCTCCCTGAGAGGGCAGCTCTGACATTAAACTGCACTTATCAGTCCAGCTATTCAACTTTTCTATTCTGGTATGTCCAGTATCTAAACAAAGAGCCTGAGCTCCTCCTGAAAAGTTCAGAAAACCAGGAGACGGACAGCAGAGGTTTTCAGGCCAGTCCTATCAAGAGTGACAGTTCCTTCCACCTGGAGAAGCCCTCGGTGCAGCTGTCGGACTCTGCCGTGTACTACTGCGCTCTGAGAGA +>423|TRAV19 ENST00000390447|TRAV19|5'UTR|TR|TRA|None|00 +CAGAAGCCTCACACAGCCCAGTAACTTTGCTAGTACCTCTTGAGTGCAAGGTGGAGAATTAAGATCTGGATTTGAGACGGAGCACGGAACATTTCACTCAGGGGAAGAGCTATGAAC +>424|TRAV19 ENST00000390447|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGACTGCCAGCCTGTTGAGGGCAGTCATAGCCTCCATCTGTGTTGTATCCAGCATGGCTCAGAAGGTAACTCAAGCGCAGACTGAAATTTCTGTGGTGGAGAAGGAGGATGTGACCTTGGACTGTGTGTATGAAACCCGTGATACTACTTATTACTTATTCTGGTACAAGCAACCACCAAGTGGAGAATTGGTTTTCCTTATTCGTCGGAACTCTTTTGATGAGCAAAATGAAATAAGTGGTCGGTATTCTTGGAACTTCCAGAAATCCACCAGTTCCTTCAACTTCACCATCACAGCCTCACAAGTCGTGGACTCAGCAGTATACTTCTGTGCTCTGAGTGAGGC +>425|TRAV2 ENST00000390424|TRAV2|5'UTR|TR|TRA|None|00 +CATTTTGGCC +>426|TRAV2 ENST00000390424|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTGCAGAGCACTCTGGGGGCGGTGTGGCTAGGGCTTCTCCTCAACTCTCTCTGGAAGGTTGCAGAAAGCAAGGACCAAGTGTTTCAGCCTTCCACAGTGGCATCTTCAGAGGGAGCTGTGGTGGAAATCTTCTGTAATCACTCTGTGTCCAATGCTTACAACTTCTTCTGGTACCTTCACTTCCCGGGATGTGCACCAAGACTCCTTGTTAAAGGCTCAAAGCCTTCTCAGCAGGGACGATACAACATGACCTATGAACGGTTCTCTTCATCGCTGCTCATCCTCCAGGTGCGGGAGGCAGATGCTGCTGTTTACTACTGTGCTGTGGAGGA +>427|TRAV20 ENST00000390448|TRAV20|5'UTR|TR|TRA|None|00 +ACAGAAGTGGCGCCTCTGAGAAAAGAAGGTTGGAATTATCGTAATTTGTTTCTAGGCTGAGATACCAGC +>428|TRAV20 ENST00000390448|TRAV20|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAAATGTTGGAGTGTGCATTCATAGTCTTGTGGCTTCAGCTTGGCTGGTTGAGTGGAGAAGACCAGGTGACGCAGAGTCCCGAGGCCCTGAGACTCCAGGAGGGAGAGAGTAGCAGTCTCAACTGCAGTTACACAGTCAGCGGTTTAAGAGGGCTGTTCTGGTATAGGCAAGATCCTGGGAAAGGCCCTGAATTCCTCTTCACCCTGTATTCAGCTGGGGAAGAAAAGGAGAAAGAAAGGCTAAAAGCCACATTAACAAAGAAGGAAAGCTTTCTGCACATCACAGCCCCTAAACCTGAAGACTCAGCCACTTATCTCTGTGCTGTGCAGG +>429|TRAV21 ENST00000390449|TRAV21|5'UTR|TR|TRA|None|00 +AGAAGGA +>430|TRAV21 ENST00000390449|TRAV21|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACCCTCTTGGGCCTGCTTATCCTTTGGCTGCAGCTGCAATGGGTGAGCAGCAAACAGGAGGTGACGCAGATTCCTGCAGCTCTGAGTGTCCCAGAAGGAGAAAACTTGGTTCTCAACTGCAGTTTCACTGATAGCGCTATTTACAACCTCCAGTGGTTTAGGCAGGACCCTGGGAAAGGTCTCACATCTCTGTTGCTTATTCAGTCAAGTCAGAGAGAGCAAACAAGTGGAAGACTTAATGCCTCGCTGGATAAATCATCAGGACGTAGTACTTTATACATTGCAGCTTCTCAGCCTGGTGACTCAGCCACCTACCTCTGTGCTGTGAGG +>431|TRAV22 ENST00000390450|TRAV22|5'UTR|TR|TRA|None|00 +GGCTTTGTCGGGTGGAGCTGATTGGTTGCAGGAGCAGCAACAGTTCCAGAGCCAAGTCATGACACCGACCTCCCCAAGGTTTAGTTAAATATATCTTATGGTGAAAATGCCCGGAGCAAGAAGGCAAAGCATC +>432|TRAV22 ENST00000390450|TRAV22|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGATATTGGGAGCTCTGCTGGGGCTCTTGAGTGCCCAGGTTTGCTGTGTGAGAGGAATACAAGTGGAGCAGAGTCCTCCAGACCTGATTCTCCAGGAGGGAGCCAATTCCACGCTGCGGTGCAATTTTTCTGACTCTGTGAACAATTTGCAGTGGTTTCATCAAAACCCTTGGGGACAGCTCATCAACCTGTTTTACATTCCCTCAGGGACAAAACAGAATGGAAGATTAAGCGCCACGACTGTCGCTACGGAACGCTACAGCTTATTGTACATTTCCTCTTCCCAGACCACAGACTCAGGCGTTTATTTCTGTGCTGTGGAGC +>433|TRAV23/DV6 ENST00000390451|TRAV23/DV6|5'UTR|TR|TRA|None|00 +CTGGAAGACCACCTGGGCTGTCATTGAGCTCTGGTGCCAGGAGGA +>434|TRAV23/DV6 ENST00000390451|TRAV23/DV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCTTAGGAGCATCATTTTTAGTTCTGTGGCTTCAACTATGCTGGGTGAGTGGCCAACAGAAGGAGAAAAGTGACCAGCAGCAGGTGAAACAAAGTCCTCAATCTTTGATAGTCCAGAAAGGAGGGATTTCAATTATAAACTGTGCTTATGAGAACACTGCGTTTGACTACTTTCCATGGTACCAACAATTCCCTGGGAAAGGCCCTGCATTATTGATAGCCATACGTCCAGATGTGAGTGAAAAGAAAGAAGGAAGATTCACAATCTCCTTCAATAAAAGTGCCAAGCAGTTCTCATCGCATATCATGGATTCCCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGCA +>435|TRAV24 ENST00000390453|TRAV24|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGAATCCTTTGGCAGCCCCATTACTAATCCTCTGGTTTCATCTTGACTGCGTGAGCAGCATACTGAACGTGGAACAAAGTCCTCAGTCACTGCATGTTCAGGAGGGAGACAGCACCAATTTCACCTGCAGCTTCCCTTCCAGCAATTTTTATGCCTTACACTGGTACAGATGGGAAACTGCAAAAAGCCCCGAGGCCTTGTTTGTAATGACTTTAAATGGGGATGAAAAGAAGAAAGGACGAATAAGTGCCACTCTTAATACCAAGGAGGGTTACAGCTATTTGTACATCAAAGGATCCCAGCCTGAAGACTCAGCCACATACCTCTGTGCCTTTA +>436|TRAV25 ENST00000390454|TRAV25|5'UTR|TR|TRA|None|00 +ACTATTTCTATTGATCTGGAAGAAGCTTGTACCAGGCAACCCATTTAGGAGAAGTTGGATGAAGAGGGAGAGGGAG +>437|TRAV25 ENST00000390454|TRAV25|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTACTCATCACATCAATGTTGGTCTTATGGATGCAATTGTCACAGGTGAATGGACAACAGGTAATGCAAATTCCTCAGTACCAGCATGTACAAGAAGGAGAGGACTTCACCACGTACTGCAATTCCTCAACTACTTTAAGCAATATACAGTGGTATAAGCAAAGGCCTGGTGGACATCCCGTTTTTTTGATACAGTTAGTGAAGAGTGGAGAAGTGAAGAAGCAGAAAAGACTGACATTTCAGTTTGGAGAAGCAAAAAAGAACAGCTCCCTGCACATCACAGCCACCCAGACTACAGATGTAGGAACCTACTTCTGTGCAGGG +>438|TRAV26-1 ENST00000390455|TRAV26-1|5'UTR|TR|TRA|None|00 +AGGAACATGACTAAACCTGGGGAGGAAGACATAGAAAAGCAACTGCTCTATCATTGGCTGACAAGATCCTGACAACAACACAATGAGAGCTGCACTCCTTGCAAGTCTTTACTAGTAGCTGTTGCTTCTGTTCTCTGGAAATTCTTTAAACCTAGAATCAGACACAAAAACTGAACTCTGGGTCCACAATCCTCATTTGTCCTTGAAGT +>439|TRAV26-1 ENST00000390455|TRAV26-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCTGGTGGCAAGAGTAACTGTGTTTCTGACCTTTGGAACTATAATTGATGCTAAGACCACCCAGCCCACCTCCATGGATTGCGCTGAAGGAAGAGCTGCAAACCTGCCTTGTAATCACTCTACCATCAGTGGAAATGAGTATGTGTATTGGTATCGACAGATTCACTCCCAGGGGCCACAGTATATCATTCATGGTCTAAAAAACAATGAAACCAATGAAATGGCCTCTCTGATCATCACAGAAGACAGAAAGTCCAGCACCTTGATCCTGCCCCACGCTACGCTGAGAGACACTGCTGTGTACTATTGCATCGTCAGAGTCG +>440|TRAV26-2 ENST00000390460|TRAV26-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTTGGTGACAAGCATTACTGTACTCCTATCTTTGGGTATTATGGGTGATGCTAAGACCACACAGCCAAATTCAATGGAGAGTAACGAAGAAGAGCCTGTTCACTTGCCTTGTAACCACTCCACAATCAGTGGAACTGATTACATACATTGGTATCGACAGCTTCCCTCCCAGGGTCCAGAGTACGTGATTCATGGTCTTACAAGCAATGTGAACAACAGAATGGCCTCTCTGGCAATCGCTGAAGACAGAAAGTCCAGTACCTTGATCCTGCACCGTGCTACCTTGAGAGATGCTGCTGTGTACTACTGCATCCTGAGAGAC +>441|TRAV27 ENST00000390457|TRAV27|5'UTR|TR|TRA|None|00 +AAGCACTCTTCTAGCCCAGAGAAGTCTGTTCCAGGACGGGCTCTTTCAGGAGCAGCTAAAGTCAGGGGCCATGTCCACCATGTGATAGAAAGACAAG +>442|TRAV27 ENST00000390457|TRAV27|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTCCTGAAATTCTCCGTGTCCATTCTTTGGATTCAGTTGGCATGGGTGAGCACCCAGCTGCTGGAGCAGAGCCCTCAGTTTCTAAGCATCCAAGAGGGAGAAAATCTCACTGTGTACTGCAACTCCTCAAGTGTTTTTTCCAGCTTACAATGGTACAGACAGGAGCCTGGGGAAGGTCCTGTCCTCCTGGTGACAGTAGTTACGGGTGGAGAAGTGAAGAAGCTGAAGAGACTAACCTTTCAGTTTGGTGATGCAAGAAAGGACAGTTCTCTCCACATCACTGCAGCCCAGACTGGTGATACAGGCCTCTACCTCTGTGCAGGAG +>443|TRAV29/DV5 ENST00000390458|TRAV29/DV5|5'UTR|TR|TRA|None|00 +ATATGTAAAATGAAGGGTCTGTGGAAGGACATGAATAAAGCACAGGAGGTTGAAGTCAGATTTGCAGCTTTCTAGGCAGGAGATAAGACAATCTGCATCTTCACAGGAGGG +>444|TRAV29/DV5 ENST00000390458|TRAV29/DV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCATGCTCCTGGGGGCATCAGTGCTGATTCTGTGGCTTCAGCCAGACTGGGTAAACAGTCAACAGAAGAATGATGACCAGCAAGTTAAGCAAAATTCACCATCCCTGAGCGTCCAGGAAGGAAGAATTTCTATTCTGAACTGTGACTATACTAACAGCATGTTTGATTATTTCCTATGGTACAAAAAATACCCTGCTGAAGGTCCTACATTCCTGATATCTATAAGTTCCATTAAGGATAAAAATGAAGATGGAAGATTCACTGTTTTCTTAAACAAAAGTGCCAAGCACCTCTCTCTGCACATTGTGCCCTCCCAGCCTGGAGACTCTGCAGTGTACTTCTGTGCAGCAAGCG +>445|TRAV3 ENST00000390425|TRAV3|5'UTR|TR|TRA|None|00 +CCGGTGTCGGGAAGCACCAGTGCCCTGAGGAAGGGCCATTTCCAAAAGCCCTGTGCTGACACAGGGTTGCTGGTTCCTCTTCAAGAGCCCACTCTCTGGGGTGGGGCCATATCTCCAGCAGAGGTGGGCTGGAAAGGACCCCCCCAATCCCGCCCGCCGTGAGCTTAGCTGGAGCC +>446|TRAV3 ENST00000390425|TRAV3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCTCTGCACCCATCTCGATGCTTGCGATGCTCTTCACATTGAGTGGGCTGAGAGCTCAGTCAGTGGCTCAGCCGGAAGATCAGGTCAACGTTGCTGAAGGGAATCCTCTGACTGTGAAATGCACCTATTCAGTCTCTGGAAACCCTTATCTTTTTTGGTATGTTCAATACCCCAACCGAGGCCTCCAGTTCCTTCTGAAATACATCACAGGGGATAACCTGGTTAAAGGCAGCTATGGCTTTGAAGCTGAATTTAACAAGAGCCAAACCTCCTTCCACCTGAAGAAACCATCTGCCCTTGTGAGCGACTCCGCTTTGTACTTCTGTGCTGTGAGAGACA +>447|TRAV30 ENST00000557168|TRAV30|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTCTCCTGAAAGTGCTTTCAGGCACCTTGTTGTGGCAGTTGACCTGGGTGAGAAGCCAACAACCAGTGCAGAGTCCTCAAGCCGTGATCCTCCGAGAAGGGGAAGATGCTGTCATCAACTGCAGTTCCTCCAAGGCTTTATATTCTGTACACTGGTACAGGCAGAAGCATGGTGAAGCACCCGTCTTCCTGATGATATTACTGAAGGGTGGAGAACAGAAGGGTCATGACAAAATATCTGCTTCATTTAATGAAAAAAAGCAGCAAAGCTCCCTGTACCTTACGGCCTCCCAGCTCAGTTACTCAGGAACCTACTTCTGCGGCACAGAGA +>448|TRAV34 ENST00000390461|TRAV34|5'UTR|TR|TRA|None|00 +AATAGCTAAGGG +>449|TRAV34 ENST00000390461|TRAV34|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTGTTCTGCAAGTACTCCTAGGGATATTGGGGTTCCAAGCAGCCTGGGTCAGTAGCCAAGAACTGGAGCAGAGTCCTCAGTCCTTGATCGTCCAAGAGGGAAAGAATCTCACCATAAACTGCACGTCATCAAAGACGTTATATGGCTTATACTGGTATAAGCAAAAGTATGGTGAAGGTCTTATCTTCTTGATGATGCTACAGAAAGGTGGGGAAGAGAAAAGTCATGAAAAGATAACTGCCAAGTTGGATGAGAAAAAGCAGCAAAGTTCCCTGCATATCACAGCCTCCCAGCCCAGCCATGCAGGCATCTACCTCTGTGGAGCAGACA +>450|TRAV35 ENST00000390462|TRAV35|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTTGAACATTTATTAATAATCTTGTGGATGCAGCTGACATGGGTCAGTGGTCAACAGCTGAATCAGAGTCCTCAATCTATGTTTACCCAGGAAGGAGAAGATGTCTCCATGAACTGCACTTCTTCAAGCATATTTAACACCTGACTATGGTACAAGCAGGACCCTGGGGAAGGTCCTGTCCTCTTGATAGCCTTATATAAGGCTGGTGAATTGACCTCAAATGGAAGACTGACTGCTCAGTTTGGTATAACCAGAAAGGACAGCTTCCTGAATATCTCAGCATCCATACCTAGTGATGTAGGCATCTACTTCTGTGCTGGGCAG +>451|TRAV36/DV7 ENST00000390463|TRAV36/DV7|5'UTR|TR|TRA|None|00 +ACTTGATAACTGAAGG +>452|TRAV36/DV7 ENST00000390463|TRAV36/DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAGTGTCCACAGGCTTTACTAGCTATCTTTTGGCTTCTACTGAGCTGGGTGAGCAGTGAAGACAAGGTGGTACAAAGCCCTCTATCTCTGGTTGTCCACGAGGGAGACACCGTAACTCTCAATTGCAGTTATGAAGTGACTAACTTTCGAAGCCTACTATGGTACAAGCAGGAAAAGAAAGCTCCCACATTTCTATTTATGCTAACTTCAAGTGGAATTGAAAAGAAGTCAGGAAGACTAAGTAGCATATTAGATAAGAAAGAACTTTTCAGCATCCTGAACATCACAGCCACCCAGACCGGAGACTCGGCCATCTACCTCTGTGCTGTGGAGG +>453|TRAV38-1 ENST00000390464|TRAV38-1|5'UTR|TR|TRA|None|00 +AGC +>454|TRAV38-1 ENST00000390464|TRAV38-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACACGAGTTAGCTTGCTGTGGGCAGTCGTGGTCTCCACCTGTCTTGAATCCGGCATGGCCCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACTGTGACCCTGAGTTGCACATATGACACCAGTGAGAATAATTATTATTTGTTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACGGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGACACTGCGATGTATTTCTGTGCTTTCATGAAGCA +>455|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|5'UTR|TR|TRA|None|00 +AGATCAGAAGAGGAGGCTTCTCACCCTGCAGCAGGGACCTGTGAGC +>456|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCATGCCCTGGCTTCCTGTGGGCACTTGTGATCTCCACCTGTCTTGAATTTAGCATGGCTCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACCGTGACCCTGAGCTGCACATATGACACCAGTGAGAGTGATTATTATTTATTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACAGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGATGCCGCGATGTATTTCTGTGCTTATAGGAGCG +>457|TRAV39 ENST00000390466|TRAV39|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAAGCTACTAGCAATGATTCTGTGGCTTCAACTAGACCGGTTAAGTGGAGAGCTGAAAGTGGAACAAAACCCTCTGTTCCTGAGCATGCAGGAGGGAAAAAACTATACCATCTACTGCAATTATTCAACCACTTCAGACAGACTGTATTGGTACAGGCAGGATCCTGGGAAAAGTCTGGAATCTCTGTTTGTGTTGCTATCAAATGGAGCAGTGAAGCAGGAGGGACGATTAATGGCCTCACTTGATACCAAAGCCCGTCTCAGCACCCTCCACATCACAGCTGCCGTGCATGACCTCTCTGCCACCTACTTCTGTGCCGTGGACA +>458|TRAV4 ENST00000390426|TRAV4|5'UTR|TR|TRA|None|00 +CTGGGCTCATTGCAGCTCAGACACAGCAAAAGAGCCTAGAACCTGGGTCCTAGTTTGCACCTAGAAT +>459|TRAV4 ENST00000390426|TRAV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCAAGTGGCGAGAGTGATCGTGTTCCTGACCCTGAGTACTTTGAGCCTTGCTAAGACCACCCAGCCCATCTCCATGGACTCATATGAAGGACAAGAAGTGAACATAACCTGTAGCCACAACAACATTGCTACAAATGATTATATCACGTGGTACCAACAGTTTCCCAGCCAAGGACCACGATTTATTATTCAAGGATACAAGACAAAAGTTACAAACGAAGTGGCCTCCCTGTTTATCCCTGCCGACAGAAAGTCCAGCACTCTGAGCCTGCCCCGGGTTTCCCTGAGCGACACTGCTGTGTACTACTGCCTCGTGGGTGACA +>460|TRAV40 ENST00000390467|TRAV40|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCCTCTCTGGACTTTCTAATTCTGATCTTAATGTTTGGAGGAACCAGCAGCAATTCAGTCAAGCAGACGGGCCAAATAACCGTCTCGGAGGGAGCATCTGTGACTATGAACTGCACATACACATCCACGGGGTACCCTACCCTTTTCTGGTATGTGGAATACCCCAGCAAACCTCTGCAGCTTCTTCAGAGAGAGACAATGGAAAACAGCAAAAACTTCGGAGGCGGAAATATTAAAGACAAAAACTCCCCCATTGTGAAATATTCAGTCCAGGTATCAGACTCAGCCGTGTACTACTGTCTTCTGGGAGA +>461|TRAV41 ENST00000390468|TRAV41|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTGAAGATCCGGCAATTTTTGTTGGCTATTTTGTGGCTTCAGCTAAGCTGTGTAAGTGCCGCCAAAAATGAAGTGGAGCAGAGTCCTCAGAACCTGACTGCCCAGGAAGGAGAATTTATCACAATCAACTGCAGTTACTCGGTAGGAATAAGTGCCTTACACTGGCTGCAACAGCATCCAGGAGGAGGCATTGTTTCCTTGTTTATGCTGAGCTCAGGGAAGAAGAAGCATGGAAGATTAATTGCCACAATAAACATACAGGAAAAGCACAGCTCCCTGCACATCACAGCCTCCCATCCCAGAGACTCTGCCGTCTACATCTGTGCTGTCAGA +>462|TRAV5 ENST00000390427|TRAV5|5'UTR|TR|TRA|None|00 +GTGGGGAGAACA +>463|TRAV5 ENST00000390427|TRAV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATTTGCTGGATTTTCGTTCCTGTTTTTGTGGCTGCAGCTGGACTGTATGAGTAGAGGAGAGGATGTGGAGCAGAGTCTTTTCCTGAGTGTCCGAGAGGGAGACAGCTCCGTTATAAACTGCACTTACACAGACAGCTCCTCCACCTACTTATACTGGTATAAGCAAGAACCTGGAGCAGGTCTCCAGTTGCTGACGTATATTTTTTCAAATATGGACATGAAACAAGACCAAAGACTCACTGTTCTATTGAATAAAAAGGATAAACATCTGTCTCTGCGCATTGCAGACACCCAGACTGGGGACTCAGCTATCTACTTCTGTGCAGAGAGTA +>464|TRAV6 ENST00000390428|TRAV6|5'UTR|TR|TRA|None|00 +AAACAGA +>465|TRAV6 ENST00000390428|TRAV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTTTGGCTGAGAAGCCTGGGTCTACATTTCAGGCCACATTTGGGGAGACGAATGGAGTCATTCCTGGGAGGTGTTTTGCTGATTTTGTGGCTTCAAGTGGACTGGGTGAAGAGCCAAAAGATAGAACAGAATTCCGAGGCTCTGAACATTCAGGAGGGTAAAACGGCCACCCTGACCTGCAACTATACAAACTATTCTCCAGCATACTTACAGTGGTACCGACAAGATCCAGGAAGAGGCCCTGTTTTCTTGCTACTCATACGTGAAAATGAGAAAGAAAAAAGGAAAGAAAGACTGAAGGTCACCTTTGATACCACCCTTAAACAGAGTTTGTTTCATATCACAGCCTCCCAGCCTGCAGACTCAGCTACCTACCTCTGTGCTCTAGACA +>466|TRAV7 ENST00000390429|TRAV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGATGCGGAGACCTGTCCTAATTATATTTTGTCTATGTCTTGGCTGGGCAAATGGAGAAAACCAGGTGGAGCACAGCCCTCATTTTCTGGGACCCCAGCAGGGAGACGTTGCCTCCATGAGCTGCACGTACTCTGTCAGTCGTTTTAACAATTTGCAGTGGTACAGGCAAAATACAGGGATGGGTCCCAAACACCTATTATCCATGTATTCAGCTGGATATGAGAAGCAGAAAGGAAGACTAAATGCTACATTACTGAAGAATGGAAGCAGCTTGTACATTACAGCCGTGCAGCCTGAAGATTCAGCCACCTATTTCTGTGCTGTAGATG +>467|TRAV8-1 ENST00000390430|TRAV8-1|5'UTR|TR|TRA|None|00 +CCAAAACAAGAGACTTGCCTAGCCCAACCTTCCTCACGCTCGCTATTCTCAAGACCTGGGTTCCAGCCACTTTCCTACTGGCCCCGAGGAGAATTTCCAAAGAGACGCCTGCAGTGTTTCCACAGCTCAGCC +>468|TRAV8-1 ENST00000390430|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGTTGCTCATACCAGTGCTGGGGATGATTTTTGCCCTGAGAGATGCCAGAGCCCAGTCTGTGAGCCAGCATAACCACCACGTAATTCTCTCTGAAGCAGCCTCACTGGAGTTGGGATGCAACTATTCCTATGGTGGAACTGTTAATCTCTTCTGGTATGTCCAGTACCCTGGTCAACACCTTCAGCTTCTCCTCAAGTACTTTTCAGGGGATCCACTGGTTAAAGGCATCAAGGGCTTTGAGGCTGAATTTATAAAGAGTAAATTCTCCTTTAATCTGAGGAAACCCTCTGTGCAGTGGAGTGACACAGCTGAGTACTTCTGTGCCGTGAATGC +>469|TRAV8-2 ENST00000390434|TRAV8-2|5'UTR|TR|TRA|None|00 +GGCTGATGTAGCTCACTGATGTCTGTGTAGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGACTCCTTAAGAGAAAGCCTTTCTGTTTTGGAAACTTTTCAAAGCCAGGGACTTGTCCAGCCCAACCTCCCCATTGCTCCTAGCTCCCGAGGCTCAGGACCCCTGGCTTCTGTCCTCCCTGCTCAGGGTCCTGCAGCGTTGCCTCTGCTCAGCC +>470|TRAV8-2 ENST00000390434|TRAV8-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGACAGCCACGTCTCTGTCTCTGAAGGAACCCCGGTGCTGCTGAGGTGCAACTACTCATCTTCTTATTCACCGTCTCTCTTCTGGTATGTGCAACACCCCAACAAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGTTGTGAGTGA +>471|TRAV8-3 ENST00000390435|TRAV8-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGAGCTTATCCCACTGCTGGGGATACATTTTGTCCTGAGAACTGCCAGAGCCCAGTCAGTGACCCAGCCTGACATCCACATCACTGTCTCTGAAGGAGCCTCACTGGAGTTGAGATGTAACTATTCCTATGGGGCAACACCTTATCTCTTCTGGTATGTCCAGTCCCCCGGCCAAGGCCTCCAGCTGCTCCTGAAGTACTTTTCAGGAGACACTCTGGTTCAAGGCATTAAAGGCTTTGAGGCTGAATTTAAGAGGAGTCAATCTTCCTTCAATCTGAGGAAACCCTCTGTGCATTGGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGC +>472|TRAV8-4 ENST00000390438|TRAV8-4|5'UTR|TR|TRA|None|00 +TTTTGAAACCCTTCAAAGGCAGAGACTTGTCCAGCCTAACCTGCCTGCTGCTCCTAGCTCCTGAGGCTCAGGGCCCTTGGCTTCTGTCCGCTCTGCTCAGGGCCCTCCAGCGTGGCCACTGCTCAGCC +>473|TRAV8-4 ENST00000390438|TRAV8-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGGCAGCCACGTCTCTGTCTCTGAAGGAGCCCTGGTTCTGCTGAGGTGCAACTACTCATCGTCTGTTCCACCATATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGCTGTGAGTGA +>474|TRAV8-6 ENST00000390443|TRAV8-6|5'UTR|TR|TRA|None|00 +GTAGCTCGTTGATGTCTGTGTGGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGGCTCCTTAAGGGAAAGCCTCTTTCTGTTTCTGAAACTTTTCAAAGCCAGGGACTTGTCCAATCCAACCTCCTCACAGTTCCTAGCTCCTGAGGCTCAGCGCCCTTGGCTTCTGTCCGCCCAGCTTAAGGTCCTGCAGCATTGCCACTGCTCAGCC +>475|TRAV8-6 ENST00000390443|TRAV8-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGCGTTCCAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCTGTGACCCAGCTTGACAGCCAAGTCCCTGTCTTTGAAGAAGCCCCTGTGGAGCTGAGGTGCAACTACTCATCGTCTGTTTCAGTGTATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTATTTATCAGGATCCACCCTGGTTGAAAGCATCAACGGTTTTGAGGCTGAATTTAACAAGAGTCAAACTTCCTTCCACTTGAGGAAACCCTCAGTCCATATAAGCGACACGGCTGAGTACTTCTGTGCTGTGAGTGA +>476|TRAV8-7 ENST00000390456|TRAV8-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCTTAGTGGTCATTCTGCTGCTTGGAATGTTCTTCACACTGAGTAAAACCCAGTCGGTGACCCAGCTTGATGGCCACATCACTGTCTCTGAAGAAGCCCCTCTGGAACTGAAGTGCAACTATTCCTATAGTGGAGTTCCTTCTCTCTTCTGGTATGTCCAATACTCTAGCCAAAGCCTCCAGCTTCTCCTCAAAGACCTAACAAAGGCCACCCAGGTTAAAGGCATCAGAGGTTTTGAGGCTGAATTTAAGAAGAGCGAAACCTCCTTCTACCTGAGGAAACCATCAACCCATGTGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGACAGGAG +>477|TRAV9-1 ENST00000390431|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATTCTTCTCCAGGACCAGCGATTGCACTATTCTTAATGTTTGGGGGAATCAATGGAGATTCAGTGGTCCAGACAGAAGGCCAAGTGCTCCCCTCTGAAGGGGATTCCCTGATTGTGAACTGCTCCTATGAAACCACACAGTACCCTTCCCTTTTTTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCACCTGAAAGCCATGAAGGCCAATGACAAGGGAAGGAACAAAGGTTTTGAAGCCATGTACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGACTCAGTTCAAGAGTCAGACTCCGCTGTGTACTTCTGTGCTCTGAGTGA +>478|TRAV9-2 ENST00000390441|TRAV9-2|5'UTR|TR|TRA|None|00 +CACTGTGATTTCTTCATGTTAAGGATCAAGACCATTATTTGGGTAACACACTAAAG +>479|TRAV9-2 ENST00000390441|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGGCTTAGTATCTCTGATACTCTTACTGCTTGGAAGAACCCGTGGAGATTCAGTGACCCAGATGGAAGGGCCAGTGACTCTCTCAGAAGAGGCCTTCCTGACTATAAACTGCACGTACACAGCCACAGGATACCCTTCCCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCTACAGCTCCTCCTGAAAGCCACGAAGGCTGATGACAAGGGAAGCAACAAAGGTTTTGAAGCCACATACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGGCTCAGTTCAAGTGTCAGACTCAGCGGTGTACTTCTGTGCTCTGAGTGA +>480|TRBC1 ENST00000633705|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>481|TRBC1 ENST00000632136|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>482|TRBC2 ENST00000466254|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>483|TRBC2 ENST00000622053|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>484|TRBD1 ENST00000632684|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>485|TRBJ1-1 ENST00000632951|TRBJ1-1|J-REGION|TR|TRB|None|00 +TGAACACTGAAGCTTTCTTTGGACAAGGCACCAGACTCACAGTTGTAG +>486|TRBJ1-2 ENST00000633553|TRBJ1-2|J-REGION|TR|TRB|None|00 +CTAACTATGGCTACACCTTCGGTTCGGGGACCAGGTTAACCGTTGTAG +>487|TRBJ1-3 ENST00000633936|TRBJ1-3|J-REGION|TR|TRB|None|00 +CTCTGGAAACACCATATATTTTGGAGAGGGAAGTTGGCTCACTGTTGTAG +>488|TRBJ1-4 ENST00000633891|TRBJ1-4|J-REGION|TR|TRB|None|00 +CAACTAATGAAAAACTGTTTTTTGGCAGTGGAACCCAGCTCTCTGTCTTGG +>489|TRBJ1-5 ENST00000633507|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAGCAATCAGCCCCAGCATTTTGGTGATGGGACTCGACTCTCCATCCTAG +>490|TRBJ1-6 ENST00000632228|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAACGGGACCAGGCTCACTGTGACAG +>491|TRBJ1-6 ENST00000633713|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAATGGGACCAGGCTCACTGTGACAG +>492|TRBJ2-1 ENST00000631600|TRBJ2-1|J-REGION|TR|TRB|None|00 +CTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAG +>493|TRBJ2-2 ENST00000633188|TRBJ2-2|J-REGION|TR|TRB|None|00 +CGAACACCGGGGAGCTGTTTTTTGGAGAAGGCTCTAGGCTGACCGTACTGG +>494|TRBJ2-2P ENST00000633209|TRBJ2-2P|J-REGION|TR|TRB|None|00 +CTGAGAGGCGCTGCTGGGCGTCTGGGCGGAGGACTCCTGGTTCTGG +>495|TRBJ2-3 ENST00000631840|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCG +>496|TRBJ2-4 ENST00000633836|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGCCAAAAACATTCAGTACTTCGGCGCCGGGACCCGGCTCTCAGTGCTGG +>497|TRBJ2-5 ENST00000634149|TRBJ2-5|J-REGION|TR|TRB|None|00 +ACCAAGAGACCCAGTACTTCGGGCCAGGCACGCGGCTCCTGGTGCTCG +>498|TRBJ2-6 ENST00000632996|TRBJ2-6|J-REGION|TR|TRB|None|00 +CTCTGGGGCCAACGTCCTGACTTTCGGGGCCGGCAGCAGGCTGACCGTGCTGG +>499|TRBJ2-7 ENST00000390419|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACTTCGGGCCGGGCACCAGGCTCACGGTCACAG +>500|TRBJ2-7 ENST00000633660|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACGTCGGGCCGGGCACCAGGCTCACGGTCACAG +>501|TRBV10-1 ENST00000632248|TRBV10-1|5'UTR|TR|TRB|None|00 +ACTGAGAGCCCAACTTCAGTCTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>502|TRBV10-1 ENST00000632248|TRBV10-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACGAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGAAATCACCCAGAGCCCAAGACACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGGCGTGTCACCAGACTTGGAACCACAACAATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCCATTACTCATATGGTGTTCACGACACTAACAAAGGAGAAGTCTCAGATGGCTACAGTGTCTCTAGATCAAACACAGAGGACCTCCCCCTCACTCTGGAGTCTGCTGCCTCCTCCCAGACATCTGTATATTTCTGCGCCAGCAGTGAGTC +>503|TRBV10-2 ENST00000426318|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>504|TRBV10-2 ENST00000426318|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTACGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>505|TRBV10-2 ENST00000633575|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>506|TRBV10-2 ENST00000633575|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTATGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>507|TRBV10-3 ENST00000611462|TRBV10-3|5'UTR|TR|TRB|None|00 +ATGAGATCCTGGCCTGGACCTGAA +>508|TRBV10-3 ENST00000611462|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCACCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>509|TRBV10-3 ENST00000631471|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCATCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>510|TRBV11-1 ENST00000634176|TRBV11-1|5'UTR|TR|TRB|None|00 +CCTGCCCTGACCCTGCC +>511|TRBV11-1 ENST00000634176|TRBV11-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCACCAGGCTTCTCTGCTGGATGGCCCTCTGTCTCCTGGGGGCAGAACTCTCAGAAGCTGAAGTTGCCCAGTCCCCCAGATATAAGATTACAGAGAAAAGCCAGGCTGTGGCTTTTTGGTGTGATCCTATTTCTGGCCATGCTACCCTTTACTGGTACCGGCAGATCCTGGGACAGGGCCCGGAGCTTCTGGTTCAATTTCAGGATGAGAGTGTAGTAGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>512|TRBV11-3 ENST00000634111|TRBV11-3|5'UTR|TR|TRB|None|00 +AGTGACCCTGATCTGGCAAAGCTTCCATCCTGCCCTGACCCTGCC +>513|TRBV11-3 ENST00000634111|TRBV11-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGGCTCCTCTGCTGGGTGGCCTTCTGTCTCCTGGTGGAAGAACTCATAGAAGCTGGAGTGGTTCAGTCTCCCAGATATAAGATTATAGAGAAAAAACAGCCTGTGGCTTTTTGGTGCAATCCTATTTCTGGCCACAATACCCTTTACTGGTACCTGCAGAACTTGGGACAGGGCCCGGAGCTTCTGATTCGATATGAGAATGAGGAAGCAGTAGACGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGA +>514|TRBV12-3 ENST00000633292|TRBV12-3|5'UTR|TR|TRB|None|00 +TTCTTTGCTCATGCTCACAGAGGGCCTGGTCTAGAATATTCCACATCTGCTCTCACTCTGCC +>515|TRBV12-3 ENST00000633292|TRBV12-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCTTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCGAAGCATACAGATGCTGGAGTTATCCAGTCACCCCGCCATGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGCCACAACTCCCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>516|TRBV12-4 ENST00000617347|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>517|TRBV12-4 ENST00000617347|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>518|TRBV12-4 ENST00000631824|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>519|TRBV12-4 ENST00000631824|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>520|TRBV12-5 ENST00000621184|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>521|TRBV12-5 ENST00000621184|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGCACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>522|TRBV12-5 ENST00000632829|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>523|TRBV12-5 ENST00000632829|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGGACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>524|TRBV13 ENST00000633796|TRBV13|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTTAGTCCTGACCTGCCTGACTCTGCCTGGAACACCAGGCTCCTCTGCCGTGTCATGCTTTGTCTCCTGGGAGCAGGTTCAGTGGCTGCTGGAGTCATCCAGTCCCCAAGACATCTGATCAAAGAAAAGAGGGAAACAGCCACTCTGAAATGCTATCCTATCCCTAGACACGACACTGTCTACTGGTACCAGCAGGGTCCAGGTCAGGACCCCCAGTTCCTCATTTCGTTTTATGAAAAGATGCAGAGCGATAAAGGAAGCATCCCTGATCGATTCTCAGCTCAACAGTTCAGTGACTATCATTCTGAACTGAACATGAGCTCCTTGGAGCTGGGGGACTCAGCCCTGTACTTCTGTGCCAGCAGCTTAGG +>525|TRBV14 ENST00000632432|TRBV14|5'UTR|TR|TRB|None|00 +CCTTTTTCTCATGCTTGTAAGCTCCTTCATCTGGAAATGTGATTTACCTGGGTCCTGCC +>526|TRBV14 ENST00000632432|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGTTTCCAGGCTTCTCAGTTTAGTGTCCCTTTGTCTCCTGGGAGCAAAGCACATAGAAGCTGGAGTTACTCAGTTCCCCAGCCACAGCGTAATAGAGAAGGGCCAGACTGTGACTCTGAGATGTGACCCAATTTCTGGACATGATAATCTTTATTGGTATCGACGTGTTATGGGAAAAGAAATAAAATTTCTGTTACATTTTGTGAAAGAGTCTAAACAGGATGAGTCCGGTATGCCCAACAATCGATTCTTAGCTGAAAGGACTGGAGGGACGTATTCTACTCTGAAGGTGCAGCCTGCAGAACTGGAGGATTCTGGAGTTTATTTCTGTGCCAGCAGCCAAGA +>527|TRBV15 ENST00000631835|TRBV15|5'UTR|TR|TRB|None|00 +ACTCCCACCTCTCAACCCAGGAATCAGAGCCTGAGACAGACAGATGCTTCATTCCTGTATGGGGTGGTATTCCTGCC +>528|TRBV15 ENST00000631835|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTCCTGGGCTTCTCCACTGGATGGCCCTTTGTCTCCTTGGAACAGGTCATGGGGATGCCATGGTCATCCAGAACCCAAGATACCAGGTTACCCAGTTTGGAAAGCCAGTGACCCTGAGTTGTTCTCAGACTTTGAACCATAACGTCATGTACTGGTACCAGCAGAAGTCAAGTCAGGCCCCAAAGCTGCTGTTCCACTACTATGACAAAGATTTTAACAATGAAGCAGACACCCCTGATAACTTCCAATCCAGGAGGCCGAACACTTCTTTCTGCTTTCTTGACATCCGCTCACCAGGCCTGGGGGACGCAGCCATGTACCTGTGTGCCACCAGCAGAGA +>529|TRBV16 ENST00000633244|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCCAATATTCACCTGCATCACAATCCTTTGTCTGCTGGCTGCAGGTTCTCCTGGTGAAGAAGTCGCCCAGACTCCAAAACATCTTGTCAGAGGGGAAGGACAGAAAGCAAAATTATATTGTGCCCCAATAAAAGGACACAGTTATGTTTTTTGGTACCAACAGGTCCTGAAAAACGAGTTCAAGTTCTTGATTTCCTTCCAGAATGAAAATGTCTTTGATGAAACAGGTATGCCCAAGGAAAGATTTTCAGCTAAGTGCCTCCCAAATTCACCCTGTAGCCTTGAGATCCAGGCTACGAAGCTTGAGGATTCAGCAGTGTATTTTTGTGCCAGCAGCCAATC +>530|TRBV17 ENST00000619103|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACACTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>531|TRBV17 ENST00000631663|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACGCTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>532|TRBV18 ENST00000611520|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>533|TRBV18 ENST00000611520|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGACTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>534|TRBV18 ENST00000631559|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>535|TRBV18 ENST00000631559|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGAGTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>536|TRBV19 ENST00000390393|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>537|TRBV19 ENST00000390393|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTCTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>538|TRBV19 ENST00000632638|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>539|TRBV19 ENST00000632638|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTTTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>540|TRBV2 ENST00000455382|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>541|TRBV2 ENST00000455382|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCGCTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>542|TRBV2 ENST00000632828|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>543|TRBV2 ENST00000632828|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCACTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>544|TRBV20-1 ENST00000390394|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>545|TRBV20-1 ENST00000390394|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>546|TRBV20-1 ENST00000633466|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>547|TRBV20-1 ENST00000633466|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCTGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>548|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|5'UTR|TR|TRB|None|00 +GATCAGTCATCCCTCCTCGCTGGTGA +>549|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTAGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAACATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGCTCCGGAAACAGAGCCTCATGCTGATGGCAACTTCCAATGAGGGCTCCGAGGTCACATACGAGCAAGGCGTCAAGAAGGACAAGTTTCCCATCAACCATCCAAACCTGACCTTCTCCGCTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGA +>550|TRBV23-1 ENST00000633842|TRBV23-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCGGCTGTGCAGCCCTGTGTCTCCTGGCAGCAGACTCTTTTCATGCCAAAGTCACACAGACTCCAGGACATTTGGTCAAAGGAAAAGGACAGAAAACAAAGATGGATTGTACCCCCGAAAAAGGACATACTTTTGTTTATTGGTATCAACAGAATCAGAATAAAGAGTTTATGCTTTTGATTTCCTTTCAGAATGAACAAGTTCTTCAAGAAACGGAGATGCACAAGAAGCGATTCTCATCTCAATGCCCCAAGAACGCACCCTGCAGCCTGGCAATCCTGTCCTCAGAACCGGGAGACACGGCACTGTATCTCTGCGCCAGCAGTCAATC +>551|TRBV24-1 ENST00000390397|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>552|TRBV24-1 ENST00000390397|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACAGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>553|TRBV24-1 ENST00000633092|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>554|TRBV24-1 ENST00000633092|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACGGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>555|TRBV25-1 ENST00000610439|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>556|TRBV25-1 ENST00000610439|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>557|TRBV25-1 ENST00000390398|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>558|TRBV25-1 ENST00000390398|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>559|TRBV27 ENST00000633283|TRBV27|5'UTR|TR|TRB|None|00 +ACCTGGAGCCCCCAGAACTGGCAGACACCTGCCTGATGCTGCC +>560|TRBV27 ENST00000633283|TRBV27|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCCAGCTCCTTGGCTATGTGGTCCTTTGCCTTCTAGGAGCAGGCCCCCTGGAAGCCCAAGTGACCCAGAACCCAAGATACCTCATCACAGTGACTGGAAAGAAGTTAACAGTGACTTGTTCTCAGAATATGAACCATGAGTATATGTCCTGGTATCGACAAGACCCAGGGCTGGGCTTAAGGCAGATCTACTATTCAATGAATGTTGAGGTGACTGATAAGGGAGATGTTCCTGAAGGGTACAAAGTCTCTCGAAAAGAGAAGAGGAATTTCCCCCTGATCCTGGAGTCGCCCAGCCCCAACCAGACCTCTCTGTACTTCTGTGCCAGCAGTTTATC +>561|TRBV28 ENST00000619125|TRBV28|5'UTR|TR|TRB|None|00 +ATTCTTTCTTCAAAGCAGCC +>562|TRBV28 ENST00000619125|TRBV28|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTATG +>563|TRBV29-1 ENST00000634198|TRBV29-1|5'UTR|TR|TRB|None|00 +GAAGGAAAGATGAACTTGAGTTTCACTTCTTAGTGCCTTTTCTCAGGGGAGAGGCCATCACTTGAAG +>564|TRBV29-1 ENST00000634198|TRBV29-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGAGTCTTCTGCTCCTTCTCCTGGGACTAGGCTCTGTGTTCAGTGCTGTCATCTCTCAAAAGCCAAGCAGGGATATCTGTCAACGTGGAACCTCCCTGACGATCCAGTGTCAAGTCGATAGCCAAGTCACCATGATGTTCTGGTACCGTCAGCAACCTGGACAGAGCCTGACACTGATCGCAACTGCAAATCAGGGCTCTGAGGCCACATATGAGAGTGGATTTGTCATTGACAAGTTTCCCATCAGCCGCCCAAACCTAACATTCTCAACTCTGACTGTGAGCAACATGAGCCCTGAAGACAGCAGCATATATCTCTGCAGCGTTGAAGA +>565|TRBV3-1 ENST00000632422|TRBV3-1|5'UTR|TR|TRB|None|00 +AGACCAGAATCCTGCCCTGGGCCTTGCCTGGTCTGCCTCACTCTGCC +>566|TRBV3-1 ENST00000632422|TRBV3-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTCCTCTGCTGTGTGGTCTTCTGCCTCCTCCAAGCAGGTCCCTTGGACACAGCTGTTTCCCAGACTCCAAAATACCTGGTCACACAGATGGGAAACGACAAGTCCATTAAATGTGAACAAAATCTGGGCCATGATACTATGTATTGGTATAAACAGGACTCTAAGAAATTTCTGAAGATAATGTTTAGCTACAATAATAAGGAGCTCATTATAAATGAAACAGTTCCAAATCGCTTCTCACCTAAATCTCCAGACAAAGCTCACTTAAATCTTCACATCAATTCCCTGGAGCTTGGTGACTCTGCTGTGTATTTCTGTGCCAGCAGCCAAGA +>567|TRBV30 ENST00000417977|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>568|TRBV30 ENST00000417977|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTTCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>569|TRBV30 ENST00000631690|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>570|TRBV30 ENST00000631690|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTCCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>571|TRBV4-1 ENST00000390357|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>572|TRBV4-1 ENST00000390357|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>573|TRBV4-1 ENST00000632713|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>574|TRBV4-1 ENST00000632713|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCGAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>575|TRBV4-2 ENST00000632512|TRBV4-2|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>576|TRBV4-2 ENST00000632512|TRBV4-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGGCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAACTTTAAAGAACAGACTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGTGCCAGCAGCCAAGA +>577|TRBV4-3 ENST00000631427|TRBV4-3|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>578|TRBV4-3 ENST00000631427|TRBV4-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGTCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAGTCTTGAAGAACGGGTTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>579|TRBV5-1 ENST00000633384|TRBV5-1|5'UTR|TR|TRB|None|00 +CTCAGAGGACCAGTATCCCTCACAGGGTGACACCTGACCAGCTCTGTCCCACCTGGCCATGGGCTCCAGGTACCTCTGATGGGAAGACCTTTGTCTCTTGGGAACAAGTGAATCCTTGGCACAGGCCCAGTGGATTCTGCTGTGCAGAACAGAGAGCAGTGGACCTCAGGAGGCCTGCAAGGGGAGGACATAGGACAGTGACATCACAGTATGCCCCTCCCACCAGGAAAAGCAAGGCTGAGAATTTAGCTCTTTCCCAGGAGGACCAAGCCCTGAGCACAGACACAGTGCTGCCTGCCCCTTTGTGCC +>580|TRBV5-1 ENST00000633384|TRBV5-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTGCTCTGTTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTAAAGGCTGGAGTCACTCAAACTCCAAGATATCTGATCAAAACGAGAGGACAGCAAGTGACACTGAGCTGCTCCCCTATCTCTGGGCATAGGAGTGTATCCTGGTACCAACAGACCCCAGGACAGGGCCTTCAGTTCCTCTTTGAATACTTCAGTGAGACACAGAGAAACAAAGGAAACTTCCCTGGTCGATTCTCAGGGCGCCAGTTCTCTAACTCTCGCTCTGAGATGAATGTGAGCACCTTGGAGCTGGGGGACTCGGCCCTTTATCTTTGCGCCAGCAGCTTGG +>581|TRBV5-3 ENST00000390362|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTATTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>582|TRBV5-3 ENST00000634123|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTGTTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>583|TRBV5-4 ENST00000454561|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACACAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGCCCCACTGTGCC +>584|TRBV5-4 ENST00000454561|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGAGACTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>585|TRBV5-4 ENST00000633696|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACTCAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGGCCCACTGTGCC +>586|TRBV5-4 ENST00000633696|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATGATAGCTCTGAGCTGAATGTGAATGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>587|TRBV5-5 ENST00000390372|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>588|TRBV5-5 ENST00000390372|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>589|TRBV5-5 ENST00000632187|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>590|TRBV5-5 ENST00000632187|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGTAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>591|TRBV5-6 ENST00000632216|TRBV5-6|5'UTR|TR|TRB|None|00 +AAGCCCTGAATCAGATGCAGTGCTTCCTGTCCCTCTGTGCC +>592|TRBV5-6 ENST00000632216|TRBV5-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGCACTGCTTTGTCTCCTGGGAGCAGGCTTAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTAAGTCTGGGCATGACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGGAGGAAGAGAGACAGAGAGGCAACTTCCCTGATCGATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>593|TRBV5-7 ENST00000633790|TRBV5-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGTGCTGCTTTGTCCCCTAGGAGAAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCACGTGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTCCTCGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCAATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTAGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>594|TRBV5-8 ENST00000631639|TRBV5-8|5'UTR|TR|TRB|None|00 +TGGCCACTGAGGAAAGGGAAGAGAATGTTGCCTGGGACAGGAAAATATAGAAAATGAAGGCCCAGAACTCACTCGGCTCTTCCCCAGGAAGACCAAGCCCTGAATCAGGTGCAGTGCCGCCTGGCCCACTGTGCC +>595|TRBV5-8 ENST00000631639|TRBV5-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGACCCAGGCTCCTCTTCTGGGCACTGCTTTGTCTCCTCGGAACAGGCCCAGTGGAGGCTGGAGTCACACAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGCGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTACTGGTACCAACAGGCCCTGGGTCTGGGCCTCCAGTTCCTCCTTTGGTATGACGAGGGTGAAGAGAGAAACAGAGGAAACTTCCCTCCTAGATTTTCAGGTCGCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGAGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>596|TRBV6-1 ENST00000631557|TRBV6-1|5'UTR|TR|TRB|None|00 +GTTCCCCTATCACCGATGCACAGACCCAGAAGACCCCTCCATCCTGTAGCACCTGCC +>597|TRBV6-1 ENST00000631557|TRBV6-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAAGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTCCATGTACTGGTATCGACAAGACCCAGGCATGGGACTGAGGCTGATTTATTACTCAGCTTCTGAGGGTACCACTGACAAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATTAAACAAACGGGAGTTCTCGCTCAGGCTGGAGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTGAAGC +>598|TRBV6-2 ENST00000632016|TRBV6-2|5'UTR|TR|TRB|None|00 +TCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>599|TRBV6-2 ENST00000632016|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>600|TRBV6-2 ENST00000634383|TRBV6-2|5'UTR|TR|TRB|None|00 +AGAATGACGCCCTTGAAAGACGTGTTCCCTTTTCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>601|TRBV6-2 ENST00000634383|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>602|TRBV6-4 ENST00000390360|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>603|TRBV6-4 ENST00000390360|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGACTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGAGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>604|TRBV6-4 ENST00000633472|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>605|TRBV6-4 ENST00000633472|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGATTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGCGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>606|TRBV6-5 ENST00000633072|TRBV6-5|5'UTR|TR|TRB|None|00 +GAGAGTCCTGCTCCCCTTTCATCAATGCACAGATACAGAAGACCCCTCCGTCATGCAGCATCTGCC +>607|TRBV6-5 ENST00000633072|TRBV6-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGCCTCCTGTGCTGTGCAGCCTTGTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGAATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGCTGGTATCACTGACCAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGCTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>608|TRBV6-6 ENST00000390371|TRBV6-6|5'UTR|TR|TRB|None|00 +CAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>609|TRBV6-6 ENST00000390371|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGACAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>610|TRBV6-6 ENST00000633963|TRBV6-6|5'UTR|TR|TRB|None|00 +ATCAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>611|TRBV6-6 ENST00000633963|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGATAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGTATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>612|TRBV6-7 ENST00000390373|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTGATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>613|TRBV6-7 ENST00000631511|TRBV6-7|5'UTR|TR|TRB|None|00 +ATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>614|TRBV6-7 ENST00000631511|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTTATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>615|TRBV6-8 ENST00000390376|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCCGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>616|TRBV6-8 ENST00000632425|TRBV6-8|5'UTR|TR|TRB|None|00 +GAGAGTCCTGTTCCCCTTTTATCAATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>617|TRBV6-8 ENST00000632425|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCGGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>618|TRBV6-9 ENST00000634093|TRBV6-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACTTGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCGCATTCATTACTCAGTTGCTGCTGGTATCACTGACAAAGGAGAAGTCCCCGATGGCTACAATGTATCCAGATCAAACACAGAGGATTTCCCGCTCAGGCTGGAGTCAGCTGCTCCCTCCCAGACATCTGTATACTTCTGTGCCAGCAGTTATTC +>619|TRBV7-1 ENST00000632308|TRBV7-1|5'UTR|TR|TRB|None|00 +CTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>620|TRBV7-1 ENST00000632308|TRBV7-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGCTCCTCTGCTGGGCAGCCATATGTCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGTCCCTGAGACACAAGGTAGCAAAGAAGGGAAAGGATGTAGCTCTCAGATATGATCCAATTTCAGGTCATAATGCCCTTTATTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTCCAATTTACTTCCAAGGCAAGGATGCAGCAGACAAATCGGGGCTTCCCCGTGATCGGTTCTCTGCACAGAGGTCTGAGGGATCCATCTCCACTCTGAAGTTCCAGCGCACACAGCAGGGGGACTTGGCTGTGTATCTCTGTGCCAGCAGCTCAGC +>621|TRBV7-2 ENST00000631392|TRBV7-2|5'UTR|TR|TRB|None|00 +CCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>622|TRBV7-2 ENST00000631392|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>623|TRBV7-2 ENST00000634605|TRBV7-2|5'UTR|TR|TRB|None|00 +ACAGTGATCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>624|TRBV7-2 ENST00000634605|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>625|TRBV7-3 ENST00000390361|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>626|TRBV7-3 ENST00000390361|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAAGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAAAGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCCGCGTATCTCCGTGCCAGCAGCTTAAC +>627|TRBV7-3 ENST00000631882|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>628|TRBV7-3 ENST00000631882|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAATATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAACGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCGGGGGGACTCAGCCGTGTATCTCTGTGCCAGCAGCTTAAC +>629|TRBV7-4 ENST00000390369|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>630|TRBV7-4 ENST00000633313|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGTGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>631|TRBV7-6 ENST00000390374|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGTCCTGACCCTGCC +>632|TRBV7-6 ENST00000390374|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>633|TRBV7-6 ENST00000633265|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGGCCTGACCCTGCC +>634|TRBV7-6 ENST00000633265|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCGTCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>635|TRBV7-7 ENST00000631548|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>636|TRBV7-8 ENST00000632560|TRBV7-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCTAGGTACAAAGTCGCAAAGAGAGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTTTTGGTACCAACAGGCCCTGGGGCAGGGGCCAGAGTTTCTGACTTATTTCCAGAATGAAGCTCAACTAGACAAATCGGGGCTGCCCAGTGATCGCTTCTTTGCAGAAAGGCCTGAGGGATCCGTCTCCACTCTGAAGATCCAGCGCACACAGCAGGAGGACTCCGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>637|TRBV7-9 ENST00000612787|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGAACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>638|TRBV7-9 ENST00000632021|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGGACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>639|TRBV9 ENST00000390363|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>640|TRBV9 ENST00000390363|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCACTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>641|TRBV9 ENST00000633328|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>642|TRBV9 ENST00000633328|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCAGTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>643|TRDC ENST00000390477|TRDC|C-REGION|TR|TRD|None|00 +GAAGTCAGCCTCATACCAAACCATCCGTTTTTGTCATGAAAAATGGAACAAATGTCGCTTGTCTGGTGAAGGAATTCTACCCCAAGGATATAAGAATAAATCTCGTGTCATCCAAGAAGATAACAGAGTTTGATCCTGCTATTGTCATCTCTCCCAGTGGGAAGTACAATGCTGTCAAGCTTGGTAAATATGAAGATTCAAATTCAGTGACATGTTCAGTTCAACACGACAATAAAACTGTGCACTCCACTGACTTTGAAGTGAAGACAGATTCTACAGATCACGTAAAACCAAAGGAAACTGAAAACACAAAGCAACCTTCAAAGAGCTGCCATAAACCCAAAGCCATAGTTCATACCGAGAAGGTGAACATGATGTCCCTCACAGTGCTTGGGCTACGAATGCTGTTTGCAAAGACTGTTGCCGTCAATTTTCTCTTGACTGCCAAGTTATTTTTCTTG +>644|TRDD1 ENST00000415118|TRDD1|D-REGION|TR|TRD|None|00 +GAAATAGT +>645|TRDD2 ENST00000434970|TRDD2|D-REGION|TR|TRD|None|00 +CCTTCCTAC +>646|TRDD3 ENST00000448914|TRDD3|D-REGION|TR|TRD|None|00 +ACTGGGGGATACG +>647|TRDJ1 ENST00000390473|TRDJ1|J-REGION|TR|TRD|None|00 +ACACCGATAAACTCATCTTTGGAAAAGGAACCCGTGTGACTGTGGAACCAA +>648|TRDJ2 ENST00000390475|TRDJ2|J-REGION|TR|TRD|None|00 +CTTTGACAGCACAACTCTTCTTTGGAAAGGGAACACAACTCATCGTGGAACCAG +>649|TRDJ3 ENST00000390476|TRDJ3|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTCGGAACTGGCATCAAACTCTTCGTGGAGCCCC +>650|TRDJ4 ENST00000390474|TRDJ4|J-REGION|TR|TRD|None|00 +CCAGACCCCTGATCTTTGGCAAAGGAACCTATCTGGAGGTACAACAAC +>651|TRDV1 ENST00000390452|TRDV1|5'UTR|TR|TRD|None|00 +CAAAGAGCTACATGCCAC +>652|TRDV1 ENST00000390452|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTGTTCTCCAGCCTGCTGTGTGTATTTGTGGCCTTCAGCTACTCTGGATCAAGTGTGGCCCAGAAGGTTACTCAAGCCCAGTCATCAGTATCCATGCCAGTGAGGAAAGCAGTCACCCTGAACTGCCTGTATGAAACAAGTTGGTGGTCATATTATATTTTTTGGTACAAGCAACTTCCCAGCAAAGAGATGATTTTCCTTATTCGCCAGGGTTCTGATGAACAGAATGCAAAAAGTGGTCGCTATTCTGTCAACTTCAAGAAAGCAGCGAAATCCGTCGCCTTAACCATTTCAGCCTTACAGCTAGAAGATTCAGCAAAGTACTTTTGTGCTCTTGGGGAACT +>653|TRDV2 ENST00000390469|TRDV2|5'UTR|TR|TRD|None|00 +ATTAGCAGGCAGCAGGCCCTGCGAGCCTCCTGTGATCAGCTAGATTTCTCTGGGGAATGAAACAGCTGCTGATAGGGACTGACTTCCTCAGTCACAAGTGTTTCACAAGTGTGTTGGTTCAGAGGAGGGACCAGGCAGAAGGTGGTTGAGAGGCAGAGCTGCCCCTGAGTGAGCC +>654|TRDV2 ENST00000390469|TRDV2|L-REGION+V-REGION|TR|TRD|None|00 +ATGCAGAGGATCTCCTCCCTCATCCATCTCTCTCTCTTCTGGGCAGGAGTCATGTCAGCCATTGAGTTGGTGCCTGAACACCAAACAGTGCCTGTGTCAATAGGGGTCCCTGCCACCCTCAGGTGCTCCATGAAAGGAGAAGCGATCGGTAACTACTATATCAACTGGTACAGGAAGACCCAAGGTAACACAATGACTTTCATATACCGAGAAAAGGACATCTATGGCCCTGGTTTCAAAGACAATTTCCAAGGTGACATTGATATTGCAAAGAACCTGGCTGTACTTAAGATACTTGCACCATCAGAGAGAGATGAAGGGTCTTACTACTGTGCCTGTGACACC +>655|TRDV3 ENST00000535880|TRDV3|5'UTR|TR|TRD|None|00 +TCTTTCATTAGAACCGTCAGATAGTCTCTGAGATCTTAGGAACCCTGTTTTGTTGTATATCCTCTGCCCTGATATGAAGAAAAG +>656|TRDV3 ENST00000535880|TRDV3|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTACTGTGGGCTTTAGCTTTTTGTTTTTCTACAGGGGCACGCTGTGTGACAAAGTAACCCAGAGTTCCCCGGACCAGACGGTGGCGAGTGGCAGTGAGGTGGTACTGCTCTGCACTTACGACACTGTATATTCAAATCCAGATTTATTCTGGTACCGGATAAGGCCAGATTATTCCTTTCAGTTTGTCTTTTATGGGGATAACAGCAGATCAGAAGGTGCAGATTTTACTCAAGGACGGTTTTCTGTGAAACACATTCTGACCCAGAAAGCCTTTCACTTGGTGATCTCTCCAGTAAGGACTGAAGACAGTGCCACTTACTACTGTGCCTTTAG +>657|TRGC1 ENST00000443402|TRGC1|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCAATTGCTGAAACAAAGCTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCTGATGTTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAAAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAGTTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCATCACAATGGATCCCAAAGACAATTGTTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACATGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>658|TRGC2 ENST00000436911|TRGC2|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCGATTGCTGAAACAAAACTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCAGATATTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAGAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAATTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCACCACAGTGGATCCCAAATACAATTATTCAAAGGATGCAAATGATGTCATCACAATGGATCCCAAAGACAATTGGTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACACGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>659|TRGJ2 ENST00000390333|TRGJ2|J-REGION|TR|TRG|None|00 +GAATTATTATAAGAAACTCTTTGGCAGTGGAACAACACTTGTTGTCACAG +>660|TRGJP ENST00000390338|TRGJP|J-REGION|TR|TRG|None|00 +GGGCAAGAGTTGGGCAAAAAAATCAAGGTATTTGGTCCCGGAACAAAGCTTATCATTACAG +>661|TRGJP1 ENST00000390339|TRGJP1|J-REGION|TR|TRG|None|00 +ATACCACTGGTTGGTTCAAGATATTTGCTGAAGGGACTAAGCTCATAGTAACTTCACCTG +>662|TRGJP2 ENST00000390334|TRGJP2|J-REGION|TR|TRG|None|00 +ATAGTAGTGATTGGATCAAGACGTTTGCAAAAGGGACTAGGCTCATAGTAACTTCGCCTG +>663|TRGV1 ENST00000390348|TRGV1|5'UTR|TR|TRG|None|00 +TACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>664|TRGV1 ENST00000390348|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGATATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCTGACTGGGTCATCTGCTGAAATCACCTGTGATCTTCCTGGAGCAAGTACCTTATACATCCACTGGTACCTGCACCAGGAGGGGAAGGCCCCACAGTGTCTTCTGTACTATGAACCCTACTACTCCAGGGTTGTGCTGGAATCAGGAATCACTCCAGGAAAGTATGACACTGGAAGCACAAGGAGCAATTGGAATTTGAGACTGCAAAATCTAATTAAAAATGATTCTGGGTTCTATTACTGTGCCACCTGGGACAGG +>665|TRGV10 ENST00000390341|TRGV10|5'UTR|TR|TRG|None|00 +ACTTTCCTGCCTTCTCCTTGGGTACACCGCCCCGAAGACAGGATGTCACTGCTGGAAGCATTTGCCTTCTCCTCCTGGGCTCCTGAGTTGCTGTCCGAACATTTCAGTCTAGCTGCGTGACCAAAATCATTCTTCAATGTTTCCCTCTTCTACTGTCAG +>666|TRGV10 ENST00000390341|TRGV10|L-REGION+V-REGION|TR|TRG|None|00 +ATGTTCATTGGAAATTCTCCTCTTTTACTTACAGTTGGACTTGGATTATCAAAAGTGGAGCAGTTCCAGCTATCCATTTCCACGGAAGTCAAGAAAAGTATTGACATACCTTGCAAGATATCGAGCACAAGGTTTGAAACAGATGTCATTCACTGGTACCGGCAGAAACCAAATCAGGCTTTGGAGCACCTGATCTATATTGTCTCAACAAAATCCGCAGCTCGACGCAGCATGGGTAAGACAAGCAACAAAGTGGAGGCAAGAAAGAATTCTCAAACTCTCACTTCAATCCTTACCATCAAGTCCGTAGAGAAAGAAGACATGGCCGTTTACTACTGTGCTGCGTGGGATTA +>667|TRGV2 ENST00000426402|TRGV2|5'UTR|TR|TRG|None|00 +GGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCCCTCTGCTTGTGTCTCAGGAAGACCACCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGAACCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>668|TRGV2 ENST00000426402|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTAACGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCAGTACTATGACTCCTACAACTCCAAGGTTGTGTTGGAATCAGGAGTCAGTCCAGGGAAGTATTATACTTACGCAAGCACAAGGAACAACTTGAGATTGATACTGCGAAATCTAATTGAAAATGACTTTGGGGTCTATTACTGTGCCACCTGGGACGGG +>669|TRGV3 ENST00000390346|TRGV3|5'UTR|TR|TRG|None|00 +CTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGTCTCAGGAAACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCGTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>670|TRGV3 ENST00000390346|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCAGACTGGGTCATCTGCTGAAATCACTTGCGATCTTACTGTAACAAATACCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCACCGCAAGGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGAGACTGCAAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>671|TRGV4 ENST00000390345|TRGV4|5'UTR|TR|TRG|None|00 +GGCCTGAGCTCTCCTGGCCCCTGGCTCTCTTCTGCAGAGGGCCTGCTCTCAGCTGCCACAAGAGGGCGCCGGAGAACGGACCTGAGCAAGAGAGGCAGGAGCTCCTCTGCAGGTCCTCCCAGGCACCAATCCTTCTGGGAGGGAGGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCTCTCTGCTTGTGTCTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCTCAGAGAGGAAGGC +>672|TRGV4 ENST00000390345|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTACCGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACACCTCCAGCGTTGTGTTGGAATCAGGAATCAGCCCAGGGAAGTATGATACTTACGGAAGCACAAGGAAGAACTTGAGAATGATACTGCGAAATCTTATTGAAAATGACTCTGGAGTCTATTACTGTGCCACCTGGGATGGG +>673|TRGV5 ENST00000390344|TRGV5|5'UTR|TR|TRG|None|00 +TTCTGGGAGGAAGGCTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGACTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCGGAGTTTTAAGAGGATCTTCTGCTCCTCCTCATCTGGTCCCTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>674|TRGV5 ENST00000390344|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGGGAACGAAGTCAGTCACGAGGCCGACTAGGTCATCTGCTGAAATCACTTGTGACCTTACTGTAATAAATGCCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCAACTCAAAGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGATACTACGAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>675|TRGV8 ENST00000390343|TRGV8|5'UTR|TR|TRG|None|00 +CTACTGTCTTCTGTGTTAGGGATCACTTCCTTGTTGAGTGGGACCTGAGTTTTGAGAGGGTCTTCTGCTCCTCTTCGTCTGGTCCCTTACTTCCAAGACCCCAGAGAGGAAGGC +>676|TRGV8 ENST00000390343|TRGV8|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTTGGCTCTAGCTCTGCTTCTAGCTTTCCTGCCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACAAAGTCAGTCACCAGGCCAACTGGGTCATCAGCTGTAATCACTTGTGATCTTCCTGTAGAAAATGCCGTCTACACCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACAACTCCAGGGTTGTGTTGGAATCAGGAATCAGTCGAGAAAAGTATCATACTTATGCAAGCACAGGGAAGAGCCTTAAATTTATACTGGAAAATCTAATTGAACGTGACTCTGGGGTCTATTACTGTGCCACCTGGGATAGG +>677|TRGV9 ENST00000444775|TRGV9|5'UTR|TR|TRG|None|00 +AAAAAAATTCAAGTCAATCCATAGAAGTGGGTCGTGGAATTCCAGGCAGAAAGTGACTAAATGAAGATGGAAGGACAGGGAGGGGGTGGCCACATCACAGAGAACCTCTTATCCTAAGAACTCTGGACTTCATCTTCAGAGGCAAGGTAGAGAGAGCAAGGACTTTAGAGCAGGAAAAGGACCAGGTCAGTCTAGTGGCCATGGGGAAGGTGGGTGGGAGGGGCCGAGATGGGATGTATGGAGGTGCGTGAGGTGGAGGCAGTGGTGAGCCAGGAAATGTTTAGGACGTAGAATCCTCAGGAATTAGAGTGCGGTGAATTAGAGGGGAGAATTGAGGCTGATGCTCAAGCTCCTGGCTTGGGCAATGTGGGTAGTTATGTCATACAGGGAACTCGGAAGAAGATATGGTTTGGGGGAAGGGAATGAGTTCACTCTGGCTATGAGCAGACTTTGTTTGAGATCCCATGTCAGACGTACTTGAAAATGTCCAAGAGTTAGCTGGATATGGGTACAGACAGCTTTCGATTTAACTGAGGTCCGACTTAAGATTTTTTTTTACTTTATGATGGTGCAAAAGTGACACGCATTTGGTAGAAAACATAATTTGACCTTTGCTGTTTCCCCAGGACAGTGATATAAGGTTATGATACTCTCTTGCGATGCTGGGCAGTGGCAGTGAGCTGCAGCTCCCAGTGGGTAAATTAAGCATGGAAATCTGGAACACAGCAGCTTTTAAGGGATGCACTGGGGAGAGCAGTTTGTAAAAATACCTTGGGACGGATTAAATGTCTTGGCTTAGAGAAAGAACAACAGACAATAGGAAACTGTCATTGAGGAGAAGCCGGGATTCAGGAGATGTACATTATTCAGGTAGCTGAGGGAGGGGACAGGAACCTGAATCTTCAACAGAAGCAAACAAACTGGGATGGAGGGCCCAGCCTCATGAAGGTGACCAGAAGGACCCGGTGCTGCAGGCTGTGTGGGTAGCTGAGCAGAGCTAAGCGGCTTGACGGACCAACATCTCTCCAGCTGGTTGAAGACAAGCTCTCAGAAGACAATGCTGCATGTCACAGCCCCAGCAACCAACAACACCAGCCTGACAACTTGCTGGGGTGGCCGCCTTGTGGTCTGAGGTGGCCGTCTAAACTATGTGGTCTGATCTCAGGCTGCAGACCTTGCAGGACTGTCTTCACACAGACTGGAAGTGCTAACAGGTGGTGAGGACACCGCTTTACAACGATGCAGGGGGCCCCATGTCACCCTCACCCATGGGAAGTTTGACTTGGTGGACTCAGCCAAGCCACAGAGGTCTAACGCTTCTCTGCGGTGATTTCAGGCTGCCCTGGCAGAAAGCACAGTGCCTGCAGAC +>678|TRGV9 ENST00000444775|TRGV9|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTCACTGCTCCACACATCAACGCTGGCAGTCCTTGGGGCTCTGTGTGTATATGGTGCAGGTCACCTAGAGCAACCTCAAATTTCCAGTACTAAAACGCTGTCAAAAACAGCCCGCCTGGAATGTGTGGTGTCTGGAATAACAATTTCTGCAACATCTGTATATTGGTATCGAGAGAGACCTGGTGAAGTCATACAGTTCCTGGTGTCCATTTCATATGACGGCACTGTCAGAAAGGAATCCGGCATTCCGTCAGGCAAATTTGAGGTGGATAGGATACCTGAAACGTCTACATCCACTCTCACCATTCACAATGTAGAGAAACAGGACATAGCTACCTACTACTGTGCCTTGTGGGAGGTG +>679|TRBD2 GRCh38-release94|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTAGCGGGAGGG +>680|TRAJ15 GRCh38-release94|TRAJ15|J-REGION|TR|TRA|None|00 +CCAACCAGGCAGGAACTGCTCTGATCTTTGGGAAGGGAACCACCTTATCAGTGAGTTCCA +>681|IGLV6-57 GRCh38-release94|IGLV6-57|5'UTR|IG|IGL|None|00 +TCTGAGGATACGCGTGACAGATAAGAAGGGCTGGTGGGATCAGTCCTGGTGGTAGCTCAGGAAGCAGAGCCTGGAGCATCTCCACT +>682|TRBV11-2 GRCh38-release94|TRBV11-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCGGCCCTCTGTCTCCTGGGAGCAGAACTCACAGAAGCTGGAGTTGCCCAGTCTCCCAGATATAAGATTATAGAGAAAAGGCAGAGTGTGGCTTTTTGGTGCAATCCTATATCTGGCCATGCTACCCTTTACTGGTACCAGCAGATCCTGGGACAGGGCCCAAAGCTTCTGATTCAGTTTCAGAATAACGGTGTAGTGGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAACCTGCAAAGCTTGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGC +>683|IGKV2D-40 GRCh38-release94|IGKV2D-40|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTC +>684|TRGV11 AC244625.2|TRGV11|L-REGION+V-REGION|TR|TRG|None|00 +ATGCCACTGGTAGTAGCTGTTATCTTCTTCTCCCTCTGGGTTTTTGCACTTGGGCAGTTGGAACAACCTGAAATATCTATTTCCAGACCAGCAAATAAGAGTGCCCACATATCTTGGAAGGCATCCATCCAAGGCTTTAGCAGTAAAATCATACACTGGTACTGGCAGAAACCAAACAAAGGCTTAGAATATTTATTACATGTCTTCTTGACAATCTCTGCTCAAGATTGCTCAGGTGGGAAGACTAAGAAACTTGAGGTAAGTAAAAATGCTCACACTTCCACTTCCACTTTGAAAATAAAGTTCTTAGAGAAAGAAGATGAGGTGGTGTACCACTGTGCCTGCTGGATTAGGCAC +>685|IGHV1-8 AC_000146.1|IGHV1-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAAGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCAGTTATGATATCAACTGGGTGCGACAGGCCACTGGACAAGGGCTTGAGTGGATGGGATGGATGAACCCTAACAGTGGTAACACAGGCTATGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGAACACCTCCATAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGG +>686|IGHJ6 GRCh38-release94|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACGGTATGGACGTCTGGGGCCAAGGGACCACGGTCACCGTCTCCTCAG +>687|TRBV20-1 GRCh38-release94|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>688|TRBV7-7 GRCh38-release94|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATTCTGTTTCCACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>689|IGHV3-9 GRCh38-release94|IGHV3-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGACTGAGCTGGATTTTCCTTTTGGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGCAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATGCCATGCACTGGGTCCGGCAAGCTCCAGGGAAGGGCCTGGAGTGGGTCTCAGGTATTAGTTGGAATAGTGGTAGCATAGGCTATGCGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACACGGCCTTGTATTACTGTGCAAAAGATA +>690|IGHV4-30-4 GRCh38-release94|IGHV4-30-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGATTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCAGACACGGCCGTGTATTACTGT +>691|IGKV1-NL1 GRCh38-release94|IGKV1-NL1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGCTCTATGCTGCATCCAGATTGGAAAGTGGGGTCCCATCCAGGTTCAGTGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGT +>692|IGHV4-38-2 GRCh38-release94|IGHV4-38-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGCACCTGTGGTTTTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTTACTCCATCAGCAGTGGTTACTACTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCCGTGTATTACTGT diff --git a/lib/rust/vdj_ann_ref/vdj_refs_7.0/mouse/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_7.0/mouse/fasta/regions.fa new file mode 100644 index 0000000..fdf09a6 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_7.0/mouse/fasta/regions.fa @@ -0,0 +1,1310 @@ +>1|IGHA ENSMUST00000178282|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGGTAAACCCACCAATGTCAGCGTGTCTGTGATCATGTCAGAGGGAGATGGCATCTGCTAC +>2|IGHA ENSMUST00000194738|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGAACGTCAAGAGCCACTTTCCTATGTGCTACTGGACCAGTCAGAAGACATCCTGGAGGAAGAGGCCCCAGGTGCCAGCCTGTGGCCCACCACTGTGACCTTCCTCACCCTCTTCCTACTGAGCTTGTTCTACAGCACAGCACTCACTGTTACAACTGTTCGAGGCCCGTTTGGCAGCAAAGAGGTCCCCCAGTAC +>3|IGHD ENSMUST00000192250|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGATGCTACCACCTCCTGCCTGAGTCAGACGGTCCTTCCAGGAGACCTGATGGTCCTGCCCTTGCC +>4|IGHD ENSMUST00000194162|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGCATAGTCAACACCATCCAACACTCGTGTATCATGGATGAGCAAAGTGACAGCTACATGGACTTAGAGGAGGAGAACGGCCTGTGGCCCACAATGTGCACCTTCGTGGCCCTCTTCCTGCTCACACTGCTCTACAGTGGCTTCGTCACCTTCATCAAGGTGAAG +>5|IGHD1-1 ENSMUST00000103439|IGHD1-1|D-REGION|IG|IGH|None|00 +TTTATTACTACGGTAGTAGCTAC +>6|IGHD2-3 ENSMUST00000177839|IGHD2-3|D-REGION|IG|IGH|None|00 +TCTATGATGGTTACTAC +>7|IGHD2-4 ENSMUST00000179560|IGHD2-4|D-REGION|IG|IGH|None|00 +TCTACTATGATTACGAC +>8|IGHD2-6 ENSMUST00000178230|IGHD2-6|D-REGION|IG|IGH|None|00 +CCTACTATAGTAACTAC +>9|IGHD2-7 ENSMUST00000177965|IGHD2-7|D-REGION|IG|IGH|None|00 +TCTACTATGGTTACGAC +>10|IGHD2-8 ENSMUST00000180001|IGHD2-8|D-REGION|IG|IGH|None|00 +TCTACTATGGTAACTAC +>11|IGHD3-1 ENSMUST00000180266|IGHD3-1|D-REGION|IG|IGH|None|00 +GGCACAGCTCGGGCTAC +>12|IGHD3-2 ENSMUST00000179883|IGHD3-2|D-REGION|IG|IGH|None|00 +AGACAGCTCAGGCTAC +>13|IGHD4-1 ENSMUST00000179520|IGHD4-1|D-REGION|IG|IGH|None|00 +CTAACTGGGAC +>14|IGHD5-5 ENSMUST00000178815|IGHD5-5|D-REGION|IG|IGH|None|00 +GACTACCTAC +>15|IGHD5-6 ENSMUST00000195858|IGHD5-6|D-REGION|IG|IGH|None|00 +GAATACCTAC +>16|IGHD5-7 ENSMUST00000178483|IGHD5-7|D-REGION|IG|IGH|None|00 +AGGCAGCTAGCCTCTGCAGTGCCACAACC +>17|IGHD5-8 ENSMUST00000178909|IGHD5-8|D-REGION|IG|IGH|None|00 +AGACAGCTAGCCTCTGCAGTGCCACAACC +>18|IGHE ENSMUST00000137336|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGGTAACACCTCCCTCCATCCCTCC +>19|IGHE ENSMUST00000223335|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGAGCTAGACCTCCAGGACCTATGTATTGAAGAGGTGGAGGGCGAGGAGCTGGAAGAGCTGTGGACCAGTATTTGTGTCTTCATCACCCTGTTCCTGCTCAGTGTGAGCTATGGGGCCACTGTCACCGTCCTCAAGGTGAAGTGGGTCTTCTCCACACCGATGCAGGATACACCCCAGACCTTCCAAGACTATGCCAACATCTTCCAGACCAGGGCA +>20|IGHG1 ENSMUST00000103420|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGTAAA +>21|IGHG1 ENSMUST00000194304|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGGCTGCAACTGGACGAGACCTGTGCTGAGGCCCAGGACGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGTGTGTGCTACAGCGCTGCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCGGTGGTGGAGCTGAAGCAGACACTGGTTCCTGAATACAAGAACATGATTGGGCAAGCACCC +>22|IGHG2B ENSMUST00000103418|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>23|IGHG2B ENSMUST00000192188|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGGCTAGACCTGGATGATATCTGTGCTGAGGCCAAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCAGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>24|IGHG2C ENSMUST00000103416|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGGCTAGACCTGGATGATGTCTGTACTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACAACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGTTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCTGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>25|IGHG2C ENSMUST00000195192|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGTAAA +>26|IGHG3 ENSMUST00000103423|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGGTAAA +>27|IGHG3 ENSMUST00000223179|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGAGCTGGAACTGAATGAGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>28|IGHJ1 ENSMUST00000103430|IGHJ1|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATGTCTGGGGCACAGGGACCACGGTCACCGTCTCCTCAG +>29|IGHJ2 ENSMUST00000192746|IGHJ2|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAAGGCACCACTCTCACAGTCTCCTCAG +>30|IGHJ3 ENSMUST00000103428|IGHJ3|J-REGION|IG|IGH|None|00 +CCTGGTTTGCTTACTGGGGCCAAGGGACTCTGGTCACTGTCTCTGCAG +>31|IGHJ4 ENSMUST00000103427|IGHJ4|J-REGION|IG|IGH|None|00 +ATTACTATGCTATGGACTACTGGGGTCAAGGAACCTCAGTCACCGTCTCCTCAG +>32|IGHM ENSMUST00000103426|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGGTAAACCCACACTGTACAATGTCTCCCTGATCATGTCTGACACAGGCGGCACCTGCTAT +>33|IGHM ENSMUST00000177715|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGAGGGGGAGGTGAATGCTGAGGAGGAAGGCTTTGAGAACCTGTGGACCACTGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGCACCACCGTCACCCTGTTCAAGGTGAAA +>34|IGHV1-11 ENSMUST00000191801|IGHV1-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCCAGATCACCCTCTTTCTGGTGGCAGCAATTACATGTGCCTACTCCCAGATCCAGCTGCAACAGTCAGGAGCTGAGCTGGCGAGTCCTGGGGCATCAGTGACACTGTCCTGCAAGGCTTCTGGCTACACATTTACTGACCATATTATGAATTGGGTAAAAAAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAGGATTTATCCAGTAAGTGGTGAAACTAACTACAATCAAAAGTTCATGGGCAAGGCCACATTCTCTGTAGACCGGTCCTCCAGCACAGTGTACATGGTGTTGAACAGCCTGACATCTGAGGACCCTGCTGTCTATTACTGTGGAAGG +>35|IGHV1-12 ENSMUST00000109711|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>36|IGHV1-12 ENSMUST00000109711|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>37|IGHV1-12 ENSMUST00000195469|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>38|IGHV1-12 ENSMUST00000195469|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGCTTATCTACAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTTACCAGTTACAATATGCACTGGGTAAAGCAGACACCTAGACAGGGCCTGGAATGGATTGGAGCTATTTATCCAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>39|IGHV1-15 ENSMUST00000192077|IGHV1-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAATTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGACGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGGGTGAAGCAGACACCTGTGCATGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTGGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCATACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>40|IGHV1-18 ENSMUST00000194350|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCCTCTTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATACCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGGACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTATCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACACTGCAGTCTATTACTGTGCAAGA +>41|IGHV1-19 ENSMUST00000193855|IGHV1-19|5'UTR|IG|IGH|None|00 +AACAACACATGTCCAATGTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>42|IGHV1-19 ENSMUST00000193855|IGHV1-19|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGTAAGGCTTCTGGATACACATTCACTGACTACTATATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGTTATTAATCCTTACAACGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTTGACAAGTCCTCCAGCACAGCCTACATGGAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>43|IGHV1-20 ENSMUST00000194968|IGHV1-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGCAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGATTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGATGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCGGAGCCTGACATCTGAGGACTCTGCAGTCTATTATTGTGCAAGA +>44|IGHV1-22 ENSMUST00000103507|IGHV1-22|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGAAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTAACCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAAACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCGGAGGATTCTGCAGTCTATTACTGTGCAAGA +>45|IGHV1-23 ENSMUST00000194625|IGHV1-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGTGTGAAGCAGACACCTGTGCACGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTTGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>46|IGHV1-24 ENSMUST00000191861|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCGGCTGCAGCAGTCTGGACCTAAGGTAGTGAATGCTGGGGCTTCCGTGAAGCTGTCCTGCAAGTCTTCTGGTTACTCATTCAGTAGATACAAAATGGAATGTGTGAAACAGAGCCATGGAAAGAGCCTTGAGTGGATTGAACATATTAATCTTTTCAAAGGTGTTACTAACTACAATGGAAAGTTCAAAAGCAAGGCCACATTGACTGTAGACATATCCTCTAGCACAGCCTATATGGAGCTTAGCAGATTGACATCTGAAGACTCAGAGGTATATTACTGTGCAAGA +>47|IGHV1-26 ENSMUST00000103510|IGHV1-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAATCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATACACGTTCACTGACTACTACATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>48|IGHV1-31 ENSMUST00000195735|IGHV1-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTATCTGGATCTTTCTCTTCCTTCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAGAGCCATGGAAATATCCTCGATTGGATTGGATATATTTATCCTTACAATGGTGTTTCTAGCTACAACCAGAAATTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCTAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>49|IGHV1-34 ENSMUST00000103512|IGHV1-34|5'UTR|IG|IGH|None|00 +GTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>50|IGHV1-34 ENSMUST00000103512|IGHV1-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGTTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTTATCCTAACAATGGTGGTAATGGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>51|IGHV1-36 ENSMUST00000191862|IGHV1-36|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGCCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATTCACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACTTGTTTATCCTTACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGGAGCTAAACAGCCTGACTTCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>52|IGHV1-37 ENSMUST00000193950|IGHV1-37|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGTAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCTGAGCCTGACATCTGAGGACTTTGCAGTCTATTATTGTGCAAGA +>53|IGHV1-39 ENSMUST00000103515|IGHV1-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTCTCAGGAACTGCAGGTGTCCACTCTGAGTTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGCGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGACTACAACATGAACTGGGTGAAGCAGAGCAATGGAAAGAGCCTTGAGTGGATTGGAGTAATTAATCCTAACTATGGTACTACTAGCTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACCAATCTTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>54|IGHV1-4 ENSMUST00000103493|IGHV1-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTTCCTGTTGTCAGTAACTTCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAGACCTGGTGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACACGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTGAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>55|IGHV1-42 ENSMUST00000191868|IGHV1-42|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAACTGGATCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGAACTGGGTGAAGCAAAGTCCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTACCTACAACCAGAAGTTCAAGGCCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>56|IGHV1-43 ENSMUST00000195417|IGHV1-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCAAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAAAGTTCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTAACTGTAGACAAGTCATCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCTGTCTATTACTGTGCAAGA +>57|IGHV1-47 ENSMUST00000194865|IGHV1-47|5'UTR|IG|IGH|None|00 +ATAAGATCAGTCTTCTCTATAATCACTGAGTGCAGAGGACCTCACA +>58|IGHV1-47 ENSMUST00000194865|IGHV1-47|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCGTGGATCTCTATCATCCTCTTCCTAGTGGCAACAGCTATAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTAGTGAAGCCTGGAGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACTACCTATCCTATAGAGTGGATGAAGCAGAATCATGGAAAGAGCCTAGAGTGGATTGGAAATTTTCATCCTTACAATGATGATACTAAGTACAATGAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGAAAAATCCTCTAGCACAGTCTACTTGGAGCTCAGCCGATTAACATCTGATGACTCTGCTGTTTATTACTGTGCAAGG +>59|IGHV1-49 ENSMUST00000192724|IGHV1-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGGTCTTTCTCTTCCTCCTGTCAGGAACTGCAGGAGTCCACTCACAGCGTGAGCTGCAGCAGTCTGGAGCTGAGTTGGTGAGACCTGGGTCCTCAGTGAAGTTGTCCTGCAAGGATTCTTACTTTGCCTTCATGGCCAGTGCTATGCACTGGGTGAAGCAAAGACCTGGACATGGCCTGGAATGGATAGGATCTTTTACTATGTACAGTGATGCTACTGAGTACAGTGAAAACTTCAAGGGCAAGGCCACATTGACTGCAAACACATCCTCGAGCACAGCCTACATGGAACTCAGCAGCCTCACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>60|IGHV1-5 ENSMUST00000191803|IGHV1-5|5'UTR|IG|IGH|None|00 +GATCAGTATCCTCTTCACAGTCACTGAAAACATTGACTCTAATC +>61|IGHV1-5 ENSMUST00000191803|IGHV1-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTAACTGGATACTTCCTTTTATTCTGTCGGTAACTTCAGGGGTCTACTCAGAGGTTCAGCTCCAGCAGTCTGGGACTGTGCTGGCAAGGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGACTTCTGGCTACACATTTACCAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATAGGGGCTATTTATCCTGGAAATAGTGATACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCAAACTGACTGCAGTCACATCCGCCAGCACTGCCTACATGGAGCTCAGCAGCCTGACAAATGAGGACTCTGCGGTCTATTACTGTACAAGA +>62|IGHV1-50 ENSMUST00000103521|IGHV1-50|5'UTR|IG|IGH|None|00 +CTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCGCC +>63|IGHV1-50 ENSMUST00000103521|IGHV1-50|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCTCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGCTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>64|IGHV1-52 ENSMUST00000192554|IGHV1-52|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCATTGGGTGAAGCAGAGGCCTATACAAGGCCTTGAATGGATTGGTAACATTGACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>65|IGHV1-53 ENSMUST00000103523|IGHV1-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGACTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAAATATTAATCCTAGCAATGGTGGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>66|IGHV1-54 ENSMUST00000103525|IGHV1-54|5'UTR|IG|IGH|None|00 +AGTCCCTGAACACACTGACTCTCACC +>67|IGHV1-54 ENSMUST00000103525|IGHV1-54|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCAGAGTCTTTATCTTTCTCCTATCAGTAACTGCAGGTGTTCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGATACGCCTTCACTAATTACTTGATAGAGTGGGTAAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGTGATTAATCCTGGAAGTGGTGGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCAACACTGACTGCAGACAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>68|IGHV1-55 ENSMUST00000103526|IGHV1-55|5'UTR|IG|IGH|None|00 +CACCACACAAAAAAGCATAAGATCACTGTTCTCTCTACAGTTACTAAGCACACAGGATCTCACC +>69|IGHV1-55 ENSMUST00000103526|IGHV1-55|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCATTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATAACCTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAGATATTTATCCTGGTAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>70|IGHV1-56 ENSMUST00000194071|IGHV1-56|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGTTGGGTCTTTCTTTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTCCTGGCTATACCTTCACCAGCCACTGGATGCAGTGGGTAAGACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>71|IGHV1-58 ENSMUST00000103529|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGATCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTCCAGCTTCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGTCCTCAGTGAAGATGTCCTGCAAGACTTCTGGATATACATTCACAAGCTACGGTATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTGGAATGGATTGGATATATTTATATTGGAAATGGTTATACTGAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTTCAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAATCTATTTCTGTGCAAGA +>72|IGHV1-59 ENSMUST00000195359|IGHV1-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATTGTCCTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGACTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTAAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGTGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>73|IGHV1-61 ENSMUST00000103531|IGHV1-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGGATTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAATGGATTGGTAACATTTACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>74|IGHV1-62-1 ENSMUST00000103503|IGHV1-62-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACAGAGTTGGGTCTTACTCTTCCTCCTGTCAGAAACTGCAGGTGTCCACTGCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACAGCAGAGAACTCTGCAATCTATCTGTGCAAGG +>75|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|5'UTR|IG|IGH|None|00 +GAACACACTGACTCAAACC +>76|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>77|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>78|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTTCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCAGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>79|IGHV1-63 ENSMUST00000103534|IGHV1-63|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCGGGGTCTTTATCTTTCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACCTTCACTAACTACTGGATAGGTTGGGCAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGATATTTACCCTGGAGGTGGTTATACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGTTCAGCAGCCTGACATCTGAGGACTCTGCCATCTATTACTGTGCAAGA +>80|IGHV1-64 ENSMUST00000103535|IGHV1-64|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACAGTTCTCTCTACAGTTACTGAGCACACAGGACCTCACA +>81|IGHV1-64 ENSMUST00000103535|IGHV1-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTATATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTAAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACTTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAATGATTCATCCTAATAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>82|IGHV1-66 ENSMUST00000103537|IGHV1-66|5'UTR|IG|IGH|None|00 +ATGATCAGTGTCCTCTCTACACAGTCCCTGACGACACTGACTCTAACC +>83|IGHV1-66 ENSMUST00000103537|IGHV1-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACAGCTTCACAAGCTACTATATACACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGTGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACGGCAGACACATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTAACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>84|IGHV1-69 ENSMUST00000199933|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGATGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGTCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>85|IGHV1-7 ENSMUST00000103496|IGHV1-7|5'UTR|IG|IGH|None|00 +GCATCCTCTCCACAGACACTGAAAACTCTGACTCAAC +>86|IGHV1-7 ENSMUST00000103496|IGHV1-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTCCCTGTTGTCAGTAATAGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAAACCTGGGGCCTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTGAGCAGCCTGACATATGAGGACTCTGCAGTCTATTACTGTGCAAGA +>87|IGHV1-71 ENSMUST00000196690|IGHV1-71|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>88|IGHV1-72 ENSMUST00000103541|IGHV1-72|5'UTR|IG|IGH|None|00 +AGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>89|IGHV1-72 ENSMUST00000103541|IGHV1-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>90|IGHV1-74 ENSMUST00000196587|IGHV1-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGCCAAGGCCTTGAGTGGATTGGAAGGATTCATCCTTCTGATAGTGATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAATA +>91|IGHV1-75 ENSMUST00000103544|IGHV1-75|5'UTR|IG|IGH|None|00 +CCTGACGACACTGACTCTAACC +>92|IGHV1-75 ENSMUST00000103544|IGHV1-75|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTACAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTTTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTTACTGTAGACAAATCCTCCAGCACAGCCTACATGTTGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>93|IGHV1-76 ENSMUST00000197537|IGHV1-76|5'UTR|IG|IGH|None|00 +CGACACTGATTCTAACC +>94|IGHV1-76 ENSMUST00000197537|IGHV1-76|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTGTCAGGTCCAGCTGAAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACTTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGCAAGGATTTATCCTGGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGAAAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCTGTCTATTTCTGTGCAAGA +>95|IGHV1-77 ENSMUST00000198777|IGHV1-77|5'UTR|IG|IGH|None|00 +AAACAACCTATGATCAGTGTCCTCTCCACAGTCTCTGAACACCCTTACTCAAACC +>96|IGHV1-77 ENSMUST00000198777|IGHV1-77|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTCCAGCTGAAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAAGATTGGTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>97|IGHV1-78 ENSMUST00000199373|IGHV1-78|5'UTR|IG|IGH|None|00 +GTCCCTGAACACACTGACTGTAACA +>98|IGHV1-78 ENSMUST00000199373|IGHV1-78|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTCTCTCTTCTTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGTTCAGCTGCAACAGTCTGACGCTGAGTTGGTGAAACCTGGAGCTTCAGTGAAGATATCCTGCAAGGTTTCTGGCTACACCTTCACTGACCATACTATTCACTGGATGAAGCAGAGGCCTGAACAGGGCCTGGAATGGATTGGATATATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>99|IGHV1-80 ENSMUST00000103547|IGHV1-80|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTTGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAAGCTTCTGGCTACGCATTCAGTAGCTACTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACAGATTTATCCTGGAGATGGTGATACTAACTACAACGGAAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>100|IGHV1-81 ENSMUST00000103548|IGHV1-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGATCTTTCTCTTCATCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGGCGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTATGGTATAAGCTGGGTGAAGCAGAGAACTGGACAGGGCCTTGAGTGGATTGGAGAGATTTATCCTAGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCGTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>101|IGHV1-82 ENSMUST00000196991|IGHV1-82|5'UTR|IG|IGH|None|00 +CTTCTCCACAGTCCCAGAACACACTCACTCTAACC +>102|IGHV1-82 ENSMUST00000196991|IGHV1-82|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTGTATCTTTCTCTTCCTCCTGTCAGTAACTGAAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAGGCTTCTGGCTACGCATTCAGTAGCTCCTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACGGATTTATCCTGGAGATGGAGATACTAACTACAATGGGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTACTTCTGTGCAAGA +>103|IGHV1-84 ENSMUST00000103551|IGHV1-84|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTTTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGATCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGCGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>104|IGHV1-85 ENSMUST00000103552|IGHV1-85|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTACGATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCGTACATGGAGCTCCACAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>105|IGHV1-9 ENSMUST00000193893|IGHV1-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGACCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGATGAAGCCTGGGGCCTCAGTGAAGCTTTCCTGCAAGGCTACTGGCTACACATTCACTGGCTACTGGATAGAGTGGGTAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGAGATTTTACCTGGAAGTGGTAGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACATTCACTGCAGATACATCCTCCAACACAGCCTACATGCAACTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>106|IGHV10-1 ENSMUST00000103492|IGHV10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGCTGTTGGGGCTGAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGGTCATTGAAACTCTCATGTGCAGCCTCTGGATTCAGCTTCAATACCTACGCCATGAACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAATAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCAGAAAGCATGCTCTATCTGCAAATGAACAACTTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGACA +>107|IGHV10-3 ENSMUST00000103495|IGHV10-3|5'UTR|IG|IGH|None|00 +GACAATATAACATTGAAC +>108|IGHV10-3 ENSMUST00000103495|IGHV10-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGTGTTGGGGCTTAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGATCATTGAAACTCTCATGTGCCGCCTCTGGTTTCACCTTCAATACCTATGCCATGCACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAGTAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCACAAAGCATGCTCTATCTGCAAATGAACAACCTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGAGA +>109|IGHV11-1 ENSMUST00000103466|IGHV11-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGAAGGCTTGGTGCCACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGCTTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCTGAGGACACAGCCACGTATTTCTGTATGAGATA +>110|IGHV11-2 ENSMUST00000103468|IGHV11-2|5'UTR|IG|IGH|None|00 +ATGCAAATAGGGCCTCTTTCTACTCATGAAACGCAGACCAACCTATCCTTGCAGTTCAGACAGAGGAGCTTGGCTCTGGTTCCCAAGACCTCTTACTCACTTCTCAAC +>111|IGHV11-2 ENSMUST00000103468|IGHV11-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGGAGGCTTGGTGCAACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGATTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCGGAGGACACAGCCACGTATTTCTGTATGAGATA +>112|IGHV12-3 ENSMUST00000103485|IGHV12-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGCTGGGATTTGTGTGCCTGGTGACAGTCCTTCCTGGTAGCCTGTCTCAGATGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCCTCACAGTCACTCTTCCTTACCTGCTCTATTACTGGTTTCCCCATCACCAGTGGTTACTACTGGATCTGGATCCGTCAGTCACCTGGGAAACCCCTAGAATGGATGGGGTACATCACTCATAGTGGGGAAACTTTCTACAACCCATCTCTCCAGAGCCCCATCTCCATTACTAGAGAAACGTCAAAGAACCAGTTCTTCCTCCAATTGAACTCTGTGACCACAGAGGACACAGCCATGTATTACTGTGCAGGAGACAG +>113|IGHV13-2 ENSMUST00000125484|IGHV13-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGACTGAGCTGGGTATTTCTTGTGGCTCTTTTGAACGGTGTCCAGTGTCAGGTGCAGCTTGTAGAGACCGGGGGAGGCTTGGTGAGGCCTGGAAATTCTCTGAAACTCTCCTGTGTTACCTCGGGATTCACTTTCAGTAACTACCGGATGCACTGGCTTCGCCAGCCTCCAGGGAAGAGGCTGGAGTGGATTGCTGTAATTACAGTCAAATCTGATAATTATGGAGCAAATTATGCAGAGTCTGTGAAAGGCAGATTCGCCATTTCAAGAGATGATTCAAAAAGCAGTGTCTACCTAGAGATGAACAGATTAAGAGAGGAAGACACTGCCACTTATTTTTGTAGTAGACA +>114|IGHV14-1 ENSMUST00000103463|IGHV14-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGATACTGAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATGACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>115|IGHV14-2 ENSMUST00000103467|IGHV14-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGATCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAAGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGACTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGAAACTAAATATGCCCCGAAATTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTGCTAGA +>116|IGHV14-3 ENSMUST00000103469|IGHV14-3|5'UTR|IG|IGH|None|00 +ATATGAGCCCTATATTCTCTACAGACACTGAATCTCAAGGTCCTTACA +>117|IGHV14-3 ENSMUST00000103469|IGHV14-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATTCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGTGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAAACACCTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGCGAATGGTAATACTAAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATAACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCATCTATTACTGTGCTAGA +>118|IGHV14-4 ENSMUST00000195706|IGHV14-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTATAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTTAACATTAAAGACGACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGATGGATTGATCCTGAGAATGGTGATACTGAATATGCCTCGAAGTTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>119|IGHV15-2 ENSMUST00000195337|IGHV15-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGATCACTCTCCATCTGCTGGCAGCAGCTACAGGTATCCAATCCCAGGTTCACCTACAACAGTCTGGTTCTGAACTGAGGAGTCCTGGGTCTTCAGTAAAGCTGTCATGCAAGGATTTTGATTCAGAAGTCTTCCCTATTGCTTATATGAGTTGGGTAAGGCAGAAGCCTGGGCATGGATTTGAATGGATTGGAGGCATACTCCCAAGTATTGGTAGAACAATCTATGGAGAGAAGTTTGAGGACAAAGCCACATTGGATGCAGACACACTGTCCAACACAGCCTACTTGGAGCTCAACAGTCTGACATCCGAGGACTCTGCTATCTACTACTGTGCAAGG +>120|IGHV16-1 ENSMUST00000195641|IGHV16-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTTAGTTGGGCTTTCCTTGTTATTTTAAAAGGCATACAGGGTGAGGTGCAGCTGGTGGAATCTGGAGGCAGCTTGGGACAGCCTGGAGGGTCCACTAAACTCTCTTGTGAAGAAGCATCTGGATTCACTTTCAGTGATCATTGGATGGACTGGTTTCGCCAAGCCCCAGGCATGAGGCTAGAATGGTTAGCAAATACAAACCATGATGAGAGTGGAAAAGGCTATGCAGAGTCTGTGAAAGACAGATTCTCCATCTCCAGAGACAATTCTGAGAACTTATTGTATCTACAAATGAACAGTCTGAGAAACGAAGACACGGCTCTGTATTATTGTGCCAGAGA +>121|IGHV2-2 ENSMUST00000103443|IGHV2-2|5'UTR|IG|IGH|None|00 +GC +>122|IGHV2-2 ENSMUST00000103443|IGHV2-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCTTGGGGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCAGCTTTCATATCCAGACTGAGCATCAGCAAGGACAATTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACAGCCATATATTACTGTGCCAGAAA +>123|IGHV2-3 ENSMUST00000178229|IGHV2-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCACTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCAGGGTTCTCATTAACCAGCTATGGTGTAAGCTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGACGGGAGCACAAATTATCATTCAGCTCTCATATCCAGACTGAGCATCAGCAAGGATAACTCCAAGAGCCAAGTTTTCTTAAAACTGAACAGTCTGCAAACTGATGACACAGCCACGTACTACTGTGCCAA +>124|IGHV2-4 ENSMUST00000103447|IGHV2-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCTGCTTTCATATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>125|IGHV2-5 ENSMUST00000195707|IGHV2-5|5'UTR|IG|IGH|None|00 +ATCCTTGCTCATTGTTTCCTTTTATCCTTTCAGAAACCTCCCCCAATGCAAAGCAGCCCTCAGGCAGAGGATAAAAGCCCACACAAAGCTGAGAAGCCCCATCCTCTTCTCATAGAGCCTCCATCAGAGC +>126|IGHV2-5 ENSMUST00000195707|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATAACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGAGGTGGAAGCACAGACTACAATGCAGCTTTCATGTCCAGACTGAGCATCACCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>127|IGHV2-6 ENSMUST00000179657|IGHV2-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTTCTCTGCCTGGTGACTTTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACCGTCTCAGGGTTCTCATTAACCAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGTAGTGATATGGAGTGATGGAAGCACAACCTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTCCAAACTGATGACACAGCCATGTACTACTGTGCCAGACA +>128|IGHV2-6-8 ENSMUST00000192911|IGHV2-6-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTATCCTTTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGTTGGAAGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAGTGA +>129|IGHV2-7 ENSMUST00000103456|IGHV2-7|5'UTR|IG|IGH|None|00 +AGAGC +>130|IGHV2-7 ENSMUST00000103456|IGHV2-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTCCTCTGCCTGGTGACCTTTCCAAGCTGTGTCCTGTCACAAGTGCAGATGAAGGAGTCAGGACCTGACCTTGTGCAGCCATCACAGACTCTGTCTCTCACCTGCACTGTCTCTGGGTTCTCATTAAGTAGCTATGGTGTACATTGGTTTCGCAAGCCTCCGAGAAAGGGATTGGAATGGTTGGGAGGAATATGGTCTGGTGGAAGCATATACTATACTCCAGCTCTCAGTTCCCGACTGAGTGTCAGCAGGGACACCTCTAAGAGCCAAGTTTTCTTTAAAATGAGCAGTCTGCAAAGTGAAGACACGGCTGTGTACCACTGTGCCAGATA +>131|IGHV2-9 ENSMUST00000103451|IGHV2-9|5'UTR|IG|IGH|None|00 +CCCCATCAGAGC +>132|IGHV2-9 ENSMUST00000103451|IGHV2-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGTTCCTCTGCCTGGTTGCATTTCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACTTGCACTGTCTCTGGGTTTTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGGTGGAAGCACAAATTATAATTCAGCTCTCATGTCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAAACA +>133|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|5'UTR|IG|IGH|None|00 +ATAGAGCCTCCATCAGAGC +>134|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTGCCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGCTATAAGCTGGGTTCGCCAGCCACCAGGAAAGGGTCTGGAGTGGCTTGGAGTAATATGGACTGGTGGAGGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGTCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCAGGTACTACTGTGCCAGAAA +>135|IGHV3-1 ENSMUST00000103478|IGHV3-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGCGTGCTGATTCTTTTGTGGCTGTTCACAGCCTTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCATGGTGAAACCTTCTCAGTCACTTTCCCTCACCTGCACTGTCACTGGCTACTCCATCACCAGTGGTTATGACTGGCACTGGATCCGACATTTTCCAGGAAACAAACTGGAGTGGATGGGCTACATAAGCTACAGTGGTAGCACTAACTACAACCCATCCCTCAAAAGTCGAATCTCCATCACTCATGACACATCTAAGAACCATTTCTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>136|IGHV3-3 ENSMUST00000191693|IGHV3-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAATGTTGAGTGTTCTGTACCTGTTGTCAGCCCTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTAGCCTGGTGAGACCTTCTCAGACACTCTCCCTTACCTGCACTGTTACTGGCTTCTCCATCAACAGTGATTGTTACTGGATCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTACATCGGGTACACATTCTACAGTGGTATCACTTACTACAACCCATCTCTTGAAAGTCGAACGTACATAACGCGTGACACATCTAAGAACCAGTTCTCACTGAAGTTGAGTTCTGTGACTACTGAGGACACAGCCACTTACTACTGTGCGAGAGA +>137|IGHV3-4 ENSMUST00000193408|IGHV3-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGTTGATTCTTGTGTACCTGTTGACAGCCCTTCCTGGTATCTTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGCCCTGGTGAAGCCTTCTCAGACAGTGTCCCTCACCTGCACTGTCACTGGCTACTCTATCACTAATGGTAATCACTGGTGGAACTGGATCCGGCAGGTTTCAGGAAGCAAACTGGAGTGGATAGGGTACATAAGCTCCAGTGGTAGCACTGACAGCAATCCATCTCTCAAAAGTCGAATCTCCATCACTAGAGACACTTCCAAGAACCAGTTATTCCTGCAGTTGAACTCTGTGACTACTGAAGATATAGCCACATATTACTGTGCAAGAGA +>138|IGHV3-5 ENSMUST00000195619|IGHV3-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAATGTTCACTCTTCTGTACCTGTTGACAGTCGTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCTTCTCAGACAGTGTTCCTCACCTGCACTGTCACTGGCATTTCCATCACCACTGGAAATTACAGGTGGAGCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTGGATAGGGTACATATACTACAGTGGTACCATTACCTACAATCCATCTCTCACAAGTCGAACCACCATCACTAGAGACACTCCCAAGAACCAGTTCTTCCTGGAAATGAACTCTTTGACTGCTGAGGACACAGCCACATACTACTGTGCACGAGA +>139|IGHV3-6 ENSMUST00000195124|IGHV3-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAGTGTTGAGTCTGTTGTACCTGTTGACAGCCATTCCTGGTATCCTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGGCCTCGTGAAACCTTCTCAGTCTCTGTCTCTCACCTGCTCTGTCACTGGCTACTCCATCACCAGTGGTTATTACTGGAACTGGATCCGGCAGTTTCCAGGAAACAAACTGGAATGGATGGGCTACATAAGCTACGATGGTAGCAATAACTACAACCCATCTCTCAAAAATCGAATCTCCATCACTCGTGACACATCTAAGAACCAGTTTTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>140|IGHV3-8 ENSMUST00000103483|IGHV3-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGTGTTAAGTCTTCTGTACCTGTTGACAGCCCTTCCGGGTATCCTGTCAGAGGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGCAAAACCTTCTCAGACTCTGTCCCTCACCTGTTCTGTCACTGGCTACTCCATCACCAGTGATTACTGGAACTGGATCCGGAAATTCCCAGGGAATAAACTTGAGTACATGGGGTACATAAGCTACAGTGGTAGCACTTACTACAATCCATCTCTCAAAAGTCGAATCTCCATAACTCGAGACACATCCAAGAACCAGTATTACCTGCAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGATACACAGTGTGGAGTCTTCAGTGTAGGCCCAGACATAAACCTCCTTGTA +>141|IGHV4-1 ENSMUST00000103464|IGHV4-1|5'UTR|IG|IGH|None|00 +GAAGCAAAGGGGATCAGCCCGAGATTCTCATTCAGTGATCAACACTGAACACACATCCCTTACC +>142|IGHV4-1 ENSMUST00000103464|IGHV4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTTTGGGCTGATTTTTTTTATTGTTGCTCTTTTAAAAGGGGTCCAGTGTGAGGTGAAGCTTCTCCAGTCTGGAGGTGGCCTGGTGCAGCCTGGAGGATCCCTGAAACTCTCCTGTGCAGCCTCAGGAATCGATTTTAGTAGATACTGGATGAGTTGGGTTCGGCGGGCTCCAGGGAAAGGACTAGAATGGATTGGAGAAATTAATCCAGATAGCAGTACAATAAACTATGCACCATCTCTAAAGGATAAATTCATCATCTCCAGAGACAACGCCAAAAATACGCTGTACCTGCAAATGAGCAAAGTGAGATCTGAGGACACAGCCCTTTATTACTGTGCAAGACC +>143|IGHV5-12 ENSMUST00000103450|IGHV5-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTGGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATTACATGTATTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAATGGTGGTGGTAGCACCTATTATCCAGACACTGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCCGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>144|IGHV5-12-4 ENSMUST00000195381|IGHV5-12-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCATATTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTCGTGGAGTCTGGGGGAGGTTTAGTGAAGCCTGGACAGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACTATTACATGTCTTGGGTTCACCAGACTCCGGAGAAGAGGCTGGAGTGGGTTGCATACATTAGTAGTAGTGGTGTTAGCACCTATTATCCAGACAATGTAAAGGGCCGATTCGCCATCTCCAGAGACAATGCCAAGAACACCCTTTACCTGCAAATGACCAGTCTGAAGTCAGAGGACACGGCCTTGTATTACTGTGCAAGAGG +>145|IGHV5-15 ENSMUST00000192877|IGHV5-15|5'UTR|IG|IGH|None|00 +CACTCATC +>146|IGHV5-15 ENSMUST00000192877|IGHV5-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCAGGCTCAGCTTACTTATTTTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTACGGAATGGCGTGGGTTCGACAGGCTCCAAGGAAGGGGCCTGAGTGGGTAGCATTCATTAGTAATTTGGCATATAGTATCTACTATGCAGACACTGTGACGGGCCGATTCACCATCTCTAGAGAGAATGCCAAGAACACCCTGTACCTGGAAATGAGCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGACA +>147|IGHV5-16 ENSMUST00000193652|IGHV5-16|5'UTR|IG|IGH|None|00 +ATCAGGACTGAACACAGACCAGTCACC +>148|IGHV5-16 ENSMUST00000193652|IGHV5-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTCAGGCTCAGCTCAGTTTTTCTTGTTCTTATTTTAAAAGGAGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGAGGGAGGCTTAGTGCAGCCTGGAAGTTCCATGAAACTCTCCTGCACAGCCTCTGGATTCACTTTCAGTGACTATTACATGGCTTGGGTCCGCCAGGTTCCAGAAAAGGGTCTAGAATGGGTTGCAAACATTAATTATGATGGTAGTAGCACCTACTATCTGGACTCCTTGAAGAGCCGTTTCATCATCTCGAGAGACAATGCAAAGAACATTCTATACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCACGTATTACTGTGCAAGAGA +>149|IGHV5-17 ENSMUST00000103459|IGHV5-17|5'UTR|IG|IGH|None|00 +TGGATTCCCAGGTCCTCACATTCAGTGATCAGCACTGAACACAGACCACTCACC +>150|IGHV5-17 ENSMUST00000103459|IGHV5-17|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTCCAGGCTCAATTTAGTTTTCCTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATGGAATGCACTGGGTTCGTCAGGCTCCAGAGAAGGGGCTGGAGTGGGTTGCATACATTAGTAGTGGCAGTAGTACCATCTACTATGCAGACACAGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTTCCTGCAAATGACCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGG +>151|IGHV5-2 ENSMUST00000195468|IGHV5-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCGGGCTCAGCTTGGTTTTCCTTGTCCTTATTTTAAAAAGTGTACAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGAGTCCCTGAAACTCTCCTGTGAATCCAATGAATACGAATTCCCTTCCCATGACATGTCTTGGGTCCGCAAGACTCCGGAGAAGAGGCTGGAGTTGGTCGCAGCCATTAATAGTGATGGTGGTAGCACCTACTATCCAGACACCATGGAGAGACGATTCATCATCTCCAGAGACAATACCAAGAAGACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACAGCCTTGTATTACTGTGCAAGACA +>152|IGHV5-4 ENSMUST00000103444|IGHV5-4|5'UTR|IG|IGH|None|00 +TGACAGAGGAGGCCGGTCCTGGATTCGAGTTCCTCACATTCAGTGATGAGCACTGAACACGGACCCCTCACC +>153|IGHV5-4 ENSMUST00000103444|IGHV5-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCGGAAAAGAGGCTGGAGTGGGTCGCAACCATTAGTGATGGTGGTAGTTACACCTACTATCCAGACAATGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACAACCTGTACCTGCAAATGAGCCATCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGAGA +>154|IGHV5-6 ENSMUST00000103446|IGHV5-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGACTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGGCATGTCTTGGGTTCGCCAGACTCCAGACAAGAGGCTGGAGTGGGTCGCAACCATTAGTAGTGGTGGTAGTTACACCTACTATCCAGACAGTGTGAAGGGGCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>155|IGHV5-9 ENSMUST00000103448|IGHV5-9|5'UTR|IG|IGH|None|00 +GGAGGCAGGTCCTAGATTTGAGTTCCTCACATTCAGTGATCAGCACTGAACACGGAACCCTCACC +>156|IGHV5-9 ENSMUST00000103448|IGHV5-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTTGGGCTGAGCTTGATTTTCCTTGTCCTAATTTTAAAAGGTGTCCAGTGTGAAGTGATGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATACCATGTCTTGGGTTCGCCAGACTCCGGAGAAGAGGCTGGAGTGGGTCGCAACCATTAGTGGTGGTGGTGGTAACACCTACTATCCAGACAGTGTGAAGGGTCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACGGCCTTGTATTACTGTGCAAGACA +>157|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|5'UTR|IG|IGH|None|00 +CTGGAATTGATTCCTAGTTCCTCACGTTCAGTG +>158|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGTACTGAACACAGACCCCTCACCATGAACTTCGGGCTCAGATTGATTTTCCTTGTCCTTACTTTAAAAGGTGTCCAGTGTGACGTGAAGCTGGTGGAGTCTGGGGAAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAGTGGTGGTGATTACATCTACTATGCAGACACTGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAGGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTACAAGAGA +>159|IGHV6-3 ENSMUST00000103486|IGHV6-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGAGACTGAGCTGTGCTTTTATTATTGTTCTTTTAAAAGGGGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTCAGTAACTACTGGATGAACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTCAAATTAGATTGAAATCTGATAATTATGCAACACATTATGCGGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAACTTAAGGGCTGAAGACACTGGAATTTATTACTGCACAGG +>160|IGHV6-4 ENSMUST00000191918|IGHV6-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGAACTGAGCTGTGTTTTCATTGTTGTTCTCTTAAAAGGTGTCCAGAGTGATGTGAACCTGGAAGTGTCTGGAGGAGGCTTAGTTAAACCTGGAGGATCCATGCAACTCTTTTGTGTAGCCTCTGGATTTACTTTTGTAGATGGCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGTCTTGAGTGGGTTGCTGAAATTGCAAACAAAGCTAATAATTATGCAACATATTATCCCGAGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTTCAAAAGTAGTGTCTACCTGCATATGAACAGCTTAAGAGCCGAAGATACAGGCATTTATTACTGTACAAGG +>161|IGHV6-5 ENSMUST00000193936|IGHV6-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGGAACTGAACTGTGTTTTCATTGTTGTCCTCTTAAAAGGTGTCCAGAGTGAAGTGAAAATTGAGGAGTCAGGAGGAGGCTTGGTCCAACCTGGAGGATCCATGAAACTCTCTTGTGCAGCCTCTGGATTCACTTTCAGTGATTACAGGATGGACTGGGTCCACCACTCTACAGAGAATGGGTTGGAGTGGGTTGCTGAAATTAGAAACAAAGCTAGTAATTATGCAACATATTATGTGGAGTCTGTGAATGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGATACTGGCATTTATTACTGTACAAGG +>162|IGHV6-6 ENSMUST00000103489|IGHV6-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAACTGTGTATTCATAGTTTTTCTCTTAAAAGGTGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCTTGTGCTGCCTCTGGATTCACTTTTAGTGACGCCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTGAAATTAGAAACAAAGCTAATAATCATGCAACATACTATGCTGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGACACTGGCATTTATTACTGTACCAGG +>163|IGHV6-7 ENSMUST00000193397|IGHV6-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAGCTGTGTATTCATTTTTTTTCTCTTAAAAGGTGTCCAGTGTGAGGAGAAGCTGGATGAGTCTGGAGGAGGCTTGGTGCAACCTGGGAGGTCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTTACTAACTCCTGGATGAACTGGTTCTGCCAGTCTCCAGAGAAAGGACTGGAGTGGGTAGCACAAATTAAAAGCAAACCTTATAATTATGAAACATATTATTCAGATTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTATACCTGCAAATGAACAACTTAAGAGCTGAAGACACGGGCATCTATTACTGTACATGG +>164|IGHV7-1 ENSMUST00000103474|IGHV7-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGTTAAACTGGGTTTTTCTTTTAACACTTTTACATGGTATCCAGTGTGAGGTGAAGCTGGTGGAATCTGGAGGAGGCTTGGTACAGTCTGGGCGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCAGTGATTTCTACATGGAGTGGGTCCGCCAAGCTCCAGGGAAGGGACTGGAGTGGATTGCTGCAAGTAGAAACAAAGCTAATGATTATACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCATCGTCTCCAGAGACACTTCCCAAAGCATCCTCTACCTTCAGATGAATGCCCTGAGAGCTGAGGACACTGCCATTTATTACTGTGCAAGAGATGCA +>165|IGHV7-2 ENSMUST00000193133|IGHV7-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGTTTAACATCATTATCTTCACAGTAACACCTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGAAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCACTGATTTCTACATGAACTGGGTCTGCCAGCCTCCAAGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGACTACAGTGCATCTATGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAACACACTGAGAACTGAGGACAGTGCCACTTATTACTGTGCAAGAGATACA +>166|IGHV7-3 ENSMUST00000103461|IGHV7-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGCTGAACTGGATTTTCCTTGTAACACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGTCTCTCCTGTGCAGCTTCTGGATTCACCTTCACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAATGCCCTGAGAGCTGAGGACAGTGCCACTTATTACTGTGCAAGATATA +>167|IGHV7-4 ENSMUST00000192499|IGHV7-4|5'UTR|IG|IGH|None|00 +ATGAACCTAGTCTTGATTTCCCCAGCCTTCAGTTCCCAGATTCAGTGATCAGCCTTGAACACAGACCTGTCACC +>168|IGHV7-4 ENSMUST00000192499|IGHV7-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGGTGAACTGGATTCTACTTGTAGCACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGATGGAATCTGGAGGAGGCTTGGTACAGCCTGGGGCTTCTCTGAGACTCTCCTGTGCAGCTTCTGGATTCACCTTTACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACCTGAGTGGTTGGCTTTGATTAGAAACAAAGCTAATGGTTACACAACAGAGTATACTGCATCTGTTAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAACATCCTCTATCTTCAAATGAACACCCTGAGGGCTGAGGACAGTGCCACTTATTACTGTGTAAAAGCTGTA +>169|IGHV8-11 ENSMUST00000103536|IGHV8-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGCTACTGATTGTTCCTGCATATGTCCTCTCCCAGATTACTCAGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTAGGCTGGATTCATCAGCCTTCAGGGAATGGTCTGGAGTGGCTGGCACACATTTGGTGGAATGATAATAAGTACTATAACACAGCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCGCCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>170|IGHV8-12 ENSMUST00000199266|IGHV8-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTGCTGCTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGTCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGAAAGGGTCTGGAGTGGCTGGCACACATTTACTGGGATGATGACAAGCGCTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAGAAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAAGAG +>171|IGHV8-2 ENSMUST00000195037|IGHV8-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGACTTACATTCTCATTCCTGCTGCTGCTGCCTGTCCCTGCATATGTCCTATCTCAGGTTACTCTGAAAGTGTCTGGCCCTGGGATATTGCAGCCATCACAGACTCTCAGCCTGGCCTGTACTTTCTCTGGGATTTCACTGAGTACTTCTGGTATGGGTTTGAGCTGGCTTCGTAAGCCCTCAGGGAAGGCTTTAGAGTGGCTGGCAAGCATTTGGAATAATGATAACTACTACAACCCATCTTTGAAGAGCCGGCTCACAATCTCCAAGGAGACCTCCAACTACCAAGTATTCCTTAAACTCACCAGTGTGGACACTGCAGATTCTGCCACATACTACGGTGCTTGGAGAGA +>172|IGHV8-4 ENSMUST00000192298|IGHV8-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTATGTCTTCATTCCTGCTGCTGGTTGTCCCTATATATGTTCTGTCCCAGATTACTCTGAAACAGTCTGGCCCTGGGATAGTGCAGCCATCCCAGCCCGTCAGACTTACTTGCACTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATAGGTGTAACCTGGATTCGTCAGCCCTCAGGGAAGGGTCTGGAGTGGCTGGCAACCATTTGGTGGGATGATGATAACCGCTACAACCCATCTCTAAAGAGCAGGCTCGCAGTCTCCAAAGACACCTCCAACAACCAAGCATTCCTGAATATCATCACTGTGGAAACTGCAGATACTGCCATATACTACTGTGCT +>173|IGHV8-5 ENSMUST00000194257|IGHV8-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCTTGCTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTAATATGGGTATAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTAGAGTGGCTGGCACACATTTGGTGGAATGATGATAAGTACTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCAAATAG +>174|IGHV8-6 ENSMUST00000193145|IGHV8-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCGCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGTACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGATCTGGAGTGGCTGGCACACATTTATTGGGATGATGACAAGCACTATAACCCATCCTTGAAGAGCCAGCTCAGAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGTAGATACTGCCACATACTACTGTGCTCGA +>175|IGHV8-8 ENSMUST00000192591|IGHV8-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGTTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTTTGGTATGGGTGTAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTGGTGGGATGATGATAAGTACTATAACCCAGCCCTGAAGAGTCGGCTCACAATCTCCAAGGATACCTCCAAAAACCAGGTATTCCTCAAGATCGCCAATGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>176|IGHV9-1 ENSMUST00000195884|IGHV9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATAGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCATGATATACACCGACACTGGAGAGCCAACATATGCTGAAGAGTTCAAGGGACGGTTTGCCTTCTCTTTGGAGACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGTAAGA +>177|IGHV9-2 ENSMUST00000103472|IGHV9-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATGGCAGCTGCCCAAAGGGCTCAAGCACAGATCCAGTTCGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGTGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCTGGATAAACACCTACTCTGGAGAGCCAACATATGCTGACGACTTCAAGGGACGGTTTGCCTTTTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>178|IGHV9-3 ENSMUST00000103473|IGHV9-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGTTGGCTGTGGAACTTGCTATTCCTGATGGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTACAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACCTATGGAATGAGCTGGGTGAAACAGGCTCCAGGAAAGGGTTTAAAGTGGATGGGCTGGATAAACACCTACTCTGGAGTGCCAACATATGCTGATGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>179|IGHV9-4 ENSMUST00000194159|IGHV9-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCTGTGGAACTTGCTATTTCTCATGGCAGCAGCTCAAAGTATCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACTGCTGGAATGCAGTGGGTGCAAAAGATGCCAGGAAAGGGTTTTAAGTGGATTGGCTGGATAAACACCCACTCTGGAGAGCCAAAATATGCAGAAGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTACAGATAAGCAACCTCAAAAATGAGGACACGGCTACGTATTTCTGTGCGAGA +>180|IGKC ENSMUST00000103410|IGKC|C-REGION|IG|IGK|None|00 +GGGCTGATGCTGCACCAACTGTATCCATCTTCCCACCATCCAGTGAGCAGTTAACATCTGGAGGTGCCTCAGTCGTGTGCTTCTTGAACAACTTCTACCCCAAAGACATCAATGTCAAGTGGAAGATTGATGGCAGTGAACGACAAAATGGCGTCCTGAACAGTTGGACTGATCAGGACAGCAAAGACAGCACCTACAGCATGAGCAGCACCCTCACGTTGACCAAGGACGAGTATGAACGACATAACAGCTATACCTGTGAGGCCACTCACAAGACATCAACTTCACCCATTGTCAAGAGCTTCAACAGGAATGAGTGT +>181|IGKJ1 ENSMUST00000103405|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGTGGAGGCACCAAGCTGGAAATCAAAC +>182|IGKJ2 ENSMUST00000198234|IGKJ2|J-REGION|IG|IGK|None|00 +TGTACACGTTCGGAGGGGGGACCAAGCTGGAAATAAAAC +>183|IGKJ3 ENSMUST00000199487|IGKJ3|J-REGION|IG|IGK|None|00 +AATCACATTCAGTGATGGGACCAGACTGGAAATAAAAC +>184|IGKJ4 ENSMUST00000103408|IGKJ4|J-REGION|IG|IGK|None|00 +ATTCACGTTCGGCTCGGGGACAAAGTTGGAAATAAAAC +>185|IGKJ5 ENSMUST00000199459|IGKJ5|J-REGION|IG|IGK|None|00 +GCTCACGTTCGGTGCTGGGACCAAGCTGGAGCTGAAAC +>186|IGKV1-110 ENSMUST00000103321|IGKV1-110|5'UTR|IG|IGK|None|00 +GATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>187|IGKV1-110 ENSMUST00000103321|IGKV1-110|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCCTTGTACACAGTAATGGAAACACCTATTTACATTGGTACCTGCAGAAGCCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTTCTGCTCTCAAAGTACACATGTTCCTCC +>188|IGKV1-117 ENSMUST00000103317|IGKV1-117|5'UTR|IG|IGK|None|00 +ACTGATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>189|IGKV1-117 ENSMUST00000103317|IGKV1-117|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTTTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCATTGTACATAGTAATGGAAACACCTATTTAGAATGGTACCTGCAGAAACCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTACTGCTTTCAAGGTTCACATGTTCCTCC +>190|IGKV1-122 ENSMUST00000103314|IGKV1-122|5'UTR|IG|IGK|None|00 +GTCTCCTCAGGCTCCCTCCTCAAA +>191|IGKV1-122 ENSMUST00000103314|IGKV1-122|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGCTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGGTCTAGTCAGAGCCTTGAAAACAGTAATGGAAACACCTATTTGAACTGGTACCTCCAGAAACCAGGCCAGTCTCCACAGCTCCTGATCTACAGGGTTTCCAACCGATTTTCTGGGGTCCTAGACAGGTTCAGTGGTAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTTCTGCCTCCAAGTTACACATGTCCCTCC +>192|IGKV1-131 ENSMUST00000103306|IGKV1-131|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGCTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTACATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCGCCTATTCTATCTGGTATCCAAACTGGACCCTGGCATCCCTGACAGTTTCAGTGGCAGTGGATCAGAGACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCCTGCAAGGTACACATTTTCCTCT +>193|IGKV1-132 ENSMUST00000103305|IGKV1-132|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGTTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTGTCTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCACCTAATGTATCAGGTGTCCAAACTGGACCCTGGCATCCCTGACAGGTTCAGTGGCAGTGGATCAGAAACAGATTTTACACTTAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCTTGCAAGGTACATATTATCCTCA +>194|IGKV1-133 ENSMUST00000103304|IGKV1-133|5'UTR|IG|IGK|None|00 +TATTTCCTCAAA +>195|IGKV1-133 ENSMUST00000103304|IGKV1-133|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAAACCTATTTGAATTGGTTATTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGAACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCGTGCAAGGTACACATTTTCCTCA +>196|IGKV1-135 ENSMUST00000103303|IGKV1-135|5'UTR|IG|IGK|None|00 +ACTGATCACTCTCCTATGTTCATTTCCTCAAA +>197|IGKV1-135 ENSMUST00000103303|IGKV1-135|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCGGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTAGATAGTGATGGAAAGACATATTTGAATTGGTTGTTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTGGCAAGGTACACATTTTCCTCA +>198|IGKV1-35 ENSMUST00000197820|IGKV1-35|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCACTCCATATTTATATTGTTGCTTTGGATTGTGGGAATCAGTGGTGACGTTGTGATGACCCAGACTCCACTCACTTTATCAGCTACCATTGGACAATCAGCCTCCGTCTCTTGCAGGTCAAGTCAGAGTCTCTTACATAGTAATGGAAACACATACTTGAATTGGTTTGTACAAAGGCCAGGCCCATCTCCACAGCTTCTAATTTATGGGGTGTTTGAACAGGAATCTGGGGTTCCTGACAGGTTCAGTGGCAGTGGGTCTGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCATGCAAGCTACCTATGAACCTCC +>199|IGKV1-88 ENSMUST00000103336|IGKV1-88|L-REGION+V-REGION|IG|IGK|None|00 +ATGAATTTGCCTGTTCATCTCTTGGTGCTTCTGTTGTTCTGGATTCCTGCTTCCAGAGGTGATGTTGTGGTGACTCAAACTCCACTCTCCCTGCCTGTCAGCTTTGGAGATCAAGTTTCTATCTCTTGCAGGTCTAGTCAGAGTCTTGCAAACAGTTATGGGAACACCTATTTGTCTTGGTACCTGCACAAGCCTGGCCAGTCTCCACAGCTCCTCATCTATGGGATTTCCAACAGATTTTCTGGGGTGCCAGACAGGTTCAGTGGCAGTGGTTCAGGGACAGATTTCACACTCAAGATCAGCACAATAAAGCCTGAGGACTTGGGAATGTATTACTGCTTACAAGGTACACATCAGCCTCC +>200|IGKV1-99 ENSMUST00000168090|IGKV1-99|5'UTR|IG|IGK|None|00 +GGCGCCTCATCAAA +>201|IGKV1-99 ENSMUST00000168090|IGKV1-99|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGCTGCCTGTTCTGCTAGTGGTGCTGCTATTGTTCACGAGTCCAGCCTCAAGCAGTGATGTTGTTCTGACCCAAACTCCACTCTCTCTGCCTGTCAATATTGGAGATCAAGCCTCTATCTCTTGCAAGTCTACTAAGAGTCTTCTGAATAGTGATGGATTCACTTATTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTAATATATTTGGTTTCTAATCGATTTTCTGGAGTTCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTTCCAGAGTAACTATCTTCCTCT +>202|IGKV10-94 ENSMUST00000103330|IGKV10-94|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGTGCAAGTCAGGGCATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAAGTTTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGACAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>203|IGKV10-95 ENSMUST00000198735|IGKV10-95|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTTTGTTTTCAAGGTACCAGATATGATATCCAGATGACACAGACTACTTCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTGAGGACATTAGCACTTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAGGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGGCAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>204|IGKV10-96 ENSMUST00000103328|IGKV10-96|5'UTR|IG|IGK|None|00 +CTCAGCCTGGAC +>205|IGKV10-96 ENSMUST00000103328|IGKV10-96|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTCAGGACATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTACTACACATCAAGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGAACAGATTATTCTCTCACCATTAGCAACCTGGAGCAAGAAGATATTGCCACTTACTTTTGCCAACAGGGTAATACGCTTCCTCC +>206|IGKV11-125 ENSMUST00000197406|IGKV11-125|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACACGAGGGCCCCTGCTGAGTTCCTTGGGTTCCTGTTGCTCTGGTTTTTAGGTGCCAGATGTGATGTCCAGATGATTCAGTCTCCATCCTCCCTGTCTGCATCTTTGGGAGACATAGTCACCATGACTTGCCAGGCAAGTCAGGGCACTAGCATTAATTTAAACTGGTTTCAGCAAAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGGTGCAAGCAACTTGGAAGATGGGGTCCCATCAAGGTTCAGTGGCAGTAGATATGGGACAGATTTCACTCTCACCATCAGCAGCCTGGAGGATGAAGATATGGCAACTTATTTCTGTCTACAGCATAGTTATCTCCCTCC +>207|IGKV12-38 ENSMUST00000198880|IGKV12-38|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAACTCCTGGGGTTGCTGCTGCTGTGGCTTACAGACGCAGGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTGGCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAACATTTACTACAGTTTAGCATGGTATCAGCAGAAGCAAGGGAAATCTCCTCAGCTCCTGATCTATAATGCAAACAGCTTGGAAGATGGTGTCCCATCGAGGTTCAGTGGCAGTGGATCTGGGACACAGTATTCTATGAAGATCAACAGCATGCAGCCTGAAGATACCGCAACTTATTTCTGTAAACAGGCTTATGACGTTCCTCC +>208|IGKV12-41 ENSMUST00000103369|IGKV12-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCTCACTCAGGTCCTGGCGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGGGAATATTCACAATTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGAACACAATATTCTCTCAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGAGTACTCCTCC +>209|IGKV12-44 ENSMUST00000103367|IGKV12-44|5'UTR|IG|IGK|None|00 +ATAGTCAGGTCACACCCTGTGCTGTAATCAGCATCACACTGAAAACACACAGAC +>210|IGKV12-44 ENSMUST00000103367|IGKV12-44|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGAAGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTTTTCTCTGAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATCATTATGGTACTCCTCC +>211|IGKV12-46 ENSMUST00000103365|IGKV12-46|5'UTR|IG|IGK|None|00 +GAGTCAGCCTCACACTGATCACACACAGAC +>212|IGKV12-46 ENSMUST00000103365|IGKV12-46|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGATGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGTATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTAATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATGCTGCAACAAACTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTATTCCCTCAAGATCAACAGCCTGCAGTCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGGGTACTCCTCC +>213|IGKV12-98 ENSMUST00000196839|IGKV12-98|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACATGCTCACTCAGCTCCTGGGATTACTGCTGCTCTGGTTTGCAGGTGGTAAATGTGACATTCAGATGACCCAGTCTCCTGCCTCCCAGTCTGCATCTCTGGGAGAAAGTGTCACCATCACATGCCTGGCAAGTCAGACCATTGGTACATGGTTAGCATGGTATCAGCAGAAACCAGGGAAATCTCCTCAGCTCCTGATTTATGCTGCAACCAGCTTGGCAGATGGGGTCCCATCAAGGTTCAGTGGTAGTGGATCTGGCACAAAATTTTCTTTCAAGATCAGCAGCCTACAGGCTGAAGATTTTGTAAGTTATTACTGTCAACAACTTTACAGTACTCCTCT +>214|IGKV13-84 ENSMUST00000103339|IGKV13-84|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTACTGCTGTTTGGAATCCCAGGCATGATATGTGACATCCAGATGACACAATCTTCATCCTCCTTTTCTGTATCTCTAGGAGACAGAGTCACCATTACTTGCAAGGCAAGTGAGGACATATATAATCGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>215|IGKV13-85 ENSMUST00000114212|IGKV13-85|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTCCTGCTGTTCAGAATCACAGGCATAATATGTGACATCCAGATGACACAATCTTCATCCTACTTGTCTGTATCTCTAGGAGGCAGAGTCACCATTACTTGCAAGGCAAGTGACCACATTAATAATTGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>216|IGKV14-100 ENSMUST00000199510|IGKV14-100|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCTTGCTCAGTTTCTTGCATTCTTGTTGCTTTGGTTTCCAGGTGCAAGATGTGACATCCTGATGACCCAATCTCCATCCTCCATGTCTGTATCTCTGGGAGACACAGTCAGCATCACTTGCCATGCAAGTCAGGGCATTAGCAGTAATATAGGGTGGTTGCAGCAGAAACCAGGGAAATCATTTAAGGGCCTGATCTATCATGGAACCAACTTGGAAGATGGAGTTCCATCAAGGTTCAGTGGCAGTGGATCTGGAGCAGATTATTCTCTCACCATCAGCAGCCTGGAATCTGAAGATTTTGCAGACTATTACTGTGTACAGTATGCTCAGTTTCCTCC +>217|IGKV14-111 ENSMUST00000103320|IGKV14-111|5'UTR|IG|IGK|None|00 +CAGCCAGGACTCAGC +>218|IGKV14-111 ENSMUST00000103320|IGKV14-111|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGACCCCTGCTCAGTTTCTTGGAATCTTGTTGCTCTGGTTTCCAGGTATCAAATGTGACATCAAGATGACCCAGTCTCCATCTTCCATGTATGCATCTCTAGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAATAGCTATTTAAGCTGGTTCCAGCAGAAACCAGGGAAATCTCCTAAGACCCTGATCTATCGTGCAAACAGATTGGTAGATGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTCACCATCAGCAGCCTGGAGTATGAAGATATGGGAATTTATTATTGTCTACAGTATGATGAGTTTCCTCC +>219|IGKV14-126 ENSMUST00000103310|IGKV14-126|5'UTR|IG|IGK|None|00 +TCAGC +>220|IGKV14-126 ENSMUST00000103310|IGKV14-126|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCCCCTGCTCAGTTTTTTGGGATCTTGTTGCTCTGGTTTCCAGGTATCAGATGTGACATCAAGATGACCCAGTCTCCATCCTCCATGTATGCATCGCTGGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAAAAGCTATTTAAGCTGGTACCAGCAGAAACCATGGAAATCTCCTAAGACCCTGATCTATTATGCAACAAGCTTGGCAGATGGGGTCCCATCAAGATTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTAACCATCAGCAGCCTGGAGTCTGACGATACAGCAACTTATTACTGTCTACAGCATGGTGAGAGCCCTCC +>221|IGKV14-130 ENSMUST00000196006|IGKV14-130|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGTTTCTTGGGATCTTGTTGCTCTGGTTCCCAGGTGCCAGATGTGAAATCCAGATGACCCAGTCTCCATCCTCTATGTCTGCATCTCTGGGAGACAGAATAACCATCACTTGCCAGGCAACTCAAGACATTGTTAAGAATTTAAACTGGTATCAGCAGAAACCAGGGAAACCCCCTTCATTCCTGATCTATTATGCAACTGAACTGGCAGAAGGGGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGACTATTCTCTGACAATCAGCAACCTGGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGTTTTATGAGTTTCCTCC +>222|IGKV15-103 ENSMUST00000103324|IGKV15-103|5'UTR|IG|IGK|None|00 +TCACTCTCAGTGAGGATACACCATCAGC +>223|IGKV15-103 ENSMUST00000103324|IGKV15-103|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCTTGCTGAGCTCCTGGGGCTGCTGCTGTTCTGCTTTTTAGGTGTGAGATGTGACATCCAGATGAACCAGTCTCCATCCAGTCTGTCTGCATCCCTTGGAGACACAATTACCATCACTTGCCATGCCAGTCAGAACATTAATGTTTGGTTAAGCTGGTACCAGCAGAAACCAGGAAATATTCCTAAACTATTGATCTATAAGGCTTCCAACTTGCACACAGGCGTCCCATCAAGGTTTAGTGGCAGTGGATCTGGAACAGGTTTCACATTAACCATCAGCAGCCTGCAGCCTGAAGACATTGCCACTTACTACTGTCAACAGGGTCAAAGTTATCCTCT +>224|IGKV16-104 ENSMUST00000103323|IGKV16-104|5'UTR|IG|IGK|None|00 +AATCAGTTCCTGCCAGGACACAGTTTAGAT +>225|IGKV16-104 ENSMUST00000103323|IGKV16-104|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCCAGGTTCAGGTTCTGGGGCTCCTTCTGCTCTGGATATCAGGTGCCCAGTGTGATGTCCAGATAACCCAGTCTCCATCTTATCTTGCTGCATCTCCTGGAGAAACCATTACTATTAATTGCAGGGCAAGTAAGAGCATTAGCAAATATTTAGCCTGGTATCAAGAGAAACCTGGGAAAACTAATAAGCTTCTTATCTACTCTGGATCCACTTTGCAATCTGGAATTCCATCAAGGTTCAGTGGCAGTGGATCTGGTACAGATTTCACTCTCACCATCAGTAGCCTGGAGCCTGAAGATTTTGCAATGTATTACTGTCAACAGCATAATGAATACCCGTAC +>226|IGKV17-121 ENSMUST00000197515|IGKV17-121|5'UTR|IG|IGK|None|00 +AAGGCC +>227|IGKV17-121 ENSMUST00000197515|IGKV17-121|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGTTCTCACTAGCTCTTCTCCTCAGTCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCATGGCTATAGGAGAAAAAGTCACCATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGTACAGATTTTGTTTTTACAATTGAAAACATGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACTTGCCTCT +>228|IGKV17-127 ENSMUST00000200586|IGKV17-127|5'UTR|IG|IGK|None|00 +AAGGCC +>229|IGKV17-127 ENSMUST00000200586|IGKV17-127|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGCTCTCACTAGCTCCTCTCCTCAGCCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCGTGGCTACAGGAGAAAAAGTCACTATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGCACAGATTTTGTTTTTACAATTGAAAACACGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACATGCCTCT +>230|IGKV18-36 ENSMUST00000200160|IGKV18-36|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACTCCAGCTTCATTTCTTTGCCTCCTTTTACTGTGGACCACGGCTGTCACTGGAGAAACAACACAGGCTCCAGCTTCTCTGAGTTTTTCTCTTGGTGAAACAGCAACACTGTCATGCAGGTCCAGTGAGAGTGTTGGCAGCTACTTAGCCTGGTACCAGCAGAAAGCAGAGCAAGTTCCCCGGCTCCTTATCCATAGTGCCTCCACTAGGGCCGGTGGTGTCCCAGTCCGGTTCAGTGGCACTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGTCTAGAACCTGAAGATGCTGCAGTTTACTACTGTCAACCTTTCAAAAGTTGGTCATA +>231|IGKV19-93 ENSMUST00000196863|IGKV19-93|5'UTR|IG|IGK|None|00 +AGGAGACGTTGTAGAA +>232|IGKV19-93 ENSMUST00000196863|IGKV19-93|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGACCGTCTATTCAGTTCCTGGGGCTCTTGTTGTTCTGGCTTCATGGTGCTCAGTGTGACATCCAGATGACACAGTCTCCATCCTCACTGTCTGCATCTCTGGGAGGCAAAGTCACCATCACTTGCAAGGCAAGCCAAGACATTAACAAGTATATAGCTTGGTACCAACACAAGCCTGGAAAAGGTCCTAGGCTGCTCATACATTACACATCTACATTACAGCCAGGCATCCCATCAAGGTTCAGTGGAAGTGGGTCTGGGAGAGATTATTCCTTCAGCATCAGCAACCTGGAGCCTGAAGATATTGCAACTTATTATTGTCTACAGTATGATAATCTTCTACC +>233|IGKV2-109 ENSMUST00000103322|IGKV2-109|5'UTR|IG|IGK|None|00 +CAAGTTCGCAGA +>234|IGKV2-109 ENSMUST00000103322|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCATTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAAGCCAGGCCAGTCTCCTCAGCTCCTGATTTATCAGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTAGCAGTGGGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTGCTCAAAATCTAGAACTTCCTCC +>235|IGKV2-112 ENSMUST00000103318|IGKV2-112|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCTCTCTTCAGTTCCTGGGGGTGCTTATGTTCTGGATCTCTGGAGTCAGTGGGGATATTGTGATAACCCAGGATGAACTCTCCAATCCTGTCACTTCTGGAGAATCAGTTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTATATAAGGATGGGAAGACATACTTGAATTGGTTTCTGCAGAGACCAGGACAATCTCCTCAGCTCCTGATCTATTTGATGTCCACCCGTGCATCAGGAGTCTCAGACCGGTTTAGTGGCAGTGGGTCAGGAACAGATTTCACCCTGGAAATCAGTAGAGTGAAGGCTGAGGATGTGGGTGTGTATTACTGTCAACAACTTGTAGAGTATCCTC +>236|IGKV2-137 ENSMUST00000103302|IGKV2-137|5'UTR|IG|IGK|None|00 +GGCTACTTTTCACACAGCTGCACCAAGCAGGGGATTTGCATATTGCTCCCTTGGGAGGATCTCTCCTGCAGGTCCAAGACAAAAGCTAGCCTCCATTTCTGTCTTGACTACTCAAGACTTTTTGTATCAAGTTCTCAGA +>237|IGKV2-137 ENSMUST00000103302|IGKV2-137|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCCTAGCTGAGTTCCTGGGGCTGCTTGTGCTCTGGATCCCTGGAGCCATTGGGGATATTGTGATGACTCAGGCTGCACCCTCTGTACCTGTCACTCCTGGAGAGTCAGTATCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTGCATAGTAATGGCAACACTTACTTGTATTGGTTCCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACTGCTTTCACACTGAGAATCAGTAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTATGCAACATCTAGAATATCCTTT +>238|IGKV20-101-2 ENSMUST00000200406|IGKV20-101-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGCTCTAGTTCAGCTCCTAGGGATGCTGATGCTCTGGCTCCAAGGCATGAGCTGTAATATCCAGGTGATCCAGTCACCATTTCTGTCTGCATCTGTGGGAGAGAGGGTCACAATCAGCTGCAAGACACATCAGCATATTAACAGTTCCATAGCCTGGTACCAGCAAAAAGTTGGAAAAGCTCCCATACTCCTGATAAGAGATGCAAGTTTTTCTCTAACAGACACCCCATCAAGGTTCACTGGGAATGGATTTGGCACAGATTTCACACTCAGCATCAGCAGTATGCAGTCTCAAGATGGTGCCACATATTTCTGCCAGCAGCATTTTCACTATTAC +>239|IGKV3-1 ENSMUST00000103404|IGKV3-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTCACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGAGCCACCATCTCCTGCAGAGCCAGTGAAAGTGTTGAATATTATGGCACAAGTTTAATGCAGTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACGTAGAATCTGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTGTGGAGGAGGATGATATTGCAATGTATTTCTGTCAGCAAAGTAGGAAGGTTCCTTC +>240|IGKV3-10 ENSMUST00000196940|IGKV3-10|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTAACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTGATCCTGTGGAGGCTGATGATGCTGCAACCTATTACTGTCAGCAAAATAATGAGGATCCTCC +>241|IGKV3-12 ENSMUST00000103396|IGKV3-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGTTATGGGTACTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCAAAAGTGTCAGTACATCTGGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCACAGTAGGGAGCTTCCTCC +>242|IGKV3-2 ENSMUST00000103403|IGKV3-2|5'UTR|IG|IGK|None|00 +TCTCTTCCAGTTCTCAGAG +>243|IGKV3-2 ENSMUST00000103403|IGKV3-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGAAAGACACACTCCTGCTATGGGTCCTGCTTCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAGAGCCAGCGAAAGTGTTGATAATTATGGCATTAGTTTTATGAACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCAAGGATCCGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTATGGAGGAGGATGATACTGCAATGTATTTCTGTCAGCAAAGTAAGGAGGTTCCTCC +>244|IGKV3-3 ENSMUST00000103402|IGKV3-3|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGAGCCACTATCTTCTGCAGAGCCAGCCAGAGTGTCGATTATAATGGAATTAGTTATATGCACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAAGATGCTGCAACCTATTACTGTCAGCAAAGTATTGAGGATCCTCC +>245|IGKV3-4 ENSMUST00000103401|IGKV3-4|5'UTR|IG|IGK|None|00 +G +>246|IGKV3-4 ENSMUST00000103401|IGKV3-4|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACAATCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAAGGCCAGCCAAAGTGTTGATTATGATGGTGATAGTTATATGAACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAATCTAGAATCTGGGATCCCAGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>247|IGKV3-5 ENSMUST00000103400|IGKV3-5|5'UTR|IG|IGK|None|00 +ATCCTCTCTTCCAGCTCTCAGAG +>248|IGKV3-5 ENSMUST00000103400|IGKV3-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTAATCCTGTGGAGGCTGATGATGTTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>249|IGKV3-7 ENSMUST00000197560|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCCAAAGTGTCAGTACATCTAGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCAAGTATGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATACTGCAACATATTACTGTCAGCACAGTTGGGAGATTCCTCC +>250|IGKV3-9 ENSMUST00000103398|IGKV3-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACCCACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGGGCCACCATATCCTGCCAAGCCAGCGAAAGTGTCAGTTTTGCTGGTACAAGTTTAATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGAGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGAGTCAGACTTCACTCTCACCATCGATCCTGTGGAGGAAGATGATGCTGCAATGTATTACTGTATGCAAAGTATGGAAGATCCTCC +>251|IGKV4-50 ENSMUST00000103363|IGKV4-50|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTATCTCAGTTGTAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGAAGGTCACCATGAGCTGCAGGGCCAGCTCAAGTGTAAATTACATGTACTGGTACCAGCAGAAGTCAGATGCCTCCCCCAAACTATGGATTTATTACACATCCAACCTGGCTCCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGAACTCTTATTCTCTCACAATCAGCAGCATGGAGGGTGAAGATGCTGCCACTTATTACTGCCAGCAGTTTACTAGTTCCCCATCCA +>252|IGKV4-51 ENSMUST00000103345|IGKV4-51|5'UTR|IG|IGK|None|00 +GCAGGAATTAGCCAGGGACTAAAATTCAAAGACACA +>253|IGKV4-51 ENSMUST00000103345|IGKV4-51|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCATTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCCCCCAAACTCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGGCTGGGATCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAAATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>254|IGKV4-53 ENSMUST00000198328|IGKV4-53|5'UTR|IG|IGK|None|00 +AAAAACACA +>255|IGKV4-53 ENSMUST00000198328|IGKV4-53|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCATGTGCAGATTTTCAGCTTCATGCTAATCAGTGTCACAGTCATATTGTCCAGTGGAGAAATTGTGCTCACCCAGTCTCCAGCACTCATGGCTGCATCTCCAGGGGAGAAGGTCACCATCACCTGCAGTGTCAGCTCAAGTATAAGTTCCAGCAACTTGCACTGGTACCAGCAGAAGTCAGAAACCTCCCCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGTCAACAGTGGAGTAGTTACCCACTCA +>256|IGKV4-54 ENSMUST00000199437|IGKV4-54|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACAGGTACCAGCAGAAGCCAGGATCCTCACCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAATATCATAGTTACCCACCCA +>257|IGKV4-55 ENSMUST00000103359|IGKV4-55|5'UTR|IG|IGK|None|00 +AGCTAGGGACCAAAGTTCAAAGACAAA +>258|IGKV4-55 ENSMUST00000103359|IGKV4-55|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCCTGATTTATGACACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTTACCCACCCA +>259|IGKV4-57 ENSMUST00000103357|IGKV4-57|L-REGION+V-REGION|IG|IGK|None|00 +ATGCATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATAACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTTCCAGCAGAAGCCAGGCACTTCTCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAAAGGAGTAGTTACCCACCCA +>260|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|5'UTR|IG|IGK|None|00 +AAATTCAAATACACA +>261|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCTGGTGCAGATTTTCAGCTTCTTGCTAATCAGTGCCTCAGTTGCAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGGGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGTGCCTCCCCCAAACTCTGGATTTATAGCACATCCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCACTCA +>262|IGKV4-58 ENSMUST00000197448|IGKV4-58|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCAGTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGCAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGCGCTTCCCCCAAACCCTTGATTCATAGGACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCGTGGAGGCTGAAGATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>263|IGKV4-59 ENSMUST00000103354|IGKV4-59|5'UTR|IG|IGK|None|00 +AAAATTCAAAGACAAA +>264|IGKV4-59 ENSMUST00000103354|IGKV4-59|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATATCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>265|IGKV4-61 ENSMUST00000199160|IGKV4-61|5'UTR|IG|IGK|None|00 +ATTAGCTAGGGACCAAAATTCAAAGACAGA +>266|IGKV4-61 ENSMUST00000199160|IGKV4-61|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATATCCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATCGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTATCATAGTTACCCACCCA +>267|IGKV4-62 ENSMUST00000198345|IGKV4-62|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGCCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGCTCCTCCCCCAGACTCTGGATTTATGACACATCCAACCTGGTTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTAGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCATCCA +>268|IGKV4-63 ENSMUST00000196595|IGKV4-63|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGAGAAAATGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAAGCACCTCCCCCAAACTCTGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCAGGTCGCTTCAGTGGCAGTGGGTCTGGAAACTCTTACTCTCTCACGATCAGCAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTTTTCAGGGGAGTGGGTACCCACTCA +>269|IGKV4-68 ENSMUST00000103350|IGKV4-68|5'UTR|IG|IGK|None|00 +AGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>270|IGKV4-68 ENSMUST00000103350|IGKV4-68|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATGAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCACTCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAAGATCCTCCCCCAAACCCTGGATTTATCTCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>271|IGKV4-69 ENSMUST00000103349|IGKV4-69|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTTAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTCTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCGCCCAAACCCTGGATTTATGACACATCCAACCTGGCTTCTGGATTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCATAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>272|IGKV4-70 ENSMUST00000103348|IGKV4-70|5'UTR|IG|IGK|None|00 +AATTAGCTAGGGACCAAAATTCAAAGACAAA +>273|IGKV4-70 ENSMUST00000103348|IGKV4-70|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTATAAGTTACATGCACTGGTACCAGCAGAAGCCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>274|IGKV4-71 ENSMUST00000196201|IGKV4-71|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTATTCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCTGGATTTATTTAACATTCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCTCAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>275|IGKV4-72 ENSMUST00000103346|IGKV4-72|5'UTR|IG|IGK|None|00 +TACTTATGAGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>276|IGKV4-72 ENSMUST00000103346|IGKV4-72|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTGTTCTCTCCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACAATGACTTGCAGGGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATGCCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGAGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>277|IGKV4-74 ENSMUST00000103344|IGKV4-74|5'UTR|IG|IGK|None|00 +GCAGTAATTAGCTAGGGACCAAAATTCAAAGGAAAA +>278|IGKV4-74 ENSMUST00000103344|IGKV4-74|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAACGGGTCACCATGACCTGCACTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCACCAGTATCATCGTTCCCCACCCA +>279|IGKV4-78 ENSMUST00000103343|IGKV4-78|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCATGACCTGCAGTGCCAGATCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTTTTACTGCCAGCAGTACAGTGGTTACCCATCCA +>280|IGKV4-79 ENSMUST00000103342|IGKV4-79|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCTTGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCTCTTATTTCTGCCATCAGTGGAGTAGTTACCCACCCC +>281|IGKV4-80 ENSMUST00000103341|IGKV4-80|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGGAGATCACCCTAACCTGCAGTGCCAGCTCGAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACTTCTCCCAAACTCTTGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTTCTCGCTTCAGTGGCAGTGGGTCTGGGACCTTTTATTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCGATTATTACTGCCATCAGTGGAGTAGTTATCCA +>282|IGKV4-81 ENSMUST00000197966|IGKV4-81|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGTTAATCAGTGTCTCAGTCATAATGTCCAGAGGAGAAAATGTGCTGACCCAGTCTCCAGCAATCATGGCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCTAGTAACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCTACCAAATTCTGGATTTATAGGACATCCAACCTGGCTTCAGAAGTCCCAGCTCCCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTTACAATCAGCAGCGTGGAGGCCGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTGGTTACCCACCCA +>283|IGKV4-86 ENSMUST00000200454|IGKV4-86|5'UTR|IG|IGK|None|00 +CACTAATTAGCCAGAGACCAAAATCCAAATACACA +>284|IGKV4-86 ENSMUST00000200454|IGKV4-86|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACTTTCGGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTGTCCAGAGGAGAAATTGTGCTCACTCAGTCTCCAGCCATCACAGCTGCATCTCTGGGGCAAAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAACCATGGATTTATGAAATATCCAAACTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCATTTATTACTGCCAGCAGTGGAATTATCCTCTTA +>285|IGKV4-90 ENSMUST00000103334|IGKV4-90|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTCATATTGACCAATGGAGAAATTTTGCTCACCCAGTCTCCAGCAATCATAGCTGCATCTCCTGGGGAGAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGAACTGGTACCAGCAGAAACCAGGATCCTCCCCCAAAATATGGATTTATGGTATATCCAACCTGGCTTCTGGAGTTCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACATCTTTCTCTTTCACAATCAACAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTCAGCAAAGGAGTAGTTACCCACCCA +>286|IGKV4-91 ENSMUST00000103333|IGKV4-91|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGATGCAGATTATCAGCTTGCTGCTAATCAGTGTCACAGTCATAGTGTCTAATGGAGAAATTGTGCTCACCCAGTCTCCAACCACCATGGCTGCATCTCCCGGGGAGAAGATCACTATCACCTGCAGTGCCAGCTCAAGTATAAGTTCCAATTACTTGCATTGGTATCAGCAGAAGCCAGGATTCTCCCCTAAACTCTTGATTTATAGGACATCCAATCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATTGGCACCATGGAGGCTGAAGATGTTGCCACTTACTACTGCCAGCAGGGTAGTAGTATACCACGCA +>287|IGKV4-92 ENSMUST00000103332|IGKV4-92|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATATGTGGGTGCAGATTTTCAGCTTACTGCTAATCTGTGTCACAGTGTCAAAGGGAGAAATGGTTCTCACCCAGTCTCCAGTATCCATAACTGCATCTCGAGGGGAGAAGGTCACCATCACCTGCCGTGCCAGCTCAAGTATAAGTTCCAATTACTTACACTGGTACCAGCAGAAGCCAGGATCCTCCCCTAAACTTTTGATTTATAGGACATCCATCCTGGCATCTGGAGTCCTAGACAGCTTCAGTGGCAGTGGGTCTGAGAGCTCTTACACTCTGACAATCAGCTGCATGCAGGACGAAGTTGCTGCCACTTACTATTGTCAGCAGGGGAGTAGTAGCCCACCA +>288|IGKV5-37 ENSMUST00000103372|IGKV5-37|5'UTR|IG|IGK|None|00 +GAAAGCTTAAAG +>289|IGKV5-37 ENSMUST00000103372|IGKV5-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATTCACACCTCATATCCTTGGACTTCTGCTTTTCTGGATTTCAGCCTCCACAGGTGACATCCTGCTGACCCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGAAACAGTCAGTCTTTCCTGTAGGGCCAGCCAGAGTATTTACAAGAACCTACACTGGTATCAACAGAAATCACATCGGTCTCCAAGGCTTCTCATCAAGTATGCTTCTGATTCCATCTCTGGGATCCCCTCCAGGTTCACTGGCAGTGGATCAGGGACAGATTACACTCTCAGTATCAACAGTGTGAAGCCCGAAGATGAAGGAATATATTACTGTCTTCAAGGTTACAGCACACCTTC +>290|IGKV5-39 ENSMUST00000197290|IGKV5-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCACTTCTCAGCTCCTTGGACTTTTGCTTTTCTGGACTTCAGCCTCCAGATGTGACATTGTGATGACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCTCTCTTTCCTGCAGGGCCAGCCAGAGTATTAGCGACTACTTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAATATGCTTCCCAATCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGTCAGATTTCACTCTCAGTATCAACAGTGTGGAACCTGAAGATGTTGGAGTGTATTACTGTCAAAATGGTCACAGCTTTCCTCC +>291|IGKV5-43 ENSMUST00000103368|IGKV5-43|5'UTR|IG|IGK|None|00 +ATGAGCCACACAAACTCAGGGAAAGCTCGAAG +>292|IGKV5-43 ENSMUST00000103368|IGKV5-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATACTTGGACTTATGCTTTTTTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGCGTCAGTCTTTCCTGCAGGGCCAGCCAAAGTATTAGCAACAACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>293|IGKV5-45 ENSMUST00000103366|IGKV5-45|5'UTR|IG|IGK|None|00 +TGTGTCATGATCCACACAAACTCAGGGAAAGCTCGAAG +>294|IGKV5-45 ENSMUST00000103366|IGKV5-45|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATTCTTGGACTTATGCTTTTCTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCAGTCTTTCCTGCAGGGCCAGTCAAAGTATTAGCAACTACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>295|IGKV5-48 ENSMUST00000103364|IGKV5-48|5'UTR|IG|IGK|None|00 +GGAAAGTTTGAAG +>296|IGKV5-48 ENSMUST00000103364|IGKV5-48|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCCACACCTCAGTTCCTTGTATTTTTGCTTTTCTGGATTCCAGCCTCCAGAGGTGACATCTTGCTGACTCAGTCTCCAGCCATCCTGTCTGTGAGTCCAGGAGAAAGAGTCAGTTTCTCCTGCAGGGCCAGTCAGAGCATTGGCACAAGCATACACTGGTATCAGCAAAGAACAAATGGTTCTCCAAGGCTTCTCATAAAGTATGCTTCTGAGTCTATCTCTGGGATCCCTTCCAGGTTTAGTGGCAGTGGATCAGGGACAGATTTTACTCTTAGCATCAACAGTGTGGAGTCTGAAGATATTGCAGATTATTACTGTCAACAAAGTAATAGCTGGCCAAC +>297|IGKV6-13 ENSMUST00000198184|IGKV6-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGCTTCAAGATGGAGTCTCATACTCAGGCCTTTGTATTCGCGTTTCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCAATCGGTACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATATGCAGTCTGAAGACCTGGCAGATTATTTCTGCCAGCAATATAGCAGCTATCCTCT +>298|IGKV6-14 ENSMUST00000103394|IGKV6-14|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTCTTTGTATTCGTGTTGCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTTCGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAGTCTCCTAAAGCACTGATTTACTTGGCATCCAACCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAATCTGAAGACCTGGCAGATTATTTCTGTCTGCAACATTGGAATTATCCTCT +>299|IGKV6-15 ENSMUST00000103393|IGKV6-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGACTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCGTCACCTGCAAGGCCAGTCAGAATGTGGGTACTAATGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAAGCACTGATTTACTCGGCATCCTACCGGTACAGTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATGTGCAGTCTGAAGACTTGGCAGAGTATTTCTGTCAGCAATATAACAGCTATCCTCT +>300|IGKV6-17 ENSMUST00000103391|IGKV6-17|5'UTR|IG|IGK|None|00 +GAAATGCATCACACCAGCATGGGCATCAAA +>301|IGKV6-17 ENSMUST00000103391|IGKV6-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGTCTTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCTACCGGTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATCTGGGACGGATTTCACTTTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAACATTATAGTACTCCTCC +>302|IGKV6-20 ENSMUST00000103388|IGKV6-20|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>303|IGKV6-20 ENSMUST00000103388|IGKV6-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACACTGGGGTCCCCGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGAGTTACAGCTATCCTCC +>304|IGKV6-23 ENSMUST00000103386|IGKV6-23|5'UTR|IG|IGK|None|00 +TCAGACCAGCATGGGCATCAAG +>305|IGKV6-23 ENSMUST00000103386|IGKV6-23|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACACATTCTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGAAGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAGTCTGAAGACTTGGCAGATTATTTCTGTCAGCAATATAGCAGCTATCCTCT +>306|IGKV6-25 ENSMUST00000103383|IGKV6-25|5'UTR|IG|IGK|None|00 +TATGAAATGCATCGCACCAGCATGGGCATCAAG +>307|IGKV6-25 ENSMUST00000103383|IGKV6-25|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGCATTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAAAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTATACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCACTTTATTACTGTCAGCAACATTATAGCACTCCTCC +>308|IGKV6-29 ENSMUST00000197371|IGKV6-29|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>309|IGKV6-29 ENSMUST00000197371|IGKV6-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACCCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTCTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGGGTTACAGCTATCTTCC +>310|IGKV6-32 ENSMUST00000103377|IGKV6-32|5'UTR|IG|IGK|None|00 +GGCAGGCAAGGGCATCAAG +>311|IGKV6-32 ENSMUST00000103377|IGKV6-32|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTCACAGACCCAGGTCTTCGTATTTCTACTGCTCTGTGTGTCTGGTGCTCATGGGAGTATTGTGATGACCCAGACTCCCAAATTCCTGCTTGTATCAGCAGGAGACAGGGTTACCATAACCTGCAAGGCCAGTCAGAGTGTGAGTAATGATGTAGCTTGGTACCAACAGAAGCCAGGGCAGTCTCCTAAACTGCTGATATACTATGCATCCAATCGCTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATATGGGACGGATTTCACTTTCACCATCAGCACTGTGCAGGCTGAAGACCTGGCAGTTTATTTCTGTCAGCAGGATTATAGCTCTCCTCC +>312|IGKV7-33 ENSMUST00000197429|IGKV7-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTACTCATGTCCCTGCTGCTCTGCATGTCTGGTGCCTGTGCAGACATTGTGATGACTCAGTCTCCAACTTTCCTTGCTGTGACAGCAAGTAAGAAGGTCACCATTAGTTGCACGGCCAGTGAGAGCCTTTATTCAAGCAAACACAAGGTGCACTACTTGGCTTGGTACCAGAAGAAACCAGAGCAATCTCCTAAACTGCTGATATACGGGGCATCCAACCGATACATTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTGACCATCAGCAGTGTACAGGTTGAAGACCTCACACATTATTACTGTGCACAGTTTTACAGCTATCCTCT +>313|IGKV8-16 ENSMUST00000195945|IGKV8-16|5'UTR|IG|IGK|None|00 +GGCAGGGGAGCAAT +>314|IGKV8-16 ENSMUST00000195945|IGKV8-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCAGAGACCCATGTCCTCATATTTTTGCTGCTATGGGTGTCTGGTGCTTGTGGGGAAATTGTGTTGACCCAGTCTATACCATCCCTGACTGTGTCAGCAGGAGAGAGGGTCACTATCAGCTGCAAATCCAATCAGAATCTTTTATGGAGTGGAAACCAAAGGTACTGTTTGGTCTGGCACCAGTGGAAACCAGGGCAAACTCCTACACCGTTGATCACCTGGACATCTGATAGGTACTCTGGAGTCCCTGATCGTTTCATAGGCAGTGGATCTGTGACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGATGTGGCAGTTTATTTCTGTCAGCAGCATTTACACATTCCTCC +>315|IGKV8-18 ENSMUST00000103390|IGKV8-18|5'UTR|IG|IGK|None|00 +CATCAGTCAGGCAGGGGGGAGAAAG +>316|IGKV8-18 ENSMUST00000103390|IGKV8-18|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGATGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAATAACTACTTATCCTGGTACCAGCAGAAACAAGGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGATTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAGCACAATCATGGCAGCTTTCTCCCCC +>317|IGKV8-19 ENSMUST00000196599|IGKV8-19|5'UTR|IG|IGK|None|00 +GCAAG +>318|IGKV8-19 ENSMUST00000196599|IGKV8-19|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATGTCCCTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGACTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGACCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATTATAGTTATCCTCC +>319|IGKV8-21 ENSMUST00000103387|IGKV8-21|5'UTR|IG|IGK|None|00 +AGACAGGCAGTGGGAGCAAG +>320|IGKV8-21 ENSMUST00000103387|IGKV8-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATATTGCTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTGGCTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAATCCAGTCAGAGTCTGCTCAACAGTAGAACCCGAAAGAACTACTTGGCTTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGCAAGCAATCTTATAATCTTCC +>321|IGKV8-24 ENSMUST00000103384|IGKV8-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCAGGTCCTCATGTTTCTTCTGCTCTGGGTATCTGGTGCCTGTGCAGACATTGTGATGACACAGTCTCCATCCTCCCTGGCTATGTCAGTAGGACAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTAAATAGTAGCAATCAAAAGAACTATTTGGCCTGGTACCAGCAGAAACCAGGACAGTCTCCTAAACTTCTGGTATACTTTGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACAGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGATTACTTCTGTCAGCAACATTATAGCACTCCTCC +>322|IGKV8-26 ENSMUST00000103382|IGKV8-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGAACCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAAGAACTACTTGTCCTGGTACCAGCAGAAACAAAGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGGTTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAACACAATCATGGCAGCTTTCTCCCCCC +>323|IGKV8-27 ENSMUST00000197272|IGKV8-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCTTCCTCTCCCTGCTGCTCTGGGTATCTGGTACCTGTGGGAACATTATGATGACACAGTCGCCATCATCTCTGGCTGTGTCTGCAGGAGAAAAGGTCACTATGAGCTGTAAGTCCAGTCAAAGTGTTTTATACAGTTCAAATCAGAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGTGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTTACTCTTACCATCAGCAGTGTACAAGCTGAAGACCTGGCAGTTTATTACTGTCATCAATACCTCTCCTCG +>324|IGKV8-28 ENSMUST00000197525|IGKV8-28|5'UTR|IG|IGK|None|00 +GCAAG +>325|IGKV8-28 ENSMUST00000197525|IGKV8-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATCTCCTTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGAGTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACGGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACCGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATCATAGTTATCCTCC +>326|IGKV8-30 ENSMUST00000103378|IGKV8-30|5'UTR|IG|IGK|None|00 +AAG +>327|IGKV8-30 ENSMUST00000103378|IGKV8-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATGTTACTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTAGCTGTGTCAGTTGGAGAGAAGGTTACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTATATAGTAGCAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATTTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGAAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAATATTATAGCTATCCTCC +>328|IGKV8-34 ENSMUST00000196959|IGKV8-34|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTCCTCATGTTGCTGCTGCTATCGGTATCTGGTACCTGTGGAGACATTTTGATGACCCAGTCTCCATCCTCCCTGACTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTAGCTAGTGGCAACCAAAATAACTACTTGGCCTGGCACCAGCAGAAACCAGGACGATCTCCTAAAATGCTGATAATTTGGGCATCCACTAGGGTATCTGGAGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACGGATTTCACTCTGACCATCAACAGTGTGCAGGCTGAAGATCTGGCTGTTTATTACTGTCAGCAGTCCTACAGCGCTCCTAC +>329|IGKV9-120 ENSMUST00000103316|IGKV9-120|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCACAGATTTTTGGCTTCTTGTTGCTCTTGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGACATTGGTAGTAGCTTAAACTGGCTTCAGCAGGAACCAGATGGAACTATTAAACGCCTGATCTACGCCACATCCAGTTTAGATTCTGGTGTCCCCAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGTAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>330|IGKV9-123 ENSMUST00000103313|IGKV9-123|5'UTR|IG|IGK|None|00 +TTGTCATTGCATTCAGAACTCAGC +>331|IGKV9-123 ENSMUST00000103313|IGKV9-123|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATCAGGGCTCCTGCTCAGTTTCTTGGCATCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGATTCAGTCTCCATCGTCCATGTTTGCCTCTCTGGGAGACAGAGTCAGTCTCTCTTGTCGGGCTAGTCAGGGCATTAGAGGTAATTTAGACTGGTATCAGCAGAAACCAGGTGGAACTATTAAACTCCTGATCTACTCCACATCCAATTTAAATTCTGGTGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTAGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGCGTAATGCGTATCCTCT +>332|IGKV9-124 ENSMUST00000196768|IGKV9-124|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTTCCTGCTCACGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGAAATTAGTGGTTACTTAAGCTGGCTTCAGCAGAAACCAGATGGAACTATTAAACGCCTGATCTACGCCGCATCCACTTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTATCCTCC +>333|IGKV9-129 ENSMUST00000200578|IGKV9-129|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGCCGGGCAAGTCAGGACATTCATGGTTATTTAAACTTGTTTCAGCAGAAACCAGGTGAAACTATTAAACACCTGATCTATGAAACATCCAATTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCATTATCGGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>334|IGLC1 ENSMUST00000200568|IGLC1|C-REGION|IG|IGL|None|00 +GCCAGCCCAAGTCTTCGCCATCAGTCACCCTGTTTCCACCTTCCTCTGAAGAGCTCGAGACTAACAAGGCCACACTGGTGTGTACGATCACTGATTTCTACCCAGGTGTGGTGACAGTGGACTGGAAGGTAGATGGTACCCCTGTCACTCAGGGTATGGAGACAACCCAGCCTTCCAAACAGAGCAACAACAAGTACATGGCTAGCAGCTACCTGACCCTGACAGCAAGAGCATGGGAAAGGCATAGCAGTTACAGCTGCCAGGTCACTCATGAAGGTCACACTGTGGAGAAGAGTTTGTCCCGTGCTGACTGTTCC +>335|IGLC2 ENSMUST00000198182|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACTCTCACCGTGTTTCCACCTTCCTCTGAGGAGCTCAAGGAAAACAAAGCCACACTGGTGTGTCTGATTTCCAACTTTTCCCCGAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGGCAACAAGTTCATGGCCAGCAGCTTCCTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGTCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>336|IGLC3 ENSMUST00000200235|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACACTCACCATGTTTCCACCTTCCCCTGAGGAGCTCCAGGAAAACAAAGCCACACTCGTGTGTCTGATTTCCAATTTTTCCCCAAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGACAACAAGTACATGGCCAGCAGCTTCTTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGCCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>337|IGLC4 ENSMUST00000197046|IGLC4|C-REGION|IG|IGL|None|00 +GCCAACCCAAGGCTACACCCTCAGTTAATCTGTTCCCACCTTCCTCTGAAGAGCTCAAGACTAAAAAGGCCACACTGGTGTGTATGATCACTGAGTTCTACGCAGCTGCTGTGAGAGTGGCCTGGAAGGCAGATGGTACCCCTTTCACTCAGGGTGTAGAGACTACCCAGCCTCCCAAACAGAGGGACAACATGGCTAGCAGTTACCTGCTCTTCACAGCAGAAGCGTGGGAATCTCATAGCAGTTACAGCTGCCATGTCACTCATGAAGGGAACACTGTGGAGAAGAGTTTGTCCCGTGCTGAGTGTTCCTAG +>338|IGLJ1 ENSMUST00000199490|IGLJ1|J-REGION|IG|IGL|None|00 +CTGGGTGTTCGGTGGAGGAACCAAACTGACTGTCCTAG +>339|IGLJ2 ENSMUST00000197969|IGLJ2|J-REGION|IG|IGL|None|00 +TTATGTTTTCGGCGGTGGAACCAAGGTCACTGTCCTAG +>340|IGLJ3 ENSMUST00000200211|IGLJ3|J-REGION|IG|IGL|None|00 +GTTTATTTTCGGCAGTGGAACCAAGGTCACTGTCCTAG +>341|IGLJ3PSEUDOGENE ENSMUST00000200074|IGLJ3PSEUDOGENE|J-REGION|IG|IGL|None|00 +AGGTTCTTTTTCCTCAAATGGCCTATTGTATGCAGGAG +>342|IGLJ4 ENSMUST00000198313|IGLJ4|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGAGGTGGAACCAGATTGACTGTCCTAGATGA +>343|IGLV1 ENSMUST00000103746|IGLV1|5'UTR|IG|IGL|None|00 +GCTGACCAATATTGAAAAGAATAGACCTGGTTTGTGAATT +>344|IGLV1 ENSMUST00000103746|IGLV1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATTTCACTTATACTCTCTCTCCTGGCTCTCAGCTCAGGGGCCATTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGAAACAGTCACACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAACAACCGAGCTCCAGGTGTTCCTGCCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGAGGCAATATATTTCTGTGCTCTATGGTACAGCAACCATTTC +>345|IGLV2 ENSMUST00000197518|IGLV2|5'UTR|IG|IGL|None|00 +CTTGGTTTGTGAATT +>346|IGLV2 ENSMUST00000197518|IGLV2|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTTCACTTATACTCTCTCTCCTGGCTCTCTGCTCAGGAGCCAGTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGGAACAGTCATACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAGCAACCGAGCTCCAGGTGTTCCTGTCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGATGCAATGTATTTCTGTGCTCTATGGTACAGCACCCATTTC +>347|IGLV3 ENSMUST00000103751|IGLV3|5'UTR|IG|IGL|None|00 +GTACCTGCATT +>348|IGLV3 ENSMUST00000103751|IGLV3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTCTTCTTCTTTGTTCTTCATTGCTCAGGTTCTTTCTCCCAACTTGTGCTCACTCAGTCATCTTCAGCCTCTTTCTCCCTGGGAGCCTCAGCAAAACTCACGTGCACCTTGAGTAGTCAGCACAGTACGTACACCATTGAATGGTATCAGCAACAGCCACTCAAGCCTCCTAAGTATGTGATGGAGCTTAAGAAAGATGGAAGCCACAGCACAGGTGATGGGATTCCTGATCGCTTCTCTGGATCCAGCTCTGGTGCTGATCGCTACCTTAGCATTTCCAACATCCAGCCTGAAGATGAAGCAATATACATCTGTGGTGTGGGTGATACAATTAAGGAACAATTTGTGTAAC +>349|TRAC ENSMUST00000198398|TRAC|C-REGION|TR|TRA|None|00 +ACATCCAGAACCCAGAACCTGCTGTGTACCAGTTAAAAGATCCTCGGTCTCAGGACAGCACCCTCTGCCTGTTCACCGACTTTGACTCCCAAATCAATGTGCCGAAAACCATGGAATCTGGAACGTTCATCACTGACAAAACTGTGCTGGACATGAAAGCTATGGATTCCAAGAGCAATGGGGCCATTGCCTGGAGCAACCAGACAAGCTTCACCTGCCAAGATATCTTCAAAGAGACCAACGCCACCTACCCCAGTTCAGACGTTCCCTGTGATGCCACGTTGACTGAGAAAAGCTTTGAAACAGATATGAACCTAAACTTTCAAAACCTGTCAGTTATGGGACTCCGAATCCTCCTGCTGAAAGTAGCCGGATTTAACCTGCTCATGACGCTGAGGCTGTGGTCCAGT +>350|TRAJ11 ENSMUST00000103730|TRAJ11|J-REGION|TR|TRA|None|00 +TGACTCGGGATACAACAAACTCACTTTTGGAAAGGGCACGGTGCTTCTAGTCTCTCCAG +>351|TRAJ12 ENSMUST00000103729|TRAJ12|J-REGION|TR|TRA|None|00 +GGGACTGGAGGCTATAAAGTGGTCTTTGGAAGTGGGACTCGATTGCTGGTAAGCCCTG +>352|TRAJ13 ENSMUST00000103728|TRAJ13|J-REGION|TR|TRA|None|00 +CAAATTCTGGGACTTACCAGAGGTTTGGAACTGGGACAAAACTCCAAGTCGTTCCAA +>353|TRAJ15 ENSMUST00000103726|TRAJ15|J-REGION|TR|TRA|None|00 +CCTACCAGGGAGGCAGAGCTCTGATATTTGGAACAGGAACCACGGTATCAGTCAGCCCCA +>354|TRAJ16 ENSMUST00000103725|TRAJ16|J-REGION|TR|TRA|None|00 +GCAACTTCAAGTGGCCAGAAGCTGGTTTTTGGCCAGGGGACCATATTAAAGGTGTACCTGC +>355|TRAJ17 ENSMUST00000103724|TRAJ17|J-REGION|TR|TRA|None|00 +TGACTAACAGTGCAGGGAACAAGCTAACTTTTGGAATCGGAACCAGGGTGCTGGTCAGGCCAG +>356|TRAJ18 ENSMUST00000103723|TRAJ18|J-REGION|TR|TRA|None|00 +TAGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTTGGAGCTGGGACTCAGCTGATTGTCATACCTG +>357|TRAJ19 ENSMUST00000103722|TRAJ19|J-REGION|TR|TRA|None|00 +ATCTATCGAGGTTTTCATAAGTTCAGCTCTGGAATAGAATCCAAGCATAATGTAAGTCCTA +>358|TRAJ2 ENSMUST00000103738|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGACTAAGTGGTAAATTAACATTCGGGGAAGGGACCCAAGTGACGGTAATATCTG +>359|TRAJ20 ENSMUST00000103721|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTGGTAACTACAAGCTCGGTGTTGAGTCAGTAACCATGATGTCTGTAAGAGCAGG +>360|TRAJ21 ENSMUST00000103720|TRAJ21|J-REGION|TR|TRA|None|00 +TGTCTAATTACAACGTGCTTTACTTCGGATCTGGCACCAAACTCACTGTAGAGCCAA +>361|TRAJ22 ENSMUST00000103719|TRAJ22|J-REGION|TR|TRA|None|00 +CATCTTCTGGCAGCTGGCAACTCATCTTTGGATCTGGAACCCAACTGACAGTTATGCCTG +>362|TRAJ23 ENSMUST00000103718|TRAJ23|J-REGION|TR|TRA|None|00 +TGAATTATAACCAGGGGAAGCTTATCTTTGGACAGGGAACCAAGTTATCTATCAAGCCCA +>363|TRAJ24 ENSMUST00000103717|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGCCAGTTTGGGGAAACTGCAGTTTGGAACAGGAACCCAGGTTGTGGTGACCCCAG +>364|TRAJ25 ENSMUST00000103716|TRAJ25|J-REGION|TR|TRA|None|00 +GAAGGACAAAAGTCTCCTCTGTCTTTGGGACAGGGAGAAGGCTGCTGGTGAAGCCAA +>365|TRAJ26 ENSMUST00000103715|TRAJ26|J-REGION|TR|TRA|None|00 +GAAATAACTATGCCCAGGGATTAACCTTCGGTCTTGGCACCAGAGTATCTGTGTTTCCCT +>366|TRAJ27 ENSMUST00000103714|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATACAGGCAAATTAACCTTTGGGGATGGGACCGTGCTCACAGTGAAGCCAA +>367|TRAJ28 ENSMUST00000103713|TRAJ28|J-REGION|TR|TRA|None|00 +TCTACCAGGCACTGGGAGTAACAGGCTCACTTTTGGGAAAGGCACCAAATTCTCACTCATCCCGA +>368|TRAJ29 ENSMUST00000103712|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAGCAGGGAGCTTGTCTTAGGAAGGGAAGCAAGGCTTTCTATGATTGAAA +>369|TRAJ3 ENSMUST00000103737|TRAJ3|J-REGION|TR|TRA|None|00 +GGAATTCAGCTATAGCTCTAAACTAATCTTTGGAGCTGAAACCAAACTCAGAAATCCACCATATAC +>370|TRAJ30 ENSMUST00000103711|TRAJ30|J-REGION|TR|TRA|None|00 +TGACACAAATGCTTACAAAGTCATCTTTGGAAAAGGGACACATCTTCATGTTCTCCCTA +>371|TRAJ31 ENSMUST00000103710|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAGCAATAACAGAATCTTCTTTGGTGATGGGACGCAGCTGGTGGTGAAGCCCA +>372|TRAJ32 ENSMUST00000103709|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGGAGCAGTGGCAACAAGCTCATCTTTGGAATTGGGACTCTGCTTTCTGTCAAGCCAA +>373|TRAJ33 ENSMUST00000103708|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTGATCTGGGGCTCTGGGACCAAGCTAATTATAAAGCCAG +>374|TRAJ34 ENSMUST00000103707|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTCCAATACCAACAAAGTCGTCTTTGGAACAGGGACCAGATTACAAGTATTACCAA +>375|TRAJ35 ENSMUST00000103706|TRAJ35|J-REGION|TR|TRA|None|00 +GCAGACAGGCTTTGCAAGTGCGCTGACATTTGGATCTGGCACAAAAGTCATTCCATGTCTACCAT +>376|TRAJ37 ENSMUST00000103705|TRAJ37|J-REGION|TR|TRA|None|00 +TAACAGGCAATACCGGAAAACTCATCTTTGGACTGGGGACAACTTTACAAGTGCAACCAG +>377|TRAJ38 ENSMUST00000103704|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGTTGGTGACAACAGTAAGCTGATTTGGGGCTTGGGGACAAGTCTGGTAGTAAATCCAA +>378|TRAJ39 ENSMUST00000103703|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGTGCCAAGCTCACATTCGGAGGGGGAACAAGGTTAACGGTCAGACCCG +>379|TRAJ4 ENSMUST00000103736|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTATCTGGTAGCTTCAATAAGTTGACCTTTGGAGCAGGGACCAGACTGGCTGTGTGCCCAT +>380|TRAJ40 ENSMUST00000103702|TRAJ40|J-REGION|TR|TRA|None|00 +GTTAATACAGGAAACTACAAATACGTCTTTGGAGCAGGTACCAGACTGAAGGTTATAGCAC +>381|TRAJ41 ENSMUST00000103701|TRAJ41|J-REGION|TR|TRA|None|00 +GGTCTCAAACACTAGCTCCATGTTGGCAGAAGCACCTCATTATTGGTCACACCCG +>382|TRAJ42 ENSMUST00000103700|TRAJ42|J-REGION|TR|TRA|None|00 +AATTCTGGAGGAAGCAATGCAAAGCTAACCTTCGGGAAAGGCACTAAACTCTCTGTTAAATCAA +>383|TRAJ43 ENSMUST00000103699|TRAJ43|J-REGION|TR|TRA|None|00 +GCAATAACAACAATGCCCCACGATTTGGAGCGGGAACCAAATTATCAGTAAAACCAA +>384|TRAJ44 ENSMUST00000103698|TRAJ44|J-REGION|TR|TRA|None|00 +GTTACTGGCAGTGGTGGAAAACTCACTTTGGGGGCTGGAACAAGACTTCAGGTCAACCTTG +>385|TRAJ45 ENSMUST00000103697|TRAJ45|J-REGION|TR|TRA|None|00 +TGAATACAGAAGGTGCAGATAGACTCACCTTTGGGAAAGGAACTCAGCTGATCATCCAGCCCT +>386|TRAJ46 ENSMUST00000103696|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAAGACAGCAGTGTAGACATGCTGGCTTTGGGGATGGGGATGAACTTGGAGTGAGCACAAA +>387|TRAJ47 ENSMUST00000197949|TRAJ47|J-REGION|TR|TRA|None|00 +TGGACTATGCAAACAAGATGATCTTTGGCTTGGGAACCATTTTGAGAGTCAGACCTC +>388|TRAJ48 ENSMUST00000200046|TRAJ48|J-REGION|TR|TRA|None|00 +GCCAACTATGGAAATGAGAAAATAACTTTTGGGGCTGGAACCAAACTCACCATTAAACCCA +>389|TRAJ49 ENSMUST00000199452|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACGGGTTACCAGAACTTCTATTTTGGGAAAGGAACAAGTTTGACTGTCATTCCAA +>390|TRAJ5 ENSMUST00000103735|TRAJ5|J-REGION|TR|TRA|None|00 +GGGGACACAGGTTGTGGGGCAGCTCACTTTCGGGAGGGGGACAAGACTCCAAGTTTATGCAA +>391|TRAJ50 ENSMUST00000103693|TRAJ50|J-REGION|TR|TRA|None|00 +TAGCATCCTCCTCCTTCAGCAAGCTGGTGTTTGGGCAGGGGACATCCTTATCAGTCGTTCCAA +>392|TRAJ52 ENSMUST00000103691|TRAJ52|J-REGION|TR|TRA|None|00 +CTAACACTGGAGCTAACACTGGAAAGCTCACGTTTGGACACGGCACCATCCTTAGGGTCCATCCAA +>393|TRAJ53 ENSMUST00000103690|TRAJ53|J-REGION|TR|TRA|None|00 +GGAACAGTGGAGGCAGCAATTACAAACTGACATTTGGGAAAGGAACTCTCTTAACTGTGACTCCAA +>394|TRAJ56 ENSMUST00000103689|TRAJ56|J-REGION|TR|TRA|None|00 +TGGCTACTGGAGGCAATAATAAGCTGACTTTTGGTCAAGGAACCGTTCTGAGTGTTATACCAG +>395|TRAJ57 ENSMUST00000196977|TRAJ57|J-REGION|TR|TRA|None|00 +TGAATCAAGGAGGGTCTGCGAAGCTCATCTTTGGGGAGGGGACAAAGCTGACAGTGAGCTCAT +>396|TRAJ58 ENSMUST00000103687|TRAJ58|J-REGION|TR|TRA|None|00 +TGCAGCAAGGCACTGGGTCTAAGCTGTCATTTGGGAAGGGGGCAAAGCTCACAGTGAGTCCAG +>397|TRAJ59 ENSMUST00000197589|TRAJ59|J-REGION|TR|TRA|None|00 +CTACTAAAAAGAGAAGATAAAGCTACCTTTGCAACTGGAGGGTATGAAGCTGAGGAAGACCT +>398|TRAJ6 ENSMUST00000103734|TRAJ6|J-REGION|TR|TRA|None|00 +AACCTCAGGAGGAAACTACAAACCTACGTTTGGGAAAGGGACCAGCCTCGTGGTTCATCCAT +>399|TRAJ7 ENSMUST00000103733|TRAJ7|J-REGION|TR|TRA|None|00 +GGACTACAGCAACAACAGACTTACTTTGGGGAAGGGAACCCAGGTGGTGGTGTTACCAA +>400|TRAJ9 ENSMUST00000103731|TRAJ9|J-REGION|TR|TRA|None|00 +AGCAACATGGGCTACAAACTTACCTTCGGGACAGGAACAAGCTTGTTGGTTGATCCAA +>401|TRAV1 ENSMUST00000103567|TRAV1|5'UTR|TR|TRA|None|00 +GCTCAGGAGCTGGGGACTCAGTGTCAGGCTGGTGGTGTC +>402|TRAV1 ENSMUST00000103567|TRAV1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGCAGATGTGGGGGTTTGTTCTCTATCTCTTCCTGACGGTGGGAGGTGCTGCAGGACAGGGTGTGGAGCAGCCTGCCAAATTGATGTCTGTGGAGGGAACCTTTGCTCGGGTCAACTGCACATACAGCACCTCAGGGTTCAACGGGTTATCCTGGTACCAGCAACGTGAAGGCCAAGCCCCTGTATTTCTTTCTTATGTTGTTTTGGATGGTTTGAAGGACAGTGGGCATTTCTCCACTTTCCTGAGCCGCTCGAATGGGTACAGTTACCTGCTTCTGACAGAGCTCCAGATCAAAGACTCTGCCTCATACCTCTGTGCTGTGAGGGA +>403|TRAV10 ENSMUST00000103583|TRAV10|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>404|TRAV10 ENSMUST00000103583|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTATGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACATGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCTTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>405|TRAV10D ENSMUST00000103646|TRAV10D|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>406|TRAV10D ENSMUST00000103646|TRAV10D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>407|TRAV10N ENSMUST00000103612|TRAV10N|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAAAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTACAGTTTTATTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>408|TRAV11 ENSMUST00000103585|TRAV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGCG +>409|TRAV12-1 ENSMUST00000200115|TRAV12-1|5'UTR|TR|TRA|None|00 +GTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCT +>410|TRAV12-1 ENSMUST00000200115|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTCCTCAGTTCTCGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACCGAGGGGTTGCCTGTGAAGCTGAACTGCACCTATCAGACTACTTATTTAACTATTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTCAGGTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>411|TRAV12-2 ENSMUST00000180972|TRAV12-2|5'UTR|TR|TRA|None|00 +GTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>412|TRAV12-2 ENSMUST00000180972|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAACAATGGAGACTCTGTGACCCAGACAGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGAGTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTTTTGAAGAGCTTCACAGACAACAAGAGGCCCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTTTGAGTGA +>413|TRAV12-3 ENSMUST00000103657|TRAV12-3|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTTTGAGGAGATCCTGCAGTAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCTATGAAC +>414|TRAV12-3 ENSMUST00000103657|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGGCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGAGATGGAGACTCAGTGACCCAGAAGGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATGCTTTCCTTTTCTGGTATGTGCACTATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>415|TRAV12D-3 ENSMUST00000177703|TRAV12D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>416|TRAV12N-1 ENSMUST00000198682|TRAV12N-1|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>417|TRAV12N-1 ENSMUST00000198682|TRAV12N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTGCTTACTCAGATGTTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTAAACTACTCCTGCGGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>418|TRAV12N-2 ENSMUST00000196674|TRAV12N-2|5'UTR|TR|TRA|None|00 +GAGACTGTGCAGACAGAGGCCCTTGTCTGTGAGTGAGGAGTGTGAGGAGATTCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAGGGACCAAGTGTCATTTCTTCCATGAAC +>419|TRAV12N-2 ENSMUST00000196674|TRAV12N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAGCAATGGAGACTCAGTGACCCAGACAGAAGGCCTGGTCACTCTCACCAAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCTACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTTCTGTGCTTTGAGTGA +>420|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|5'UTR|TR|TRA|None|00 +CTGAAC +>421|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>422|TRAV13-1 ENSMUST00000103651|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGAGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCATAGTGGGAGACTGACATCCACTACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>423|TRAV13-2 ENSMUST00000103658|TRAV13-2|5'UTR|TR|TRA|None|00 +TGACACAACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCATCCACACAAGCACC +>424|TRAV13-2 ENSMUST00000103658|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGTTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACATCCTGGGGGAAGACTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAACGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATAGATC +>425|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>426|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCGGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>427|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|5'UTR|TR|TRA|None|00 +CCACCCTGACACCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>428|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>429|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>430|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAATGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>431|TRAV13D-4 ENSMUST00000196079|TRAV13D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACACAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATGGAAC +>432|TRAV13N-1 ENSMUST00000198359|TRAV13N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCATCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>433|TRAV13N-2 ENSMUST00000196941|TRAV13N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCAGCTGCAGTGGTTTTACCAAAGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAGGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTATAGATC +>434|TRAV13N-3 ENSMUST00000179580|TRAV13N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAACGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>435|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|5'UTR|TR|TRA|None|00 +GACTGGTTGCAGAAGAAGGAGGGGACACTTCAACAGCCACCCTGACACCACAGCCCAGGAGCTGGTTACTTGCTTCTGTCTCCAGCAGCTACACAAGCACC +>436|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>437|TRAV14-1 ENSMUST00000198297|TRAV14-1|5'UTR|TR|TRA|None|00 +CACCTGAGTTTCCCCCAAGCTTCAGTCTAGGAGGA +>438|TRAV14-1 ENSMUST00000198297|TRAV14-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATTCTGACAGCATCATTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGAAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGGAACCACAGTTCTGACCTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAACAGTTCCCTGGGGAAGGCCCTGCACTTCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAACCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCATAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>439|TRAV14-2 ENSMUST00000179267|TRAV14-2|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAAGAGGA +>440|TRAV14-2 ENSMUST00000179267|TRAV14-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACCATCAGTTCCCTGGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGTTCTCCTTGCACATCGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>441|TRAV14-3 ENSMUST00000103589|TRAV14-3|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAGGAGAA +>442|TRAV14-3 ENSMUST00000103589|TRAV14-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCATTTTTACTTCTAGGCCTTCACCTATCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTAAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCCACTTACTTCTGTGCAGCAAGTG +>443|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|5'UTR|TR|TRA|None|00 +CTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGACCACAGAGTTTCTCCCAAGCTTCAGTCTAGGAGGA +>444|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTTCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGTCCCGCTCTCCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATTGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>445|TRAV14N-1 ENSMUST00000196639|TRAV14N-1|5'UTR|TR|TRA|None|00 +GTGGGAGACAAAAGGTCACCTGAGTTCCCTTCAAGCTTCAGTCTAGGAGGA +>446|TRAV14N-1 ENSMUST00000196639|TRAV14N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCAACGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCACTCCTGATATCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>447|TRAV14N-2 ENSMUST00000197614|TRAV14N-2|5'UTR|TR|TRA|None|00 +GGAGCCTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGGCCACCTGAGTTCCCCCAAGCTTCAGTCTAGGAGGA +>448|TRAV14N-2 ENSMUST00000197614|TRAV14N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACTGGCAGTTCCCTAGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>449|TRAV14N-3 ENSMUST00000103652|TRAV14N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATTGTTTTTACTTCTAGGTCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTTCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAATCTCTCCTTGCACATCAAAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>450|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|5'UTR|TR|TRA|None|00 +GCTGAGGCAGAGCAGACACACTCATGCAGAGGACAGTGTGTCAC +>451|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCCAGAAAGTGATTCAGGTCTGGTCAACAACAAGCAGGCAGGAGGGCGAAAAACTCACACTGGACTGTTCATATAAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTGCTTATTCGACAAATGCCTTCTACTATTGCAATAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACGCAAATCCATCAGCCTTGTCATTTCAACCTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>452|TRAV15-2-DV6-2 ENSMUST00000103660|TRAV15-2-DV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGGACATGTGTCACATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGTCAACAGGCAGCAGTCAGTGGGGAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTCCTACCTTATTCTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGATACTCAGAACCAGAGGAGCGGCCACTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>453|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|5'UTR|TR|TRA|None|00 +GCACTTAGACACTGATCTCTGAGCTGAGGCAGAGCAGACACACTC +>454|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGACAGTGTGTCACATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>455|TRAV15N-1 ENSMUST00000197433|TRAV15N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>456|TRAV15N-2 ENSMUST00000199112|TRAV15N-2|5'UTR|TR|TRA|None|00 +GAGCTGAGGCAGAGCAGACACACTCATGCAGAGGGACATGTGTCAC +>457|TRAV15N-2 ENSMUST00000199112|TRAV15N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGCCAACAGGCAGCAGTCAGTGGGGAGAAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTTCTACCGTATTTTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGACACTCAGAACCAGAGGAGCGGCCGCTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>458|TRAV16 ENSMUST00000103667|TRAV16|5'UTR|TR|TRA|None|00 +CACAAAGTATAGATTAAGATCTGGTTGAGAGAGGACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>459|TRAV16 ENSMUST00000103667|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGCTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGAAGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACTGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>460|TRAV16D-DV11 ENSMUST00000103606|TRAV16D-DV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCTCCATTTTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCAGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCGGCAGTATATTTCTGTGCTATGAGAGAGGG +>461|TRAV16N ENSMUST00000199280|TRAV16N|5'UTR|TR|TRA|None|00 +ATAGATTAAGATCTGGTTGAGAGAGAACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>462|TRAV16N ENSMUST00000199280|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>463|TRAV17 ENSMUST00000103672|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGTTCCCAGTGACCATTCTGCTGCTCAGCGCGTTCTTCTCACTGAGAGGAAACAGTGCCCAGTCCGTGGACCAGCCTGATGCTCATGTCACGCTCTCTGAAGGAGCCTCCCTGGAGCTCAGATGCAGTTATTCATACAGTGCAGCACCTTACCTCTTCTGGTACGTGCAGTATCCTGGCCAGAGCCTCCAGTTTCTCCTCAAATACATCACAGGAGACACCGTTGTTAAAGGCACCAAGGGCTTTGAGGCCGAGTTTAGGAAGAGTAACTCCTCTTTCAACCTGAAGAAATCCCCAGCCCATTGGAGCGACTCAGCCAAGTACTTCTGTGCACTGGAGGG +>464|TRAV18 ENSMUST00000103673|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGAAACTCTCTGTGTTGCTCCTTTGGAATCAAGTGGCCCGTGTGGCCACTCAACGGCTGGAGCAGAGTCCTCGGTTTCTGAGTATCCAGGAGGGGCAAGATTTCACTGCACGCTGCAGCTCCTCAACCACCTTCCCCCAACTTTACTGGTACCGACAGGTCCCCAGGGAAGGTCCTGTCATCCTGGTGACATTGGTCAAGAGTGGAGAGGTAAAGGAGCAGAGGAGGATGACTGCTAAGTTTGGTGAAGCAAGAAAGAACAGCTCCCTATTCATCGCCAGAGCTCAGCCTGGAGACGCAGGCATCTACTTCTGTACAGGAA +>465|TRAV19 ENSMUST00000103674|TRAV19|5'UTR|TR|TRA|None|00 +AAAGGGAATAAAGTCAGGACAGGAAGATGAAATCTGAGTTGCAGTTCCCTGAGTAGAAGGAGAGACAACTCAAAGCTTCAGAGAAGAC +>466|TRAV19 ENSMUST00000103674|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGACTGGCTTCCTGAAGGCCTTGCTGTTGGTTCTGTGCCTGCGGCCAGAATGGGTAAAGAGTCAACAGAAGACTAGTGGCCAGCAAGTTAAACAAAGCTCTCCATCGCTGACTGTTCAAGAGGGAGGGATATCGATCCTGAATTGTGACTACGAGAATGATATGTTTGACTATTTTGCCTGGTACAAAAAATACCCTGACAACAGCCCCACACTCCTGATATCCGTACGCTCAAATGTGGATAAGAGGGAAGACGGAAGACTCACAGTTTTCTTGAACAAAAGCGGCAAACACTTCTCACTGCACATCACAGCCTCCCAGCCTGAAGACACAGCAGTGTACCTCTGCGCAGCAGGTG +>467|TRAV2 ENSMUST00000196939|TRAV2|5'UTR|TR|TRA|None|00 +CAGTGGCTTCTGAGTCTCCTCCTTGGTTCGTATTCTGGTCTAAGCTCAGATTCAGCAAAGAATCTGGAATCTGGGCCTGTGCTTACAAAGAGAAT +>468|TRAV2 ENSMUST00000196939|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCAGGTGGCAAAAGTGACTGTGCTCCTGATCTTGGTCTCATGGAGCCTTGCCAAGACCACCCAGCCCCCCTCCATGGAGGCCTATGAAGGGCAAGAAGTGAACGTGTCCTGCAGCCATACAAACATTGCTACAAGCGAGTACATCTACTGGTACCGACAGGTTCCCCACCAGGGACCACAGTTTATCATTCAAGGATATAAGGACTATGTGGTAAATGAAGTGGCATCTCTGTTTATCTCTGCTGACCGGAAGCTCAGCACTCTGAGCCTGCCCTGGGTTTCCCTGAGAGATGCTGCTGTGTATTACTGCATTGTGACTGACA +>469|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|5'UTR|TR|TRA|None|00 +ACAGATCTGAGCTCATCCATTTGCTCTTAACT +>470|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGATGTGTGAGTGGAATTGCCATTCTCCTGGCTTTGGGTATTGCGGGTGATGCTAAGACTACACAACCAGATTCAATGGAAAGTACTGAAGGAGAAACGGTGCACTTGCCTTGTAGCCACGCCACAATCAGTGGAAACGAGTACATCTATTGGTACCGACAGGTTCCTCTTCAGGGTCCAGAATATGTGACTCACGGTCTACAACAAAATACAACCAATAGTATGGCTTTCCTGGCTATTGCCTCTGACAGAAAGTCAAGCACCTTGATCCTGCCTCATGTCAGCCTGAGAGACGCGGCTGTGTACCACTGTATCCTGAGAGTAG +>471|TRAV3-1 ENSMUST00000103569|TRAV3-1|5'UTR|TR|TRA|None|00 +GGCATCTTGTCTGGCTGAAGGCCACAGTCCAGAGGGAGAGCA +>472|TRAV3-1 ENSMUST00000103569|TRAV3-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTGCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCATTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTCCTGGTACAAGCAAGAGGCGGGGGCAGGTCTTCAGTTGCTTATGAGTGTCCTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>473|TRAV3-3 ENSMUST00000181768|TRAV3-3|5'UTR|TR|TRA|None|00 +GAAGATGCCTCAGTGCTGTGGAGGTGATCACAGAGGCATCTTGTCTGGCTGAAGGTCAGAGTCTGGAGGGAGAGCA +>474|TRAV3-3 ENSMUST00000181768|TRAV3-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCACCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAAGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGCGTACTTCTGCGCAGTCAGTG +>475|TRAV3-4 ENSMUST00000103670|TRAV3-4|5'UTR|TR|TRA|None|00 +CAGTAGCCTTCTGTGCAGACAGGTGAAGTAGCCTCAGTGCTGTGGAGAACAGAGGAGGTGAGCTGATCACAGAGGCATCTTGTCTGGCTGAAGGCCAGAGTCTGGAGGGAGAGCA +>476|TRAV3-4 ENSMUST00000103670|TRAV3-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACAGTGGCTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGTTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCTTTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTACTGGTACAAGCAAGAGCCAGGGGCAGGTCTTCAGTTGCTTATGAGTGTCTTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCTGTGTACTTCTGCGCAGTCAGTG +>477|TRAV3N-3 ENSMUST00000197557|TRAV3N-3|5'UTR|TR|TRA|None|00 +ACACAGCTGAAGATGCCTCCGTGTTGTGGAGGTGATCACAGAGGCATCCTGTCTGGCTAAAGGTCAGAGTCTGGAGGGAGCGCA +>478|TRAV3N-3 ENSMUST00000197557|TRAV3N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCATCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAGGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACAACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>479|TRAV4-2 ENSMUST00000103637|TRAV4-2|5'UTR|TR|TRA|None|00 +CCCTGCTGACTGTTGGAAATCAGCAGCTTGACAGGGTCA +>480|TRAV4-2 ENSMUST00000103637|TRAV4-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAGCCCGGGAACTGTGCTGGGGCTGCTGTTGGTGCCGCTATGCTGGGTAAGAGGAATGCCGGTGGAACAGAATCCTCCAGCCCTGAGTCTTTATGAAGGAGCTGAGTCTGGTCTGAGATGCAATTTTTCTACCACCATGAAAGGTGTCCAGTGGTTTCAACAAAATCACAGAGGCAGACTTATCACTCTGTTTTACCTGGCTCAAGGAACAAAGGAGAATGGAAGGTTAAAGTCAACATTCAATTCTAAGGAGCGCTACAGCACCCTGCACATCAAGGATGCACAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGTTGAGG +>481|TRAV4-3 ENSMUST00000103655|TRAV4-3|5'UTR|TR|TRA|None|00 +AGTCTGTAAGCACAAGTGTGTCTGGGCATAAGACACCCTTCAGAGCTGGAGAGAAGACAACCAGCGATTGGACAGGGGCC +>482|TRAV4-3 ENSMUST00000103655|TRAV4-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAACAAAGTCCCTCAGCGCTGAGTCTCCAAGAAGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCCGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATCAATCTTTTTTACCTGGTTCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTCGATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>483|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|5'UTR|TR|TRA|None|00 +GAGAAGACAACCAGCGATTGGACAGGGGCC +>484|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGGCTGTGCAGTGGTTCCAACAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAACATTCAATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>485|TRAV4N-3 ENSMUST00000103618|TRAV4N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAGCAAAGTCCCTCAGCGCTGAGTCTCCAAGAGGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCTGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATGAATCTTTTTTACCTGGTGCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTTGATTCTAAGGAGAGCTACAGCACCCTGCACATTAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>486|TRAV4N-4 ENSMUST00000103627|TRAV4N-4|5'UTR|TR|TRA|None|00 +ATCCCAGCGATTGGACAGGGGCC +>487|TRAV4N-4 ENSMUST00000103627|TRAV4N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACTACCACCATGAGGGCTGTGCAGTGGTTCCGAAAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>488|TRAV5-1 ENSMUST00000103570|TRAV5-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGCTATTCATGCTTTATTTATTTTCTTCTGGCTACAGATGGACTGGAAGAGCCAAGGTGAGCAGGTGGAACAGCTCCCTTCCTCCCTGATTGTCCAGGAGGGAGCCAGTGTTCTGATCAACTGCTCCTACACAGACAGTGCCTCTGTCTACTTCCCTTGGTATAAGCAAGAGCCTGGGAAGCGTCTTCAGTTCATCATAGACATCCGTTCAAATATGGAAAGAAAGCAGACTCAAAGACTCACCCTTTTATTTGATAAGAAAACCAAACACCTTTCCCTGCACATTACAGCCACTCAGCCTGGAGACTCAGCCATCTACTTCTGCTCAGCAAGTA +>489|TRAV5-4 ENSMUST00000103664|TRAV5-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGCGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCAGTTATGAAGACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGATCCAAGAACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>490|TRAV5N-4 ENSMUST00000179997|TRAV5N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGTGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCACTTATGAGAACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGACCCAAGGACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>491|TRAV6-1 ENSMUST00000103571|TRAV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGCTTTAGTGACTGTGATGCTGTTTGTGTTTGGGAGGACCCATGGAGACTCAGTAACCCAGATGCAAGGTCAAGTGACCCTCTCAGAAGACGACTTCCTATTTATAAACTGTACTTATTCAACCACATGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAACAAGGGAATCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACAACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCTGCTGTGTACTACTGTGTTCTGGGTGA +>492|TRAV6-2 ENSMUST00000198058|TRAV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACACTTCTCCAGCTTTAGTGACTGTGATGCTGCTGTTCATGCTTGAGAGGACACATGGAAATTCAGTGACCCAGATGCAAGGTCAAGTGACCCTTTCAGAAGAGGAGTTTCTATTTATAAACTGTACCTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAATAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>493|TRAV6-3 ENSMUST00000180549|TRAV6-3|5'UTR|TR|TRA|None|00 +ATCATTTCTTCATGTGAAGAGTTGAGAGCATCACTCTGGTGACACTGAAG +>494|TRAV6-3 ENSMUST00000180549|TRAV6-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGAGA +>495|TRAV6-4 ENSMUST00000180711|TRAV6-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCAGCACTCTACACTGAAC +>496|TRAV6-4 ENSMUST00000180711|TRAV6-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTAACTGTGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACATACCCAACTCTTTTGTGGTATGTCCAATATCTTGGACAAGGTCCACAGCTCCTTCTGAAAGTGACAACTGCCAACAATAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>497|TRAV6-5 ENSMUST00000181210|TRAV6-5|5'UTR|TR|TRA|None|00 +AAAATATTTGTATTCACACACTCCAGTGGCTCAGAAA +>498|TRAV6-5 ENSMUST00000181210|TRAV6-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>499|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|5'UTR|TR|TRA|None|00 +AC +>500|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTAAGAATCATGAACACTGTCGAGATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGGCCACAGCTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCTTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>501|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|5'UTR|TR|TRA|None|00 +ACACTGAAG +>502|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGTGA +>503|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCATCACTCTACACTGAAC +>504|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTGACTGCGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACGTACCCAACTCTTTTCTGGTATGTCCAATATCCTGGACAAGGTCCACAGCTCCTTCTGAAAGTCACAACTGCCAACAACAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACCTCCTTCCACTTACAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>505|TRAV6D-5 ENSMUST00000180687|TRAV6D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGGATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCGGTGACTCAGACAAAAGGTCCAGTGACATTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACGTATGATAAAGGGACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>506|TRAV6D-6 ENSMUST00000197754|TRAV6D-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTTGGAAGGACCCACGGAGATTCCGTGACTCAAACAGAAGGCCCAGTGACCGTCTCAGAAAGCGAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGCTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>507|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|5'UTR|TR|TRA|None|00 +CTGTCGAGATGGGTCTAAAG +>508|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>509|TRAV6N-5 ENSMUST00000103611|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>510|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|5'UTR|TR|TRA|None|00 +ACTTTCTAGATGACACTAAAG +>511|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTGGGAAGGACCCATGGAGATTCCGTGACTCAAACAGAAGGCCAAGTGACTGTCTCAGAAAGCAAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGGTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGCGCTCTGAGTGA +>512|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|5'UTR|TR|TRA|None|00 +CTGTCGAG +>513|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>514|TRAV7-1 ENSMUST00000198019|TRAV7-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTCCTTGTGTGTTTCACTAGTGGTCCTGTGGCTTCAGCTACACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTAATTCTCAGTATTTCTGGTGGTACAGACAGCATTCTGGGGAAGGCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGACAAGAAGGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTATCCCTGCACATCAAAGACTCCCAACCCAGTGACTCTGCTCTCTACTTCTGTGCAGTGAGCA +>515|TRAV7-3 ENSMUST00000177622|TRAV7-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAACTTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAGGAAGAGAGA +>516|TRAV7-3 ENSMUST00000177622|TRAV7-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>517|TRAV7-4 ENSMUST00000181728|TRAV7-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>518|TRAV7-4 ENSMUST00000181728|TRAV7-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCAATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>519|TRAV7-5 ENSMUST00000200609|TRAV7-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGCAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACGTTCAGTGATGGTACTTCTAACAACTTCAGGTGGTACAGACAGCATTCTGCGAAAGGCCTTGAGGTGCTAGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGATTTACAGCTCACCTCAATAGAGCCAACTTGCATGTTTCCCTACACATCAGAGAACCACAACCCAGTGACTCTGCTGTCTACCTCTGTGCAGTGAGCA +>520|TRAV7-6 ENSMUST00000103641|TRAV7-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>521|TRAV7-6 ENSMUST00000103641|TRAV7-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGGTCTCCCTCAACTGCAGTTTCAGCGACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCAAAGCACTAATATCCATCTTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAAAGACTCCCAGCCCAGTGACTCCGCTGTCTACCTCTGTGCAGTGAGCA +>522|TRAV7D-2 ENSMUST00000200127|TRAV7D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGCA +>523|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAAATTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAAGAAGAGAGA +>524|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCGCTACACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>525|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>526|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTTACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>527|TRAV7N-4 ENSMUST00000103609|TRAV7N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAAGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTATTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAAGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGTTAGTGAGCA +>528|TRAV7N-5 ENSMUST00000199753|TRAV7N-5|5'UTR|TR|TRA|None|00 +ATG +>529|TRAV7N-5 ENSMUST00000199753|TRAV7N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGAAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTTCTTCTGACAACTTCAGGTGGTACAGACAGCATTCTGGGAAAGGCCTTGAGGTGCTGGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGTTTTACAGCTCACCTCAATAGAGCCAGCCTGCATGTTTTCCTACACATCAGAGAGCCGCAACCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>530|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>531|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGTCCTCCCTCAACTGCACTTTCAGCAACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCGAAGCACTAATATCCATATTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCCGTCTACCTCTGTGCAGTGAGCA +>532|TRAV8-1 ENSMUST00000103643|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGTTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATTCGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>533|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|5'UTR|TR|TRA|None|00 +AAACCAACCACCTTGAACAGGCCTGGAGCTGTATCTCTTGCGATCTGATCTTCATAGGGAAGA +>534|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGATGGTGTCACTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATCTGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCGAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>535|TRAV8D-2 ENSMUST00000198439|TRAV8D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCGAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTATACAACTGTTGTACACTGGTACAGGCAAGACTCAGGCAGAGGCCCTGCCCTGATAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTAAGAGCCACCCTTGACACCTCCAGCCAAAGTAGCTCTCTGTCCATCACTGCTGCTCAGTGTGAAGACACTGCTGTGTACTTCTGTGCTACAGATG +>536|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|5'UTR|TR|TRA|None|00 +CTGTCCTAGGAACCAGGTTCCACTTCAGGGTGCAGCACAGCCTTTCCTGTGACATCAATAAAGCAAGAAAA +>537|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCAAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTACACAACTGTTGTTCAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTCAGAGCCACCCTTGACACTTCCAGCCAGAGCAGCTCCCTGTCCATCACTGGTACTCTAGCTACAGACACTGCTGTGTACTTCTGTGCTACTGATG +>538|TRAV9-1 ENSMUST00000103581|TRAV9-1|5'UTR|TR|TRA|None|00 +TCTTTCCTGCACGAGCCAGGTTTTTCCAGAAAGGCACCAGAGCTGTTTCCAGTGTGCAGCC +>539|TRAV9-1 ENSMUST00000103581|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCATGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCGAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>540|TRAV9-2 ENSMUST00000103654|TRAV9-2|5'UTR|TR|TRA|None|00 +TTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCCTACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCTTTTCCAAGGCTCAGCC +>541|TRAV9-2 ENSMUST00000103654|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCTGCTGTGTACTTCTGTGTTTTGAGCG +>542|TRAV9-4 ENSMUST00000103662|TRAV9-4|5'UTR|TR|TRA|None|00 +TGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>543|TRAV9-4 ENSMUST00000103662|TRAV9-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCACTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACGCCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCATCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>544|TRAV9D-1 ENSMUST00000178426|TRAV9D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCGTGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCAAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>545|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>546|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>547|TRAV9N-2 ENSMUST00000198913|TRAV9N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTCCTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGTTCTGAGCG +>548|TRAV9N-3 ENSMUST00000177705|TRAV9N-3|5'UTR|TR|TRA|None|00 +ATCTCATCCCTCTTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGTTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCTGCTTTCCTGCCTGTCCTGTTCCAGAGTTTCTCCACAACAGAGCTGCAGCCTTCTCAAGGCTCAGTC +>549|TRAV9N-3 ENSMUST00000177705|TRAV9N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTCTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTTTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATCCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTGGGCTGTGTACTTCTGTGCTGTGAGCA +>550|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>551|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAACAGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>552|TRBC1 ENSMUST00000192856|TRBC1|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGCAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGGATTACCTCAGCATCCTATCAACAAGGGGTCTTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAAGCCACCCTGTATGCTGTGCTTGTCAGTACACTGGTGGTGATGGCTATGGTCAAAAGAAAGAATTCA +>553|TRBC2 ENSMUST00000103299|TRBC2|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGAAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGAATCACTTCAGCATCCTATCATCAGGGGGTTCTGTCTGCAACCATCCTCTATGAGATCCTACTGGGGAAGGCCACCCTATATGCTGTGCTGGTCAGTGGCCTGGTGCTGATGGCCATGGTCAAGAAAAAAAATTCC +>554|TRBD1 ENSMUST00000178537|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>555|TRBD2 ENSMUST00000178862|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTGGGGGGGC +>556|TRBJ1-1 ENSMUST00000103284|TRBJ1-1|J-REGION|TR|TRB|None|00 +CAAACACAGAAGTCTTCTTTGGTAAAGGAACCAGACTCACAGTTGTAG +>557|TRBJ1-2 ENSMUST00000103285|TRBJ1-2|J-REGION|TR|TRB|None|00 +CAAACTCCGACTACACCTTCGGCTCAGGGACCAGGCTTTTGGTAATAG +>558|TRBJ1-3 ENSMUST00000192366|TRBJ1-3|J-REGION|TR|TRB|None|00 +TTCTGGAAATACGCTCTATTTTGGAGAAGGAAGCCGGCTCATTGTTGTAG +>559|TRBJ1-4 ENSMUST00000103287|TRBJ1-4|J-REGION|TR|TRB|None|00 +TTTCCAACGAAAGATTATTTTTCGGTCATGGAACCAAGCTGTCTGTCCTGG +>560|TRBJ1-5 ENSMUST00000103288|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAACAACCAGGCTCCGCTTTTTGGAGAGGGGACTCGACTCTCTGTTCTAG +>561|TRBJ1-6 ENSMUST00000103289|TRBJ1-6|J-REGION|TR|TRB|None|00 +TTCCTATAATTCGCCCCTCTACTTTGCGGCAGGCACCCGGCTCACTGTGACAG +>562|TRBJ1-7 ENSMUST00000193061|TRBJ1-7|J-REGION|TR|TRB|None|00 +CCTGTGTTGGATGACCATGGTCTTGGAAAGGAACTTAGGTATAAGA +>563|TRBJ2-1 ENSMUST00000103293|TRBJ2-1|J-REGION|TR|TRB|None|00 +TAACTATGCTGAGCAGTTCTTCGGACCAGGGACACGACTCACCGTCCTAG +>564|TRBJ2-2 ENSMUST00000103294|TRBJ2-2|J-REGION|TR|TRB|None|00 +CAAACACCGGGCAGCTCTACTTTGGTGAAGGCTCAAAGCTGACAGTGCTGG +>565|TRBJ2-3 ENSMUST00000103295|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGTGCAGAAACGCTGTATTTTGGCTCAGGAACCAGACTGACTGTTCTCG +>566|TRBJ2-4 ENSMUST00000103296|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGTCAAAACACCTTGTACTTTGGTGCGGGCACCCGACTATCGGTGCTAG +>567|TRBJ2-5 ENSMUST00000103297|TRBJ2-5|J-REGION|TR|TRB|None|00 +AACCAAGACACCCAGTACTTTGGGCCAGGCACTCGGCTCCTCGTGTTAG +>568|TRBJ2-7 ENSMUST00000103298|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTATGAACAGTACTTCGGTCCCGGCACCAGGCTCACGGTTTTAG +>569|TRBV1 ENSMUST00000103262|TRBV1|5'UTR|TR|TRB|None|00 +GGATTCTCTTCTCTTGCCTGATGCCCTGCATGCCCCACAGAGATAGAGAGAACCTGAGGTCTCAGAG +>570|TRBV1 ENSMUST00000103262|TRBV1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGCAGTTTTGCATTCTGTGCCTCTGTGTACTCATGGCTTCTGTGGCTACAGACCCCACAGTGACTTTGCTGGAGCAAAACCCAAGGTGGCGTCTGGTACCACGTGGTCAAGCTGTGAACCTACGCTGCATCTTGAAGAATTCCCAGTATCCCTGGATGAGCTGGTATCAGCAGGATCTCCAAAAGCAACTACAGTGGCTGTTCACTCTGCGGAGTCCTGGGGACAAAGAGGTCAAATCTCTTCCCGGTGCTGATTACCTGGCCACACGGGTCACTGATACGGAGCTGAGGCTGCAAGTGGCCAACATGAGCCAGGGCAGAACCTTGTACTGCACCTGCAGTGCAGA +>571|TRBV10 ENSMUST00000103265|TRBV10|5'UTR|TR|TRB|None|00 +TCTGATAGCTGCAGTAGGTAGGGCTTATTTGCCCTGCCTTGACCCAACT +>572|TRBV10 ENSMUST00000103265|TRBV10|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGTAGGCTCCTAAGCTGTGTGGCCTTCTGCCTCTTGGGAATAGGCCCTTTGGAGACGGCTGTTTTCCAGACTCCAAACTATCATGTCACACAGGTGGGAAATGAAGTGTCTTTCAATTGTAAGCAAACTCTGGGCCACGATACTATGTATTGGTACAAGCAAGACTCTAAGAAATTGCTGAAGATTATGTTTAGCTACAATAATAAGCAACTCATTGTAAACGAAACAGTTCCAAGGCGCTTCTCACCTCAGTCTTCAGATAAAGCTCATTTGAATCTTCGAATCAAGTCTGTAGAGCCGGAGGACTCTGCTGTGTATCTCTGTGCCAGCAGCTAAGA +>573|TRBV12-1 ENSMUST00000103267|TRBV12-1|5'UTR|TR|TRB|None|00 +GCATCCTGAGAAGAAGC +>574|TRBV12-1 ENSMUST00000103267|TRBV12-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGTCCTCGCTGATTCTGCCTGGGGCATCACCCTGCTATCTTGGGTTACTGTCTTTCTCTTGGGAACAAGTTCAGCAGATTCTGGGGTTGTCCAGTCTCCAAGACACATAATCAAAGAAAAGGGAGGAAGGTCCGTTCTGACGTGTATTCCCATCTCTGGACATAGCAATGTGGTCTGGTACCAGCAGACTCTGGGGAAGGAATTAAAGTTCCTTATTCAGCATTATGAAAAGGTGGAGAGAGACAAAGGATTCCTACCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAAATGAACATGAGTGCCTTGGAACTGGAGGACTCTGCTATGTACTTCTGTGCCAGCTCTCTC +>575|TRBV12-2 ENSMUST00000103269|TRBV12-2|5'UTR|TR|TRB|None|00 +CCTGAGAGGAAGC +>576|TRBV12-2 ENSMUST00000103269|TRBV12-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAGTTCAGCAAATTCTGGGGTTGTCCAGTCTCCAAGATACATAATCAAAGGAAAGGGAGAAAGGTCCATTCTAAAATGTATTCCCATCTCTGGACATCTCTCTGTGGCCTGGTATCAACAGACTCAGGGGCAGGAACTAAAGTTCTTCATTCAGCATTATGATAAAATGGAGAGAGATAAAGGAAACCTGCCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAGATGAACATGAGTGCCTTGGAGCTAGAGGACTCTGCCGTGTACTTCTGTGCCAGCTCTCTC +>577|TRBV13-1 ENSMUST00000194399|TRBV13-1|5'UTR|TR|TRB|None|00 +AACATACAAGAGCCTGACTTGGTCGCGAG +>578|TRBV13-1 ENSMUST00000194399|TRBV13-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTTCTGGTCTTGAGCCTCCTGTGTACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCTAGAAACAAGGTGACAGTAACAGGAGGAAACGTGACATTGAGCTGTCGCCAGACTAATAGCCACAACTACATGTACTGGTATCGGCAGGACACTGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGCTGGCAACCTTCAAATAGGAGATGTCCCTGATGGGTACAAGGCCACCAGAACAACGCAAGAAGACTTCTTCCTCCTGCTGGAATTGGCTTCTCCCTCTCAGACATCTTTGTACTTCTGTGCCAGCAGTGATG +>579|TRBV13-2 ENSMUST00000103270|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>580|TRBV13-3 ENSMUST00000103271|TRBV13-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGACTCTTCTTTGTGGTTTTGATTCTCCTGTGTGCAAAACACATGGAGGCTGCAGTCACCCAAAGTCCAAGAAGCAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTCACCAGACTAATAACCATGACTATATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTACTCATATGTCGCTGACAGCACGGAGAAAGGAGATATCCCTGATGGGTACAAGGCCTCCAGACCAAGCCAAGAGAATTTCTCTCTCATTCTGGAGTTGGCTTCCCTTTCTCAGACAGCTGTATATTTCTGTGCCAGCAGTGATG +>581|TRBV14 ENSMUST00000103272|TRBV14|5'UTR|TR|TRB|None|00 +CCTCCTCTGCCCTCAATCTGCC +>582|TRBV14 ENSMUST00000103272|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTTCTTGGCTGGGCAGTGTTCTGTCTCCTTGACACAGTACTGTCTGAAGCTGGAGTCACCCAGTCTCCCAGATATGCAGTCCTACAGGAAGGGCAAGCTGTTTCCTTTTGGTGTGACCCTATTTCTGGACATGATACCCTTTACTGGTATCAGCAGCCCAGAGACCAGGGGCCCCAGCTTCTAGTTTACTTTCGGGATGAGGCTGTTATAGATAATTCACAGTTGCCCTCGGATCGATTTTCTGCTGTGAGGCCTAAAGGAACTAACTCCACTCTCAAGATCCAGTCTGCAAAGCAGGGCGACACAGCCACCTATCTCTGTGCCAGCAGTTTCT +>583|TRBV15 ENSMUST00000103273|TRBV15|5'UTR|TR|TRB|None|00 +GTCACATCAGTGCTCATCCCACT +>584|TRBV15 ENSMUST00000103273|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCATCCAGACCCTCTGTTGTGTGATCTTTTATGTTCTGATAGCAAATCACACAGATGCTGGAGTTACCCAGACACCCAGACATGAGGTGGCAGAGAAAGGACAAACAATAATCCTGAAGTGTGAGCCAGTTTCAGGCCACAATGACCTTTTCTGGTACAGACAGACCAAGATACAGGGACTAGAGTTGCTGAGCTACTTCCGCAGCAAGTCTCTTATGGAAGATGGTGGGGCTTTCAAGGATCGATTCAAAGCTGAGATGCTAAATTCATCCTTCTCCACTCTGAAGATTCAACCTACAGAACCCAAGGACTCAGCTGTGTATCTGTGTGCCAGCAGTTTAGC +>585|TRBV16 ENSMUST00000103274|TRBV16|5'UTR|TR|TRB|None|00 +TCTCGTGCTTACGTGGAGTTTCTATGAGTGAAGCCACTGCCTCATCTTGCC +>586|TRBV16 ENSMUST00000103274|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCCCCAGGCTCCTTTTCTGTCTGGTTCTTTGCTTCTTGAGAGCAGAACCAACAAATGCTGGTGTCATCCAAACACCTAGGCACAAGGTGACAGGGAAGGGACAAGAAGCAACTCTGTGGTGTGAGCCAATTTCAGGACATAGTGCTGTTTTCTGGTACAGACAGACCATTGTGCAGGGCCTGGAGTTCCTGACTTACTTTCGAAATCAAGCTCCTATAGATGATTCAGGGATGCCCAAGGAACGATTCTCAGCTCAGATGCCCAATCAGTCGCACTCAACTCTGAAGATCCAGAGCACGCAACCCCAGGACTCAGCGGTGTATCTTTGTGCAAGCAGCTTAGA +>587|TRBV17 ENSMUST00000103275|TRBV17|5'UTR|TR|TRB|None|00 +CAAATATTCCTTTCCTGTTCTGGACCATCC +>588|TRBV17 ENSMUST00000103275|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATCCTAGACTTCTTTGCTGTGTGATCTTCTGTCTTCTTGCAGCCACTTTTGTGGATACTACGGTTAAGCAGAACCCAAGATACAAGCTTGCAAGAGTTGGAAAACCAGTGAATTTGATCTGTTCTCAGACTATGAATCATGATACCATGTACTGGTACCAAAAGAAGCCAAACCAAGCACCAAAGCTTCTTCTTTTCTACTATGATAAGATTTTGAACAGGGAAGCTGACACTTTTGAGAAGTTCCAATCCAGTCGGCCTAACAATTCTTTCTGCTCTCTCTACATTGGCTCTGCAGGCCTAGAGTATTCTGCCATGTACCTCTGTGCTAGCAGTAGAGA +>589|TRBV19 ENSMUST00000103276|TRBV19|5'UTR|TR|TRB|None|00 +CCCCTCTTCTCAGAACTGGTGCAGATGCTTGGAGCCAGTGTCTGGCTCTCTGGTCTCCCTCTCCTTCTGCCACACCAGGAAGCTCCTTTTGAACATCTCAAGAGTCTTCCTACCATTCTAGTCATCATAGTTAGCCAGGTGGAGCCCCTGCATAGCGCGTCTCCTTGTTTCTCTTTTAACTAATGCCCAGAGCCAAAGAAAGTCCCTCCAAACT +>590|TRBV19 ENSMUST00000103276|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAACAAGTGGGTTTTCTGCTGGGTAACCCTTTGTCTCCTTACTGTAGAGACCACACATGGTGATGGTGGCATCATTACTCAGACACCCAAATTCCTGATTGGTCAGGAAGGGCAAAAACTGACCTTGAAATGTCAACAGAATTTCAATCATGATACAATGTACTGGTACCGACAGGATTCAGGGAAAGGATTGAGACTGATCTACTATTCAATAACTGAAAACGATCTTCAAAAAGGCGATCTATCTGAAGGCTATGATGCGTCTCGAGAGAAGAAGTCATCTTTTTCTCTCACTGTGACATCTGCCCAGAAGAACGAGATGGCCGTTTTTCTCTGTGCCAGCAGTATAG +>591|TRBV2 ENSMUST00000103263|TRBV2|5'UTR|TR|TRB|None|00 +GCACAAGAAACTGTCTGAGGAGACCCAAGAGGTAGCTGGGTATGGTCTAGGTCTGGGAGCCTATGCCCTGACAAGCATGAAGGGCAAAGAGGAAGTGTGAGCTGAAACCATCTACACAACAGGGAGCATCCAAGCAAAGCATTTTACAGGTCAGCAAAAGGCACCCAGACAGCCAGGATCCAAAGAGAAAGAGATCCTATCCTGTGTGACACTGCT +>592|TRBV2 ENSMUST00000103263|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCATTTTCCTCAGTTGCCTGGCCGTTTGTCTCCTGGTGGCAGGTCCAGTCGACCCGAAAATTATCCAGAAACCAAAATATCTGGTGGCAGTCACAGGGAGCGAAAAAATCCTGATATGCGAACAGTATCTAGGCCACAATGCTATGTATTGGTATAGACAAAGTGCTAAGAAGCCTCTAGAGTTCATGTTTTCCTACAGCTATCAAAAACTTATGGACAATCAGACTGCCTCAAGTCGCTTCCAACCTCAAAGTTCAAAGAAAAACCATTTAGACCTTCAGATCACAGCTCTAAAGCCTGATGACTCGGCCACATACTTCTGTGCCAGCAGCCAAGA +>593|TRBV20 ENSMUST00000103277|TRBV20|L-REGION+V-REGION|TR|TRB|None|00 +ATGTTACTGCTTCTATTACTTCTGGGGCCTGGCTGTGGGCTTGGAGCACTCGTCTATCAATATCCCAGAAGAACCATCTGTAAGAGTGGAACTTCCATGAGGATGGAGTGTCAAGCTGTGGGTTTTCAGGCAACTTCTGTAGCTTGGTATCGTCAATCGCCTCAAAAGACATTTGAACTGATAGCACTTTCTACTGTGAACTCAGCAATCAAATATGAACAAAATTTTACCCAGGAAAAATTTCCCATCAGTCATCCCAACTTATCCTTTTCATCTATGACAGTTTTAAATGCATATCTTGAAGACAGAGGCTTATATCTCTGTGGTGCTAGGGA +>594|TRBV21 ENSMUST00000195087|TRBV21|5'UTR|TR|TRB|None|00 +AGACAGCTAGCTGATCAGCACTCTCTATGAATCAACCATGCACTGCAAACTTTTCTACTGTGTGCCCTTTTATTCTGGACATCAAGCTCC +>595|TRBV23 ENSMUST00000193997|TRBV23|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTGCACGGCTCATTTGCTATGTAGCACTTTGCCTCCTGGGGGCAGGCTCTTTTGATGCTGCAGTTACACAGAAGCCAAGATATTTGATCAAAATGAAAGGCCAGGAAGCAGAGATGAAATGTATCCCTGAAAAGGGGCACACTGCTGTTTTCTGGTATCAACAAAAGCAGAGCAAAGAATTAAAGTTCCTGATTTACTTTCAGAATCAACAGCCTCTTGATCAAATAGACATGGTCAAGGAGAGATTCTCAGCTGTGTGCCCCTCCAGCTCACTCTGCAGCCTGGGAATCAGAACGTGCGAAGCAGAAGACTCAGCACTGTACTTGTGCTCCAGCAGTCAATC +>596|TRBV26 ENSMUST00000193064|TRBV26|5'UTR|TR|TRB|None|00 +TTTCGTACTTCTAAGCCACC +>597|TRBV26 ENSMUST00000193064|TRBV26|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCTACAAGGCTCCTCTGTTACACAGTACTTTGTCTCCTGGGTGCAAGAATTTTGAATTCAAAAGTCATTCAGACTCCAAGATATCTGGTGAAAGGGCAAGGACAAAAAGCAAAGATGAGGTGTATCCCTGAAAAGGGACATCCAGTTGTATTCTGGTATCAACAAAATAAGAACAATGAGTTTAAATTTTTGATTAACTTTCAGAATCAAGAAGTTCTTCAGCAAATAGACATGACTGAAAAACGATTCTCTGCTGAGTGTCCTTCAAACTCACCTTGCAGCCTAGAAATTCAGTCCTCTGAGGCAGGAGACTCAGCACTGTACCTCTGTGCCAGCAGTCTGTC +>598|TRBV29 ENSMUST00000103281|TRBV29|5'UTR|TR|TRB|None|00 +AAAACCACC +>599|TRBV29 ENSMUST00000103281|TRBV29|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAGTTAGGCTCATCTCTGCTGTGGTGCTGTGTTTCCTAGGAACAGGCCTTGTGGACATGAAAGTAACCCAGATGCCAAGATACCTGATCAAAAGAATGGGAGAGAATGTTTTGCTGGAATGTGGACAGGACATGAGCCATGAAACAATGTACTGGTATCGACAAGACCCTGGTCTGGGGCTACAGCTGATTTATATCTCATACGATGTTGATAGTAACAGCGAAGGAGACATCCCTAAAGGATACAGGGTCTCACGGAAGAAGCGGGAGCATTTCTCCCTGATTCTGGATTCTGCTAAAACAAACCAGACATCTGTGTACTTCTGTGCTAGCAGTTTATC +>600|TRBV3 ENSMUST00000103264|TRBV3|5'UTR|TR|TRB|None|00 +GTCAGACCTTGCCTATGGGACCATAGGATGCTAGCATACCCCTCCTGTTTCTGATGTGCAGTCAGTCAAGCTAGGAGAAACTACATTCCTGCCGTGACCCTACT +>601|TRBV3 ENSMUST00000103264|TRBV3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTTCTAGGTTGGATAATTTTTAGTTTCTTGGAAGCAGGACACACAGGACCCAAAGTCTTACAGATCCCAAGTCATCAAATAATAGATATGGGGCAGATGGTGACCCTCAATTGTGACCCAGTTTCTAATCACCTATATTTTTATTGGTATAAACAGATTTTAGGACAGCAGATGGAGTTTCTGGTTAATTTCTACAATGGTAAAGTCATGGAGAAGTCTAAACTGTTTAAGGATCAGTTTTCAGTTGAAAGACCAGATGGTTCATATTTCACTCTGAAAATCCAACCCACAGCACTGGAGGACTCAGCTGTGTACTTCTGTGCCAGCAGCTTAGCCACA +>602|TRBV30 ENSMUST00000191646|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGACATTCCTGCTACTTCTTTGGAGCCAAGGTTCTGTATTCAGTGTCCTCCTCTACCAAAAGCCAAACAGGGACATCTGTCAAAGTGGCACTTCACTGAAAATCCAGTGTGTGGCTGACAGTCAAGTTGTTTCGATGTTTTGGTACCAACAGTTCCAGGAACAGAGCTTGATGCTCATGGCAACTGCAAATGAAGGCTCTGAAGCCACATACGAGAGTGGATTCACCAAGGACAAGTTTCCAATCAGCCGGCCAAACCTAACATTCTCAACGTTGACAGTGAACAATGCAAGGCCTGGAGACAGCAGTATCTATTTCTGTAGTTCTAGAGA +>603|TRBV31 ENSMUST00000193003|TRBV31|5'UTR|TR|TRB|None|00 +GGAGGGGCCTGTGCATCTCTGGCTTAGAAAAGGAAGTACAAGTGCAGAGTAGACAAGCCTAGACAAAGACCATCTTGAACT +>604|TRBV31 ENSMUST00000193003|TRBV31|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGTACTCTCTCCTTGCCTTTCTCCTGGGCATGTTCTTGGGTGTTAGTGCTCAGACTATCCATCAATGGCCAGTTGCCGAGATCAAGGCTGTGGGCAGCCCACTGTCTCTGGGGTGTACCATAAAGGGGAAATCAAGCCCTAACCTCTACTGGTACTGGCAGGCCACAGGAGGCACCCTCCAGCAACTCTTCTACTCTATTACTGTTGGCCAGGTAGAGTCGGTGGTGCAACTGAACCTCTCAGCTTCCAGGCCGAAGGACGACCAATTCATCCTAAGCACGGAGAAGCTGCTTCTCAGCCACTCTGGCTTCTACCTCTGTGCCTGGAGTCT +>605|TRBV5 ENSMUST00000103266|TRBV5|5'UTR|TR|TRB|None|00 +AATACCCGTCTGGAGCCTGATTCCACC +>606|TRBV5 ENSMUST00000103266|TRBV5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCTGCAGGCTTCTCCTCTATGTTTCCCTATGTCTTGTGGAAACAGCACTCATGAACACTAAAATTACTCAGTCACCAAGATATCTAATCCTGGGAAGAGCAAATAAGTCTTTGGAATGTGAGCAACATCTGGGACATAATGCTATGTACTGGTATAAACAGAGCGCTGAGAAGCCGCCAGAGCTCATGTTTCTCTACAATCTTAAACAGTTGATTCGAAATGAGACGGTGCCCAGTCGTTTTATACCTGAATGCCCAGACAGCTCCAAGCTACTTTTACATATATCTGCCGTGGATCCAGAAGACTCAGCTGTCTATTTTTGTGCCAGCAGCCAAGA +>607|TRDC ENSMUST00000196323|TRDC|C-REGION|TR|TRD|None|00 +AAAGCCAGCCTCCGGCCAAACCATCTGTTTTCATCATGAAAAATGGAACAAATGTTGCTTGTCTGGTGAAAGATTTCTACCCTAAAGAGGTGACTATAAGTCTCAGATCATCCAAGAAGATTGTGGAATTCGACCCTGCTATAGTCATCTCCCCCAGCGGGAAGTACAGTGCTGTCAAGCTTGGTCAGTATGGAGATTCGAATTCAGTGACATGTTCAGTTCAGCACAACAGTGAAACTGTGCACTCGACTGACTTTGAACCATATGCAAATTCTTTCAATAATGAAAAACTACCAGAACCTGAAAATGACACACAAATTTCAGAGCCTTGCTATGGCCCAAGAGTCACAGTTCACACTGAGAAGGTAAACATGATGTCCCTCACGGTGCTGGGCCTACGACTGCTGTTTGCCAAGACCATTGCCATCAATTTTCTCTTGACTGTTAAGTTATTCTTT +>608|TRDD1 ENSMUST00000196221|TRDD1|D-REGION|TR|TRD|None|00 +ATGGCATAT +>609|TRDD2 ENSMUST00000177564|TRDD2|D-REGION|TR|TRD|None|00 +ATCGGAGGGATACGAG +>610|TRDJ1 ENSMUST00000103682|TRDJ1|J-REGION|TR|TRD|None|00 +CTACCGACAAACTCGTCTTTGGACAAGGAACCCAAGTGACTGTGGAACCAA +>611|TRDJ2 ENSMUST00000103683|TRDJ2|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTTGGAACTGGCATAGAGCTCTTTGTGGAGCCCC +>612|TRDV1 ENSMUST00000103676|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGGGATGCGCCTTCAAGTGCTTGCTTGGCTATTGACATTTCAGGCTGCCTGGGTCAACACCCAAATGTTGCATCAGAGTCCTCAGTCTCTGACAATCCAAGAAGGAGATGAAGTCACCATGAGCTGCAATTTATCAACATCTTTATATGCCTTACTCTGGTATAGGCAGGGGGATGATGGCAGCCTCGTCTCCTTGGTGACATTACAGAAAGGAGGAGATGAGAAAAGTAAGGACAAAATAACCGCTAATCTGGATAAGAAAATGCAACAAAGTTCCCTGTGGATCCAAGCCTCCCAGCCCAGCCACTCAGGCACTTACCTCTGTGGAGGGAAAG +>613|TRDV2-1 ENSMUST00000197130|TRDV2-1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGCAGTCCTTAGCTCACTGTGGGCAGTTGTGATCACCACCTGTCTAGGAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAGTCGGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCACTCAGGGGGAGC +>614|TRDV2-2 ENSMUST00000103678|TRDV2-2|5'UTR|TR|TRD|None|00 +AGTGCTAGCGCAGCTGAGAGCAAGGACTGATCTGAAGCCGGCTTCTAGC +>615|TRDV2-2 ENSMUST00000103678|TRDV2-2|L-REGION+V-REGION|TR|TRD|None|00 +ATGGTACGGCCGTTCTTCCTGTGGGTGCTCTTCCTTTCCACTTCTCTTGAAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAATCAGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCTCTCATGGAGCGC +>616|TRDV4 ENSMUST00000103679|TRDV4|5'UTR|TR|TRD|None|00 +AGCAGATAAGGATTCTCACGGAGACAGAGACAGAGGTGAGGCTCAGCAGGGCAGCCCAGGAAAGCACCAGCCGATTACAAACTCATCCTCAGTGAAACT +>617|TRDV4 ENSMUST00000103679|TRDV4|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTTTGGAGATGTCCAGTCCTCTGCATATTCATCTTCAGTACAGGGACCTCTTTGGATGTATATTTGGAACCAGTTGCCAAAACTTTTACTGTTGTAGCTGGGGATCCTGCCTCCTTCTACTGCACTGTAACAGGAGGGGACATGAAGAATTATCATATGAGCTGGTATAAGAAGAATGGAACTAATGCTCTGTTTTTAGTATACAAGCTAAATAGCAATTCTACTGATGGTGGAAAGAGCAACCTCAAAGGGAAAATTAACATTTCAAAAAATCAGTTTATACTCGACATTCAGAAGGCAACAATGAAAGACGCTGGTACGTACTACTGTGGGTCAGATATC +>618|TRDV5 ENSMUST00000103685|TRDV5|5'UTR|TR|TRD|None|00 +CCCTCCTGTCCCCTCCCTAGACAAAGCAATAGGGATGGTTAAAGAGAGTCCAGCAGCCCTCCTCCACGCTGTGCCCCTGTACCGACTGGAAGG +>619|TRDV5 ENSMUST00000103685|TRDV5|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTGCCGCGACCCTTACCCTTCTGTTTGCCTACAAGGATGTGCTGTGCATCACGCTGACCCAGAGCTCCACTGACCAGACAGTGGCAAGCGGCACTGAAGTAACACTGCTCTGCACGTACAATGCGGATTCTCCAAACCCAGATTTATTTTGGTATCGCAAAAGGCCAGACAGATCCTTCCAGTTCATCCTTTATAGGGACGACACTAGTTCCCATGATGCAGATTTTGTTCAAGGTCGATTTTCTGTGAAGCACAGCAAGGCCAACAGAACCTTCCATCTGGTGATCTCTCCAGTGAGCCTTGAAGACAGCGCTACTTATTACTGTGCCTCGGGGTAT +>620|TRGC1 ENSMUST00000103558|TRGC1|C-REGION|TR|TRG|None|00 +ACAAAAGGCTTGATGCAGACATTTCCCCCAAGCCCACTATTTTCCTTCCTTCTGTTGCTGAAACAAATCTCCATAAGACTGGGACATACCTTTGTCTCCTTGAAAAGTTCTTTCCAGATGTTATAAGGGTGTATTGGAAAGAAAAGGATGGCAATACTATCCTGGACTCCCAGGAAGGGGATACGCTGAAGACTAACGACACATACATGAAGTTTAGCTGGCTTACAGTGCCTGAAAGGGCAATGGGGAAAGAGCACAGATGTATTGTCAAACATGAGAACAACAAAGGAGGAGCAGATCAAGAGATTTTCTTTCCTTCAATAAAGAAAGTTGCTGTGAGTACCAAGCCTACAACTTGCTGGCAAGATAAAAATGATGTGCTGCAGCTCCAGTTCACGATCACCTCTGCCTACTACACCTACCTTCTCCTGCTCCTCAAGAGTGTGATCTACTTGGCCATCATCAGCTTCTCTCTGCTTAGAAGAACATCTGTCTGTGGCAATGAGAAGAAATCC +>621|TRGC2 ENSMUST00000103561|TRGC2|C-REGION|TR|TRG|None|00 +ACAAAAGGCTTGATGCAGACATTTCCCCCAAGCCCACTATTTTTCTTCCTTCTGTTGCTGAAACAAATCTCCATAAGACTGGGACATACCTTTGTCTCCTTGAAAAGTTCTTTCCCGATGTCATAAGGGTGTATTGGAAAGAAAAGAATGGCAATACTATCCTGGACTCCCAGGAAGGGGATACGCTGAAGACTAAGGGCACATACATGAAGTTTAGCTGGCTTACTGTGCCTGAAAGGGCAATGGGGAAAGAGCACAGTTGTATTGTCAAACATGAGAACAACAAAGGAGGAGCAGATCAAGAGATTTTCTTCCCTTCAATAAAGAAAGTTGCTACAACTTGCTGGCAAGATAAAAATGATGTGCTGCAGTTCCAGTTCACGAGCACCTCTGCCTACTACACCTACCTCCTCCTGCTCCTCAAGAGTGTGATCTACTTGGCCATCATCAGCTTCTCTCTGCTTAGAAGAACATCTGTCTGTGGCAATGAGAAGAAGTCC +>622|TRGC3 ENSMUST00000198163|TRGC3|C-REGION|TR|TRG|None|00 +ACAAAAAGCTTGATGCAGACATTTCCCCCAAGCCCACTATTTTTCTTCCTTCTGTTGCTGAAACAAATCTCCATAAGACTGGGACATACCTTTGTGTCCTTGAAAAGTTCTTTCCCGATGTCATAAGGGTGTATTGGAAAGAAAAGAAAGGCAATACCATCCTGGACTCCCAGGAAGGTGATATGCTGAAGACTAATGACACATACATGAAGTTTAGCTGGCTTACTGTGCCTGAAAGGTCAATGGGGAAAGAGCACAGATGTATTGTCAAACATGAGAACAACAAAGGAGGAGCAGATCAAGAGATTTTCTTTCCTTCAATAAAGAAAGTTGCCGTGAGTACCAAGCCTACAACTTGCTGGCAAGATAAAAATATGTGCTGCAGCTCCAGTTCACGATCACCTCTGCCTACTACACCTACCTTCTCCTGCTCCTCAAGAGTG +>623|TRGC4 ENSMUST00000179181|TRGC4|C-REGION|TR|TRG|None|00 +ACAAACGCACTGACTCAGACTTTTCTCCCAAGCCTACTATTTTCCTTCCTTCTGCTGCTGAAACAAATCTCCATAAGGCTGGGACCTACCTTTGTCTCCTTGAAAAGTTCTTTCCTGAAGTCATAAGGGTGTATTGGAAAGAAAAGGATGGTGAAAAGATTCTGGAATCCCAGGAAGGAAACACCATAAAAACTAATGACAGATACATGAAATTTAGTTGGCTGACGGTGACTGAAGATTCAATGGCTAAAGAACATAGTTGCATTGTCAAACACGAAAACAACAAAAGAGGAGTTGACCAAGAGATTCTGTTTCCTCCCATAGGTAAAGCTTTCACAACTATTAATGTTAATCCCAGAGATAGTGTTTTGCGGCATGAAAATGTTAACAATGCTACTGATCTGGAAGATTGCATGAAAGGAAGAAAGGATATGTTGCAGCTTCAGGTCACCACCACCTATGCATTCTACACCTACCTCATCCTGTTCTTCAAGAGCATGGTCCACTTGGCCTTCGTTGTATTCTGTCTATTCAGAAGAGCAGCCATGTCCTGTGATGATCAACGTTCA +>624|TRGJ1 ENSMUST00000200495|TRGJ1|J-REGION|TR|TRG|None|00 +ATAGCTCAGGTTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCCTCTG +>625|TRGJ2 ENSMUST00000197113|TRGJ2|J-REGION|TR|TRG|None|00 +ATAGCTCGGGCTTTCACAAGGTATTTGCAGAAGGAACAAAGCTCATAGTAATTCCCTCCG +>626|TRGJ3 ENSMUST00000103562|TRGJ3|J-REGION|TR|TRG|None|00 +ATAGTTGGGACTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCTTCTG +>627|TRGJ4 ENSMUST00000184430|TRGJ4|J-REGION|TR|TRG|None|00 +TCAGGCACATCATGGGTCAAGATATTTGCCAAAGGGACAAAGCTCGTAGTAATTCCCCCAG +>628|TRGV1 ENSMUST00000103564|TRGV1|5'UTR|TR|TRG|None|00 +CTCCCTGTGAAGCAGCCTGACCTTGGG +>629|TRGV1 ENSMUST00000103564|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGATGGCCCACCTTCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGAGACAGATGAGAGTGCGCAAATATCCTGTATAGTTTCTCTTCCATATTTCTCCAACACAGCTATACATTGGTACCGGCAAAAAGCAAAAAAGTTTGAGTATCTAATATATGTCTCAACAAACTACAATCAACGACCCTTAGGAGGGAAGAACAAAAAAATTGAAGCAAGTAAAGATTTTCAAACTTCTACCTCAACCTTGAAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATAAA +>630|TRGV2 ENSMUST00000103563|TRGV2|5'UTR|TR|TRG|None|00 +AACAGATCATGACCAACCCTGGGGGAACCCACTGACTGCATTTTTCTGAGACTATAGCACAGTCCCACCCTCCAGCTGGTGACCTGAAATTCCAGCCTGCAGAGCACTTCCTGCCTCCCTGTGAAGCAGTCCAACCTTGGG +>631|TRGV2 ENSMUST00000103563|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGATGGTTCACCTCCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGAGACAGATGAGAATGTGCAAATATCCTGTATAGTTTATCTTCCATATTTCTCCAACACAGCTATACATTGGTACCGGCAAAAAACAAATCAACAGTTTGAGTATCTAATATATGTCGCAACAAACTACAATCAACGACCCTTAGGAGGGAAGCACAAAAAAATTGAAGCAAGTAAAGATTTTAAAAGTTCTACCTCAACCTTGGAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATGAG +>632|TRGV3 ENSMUST00000198663|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGAATGTTCACCTCCTGCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGCAACAGATGAGAGTGCGCAAATATCCTGTATAGTTTCTCTTCCATGTTTCTCCAACACAGCTATACATTGGTACCGGCAAAAACCAAATCAACAGTTTGAGTATCTAATATATGTCGAGACAAACTACAATCAACAACCCTTAGGAGGGAAGAACAAGAAAATTGAAGCAAGTAAAGATTTTCAAACTTCTACCTCAACCTTGAAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATAAA +>633|TRGV4 ENSMUST00000103554|TRGV4|5'UTR|TR|TRG|None|00 +GCAGACC +>634|TRGV4 ENSMUST00000103554|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGAAGAACCCTGGCTCACAAGCCCTGCTTCCTTTATATCTTCCCTGGGAAGCCAACCTGGCAGATGAGAATCCACTCCTGAAAGTAGTCATTTTCTTATGCCTCTTGACATTTGGACATGGGAAGTTGGAGCAACCTGAAATATCAATTTCCAGACCAAGAGATGAGACTGCACAAATATCCTGTAAAGTTTTCATCGAAAGCTTTAGGAGTGTAACCATACACTGGTACCGGCAGAAACCAAACCAAGGTTTAGAGTTTCTATTATATGTCCTTGCAACCCCTACCCATATTTTCTTAGATAAGGAGTACAAGAAAATGGAGGCAAGTAAAAATCCTAGTGCTTCTACATCGATATTGACAATATATTCCTTGGAGGAAGAAGACGAAGCTATCTACTACTGTTCCTACGGCTAAAG +>635|TRGV5 ENSMUST00000199017|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGTCAACCTCTTGGCTTTTTCTTCTGTCTTTGACCTGTGTTTATGGAGACTCCTGGATATCTCAGGATCAGCTCTCCTTTACCCGAAGACCAAACAAGACGGTGCACATAAGTTGCAAGCTCTCTGGGGTTCCCCTTCATAACACCATTGTGCACTGGTACCAACTGAAAGAAGGGGAGCCCCTGAGACGAATCTTCTATGGCTCAGTCAAAACTTACAAACAAGACAAGTCCCACTCCCGCTTGGAAATTGATGAGAAGGATGATGGTACCTTTTACCTGATAATCAACAATGTTGTCACATCGGATGAAGCCACGTACTACTGTGCCTGCTGGGATCT +>636|TRGV6 ENSMUST00000198330|TRGV6|5'UTR|TR|TRG|None|00 +AAGGGCTGCAGG +>637|TRGV6 ENSMUST00000198330|TRGV6|L-REGION+V-REGION|TR|TRG|None|00 +ATGGGGCTTCTGCTACAAGTCTTCACACTGGCCTCCCTCAGGATTTATTCAGAGGGAAGCAGTCTCACGTCACCTCTGGGGTCATATGTCATCAAGAGGAAAGGAAATACGGCTTTTCTCAAATGTCAAATAAAAACAAGTGTTCAGAAGCCCGATGCATACATACACTGGTACCAAGAGAAGCCAGGCCAGCGTCTCCAAAGAATGCTGTGTAGTTCTTCAAAAGAAAACATTGTCTATGAGAAAGATTTTAGTGACGAAAGATATGAGGCAAGGACATGGCAGAGTGATTTGTCTTCAGTCCTCACCATACACCAAGTGACAGAAGAGGACACGGGAACTTATTACTGTGCATGCTGGGATA +>638|TRGV7 ENSMUST00000103553|TRGV7|5'UTR|TR|TRG|None|00 +GTTCTTATAGCACAAGGC +>639|TRGV7 ENSMUST00000103553|TRGV7|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTGGGCTCTGGCCCTACTTCTAGCTTTCTTGCCGGCTGGCAGACAAACATCCTCCAACTTGGAAGAAAGAATAATGTCAATCACCAAGCTAGAGGGGTCCTCTGCTATAATGACTTGTGATACTCACAGAACAGGCACTTACATCCACTGGTACCGATTCCAGAAAGGGAGGGCCCCAGAGCACCTTCTCTACTATAACTTCGTCAGTTCCACAACTGTGGTGGATTCCAGATTCAATTTGGAGAAATATCATGTTTATGAAGGCCCGGACAAGAGGTATAAATTTGTGCTTCGGAATGTGGAGGAGTCCGATTCTGCTCTGTACTACTGTGCCTCCTGGGCTGG +>640|IGKV12-89 GRCm38-release94|IGKV12-89|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGTGTACCCACTCAGCTCCTGTTGCTGTGGCTTACAGTCGTAGTTGTCAGATGTGACATCCAGATGACTCAGTCTCCAGCTTCACTGTCTGCATCTGTGGGAGAAACTGTCACCATCACATGTGGAGCAAGTGAGAATATTTACGGTGCTTTAAATTGGTATCAGCGGAAACAGGGAAAATCTCCTCAGCTCCTGATCTATGGTGCAACCAACTTGGCAGATGGCATGTCATCGAGGTTCAGTGGCAGTGGATCTGGTAGACAGTATTCTCTCAAGATCAGTAGCCTGCATCCTGACGATGTTGCAACGTATTACTGTCAAAATGTGTTAAGTACTCCTCC +>641|IGHV12-1 AJ851868.3|IGHV12-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGACTACTAGGGTTTCTCCTGTGCTTGGCAGCAGCTCTAAAAAGTGTTCTGTCCCAGATTCAGCTTAAGGAGTCTGGACCTGCTGTCATCAAGCCATCACAGTCACTGTCTCTCACCTGCATAGTCTCTGGATTCTCCATCACAAGTAGTAGTTATTGCTGGCACTGGATCCGCCAGCCCCCAGGAAAGGGGTTAGAGTGGATGGGGCGCATATGTTATGAAGGTTCAATATACTATAGTCCATCCATCAAAAGCCGCAGCACCATCTCCAGAGACACATCTCTGAACAAATTCTTTATCCAGCTGAGCTCTGTGACAAATGAGGACACAGCCATGTACTACTGTTCC +>642|IGHV1-unknown1 LVXK01034187.1|IGHV1-unknown1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGGTCGTTCTCTTCCTCCTGTCATTAACTGCAGGTGTCTATGCCCAGGGTCAGATGCAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGACTTCTGGCTTCACCTTCAGCAGTAGCTATATAAGTTGGTTGAAGCAAAAGCCTGGACAGAGTCTTGAGTGGATTGCATGGATTTATGCTGGAACTGGTGGTACTAGCTATAATCAGAAGTTCACAGGCAAGGCCCAACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAATTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>643|TRAV4-4-DV10 GRCm38-release94|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGGGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGATTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGAGTGTGCAGTGGTTCCGACAGAATTCCAGGGGCAGCCTCATCAGTTTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>644|TRAV13-1 GRCm38-release94|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAATGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGAGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>645|TRBV12-2+TRBV13-2 GRCm38-release94|TRBV12-2+TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>646|TRAV16N GRCm38-release94|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>647|TRAV6N-5 GRCm38-release94|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>648|TRAV13N-4 GRCm38-release94|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGTGCTTCTCAATTAGGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>649|TRBV13-2 GRCm38-release94|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAGTTTTGTCTTTCTTTTTATAGAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>650|IGHG3 GRCm38-release94|IGHG3|C-REGION|IG|IGH|G3|00 +AGCTGGAACTGAATGGGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTGTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>651|IGHG2B GRCm38-release94|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCCGTGACCTCTGGGTGCCTGGTCAAGGGGTACTTCCCTGAGCCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGCACCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTGAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACACTTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTTCTTGACTCTGACGGTTCTTACTTCATATATAGCAAGCTCAATATGAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>652|IGHV8-9 GRCm38-release94|IGHV8-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCCCAGACCCTCAGTCTGACCTGTTCTTTCTCTGTGTTTTCACTGAGCACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTATTGGGATGAGGACAAGCACTATAAACCATCCTTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGCAGATACTGCCACATACTACTGT +>653|IGKV2-109 GRCm38-release94|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCCTTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAATCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGGTGTCCAATCTGGCCTCAGGAGTCCCAAACAGGTTCAGTGGCAGTGAGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGT +>654|IGKV4-56 GRCm38-release94|IGKV4-56|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGCAGAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGCAGAAAGTCACCATAACCTGCAGTGCCATCTCAAGTGTAAATTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATGCAACATCCAAACTGGCTCTTGGAGTCCCTGCTTGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGTGGCTGAAGATGCCACCTCTTATTTCTGT +>655|IGHV1-2 GRCm38-release94|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGATACTTCCTTTTATTATGTCAGTAACTGCAGGTGTCTACTCACAGGTTCAGCTCCAGCAGTCTGGGCCTGAGCTGGCAAGGCCTTGGGCTTCAGTGAAGATATCCTGCCAGGCTTTCTACACCTTTTCCAGAAGGGTGCACTTTGCCATTAGGGATACCAACTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATCGGGGCTATTTATCCTGGAAATGGTGATACTAGTTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGT diff --git a/lib/rust/vdj_ann_ref/vdj_refs_old/human/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_old/human/fasta/regions.fa new file mode 100644 index 0000000..9ec6891 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_old/human/fasta/regions.fa @@ -0,0 +1,1484 @@ +>1|IGHA1 ENST00000390547|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>2|IGHA1 ENST00000641837|IGHA1|C-REGION|IG|IGH|A1|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCTGCAGCACCCAGCCAGATGGGAACGTGGTCATCGCCTGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGGGCGTGACCGCCAGAAACTTCCCACCCAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCTAGCCGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCTCAACTCCACCTACCCCATCTCCCTCAACTCCACCTACCCCATCTCCCTCATGCTGCCACCCCCGACTGTCACTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCAGGTGTCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCGGGCTGTGCCGAGCCATGGAACCATGGGAAGACCTTCACTTGCACTGCTGCCTACCCCGAGTCCAAGACCCCGCTAACCGCCACCCTCTCAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGCGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAACAGGGAGGGCCCCCAGTAC +>3|IGHA2 ENST00000390539|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGTAAACCCACCCACATCAATGTGTCTGTTGTCATGGCGGAGGCGGATGGCACCTGCTAC +>4|IGHA2 ENST00000497872|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATTCCAGCCAGGATGTGACTGTGCCCTGCCGAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTACGCTGTAACCAGCATACTGCGCGTGGCAGCTGAGGACTGGAAGAAGGGGGAGACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCATGGCGGGCTCTTGCTGTGTTGCAGATTGGCAGATGCCGCCTCCCTATGTGGTGCTGGACTTGCCGCAGGAGACCCTGGAGGAGGAGACCCCCGGCGCCAACCTGTGGCCCACCACCATCACCTTCCTCACCCTCTTCCTGCTGAGCCTGTTCTATAGCACAGCACTGACCGTGACCAGCGTCCGGGGCCCATCTGGCAAGAGGGAGGGCCCCCAGTAC +>5|IGHA2 ENST00000622473|IGHA2|C-REGION|IG|IGH|A2|00 +CATCCCCGACCAGCCCCAAGGTCTTCCCGCTGAGCCTCGACAGCACCCCCCAAGATGGGAACGTGGTCGTCGCATGCCTGGTCCAGGGCTTCTTCCCCCAGGAGCCACTCAGTGTGACCTGGAGCGAAAGCGGACAGAACGTGACCGCCAGAAACTTCCCACCTAGCCAGGATGCCTCCGGGGACCTGTACACCACGAGCAGCCAGCTGACCCTGCCGGCCACACAGTGCCCAGACGGCAAGTCCGTGACATGCCACGTGAAGCACTACACGAATCCCAGCCAGGATGTGACTGTGCCCTGCCCAGTTCCCCCACCTCCCCCATGCTGCCACCCCCGACTGTCGCTGCACCGACCGGCCCTCGAGGACCTGCTCTTAGGTTCAGAAGCGAACCTCACGTGCACACTGACCGGCCTGAGAGATGCCTCTGGTGCCACCTTCACCTGGACGCCCTCAAGTGGGAAGAGCGCTGTTCAAGGACCACCTGAGCGTGACCTCTGTGGCTGCTACAGCGTGTCCAGTGTCCTGCCTGGCTGTGCCCAGCCATGGAACCATGGGGAGACCTTCACCTGCACTGCTGCCCACCCCGAGTTGAAGACCCCACTAACCGCCAACATCACAAAATCCGGAAACACATTCCGGCCCGAGGTCCACCTGCTGCCGCCGCCGTCGGAGGAGCTGGCCCTGAACGAGCTGGTGACGCTGACGTGCCTGGCACGTGGCTTCAGCCCCAAGGATGTGCTGGTTCGCTGGCTGCAGGGGTCACAGGAGCTGCCCCGCGAGAAGTACCTGACTTGGGCATCCCGGCAGGAGCCCAGCCAGGGCACCACCACCTTCGCTGTGACCAGCATACTGCGCGTGGCAGCCGAGGACTGGAAGAAGGGGGACACCTTCTCCTGCATGGTGGGCCACGAGGCCCTGCCGCTGGCCTTCACACAGAAGACCATCGACCGCTTGGCGGGTAAACCCACCCATGTCAATGTGTCTGTTGTCATGGCGGAGGTGGACGGCACCTGCTAC +>6|IGHD ENST00000390556|IGHD|C-REGION|IG|IGH|D|00 +CACCCACCAAGGCTCCGGATGTGTTCCCCATCATATCAGGGTGCAGACACCCAAAGGATAACAGCCCTGTGGTCCTGGCATGCTTGATAACTGGGTACCACCCAACGTCCGTGACTGTCACCTGGTACATGGGGACACAGAGCCAGCCCCAGAGAACCTTCCCTGAGATACAAAGACGGGACAGCTACTACATGACAAGCAGCCAGCTCTCCACCCCCCTCCAGCAGTGGCGCCAAGGCGAGTACAAATGCGTGGTCCAGCACACCGCCAGCAAGAGTAAGAAGGAGATCTTCCGCTGGCCAGAGTCTCCAAAGGCACAGGCCTCCTCAGTGCCCACTGCACAACCCCAAGCAGAGGGCAGCCTCGCCAAGGCAACCACAGCCCCAGCCACCACCCGTAACACAGGAAGAGGAGGAGAAGAGAAGAAGAAGGAGAAGGAGAAAGAGGAACAAGAAGAGAGAGAGACAAAGACACCAGAGTGTCCGAGCCACACCCAGCCTCTTGGCGTCTACCTGCTAACCCCTGCAGTGCAGGACCTGTGGCTCCGGGACAAAGCCACCTTCACCTGCTTCGTGGTGGGCAGTGACCTGAAGGATGCTCACCTGACCTGGGAGGTGGCTGGGAAGGTCCCCACAGGGGGCGTGGAGGAAGGGCTGCTGGAGCGGCACAGCAACGGCTCCCAGAGCCAGCACAGCCGTCTGACCCTGCCCAGGTCCTTGTGGAACGCGGGGACCTCCGTCACCTGCACACTGAACCATCCCAGCCTCCCACCCCAGAGGTTGATGGCGCTGAGAGAACCCGCTGCGCAGGCACCCGTCAAGCTTTCCCTGAACCTGCTGGCCTCGTCTGACCCTCCCGAGGCGGCCTCGTGGCTCCTGTGTGAGGTGTCTGGCTTCTCGCCCCCCAACATCCTCCTGATGTGGCTGGAGGACCAGCGTGAGGTGAACACTTCTGGGTTTGCCCCCGCACGCCCCCCTCCACAGCCCAGGAGCACCACGTTCTGGGCCTGGAGTGTGCTGCGTGTCCCAGCCCCGCCCAGCCCTCAGCCAGCCACCTACACGTGTGTGGTCAGCCACGAGGACTCCCGGACTCTGCTCAACGCCAGCCGGAGCCTAGAAGTCAGCTACCTGGCCATGACCCCCCTGATCCCTCAGAGCAAGGATGAGAACAGCGATGACTACACGACCTTTGATGATGTGGGCAGCCTGTGGACCACCCTGTCCACGTTTGTGGCCCTCTTCATCCTCACCCTCCTCTACAGCGGCATTGTCACTTTCATCAAGGTGAAG +>7|IGHD1-1 ENST00000454908|IGHD1-1|D-REGION|IG|IGH|None|00 +GGTACAACTGGAACGAC +>8|IGHD1-14 ENST00000451044|IGHD1-14|D-REGION|IG|IGH|None|00 +GGTATAACCGGAACCAC +>9|IGHD1-20 ENST00000450276|IGHD1-20|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACGAC +>10|IGHD1-26 ENST00000390567|IGHD1-26|D-REGION|IG|IGH|None|00 +GGTATAGTGGGAGCTACTAC +>11|IGHD1-7 ENST00000430425|IGHD1-7|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACTAC +>12|IGHD1/OR15-1A ENST00000605284|IGHD1/OR15-1A|D-REGION|IG|IGH|None|00 +GGTATAACTGGAACAAC +>13|IGHD2-15 ENST00000390578|IGHD2-15|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTGGTGGTAGCTGCTACTCC +>14|IGHD2-2 ENST00000390591|IGHD2-2|D-REGION|IG|IGH|None|00 +AGGATATTGTAGTAGTACCAGCTGCTATGCC +>15|IGHD2-21 ENST00000390572|IGHD2-21|D-REGION|IG|IGH|None|00 +AGCATATTGTGGTGGTGACTGCTATTCC +>16|IGHD2-8 ENST00000390585|IGHD2-8|D-REGION|IG|IGH|None|00 +AGGATATTGTACTAATGGTGTATGCTATACC +>17|IGHD2/OR15-2A ENST00000603077|IGHD2/OR15-2A|D-REGION|IG|IGH|None|00 +AGAATATTGTAATAGTACTACTTTCTATGCC +>18|IGHD3-10 ENST00000390583|IGHD3-10|D-REGION|IG|IGH|None|00 +GTATTACTATGGTTCGGGGAGTTATTA +>19|IGHD3-16 ENST00000390577|IGHD3-16|D-REGION|IG|IGH|None|00 +GTATTATGATTACGTTTGGGGGAGTTATCGTTATACC +>20|IGHD3-22 ENST00000390571|IGHD3-22|D-REGION|IG|IGH|None|00 +GTATTACTATGATAGTAGTGGTTATTACTAC +>21|IGHD3-3 ENST00000390590|IGHD3-3|D-REGION|IG|IGH|None|00 +GTATTACGATTTTTGGAGTGGTTATTATACC +>22|IGHD3-9 ENST00000390584|IGHD3-9|D-REGION|IG|IGH|None|00 +GTATTACGATATTTTGACTGGTTATTA +>23|IGHD3/OR15-3A ENST00000604950|IGHD3/OR15-3A|D-REGION|IG|IGH|None|00 +GTATTATGATTTTTGGACTGGTTATTATACC +>24|IGHD4-11 ENST00000431440|IGHD4-11|D-REGION|IG|IGH|None|00 +TGACTACAGTAACTAC +>25|IGHD4-17 ENST00000431870|IGHD4-17|D-REGION|IG|IGH|None|00 +TGACTACGGTGACTAC +>26|IGHD4-23 ENST00000437320|IGHD4-23|D-REGION|IG|IGH|None|00 +TGACTACGGTGGTAACTCC +>27|IGHD4/OR15-4A ENST00000603326|IGHD4/OR15-4A|D-REGION|IG|IGH|None|00 +TGACTATGGTGCTAACTAC +>28|IGHD5-12 ENST00000390581|IGHD5-12|D-REGION|IG|IGH|None|00 +GTGGATATAGTGGCTACGATTAC +>29|IGHD5-18 ENST00000390575|IGHD5-18|D-REGION|IG|IGH|None|00 +GTGGATACAGCTATGGTTAC +>30|IGHD5-24 ENST00000390569|IGHD5-24|D-REGION|IG|IGH|None|00 +GTAGAGATGGCTACAATTAC +>31|IGHD5/OR15-5A ENST00000604642|IGHD5/OR15-5A|D-REGION|IG|IGH|None|00 +GTGGATATAGTGTCTACGATTAC +>32|IGHD6-13 ENST00000390580|IGHD6-13|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCAGCTGGTAC +>33|IGHD6-19 ENST00000390574|IGHD6-19|D-REGION|IG|IGH|None|00 +GGGTATAGCAGTGGCTGGTAC +>34|IGHD6-25 ENST00000452198|IGHD6-25|D-REGION|IG|IGH|None|00 +GGGTATAGCAGCGGCTAC +>35|IGHD6-6 ENST00000454691|IGHD6-6|D-REGION|IG|IGH|None|00 +GAGTATAGCAGCTCGTCC +>36|IGHD7-27 ENST00000439842|IGHD7-27|D-REGION|IG|IGH|None|00 +CTAACTGGGGA +>37|IGHE ENST00000390541|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>38|IGHE ENST00000641420|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCAAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGAGCTGGACGTGTGCGTGGAGGAGGCCGAGGGCGAGGCGCCGTGGACGTGGACCGGCCTCTGCATCTTCGCCGCACTCTTCCTGCTCAGCGTGAGCTACAGCGCCGCCATCACGCTCCTCATGGTGCAGCGGTTCCTCTCAGCCACGCGGCAGGGGAGGCCCCAGACCTCCCTCGACTACACCAACGTCCTCCAGCCCCACGCC +>39|IGHE ENST00000610670|IGHE|C-REGION|IG|IGH|E|00 +CCTCCACACAGAGCCCATCCGTCTTCCCCTTGACCCGCTGCTGCAAAAACATTCCCTCCAATGCCACCTCCGTGACTCTGGGCTGCCTGGCCACGGGCTACTTCCCGGAGCCGGTGATGGTGACCTGGGACACAGGCTCCCTCAACGGGACAACTATGACCTTACCAGCCACCACCCTCACGCTCTCTGGTCACTATGCCACCATCAGCTTGCTGACCGTCTCGGGTGCGTGGGCCAAGCAGATGTTCACCTGCCGTGTGGCACACACTCCATCGTCCACAGACTGGGTCGACAACAAAACCTTCAGCGTCTGCTCCAGGGACTTCACCCCGCCCACCGTGAAGATCTTACAGTCGTCCTGCGACGGCGGCGGGCACTTCCCCCCGACCATCCAGCTCCTGTGCCTCGTCTCTGGGTACACCCCAGGGACTATCAACATCACCTGGCTGGAGGACGGGCAGGTCATGGACGTGGACTTGTCCACCGCCTCTACCACGCAGGAGGGTGAGCTGGCCTCCACACAAAGCGAGCTCACCCTCAGCCAGAAGCACTGGCTGTCAGACCGCACCTACACCTGCCAGGTCACCTATCAAGGTCACACCTTTGAGGACAGCACCAAGAAGTGTGCAGATTCCAACCCGAGAGGGGTGAGCGCCTACCTAAGCCGGCCCAGCCCGTTCGACCTGTTCATCCGCAAGTCGCCCACGATCACCTGTCTGGTGGTGGACCTGGCACCCAGCAAGGGGACCGTGAACCTGACCTGGTCCCGGGCCAGTGGGAAGCCTGTGAACCACTCCACCAGAAAGGAGGAGAAGCAGCGCAATGGCACGTTAACCGTCACGTCCACCCTGCCGGTGGGCACCCGAGACTGGATCGAGGGGGAGACCTACCAGTGCAGGGTGACCCACCCCCACCTGCCCAGGGCCCTCATGCGGTCCACGACCAAGACCAGCGGCCCGCGTGCTGCCCCGGAAGTCTATGCGTTTGCGACGCCGGAGTGGCCGGGGAGCCGGGACAAGCGCACCCTCGCCTGCCTGATCCAGAACTTCATGCCTGAGGACATCTCGGTGCAGTGGCTGCACAACGAGGTGCAGCTCCCGGACGCCCGGCACAGCACGACGCAGCCCCGCAAGACCAAGGGCTCCGGCTTCTTCGTCTTCAGCCGCCTGGAGGTGACCAGGGCCGAATGGGAGCAGAAAGATGAGTTCATCTGCCGTGCAGTCCATGAGGCAGCGAGCCCCTCACAGACCGTCCAGCGAGCGGTGTCTGTAAATCCCGGTAAA +>40|IGHG1 ENST00000390542|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>41|IGHG1 ENST00000390548|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTACAGGAACATGATCGGACAGGGGGCC +>42|IGHG1 ENST00000390549|IGHG1|C-REGION|IG|IGH|G1|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCACCCTCCTCCAAGAGCACCTCTGGGGGCACAGCAGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACATCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAAAGTTGAGCCCAAATCTTGTGACAAAACTCACACATGCCCACCGTGCCCAGCACCTGAACTCCTGGGGGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACATGCGTGGTGGTGGACGTGAGCCACGAAGACCCTGAGGTCAAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAATGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGATGAGCTGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTATCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>43|IGHG2 ENST00000390545|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>44|IGHG2 ENST00000641095|IGHG2|C-REGION|IG|IGH|G2|00 +CCTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCTCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAACTTCGGCACCCAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGACAGTTGAGCGCAAATGTTGTGTCGAGTGCCCACCGTGCCCAGCACCACCTGTGGCAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGACACCCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCACGGGAGGAGCAGTTCAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCGTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGGCAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCTCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACACCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACCACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCATCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATCAGGCAGGGGGCC +>45|IGHG3 ENST00000390551|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGGTAAA +>46|IGHG3 ENST00000641136|IGHG3|C-REGION|IG|IGH|G3|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCTGGGGGCACAGCGGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCAGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACCCAGACCTACACCTGCAACGTGAATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGCTCAAAACCCCACTTGGTGACACAACTCACACATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCATGCCCACGGTGCCCAGAGCCCAAATCTTGTGACACACCTCCCCCGTGCCCAAGGTGCCCAGCACCTGAACTCCTGGGAGGACCGTCAGTCTTCCTCTTCCCCCCAAAACCCAAGGATACCCTTATGATTTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCACGAAGACCCCGAGGTCCAGTTCAAGTGGTACGTGGACGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTACAACAGCACGTTCCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGCCCTCCCAGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGACAGCCCCGAGAACCACAGGTGTACACCCTGCCCCCATCCCGGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAGCGGGCAGCCGGAGAACAACTACAACACCACGCCTCCCATGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAAGCTCACCGTGGACAAGAGCAGGTGGCAGCAGGGGAACATCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCGCTTCACGCAGAAGAGCCTCTCCCTGTCTCCGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGTTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCGGTGGTGGACCTGAAGCAGACCATCATCCCCGACTATAGGAACATGATTGGGCAGGGGGCC +>47|IGHG4 ENST00000390543|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGGTAAA +>48|IGHG4 ENST00000641978|IGHG4|C-REGION|IG|IGH|G4|00 +CTTCCACCAAGGGCCCATCGGTCTTCCCCCTGGCGCCCTGCTCCAGGAGCACCTCCGAGAGCACAGCCGCCCTGGGCTGCCTGGTCAAGGACTACTTCCCCGAACCGGTGACGGTGTCGTGGAACTCAGGCGCCCTGACCAGCGGCGTGCACACCTTCCCGGCTGTCCTACAGTCCTCAGGACTCTACTCCCTCAGCAGCGTGGTGACCGTGCCCTCCAGCAGCTTGGGCACGAAGACCTACACCTGCAACGTAGATCACAAGCCCAGCAACACCAAGGTGGACAAGAGAGTTGAGTCCAAATATGGTCCCCCATGCCCATCATGCCCAGCACCTGAGTTCCTGGGGGGACCATCAGTCTTCCTGTTCCCCCCAAAACCCAAGGACACTCTCATGATCTCCCGGACCCCTGAGGTCACGTGCGTGGTGGTGGACGTGAGCCAGGAAGACCCCGAGGTCCAGTTCAACTGGTACGTGGATGGCGTGGAGGTGCATAATGCCAAGACAAAGCCGCGGGAGGAGCAGTTCAACAGCACGTACCGTGTGGTCAGCGTCCTCACCGTCCTGCACCAGGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTCTCCAACAAAGGCCTCCCGTCCTCCATCGAGAAAACCATCTCCAAAGCCAAAGGGCAGCCCCGAGAGCCACAGGTGTACACCCTGCCCCCATCCCAGGAGGAGATGACCAAGAACCAGGTCAGCCTGACCTGCCTGGTCAAAGGCTTCTACCCCAGCGACATCGCCGTGGAGTGGGAGAGCAATGGGCAGCCGGAGAACAACTACAAGACCACGCCTCCCGTGCTGGACTCCGACGGCTCCTTCTTCCTCTACAGCAGGCTCACCGTGGACAAGAGCAGGTGGCAGGAGGGGAATGTCTTCTCATGCTCCGTGATGCATGAGGCTCTGCACAACCACTACACACAGAAGAGCCTCTCCCTGTCTCTGGAGCTGCAACTGGAGGAGAGCTGTGCGGAGGCGCAGGACGGGGAGCTGGACGGGCTGTGGACGACCATCACCATCTTCATCACACTCTTCCTGCTAAGCGTGTGCTACAGTGCCACCGTCACCTTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGGACCTGAAGCAGACCATCGTCCCCGACTACAGGAACATGATAAGGCAGGGGGCC +>49|IGHJ1 ENST00000390565|IGHJ1|J-REGION|IG|IGH|None|00 +GCTGAATACTTCCAGCACTGGGGCCAGGGCACCCTGGTCACCGTCTCCTCAG +>50|IGHJ2 ENST00000390564|IGHJ2|J-REGION|IG|IGH|None|00 +TACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>51|IGHJ2 ENST00000632178|IGHJ2|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATCTCTGGGGCCGTGGCACCCTGGTCACTGTCTCCTCAG +>52|IGHJ3 ENST00000463911|IGHJ3|J-REGION|IG|IGH|None|00 +GATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>53|IGHJ3 ENST00000633896|IGHJ3|J-REGION|IG|IGH|None|00 +TGATGCTTTTGATATCTGGGGCCAAGGGACAATGGTCACCGTCTCTTCAG +>54|IGHJ4 ENST00000461719|IGHJ4|J-REGION|IG|IGH|None|00 +TACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>55|IGHJ4 ENST00000631521|IGHJ4|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>56|IGHJ5 ENST00000488476|IGHJ5|J-REGION|IG|IGH|None|00 +AACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>57|IGHJ5 ENST00000633501|IGHJ5|J-REGION|IG|IGH|None|00 +ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG +>58|IGHJ6 ENST00000390560|IGHJ6|J-REGION|IG|IGH|None|00 +TACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>59|IGHJ6 ENST00000631705|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAG +>60|IGHM ENST00000390559|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGGTAAACCCACCCTGTACAACGTGTCCCTGGTCATGTCCGACACAGCTGGCACCTGCTAC +>61|IGHM ENST00000637539|IGHM|C-REGION|IG|IGH|M|00 +GGAGTGCATCCGCCCCAACCCTTTTCCCCCTCGTCTCCTGTGAGAATTCCCCGTCGGATACGAGCAGCGTGGCCGTTGGCTGCCTCGCACAGGACTTCCTTCCCGACTCCATCACTTTCTCCTGGAAATACAAGAACAACTCTGACATCAGCAGCACCCGGGGCTTCCCATCAGTCCTGAGAGGGGGCAAGTACGCAGCCACCTCACAGGTGCTGCTGCCTTCCAAGGACGTCATGCAGGGCACAGACGAACACGTGGTGTGCAAAGTCCAGCACCCCAACGGCAACAAAGAAAAGAACGTGCCTCTTCCAGTGATTGCTGAGCTGCCTCCCAAAGTGAGCGTCTTCGTCCCACCCCGCGACGGCTTCTTCGGCAACCCCCGCAAGTCCAAGCTCATCTGCCAGGCCACGGGTTTCAGTCCCCGGCAGATTCAGGTGTCCTGGCTGCGCGAGGGGAAGCAGGTGGGGTCTGGCGTCACCACGGACCAGGTGCAGGCTGAGGCCAAAGAGTCTGGGCCCACGACCTACAAGGTGACCAGCACACTGACCATCAAAGAGAGCGACTGGCTCGGCCAGAGCATGTTCACCTGCCGCGTGGATCACAGGGGCCTGACCTTCCAGCAGAATGCGTCCTCCATGTGTGTCCCCGATCAAGACACAGCCATCCGGGTCTTCGCCATCCCCCCATCCTTTGCCAGCATCTTCCTCACCAAGTCCACCAAGTTGACCTGCCTGGTCACAGACCTGACCACCTATGACAGCGTGACCATCTCCTGGACCCGCCAGAATGGCGAAGCTGTGAAAACCCACACCAACATCTCCGAGAGCCACCCCAATGCCACTTTCAGCGCCGTGGGTGAGGCCAGCATCTGCGAGGATGACTGGAATTCCGGGGAGAGGTTCACGTGCACCGTGACCCACACAGACCTGCCCTCGCCACTGAAGCAGACCATCTCCCGGCCCAAGGGGGTGGCCCTGCACAGGCCCGATGTCTACTTGCTGCCACCAGCCCGGGAGCAGCTGAACCTGCGGGAGTCGGCCACCATCACGTGCCTGGTGACGGGCTTCTCTCCCGCGGACGTCTTCGTGCAGTGGATGCAGAGGGGGCAGCCCTTGTCCCCGGAGAAGTATGTGACCAGCGCCCCAATGCCTGAGCCCCAGGCCCCAGGCCGGTACTTCGCCCACAGCATCCTGACCGTGTCCGAAGAGGAATGGAACACGGGGGAGACCTACACCTGCGTGGTGGCCCATGAGGCCCTGCCCAACAGGGTCACCGAGAGGACCGTGGACAAGTCCACCGAGGGGGAGGTGAGCGCCGACGAGGAGGGCTTTGAGAACCTGTGGGCCACCGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGTACCACCGTCACCTTGTTCAAGGTGAAA +>62|IGHV1-18 ENST00000390605|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>63|IGHV1-18 ENST00000390605|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGA +>64|IGHV1-18 ENST00000633147|IGHV1-18|5'UTR|IG|IGH|None|00 +GCATCACCCAAAAACCACACCCCTCCTTGGGAGAATCCCCTAGATCACAGCTCCTCACC +>65|IGHV1-18 ENST00000633147|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTTTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTACGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>66|IGHV1-2 ENST00000390594|IGHV1-2|5'UTR|IG|IGH|None|00 +GAGAGCATCACCCAGCAACCACATCTGTCCTCTAGAGAATCCCCTGAGAGCTCCGTTCCTCACC +>67|IGHV1-2 ENST00000390594|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCCACAGGAGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCGGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCTGGGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACATGGAGCTGAGCAGGCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA +>68|IGHV1-24 ENST00000390610|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>69|IGHV1-24 ENST00000390610|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACA +>70|IGHV1-24 ENST00000633490|IGHV1-24|5'UTR|IG|IGH|None|00 +ACCATCACACAACAGCCACATCCCTCCCCTACAGAAGCCCCCAGAGCGCAGCACCTCACC +>71|IGHV1-24 ENST00000633490|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGCACCCACGCCCAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGGATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCGAGGACACATCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>72|IGHV1-3 ENST00000390595|IGHV1-3|5'UTR|IG|IGH|None|00 +CCACATCCCTCCTCAGAAGCCCCCAGAGCACAACGCCTCACC +>73|IGHV1-3 ENST00000390595|IGHV1-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTTTTGGTGGCAGCAGCCACAGGTGCCCACTCCCAGGTCCAGCTTGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGCATTGGGTGCGCCAGGCCCCCGGACAAAGGCTTGAGTGGATGGGATGGATCAACGCTGGCAATGGTAACACAAAATATTCACAGAAGTTCCAGGGCAGAGTCACCATTACCAGGGACACATCCGCGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAAGACACGGCTGTGTATTACTGTGCGAGAGA +>74|IGHV1-45 ENST00000390621|IGHV1-45|5'UTR|IG|IGH|None|00 +ATCACCCAACAACCACATCCCTCCTCTAGAGAATCCCCTGAAAGCACAGCTCCTCACC +>75|IGHV1-45 ENST00000390621|IGHV1-45|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGAATCCTCTTCTTGGTGGCAGCAGTCACAGATGCCTACTCCCAGATGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGACTGGGTCCTCAGTGAAGGTTTCCTGCAAGGCTTCCGGATACACCTTCACCTACCGCTACCTGCACTGGGTGCGACAGGCCCCCGGACAAGCGCTTGAGTGGATGGGATGGATCACACCTTTCAATGGTAACACCAACTACGCACAGAAATTCCAGGACAGAGTCACCATTACCAGGGACAGGTCTATGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACAGCCATGTATTACTGTGCAAGATA +>76|IGHV1-46 ENST00000390622|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>77|IGHV1-46 ENST00000390622|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>78|IGHV1-46 ENST00000632105|IGHV1-46|5'UTR|IG|IGH|None|00 +ATCTGTGGGGACTTGTTCTTCAGTGAAAGGATCCTGTCCGCAAACAGAAATGGAGCAGGACATGCATTTCTTCAAGCAGGATTAGGGCTTGGACCATCAGCATCCCACTCCTGTGTGGCAGATGGGACATCTATCTTCTTTCTCAACCTCGATCAGGCTTTGAGGTATGAAATAATCTGTCTCATGAATATGCAAATAACCTTAGATCTACTGAGGTAAATATGGATACATCTGGGCCCTGAAAGCATCATCCAACAACCACATCCCTTCTCTACAGAAGCCTCTGAGAGGAAAGTTCTTCACC +>79|IGHV1-46 ENST00000632105|IGHV1-46|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGGTCTTCTGCTTGCTGGCTGTAGCTCCAGGTGCTCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCATCTGGATACACCTTCACCAGCTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAATAATCAACCCTAGTGGTGGTAGCACAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGGACACGTCCACGAGCACAGTCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>80|IGHV1-58 ENST00000390628|IGHV1-58|5'UTR|IG|IGH|None|00 +AGCATCATCCAGAAACCACATCCCTCCGCTAGAGAAGCCCCTGACGGCACAGTTCCTCACT +>81|IGHV1-58 ENST00000390628|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGAGGATCCTCTTCTTGGTGGGAGCAGCGACAGGTGCCCACTCCCAAATGCAGCTGGTGCAGTCTGGGCCTGAGGTGAAGAAGCCTGGGACCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATTCACCTTTACTAGCTCTGCTGTGCAGTGGGTGCGACAGGCTCGTGGACAACGCCTTGAGTGGATAGGATGGATCGTCGTTGGCAGTGGTAACACAAACTACGCACAGAAGTTCCAGGAAAGAGTCACCATTACCAGGGACATGTCCACAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCCGAGGACACGGCCGTGTATTACTGTGCGGCAGA +>82|IGHV1-69 ENST00000390633|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>83|IGHV1-69 ENST00000390633|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGA +>84|IGHV1-69 ENST00000632882|IGHV1-69|5'UTR|IG|IGH|None|00 +AGCATCACATAACAACCACATTCCTCCTCTGAAGAAGCCCCTGGGAGCACAGCTCATCACC +>85|IGHV1-69 ENST00000632882|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACAAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>86|IGHV1-69-2 ENST00000615784|IGHV1-69-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGCACCTGGAGGATCCTCCTCTTGGTGGCAGCAGCTACAGGCACCCACGCCGAGGTCCAGCTGGTACAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCTACAGTGAAAATCTCCTGCAAGGTTTCTGGATACACCTTCACCGACTACTACATGCACTGGGTGCAACAGGCCCCTGGAAAAGGGCTTGAGTGGATGGGACTTGTTGATCCTGAAGATGGTGAAACAATATACGCAGAGAAGTTCCAGGGCAGAGTCACCATAACCGCGGACACGTCTACAGACACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCAACAGA +>87|IGHV1-69D ENST00000624687|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>88|IGHV1-69D ENST00000624687|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>89|IGHV1-69D ENST00000633446|IGHV1-69D|5'UTR|IG|IGH|None|00 +ATCACATAACAACCAGATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACC +>90|IGHV1-69D ENST00000633446|IGHV1-69D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTCCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>91|IGHV1/OR15-1 ENST00000604066|IGHV1/OR15-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACATCTTCACCGACTACTATATGCACTGGGTGCGACAGGCCCCTGGACAAGAGCTTGGGTGGATGGGACGGATCAACCCTAACAGTGGTGGCACAAACTATGCACAGAAGTTTCAGGGCAGAGTCACCATGACCAGGGACACGTCCATCAGCACAGCCTACACGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCACGTATTACTGTGCGAGAGA +>92|IGHV1/OR21-1 ENST00000622028|IGHV1/OR21-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGAATTGGAGGATCCTGTTTTTGGTGGTCATAGCTGCGGGTGCCCAGTCCCAGGTACAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCATCACCAGCTACTGTATGCACTGGGTGCACCAGGTCCATGCACAAGGGCTTGAGTGGATGGGATTGGTGTGCCCTAGTGATGGCAGCACAAGCTATGCACAGAAGTTCCAGGCCAGAGTCACCATAACCAGGGACACATCCATGAGCACAGCCTACATGGAGCTAAGCAGTCTGAGATCTGAGGACACGGCCATGTATTACTGTGTGAGAGA +>93|IGHV2-26 ENST00000390611|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>94|IGHV2-26 ENST00000390611|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATA +>95|IGHV2-26 ENST00000632457|IGHV2-26|5'UTR|IG|IGH|None|00 +GCTCAGTGACTCCTGTGCCCCACC +>96|IGHV2-26 ENST00000632457|IGHV2-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTACACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGTGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACCGTCTCTGGGTTCTCACTCAGCAATGCTAGAATGGGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACACATTTTTTCGAATGACGAAAAATCCTACAGCACATCTCTGAAGAGCAGGCTCACCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACGGATAC +>97|IGHV2-5 ENST00000390597|IGHV2-5|5'UTR|IG|IGH|None|00 +AGTGACTCCTGTGCCCCACC +>98|IGHV2-5 ENST00000390597|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACACTTTGCTCCACGCTCCTGCTGCTGACCATCCCTTCATGGGTCTTGTCCCAGATCACCTTGAAGGAGTCTGGTCCTACGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAGTGGGTGTGGGCTGGATCCGTCAGCCCCCAGGAAAGGCCCTGGAGTGGCTTGCACTCATTTATTGGGATGATGATAAGCGCTACAGCCCATCTCTGAAGAGCAGGCTCACCATCACCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACATATTACTGTGCACACAGAC +>99|IGHV2-70 ENST00000617374|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAGGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGTGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACTCATTGATTGGGATGATGATAAATACTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>100|IGHV2-70 ENST00000632173|IGHV2-70|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCCCCACC +>101|IGHV2-70 ENST00000632173|IGHV2-70|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATGCTTTGTTCCATGCTCCTGCTACTGACTGTCCCGTCTTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACGCTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTACTGGAATGCGTGTGAGCTGGATCCGTCGGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATACTGCAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>102|IGHV2-70D ENST00000390634|IGHV2-70D|5'UTR|IG|IGH|None|00 +ATCTCCACCAGCTCCACCCTCCCCTGGGTTCAAAAGACGAGGACAGGGCCTCGCTCAGTGAATCCTGCTCTCCACC +>103|IGHV2-70D ENST00000390634|IGHV2-70D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACATACTTTGTTCCACGCTCCTGCTACTGACTGTCCCGTCCTGGGTCTTATCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACACAGACCCTCACACTGACCTGCACCTTCTCTGGGTTCTCACTCAGCACTAGTGGAATGCGTGTGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCACGCATTGATTGGGATGATGATAAATTCTACAGCACATCTCTGAAGACCAGGCTCACCATCTCCAAGGACACCTCCAAAAACCAGGTGGTCCTTACAATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCACGGATAC +>104|IGHV2/OR16-5 ENST00000567458|IGHV2/OR16-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACACGTTTTGCTCCACACTCCTGCTGCTGACCACCCCTTCCTGGGTCTTGTCCCAGGTCACCTTGAAGGAGTCTGGTCCTGCGCTGGTGAAACCCACAGAGACCCTCACGCTGACCTGCACTCTCTCTGGGTTCTCACTCAGCACTTCTGGAATGGGTATGAGCTGGATCCGTCAGCCCCCAGGGAAGGCCCTGGAGTGGCTTGCTCACATTTTTTTGAATGACAAAAAATCCTACAGCACGTCTCTGAAGAACAGGCTCATCATCTCCAAGGACACCTCCAAAAGCCAGGTGGTCCTTACCATGACCAACATGGACCCTGTGGACACAGCCACGTATTACTGTGCATGGAGAG +>105|IGHV3-11 ENST00000390601|IGHV3-11|5'UTR|IG|IGH|None|00 +CTCCCTCTGCTGATAAAAACCAGCCGAGCCCAGACCCTGCAGCTCTGGGAGAAGAGCCCCAGCCCCAGAATTCCCAGGAGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>106|IGHV3-11 ENST00000390601|IGHV3-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTATAAAAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCAAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTAGTAGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>107|IGHV3-13 ENST00000390602|IGHV3-13|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTGTATTCAGTGATCAGGACTGAACACACAGGACTCACC +>108|IGHV3-13 ENST00000390602|IGHV3-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATATTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACGACATGCACTGGGTCCGCCAAGCTACAGGAAAAGGTCTGGAGTGGGTCTCAGCTATTGGTACTGCTGGTGACCCATACTATCCAGGCTCCGTGAAGGGCCGATTCACCATCTCCAGAGAAAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGGGGACACGGCTGTGTATTACTGTGCAAGAGA +>109|IGHV3-15 ENST00000390603|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>110|IGHV3-15 ENST00000390603|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACA +>111|IGHV3-15 ENST00000632959|IGHV3-15|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCTTGGGATTCCCAAGTGTTTTCATTCAGTGATCAGGACTGAACACAGAGGACTCACC +>112|IGHV3-15 ENST00000632959|IGHV3-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGATTTTCCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTAAAGCCTGGGGGGTCCCTTAGACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACGCCTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTATTAAAAGCAAAACTGATGGTGGGACAACAGACTACGCTGCACCCGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAAAACACGCTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACCACAGA +>113|IGHV3-16 ENST00000390604|IGHV3-16|5'UTR|IG|IGH|None|00 +AGCCCTGGGAGAGAAGCCCCAGCCCTGGGATTCTCAGGTGTTTCTATTGGGTCAACAGCAATAAACAAATTACC +>114|IGHV3-16 ENST00000390604|IGHV3-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGCCCGCAAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGTGGACTCCGTGAAGCGCCGATTCATCATCTCCAGAGACAATTCCAGGAACTCCCTGTATCTGCAAAAGAACAGACGGAGAGCCGAGGACATGGCTGTGTATTACTGTGTGAGA +>115|IGHV3-20 ENST00000390606|IGHV3-20|5'UTR|IG|IGH|None|00 +CCAGCCCTGAGATTCCCACGTGTTTCCATTCAGTGATCAGCACTGAACACAGAGGACTCGCC +>116|IGHV3-20 ENST00000390606|IGHV3-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGTGTGGTACGGCCTGGGGGGTCCCTGAGACTCTCCTTTGCAGCCTCTGGATTCACCTTTGATGATTATGGCATGAGCTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGAGTGGGTCTCTGGTATTAATTGGAATGGTGGTAGCACAGGTTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCCCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCCTTGTATCACTGTGCGAGAGA +>117|IGHV3-21 ENST00000390607|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>118|IGHV3-21 ENST00000390607|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>119|IGHV3-21 ENST00000632980|IGHV3-21|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCTTAGCCCTGGATTCCAAGGCCTATCCACTTGGTGATCAGCACTGAGCACCGAGGATTCACC +>120|IGHV3-21 ENST00000632980|IGHV3-21|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACTGGGGCTCCGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATAGCATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTAGTAGTAGTAGTTACATATACTACGCAGACTCAGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>121|IGHV3-23 ENST00000390609|IGHV3-23|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGAGGAGCCCAGCCCTGGGATTTTCAGGTGTTTTCATTTGGTGATCAGGACTGAACAGAGAGAACTCACC +>122|IGHV3-23 ENST00000390609|IGHV3-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGCTTTTTCTTGTGGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGCAGCTATGCCATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGCTATTAGTGGTAGTGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGGTTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTATATTACTGTGCGAAAGA +>123|IGHV3-30 ENST00000603660|IGHV3-30|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>124|IGHV3-30 ENST00000603660|IGHV3-30|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAAA +>125|IGHV3-33 ENST00000390615|IGHV3-33|5'UTR|IG|IGH|None|00 +CAGCTCTGGGAGAGGAGCCCAGCACTAGAAGTCGGCGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>126|IGHV3-33 ENST00000390615|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCGTCTGGATTCACCTTCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATGGTATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCGAGA +>127|IGHV3-33 ENST00000631807|IGHV3-33|5'UTR|IG|IGH|None|00 +CGAGCCCAGCACTGGAAGTCGCCGGTGTTTCCATTCGGTGATCATCACTGAACACAGAGGACTCACC +>128|IGHV3-33 ENST00000631807|IGHV3-33|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTCGTTGCTCTTTTAAGAGGTGTCCAGTGTCAGGTGCAGCTGGTGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCATATGATGGAAGCAATAAATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>129|IGHV3-35 ENST00000390617|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>130|IGHV3-35 ENST00000390617|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGA +>131|IGHV3-35 ENST00000632225|IGHV3-35|5'UTR|IG|IGH|None|00 +AACAAACAAATTACC +>132|IGHV3-35 ENST00000632225|IGHV3-35|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTTGGGCTGAGCTGGGTTTTTCTTGCTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGATCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAACAGTGACATGAACTGGGTCCATCAGGCTCCAGGAAAGGGGCTGGAGTGGGTATCGGGTGTTAGTTGGAATGGCAGTAGGACGCACTATGCAGACTCTGTGAAGGGCCGATTCATCATCTCCAGAGACAATTCCAGGAACACCCTGTATCTGCAAACGAATAGCCTGAGGGCCGAGGACACGGCTGTGTATTACTGTGTGAGAAA +>133|IGHV3-38 ENST00000390618|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>134|IGHV3-38 ENST00000390618|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATAT +>135|IGHV3-38 ENST00000631785|IGHV3-38|5'UTR|IG|IGH|None|00 +CTCTGGGAGTGGAGCCCCAGCCTTGGGATTCCCAGGTGTTTCCCTTCAGTGATCAGGACTGAACACACACAACTCATC +>136|IGHV3-38 ENST00000631785|IGHV3-38|L-REGION+V-REGION|IG|IGH|None|00 +ATGCAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGGTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTAGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCGTCAGTAGCAATGAGATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTAGTGGTGGTAGCACATACTACGCAGACTCCAGGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAACCTGAGAGCTGAGGGCACGGCCGTGTATTACTGTGCCAGATATA +>137|IGHV3-43 ENST00000434710|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>138|IGHV3-43 ENST00000434710|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGAT +>139|IGHV3-43 ENST00000633040|IGHV3-43|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCCTGAGATTCCCAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGAACGCACC +>140|IGHV3-43 ENST00000633040|IGHV3-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGTCGTGGTACAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTGATGATTATACCATGCACTGGGTCCGTCAAGCTCCGGGGAAGGGTCTGGAGTGGGTCTCTCTTATTAGTTGGGATGGTGGTAGCACATACTATGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACAGCAAAAACTCCCTGTATCTGCAAATGAACAGTCTGAGAACTGAGGACACCGCCTTGTATTACTGTGCAAAAGATA +>141|IGHV3-48 ENST00000390624|IGHV3-48|5'UTR|IG|IGH|None|00 +AGCTCTCAGAGAGGTGCCTTAGCCCTGGATTCCAAGGCATTTCCACTTGGTGATCAGCACTGAACACAGAGGACTCACC +>142|IGHV3-48 ENST00000390624|IGHV3-48|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGTGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGTTATGAAATGAACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTGGTAGTACCATATACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTTTATTACTGTGCGAGAGA +>143|IGHV3-49 ENST00000390625|IGHV3-49|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCAGCCGTGAGATTCCCAGGAGTTTCCACTTGGTGATCAGCACTGAACACAGACCACCAACC +>144|IGHV3-49 ENST00000390625|IGHV3-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTTAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAATGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCAGGGCGGTCCCTGAGACTCTCCTGTACAGCTTCTGGATTCACCTTTGGTGATTATGCTATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTAGGTTTCATTAGAAGCAAAGCTTATGGTGGGACAACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGCATCGCCTATCTGCAAATGAACAGCCTGAAAACCGAGGACACAGCCGTGTATTACTGTACTAGAGA +>145|IGHV3-53 ENST00000390627|IGHV3-53|5'UTR|IG|IGH|None|00 +AATACCAATCTCCCCCAGGACACTTCATCTGCACGGAGCCCGGCCTCTCCTCAGATGTCCCACCCCAGAGCTTGCTATATAGTCGGGGACATGCAAATAGGGCCCTCCCTCTGCTGATGAAAACCAGCCCAGCTGACCCTGCAGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCGGTGATCAGCACTGAACACAGAGGACTCACC +>146|IGHV3-53 ENST00000390627|IGHV3-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTTGGCTGAGCTGGGTTTTCCTTGTTGCTATTTCAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGACTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCGGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>147|IGHV3-64 ENST00000454421|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>148|IGHV3-64 ENST00000454421|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGA +>149|IGHV3-64 ENST00000631710|IGHV3-64|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCCCGCCCTGGGATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAAGAGTC +>150|IGHV3-64 ENST00000631710|IGHV3-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTTAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGAAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATATTATGCAGACTCTGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGGGCAGCCTGAGAGCTGAGGACATGGCTGTGTATTACTGTGCGAGAGA +>151|IGHV3-64D ENST00000632099|IGHV3-64D|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTCTGGCTGAGCTGGGTTCTCCTTGTTGCCATTTTAAAAGATGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTTCAGCCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAATATGTTTCAGCTATTAGTAGTAATGGGGGTAGCACATACTACGCAGACTCCGTGAAGGGCAGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAGCAGTCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGAAAGA +>152|IGHV3-66 ENST00000390632|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>153|IGHV3-66 ENST00000390632|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGA +>154|IGHV3-66 ENST00000632846|IGHV3-66|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCCCAGCACTGGGATTCCGAGGTGTTTCCATTCAGTGATCTGCACTGAACACAGAGGACTCGCC +>155|IGHV3-66 ENST00000632846|IGHV3-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGAGGAGGCTTGATCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGGTTCACCGTCAGTAGCAACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCAGTTATTTATAGCTGTGGTAGCACATACTACGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGAACACGCTGTATCTTCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGCGAGAGA +>156|IGHV3-7 ENST00000390598|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>157|IGHV3-7 ENST00000390598|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGA +>158|IGHV3-7 ENST00000633988|IGHV3-7|5'UTR|IG|IGH|None|00 +AGGTCTCAGAGAGGAGCCTTAGCCCTGGACTCCAAGGCCTTTCCACTTGGTGATCAGCACTGAGCACAGAGGACTCACC +>159|IGHV3-7 ENST00000633988|IGHV3-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAGAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTTAGTAGCTATTGGATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTGGCCAACATAAAGCAAGATGGAAGTGAGAAATACTATGTGGACTCTGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCCGTGTATTACTGTGCGAGAGA +>160|IGHV3-72 ENST00000433072|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>161|IGHV3-72 ENST00000433072|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGA +>162|IGHV3-72 ENST00000633602|IGHV3-72|5'UTR|IG|IGH|None|00 +AGCTCTGAGAGCGGAGCCCCAGCCCCAGAATTCCCAGGTGTTTTCATTTGGTGATCAGCACTGAACACAGAGGACTCACC +>163|IGHV3-72 ENST00000633602|IGHV3-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGTTATTTTACAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGGACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTGGCCGTACTAGAAACAAAGCTAACAGTTACACCACAGAATACGCCGCGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCAAAGAACTCACTGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTGCTAGAGA +>164|IGHV3-73 ENST00000390636|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>165|IGHV3-73 ENST00000390636|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGA +>166|IGHV3-73 ENST00000631708|IGHV3-73|5'UTR|IG|IGH|None|00 +AGCTCTGGGAGAGGAGCTCCAGCCTTGGGATTCCCAGCTGTCTCCACTCGGTGATCGGCACTGAATACAGGAGACTCACC +>167|IGHV3-73 ENST00000631708|IGHV3-73|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTGGTCCAGCCTGGGGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGGTTCACCTTCAGTGGCTCTGCTATGCACTGGGTCCGCCAGGCTTCCGGGAAAGGGCTGGAGTGGGTTGGCCGTATTAGAAGCAAAGCTAACAGTTACGCGACAGCATATGCTGCGTCGGTGAAAGGCAGGTTCACCATCTCCAGAGATGATTCAAAGAACACGGCGTATCTGCAAATGAACAGCCTGAAAACCGAGGACACGGCCGTGTATTACTGTACTAGACA +>168|IGHV3-74 ENST00000424969|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>169|IGHV3-74 ENST00000424969|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>170|IGHV3-74 ENST00000633987|IGHV3-74|5'UTR|IG|IGH|None|00 +AATTTCTCAAATCCCATTGTTGTCACCCATCTTCCTCAGGACACTTTCATCTGCCCTGGGTCCTGCTCTTTCTTCAGGTGTCTCACCCCAGAGCTTGATATATAGTAGGAGACATGCAAATAGGGCCCTCACTCTGCTGAAGAAAACCAGCCCTGCAGCTCTGGGAGAGGAGCCCCAGCCCTGGGATTCCCAGCTGTTTCTGCTTGCTGATCAGGACTGCACACAGAGAACTCACC +>171|IGHV3-74 ENST00000633987|IGHV3-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCCGGGGGAGGCTTAGTTCAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCGGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>172|IGHV3/OR15-7 ENST00000558565|IGHV3/OR15-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTCCAGCCTGGGGGTTCTCTGAGACTCTCATGTGCAGCCTCTGGATTCACCTTCAGTGACCACTACATGAGCTGGGTCCGCCAGGCTCAAGGGAAAGGGCTAGAGTTGGTAGGTTTAATAAGAAACAAAGCTAACAGTTACACGACAGAATATGCTGCGTCTGTGAAAGGCAGACTTACCATCTCAAGAGAGGATTCAAAGAACACGCTGTATCTGCAAATGAGCAACCTGAAAACCGAGGACTTGGCCGTGTATTACTGTGCTAGAGA +>173|IGHV3/OR16-10 ENST00000425181|IGHV3/OR16-10|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGTGCTGAGCTGGGTTTTCCTTGTTGCTATATTAAAAGGTGTCCAGTGTGAGGTTCAGCTGGTGCAGTCTGGGGGAGGCTTGGTACATCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGGCTCTGGATTCACCTTCAGTAGCTATGCTATGCACTGGGTTCGCCAGGCTCCAGGAAAAGGTCTGGAGTGGGTATCAGCTATTGGTACTGGTGGTGGCACATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACTCCTTGTATCTTCAAATGAACAGCCTGAGAGCCGAGGACATGGCTGTGTATTACTGTGCAAGAGA +>174|IGHV3/OR16-12 ENST00000570121|IGHV3/OR16-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGAGCTCAGCTGGGTTTTCCTTGTTGCTATTTTACAAGGTGTCCACTGTGAGGTGCAGCTGGTAGAGTCTGGGAGAGGCTTGGCCCAGCCTGGGGGGTACCTAAAACTCTCCGGTGCAGCCTCTGGATTCACCGTCGGTAGCTGGTACATGAGCTGGATCCACCAGGCTCCAGGGAAGGGTCTGGAGTGGGTCTCATACATTAGTAGTAGTGGTTGTAGCACAAACTACGCAGACTCTGTGAAGGGCAGATTCACCATCTCCACAGACAACTCAAAGAACACGCTCTACCTGCAAATGAACAGCCTGAGAGTGGAGGACACGGCCGTGTATTACTGTGCAAGAGA +>175|IGHV3/OR16-13 ENST00000562905|IGHV3/OR16-13|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAGCTGGGTTTTCCTTGTTGCTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTACAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCTTCAGTAGCTACTGGATGCACTGGGTCCGCCAAGCTCCAGGGAAGGGGCTGGTGTGGGTCTCACGTATTAATAGTGATGGGAGTAGCACAAGCTACGCAGACTCCATGAAGGGCCAATTCACCATCTCCAGAGACAATGCTAAGAACACGCTGTATCTGCAAATGAACAGTCTGAGAGCTGAGGACATGGCTGTGTATTACTGTACTAGAGA +>176|IGHV3/OR16-8 ENST00000565407|IGHV3/OR16-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGGCTGAACTGGGTTTTCCTTGTTGCTATTATAAAAGGTGCCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTGGTACAGCCTGGGGGGTCCCTGAGACTGTCCTGTCCAGCCTCTGGATTCACCTTCAGTAACCACTACATGAGCTGGGTCCGCCAGGCTCCAGGGAAGGGACTGGAGTGGGTTTCATACATTAGTGGTGATAGTGGTTACACAAACTACGCAGACTCTGTGAAGGGCCGATTCACCATCTCCAGGGACAACGCCAATAACTCACCGTATCTGCAAATGAACAGCCTGAGAGCTGAGGACACGGCTGTGTATTACTGTGTGA +>177|IGHV4-28 ENST00000390612|IGHV4-28|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCTGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>178|IGHV4-28 ENST00000390612|IGHV4-28|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTACAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGACACCCTGTCCCTCACCTGCGCTGTCTCTGGTTACTCCATCAGCAGTAGTAACTGGTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTACATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATGTCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGTGGACACGGCCGTGTATTACTGTGCGAGAAA +>179|IGHV4-30-2 ENST00000632151|IGHV4-30-2|5'UTR|IG|IGH|None|00 +ACTTTCTGAGAGTCCTGGACCTCCTGCACAAGAAC +>180|IGHV4-30-2 ENST00000632151|IGHV4-30-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>181|IGHV4-31 ENST00000438142|IGHV4-31|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>182|IGHV4-31 ENST00000438142|IGHV4-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCCGGCTCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTCCTGGAGCTGGATCCGGCAGCCACCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAGGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCCAGAGA +>183|IGHV4-34 ENST00000390616|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>184|IGHV4-34 ENST00000390616|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGA +>185|IGHV4-34 ENST00000612474|IGHV4-34|5'UTR|IG|IGH|None|00 +CAGCTCACATGGGAAGTGCTTTCTGAGAGTC +>186|IGHV4-34 ENST00000612474|IGHV4-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACCTCCTGCACAAGAACATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTACAGCAGTGGGGCGCAGGACTGTTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCAATCATAGTGGAAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCTGTGTATTACTGTGCGAGAGG +>187|IGHV4-39 ENST00000390619|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>188|IGHV4-39 ENST00000390619|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGA +>189|IGHV4-39 ENST00000633618|IGHV4-39|5'UTR|IG|IGH|None|00 +ATTTCCTTAAATTCAGGTCCAACTCATAAGGGAAATGCTTTCTGAGAGTC +>190|IGHV4-39 ENST00000633618|IGHV4-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGACA +>191|IGHV4-4 ENST00000455737|IGHV4-4|5'UTR|IG|IGH|None|00 +AAATTCAGGGTCCAGCTCACATGGGAAATACTTTCTGAGAGTCATGGACCTCCTGCACAAGAAC +>192|IGHV4-4 ENST00000455737|IGHV4-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCTCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGGGACCCTGTCCCTCACCTGCGCTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGTTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCACCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>193|IGHV4-59 ENST00000390629|IGHV4-59|5'UTR|IG|IGH|None|00 +TTTTCACCTCTCCATACAAAGGCACCACCCACATGCAAATCCTCACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>194|IGHV4-59 ENST00000390629|IGHV4-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACATCTGTGGTTCTTCCTTCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>195|IGHV4-61 ENST00000390630|IGHV4-61|5'UTR|IG|IGH|None|00 +ACTTAAGCACCCACAGGAAACCACCACACATTTCCTTAAATTCAGGTTCCAGCTCACATGGGAAATACTTTCTGAGAGTCCTGGACCTCCTGTGCAAGAAC +>196|IGHV4-61 ENST00000390630|IGHV4-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCGTCAGCAGTGGTAGTTACTACTGGAGCTGGATCCGGCAGCCCCCAGGGAAGGGACTGGAGTGGATTGGGTATATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCTGCGGACACGGCCGTGTATTACTGTGCGAGAGA +>197|IGHV4/OR15-8 ENST00000557788|IGHV4/OR15-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTTCTCCTCCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGTTGTCTCTGGTGGCTCCATCAGCAGTAGTAACTGGTGGAGCTGGGTCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGGAAATCTATCATAGTGGGAGCCCCAACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACAAGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCGGACAGGGCCGTGTATTACTGTGCGAGAGA +>198|IGHV5-10-1 ENST00000632950|IGHV5-10-1|5'UTR|IG|IGH|None|00 +AGTCTCCTTCACCACCCAGCTGGGATCTCAGGGCTTCCTTTTCTGTCCTCCTCCAGG +>199|IGHV5-10-1 ENST00000632950|IGHV5-10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAAGTGCAGCTGGTGCAGTCCGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAGGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCAGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGAGGATTGATCCTAGTGACTCTTATACCAACTACAGCCCGTCCTTCCAAGGCCACGTCACCATCTCAGCTGACAAGTCCATCAGCACTGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>200|IGHV5-51 ENST00000390626|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>201|IGHV5-51 ENST00000390626|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGA +>202|IGHV5-51 ENST00000620764|IGHV5-51|5'UTR|IG|IGH|None|00 +TGAGTCTCCCTCACTGCCCAGCTGGGATCTCAGGGCTTCATTTTCTGTCCTCCACCATC +>203|IGHV5-51 ENST00000620764|IGHV5-51|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTCAACCGCCATCCTCGCCCTCCTCCTGGCTGTTCTCCAAGGAGTCTGTGCCGAGGTGCAGCTGGTGCAGTCTGGAGCAGAGGTGAAAAAGCCCGGGGAGTCTCTGAAGATCTCCTGTAAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAGTGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATCTCAGCCGACAAGTCCATCAGCACCGCCTACCTGCAGTGGAGCAGCCTGAAGGCCTCGGACACCGCCATGTATTACTGTGCGAGACA +>204|IGHV6-1 ENST00000390593|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>205|IGHV6-1 ENST00000390593|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGA +>206|IGHV6-1 ENST00000633299|IGHV6-1|5'UTR|IG|IGH|None|00 +GCAGAGCCTGCTGAATTCTGGCTGACCAGGGCAGTCACCAGAGCTCCAGACA +>207|IGHV6-1 ENST00000633299|IGHV6-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGTCTGTCTCCTTCCTCATCTTCCTGCCCGTGCTGGGCCTCCCATGGGGTGTCCTGTCACAGGTACAGCTGCAGCAGTCAGGTCCAGGACTGGTGAAGCCCTCGCAGACCCTCTCACTCACCTGTGCCATCTCCGGGGACAGTGTCTCTAGCAACAGTGCTGCTTGGAACTGGATCAGGCAGTCCCCATCGAGAGGCCTTGAGTGGCTGGGAAGGACATACTACAGGTCCAAGTGGTATAATGATTATGCAGTATCTGTGAAAAGTCGAATAACCATCAACCCAGACACATCCAAGAACCAGTTCTCCCTGCAGCTGAACTCTGTGACTCCCGAGGACACGGCTGTGTATTACTGTGCAAGAGA +>208|IGHV7-4-1 ENST00000631943|IGHV7-4-1|5'UTR|IG|IGH|None|00 +ACAACCACACCCCTCCTAAGAAGAAGCCCCTAGACCACAGCTCCACACC +>209|IGHV7-4-1 ENST00000631943|IGHV7-4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCAACAGGTGCCCACTCCCAGGTGCAGCTGGTGCAATCTGGGTCTGAGTTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAGGCTTCTGGATACACCTTCACTAGCTATGCTATGAATTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAACACCAACACTGGGAACCCAACGTATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCTTGGACACCTCTGTCAGCACGGCATATCTGCAGATCTGCAGCCTAAAGGCTGAGGACACTGCCGTGTATTACTGTGCGAGAGA +>210|IGHV7-81 ENST00000390639|IGHV7-81|5'UTR|IG|IGH|None|00 +ACCCAACAACAACATCCCTCCTTGGGAGAATCCCCTAGAGCACAGCTCCTCACC +>211|IGHV7-81 ENST00000390639|IGHV7-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGCATCCTCTTCTTGGTGGCAGCAGCAACAGGTACCTACTCCCAGGTGCAGCTGGTGCAGTCTGGCCATGAGGTGAAGCAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACAGTTTCACCACCTATGGTATGAATTGGGTGCCACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGTTCAACACCTACACTGGGAACCCAACATATGCCCAGGGCTTCACAGGACGGTTTGTCTTCTCCATGGACACCTCTGCCAGCACAGCATACCTGCAGATCAGCAGCCTAAAGGCTGAGGACATGGCCATGTATTACTGTGCGAGA +>212|IGKC ENST00000390237|IGKC|C-REGION|IG|IGK|None|00 +GAACTGTGGCTGCACCATCTGTCTTCATCTTCCCGCCATCTGATGAGCAGTTGAAATCTGGAACTGCCTCTGTTGTGTGCCTGCTGAATAACTTCTATCCCAGAGAGGCCAAAGTACAGTGGAAGGTGGATAACGCCCTCCAATCGGGTAACTCCCAGGAGAGTGTCACAGAGCAGGACAGCAAGGACAGCACCTACAGCCTCAGCAGCACCCTGACGCTGAGCAAAGCAGACTACGAGAAACACAAAGTCTACGCCTGCGAAGTCACCCATCAGGGCCTGAGCTCGCCCGTCACAAAGAGCTTCAACAGGGGAGAGTGT +>213|IGKJ1 ENST00000390242|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGCCAAGGGACCAAGGTGGAAATCAAAC +>214|IGKJ2 ENST00000390241|IGKJ2|J-REGION|IG|IGK|None|00 +TGTGCAGTTTTGGCCAGGGGACCAAGCTGGAGATCAAAC +>215|IGKJ3 ENST00000390240|IGKJ3|J-REGION|IG|IGK|None|00 +ATTCACTTTCGGCCCTGGGACCAAAGTGGATATCAAAC +>216|IGKJ4 ENST00000390239|IGKJ4|J-REGION|IG|IGK|None|00 +CTCACTTTCGGCGGAGGGACCAAGGTGGAGATCAAAC +>217|IGKJ5 ENST00000390238|IGKJ5|J-REGION|IG|IGK|None|00 +GATCACCTTCGGCCAAGGGACACGACTGGAGATTAAAC +>218|IGKV1-12 ENST00000480492|IGKV1-12|5'UTR|IG|IGK|None|00 +AGGCTGATCACACCCTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>219|IGKV1-12 ENST00000480492|IGKV1-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>220|IGKV1-16 ENST00000479981|IGKV1-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>221|IGKV1-16 ENST00000479981|IGKV1-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGAGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAAGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>222|IGKV1-17 ENST00000490686|IGKV1-17|5'UTR|IG|IGK|None|00 +AGGAATCAGTCCCACTCAGGACACAGC +>223|IGKV1-17 ENST00000490686|IGKV1-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGGTGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCGCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>224|IGKV1-27 ENST00000498435|IGKV1-27|5'UTR|IG|IGK|None|00 +GTGCAGAAGTCTCTCTCAGTCAGGACACAGC +>225|IGKV1-27 ENST00000498435|IGKV1-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGACTCCTGCTGCTCTGGCTCCCAGATACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTATTTAGCCTGGTATCAGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAATCAGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCAAAAGTATAACAGTGCCCCT +>226|IGKV1-33 ENST00000473726|IGKV1-33|5'UTR|IG|IGK|None|00 +GTGCAGGAGTCAGTCCCAACCAGGACACAGC +>227|IGKV1-33 ENST00000473726|IGKV1-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>228|IGKV1-37 ENST00000465170|IGKV1-37|5'UTR|IG|IGK|None|00 +AGGCTGGTCACACCCCGTGCAGCAGTCAGTCCCAGTCAGGACACAGC +>229|IGKV1-37 ENST00000465170|IGKV1-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCT +>230|IGKV1-39 ENST00000498574|IGKV1-39|5'UTR|IG|IGK|None|00 +GGGCTGGTCGCACCCTGTGCAGGAGTCAGTCTCAGTCAGGACACAGC +>231|IGKV1-39 ENST00000498574|IGKV1-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCT +>232|IGKV1-5 ENST00000496168|IGKV1-5|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCCCTGAAGCCTTATTAATAGGCTGGTCACACTTTGTGCAGGAGTCAGACCCAGTCAGGACACAGC +>233|IGKV1-5 ENST00000496168|IGKV1-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAAATGTGACATCCAGATGACCCAGTCTCCTTCCACCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGAGTATTAGTAGCTGGTTGGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATAAGGCGTCTAGTTTAGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACCATCAGCAGCCTGCAGCCTGATGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTATTCT +>234|IGKV1-6 ENST00000464162|IGKV1-6|5'UTR|IG|IGK|None|00 +GCAGGAGTCAGACCCACTCAGGACACAGC +>235|IGKV1-6 ENST00000464162|IGKV1-6|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTTGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGAAATGATTTAGGCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTACAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGCACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAAGATTACAATTACCCT +>236|IGKV1-8 ENST00000495489|IGKV1-8|5'UTR|IG|IGK|None|00 +AGGCTGGACACACTTCATGCAGGAGTCAGACCCTGTCAGGACACAGCATAGAC +>237|IGKV1-8 ENST00000495489|IGKV1-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATCCTCATTCTCTGCATCTACAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTACCCT +>238|IGKV1-9 ENST00000493819|IGKV1-9|5'UTR|IG|IGK|None|00 +AGACTTCTTAATAGGCTGGTCACACCTGTGCAGGAGTCAGTCCCAGTCAGGACACAGC +>239|IGKV1-9 ENST00000493819|IGKV1-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTTCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGCTTAATAGTTACCCT +>240|IGKV1/OR2-108 ENST00000453673|IGKV1/OR2-108|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCGAGGTGCCAGATGTGACATCCAGGTGACCCAGTCTCCATCTTCCCTGTCTGCGTCTGTAGGAGACAGAGTCACCATCACCTGCCGGGCAAGTCAGGGCATTAGCAATGGGTTATCCTGGTATCAGCAGAAACCAGGGCAAGCCCCTACGCTCCTGATCTATGCTGCATCCAGTTTGCAGTCGGGGGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACTGTCTACAGGATTATACTACCCCATT +>241|IGKV1D-12 ENST00000377032|IGKV1D-12|5'UTR|IG|IGK|None|00 +AGACCCACTCAGGACACAGC +>242|IGKV1D-12 ENST00000377032|IGKV1D-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTTCCAGATGCGACATCCAGATGACCCAGTCTCCATCTTCCGTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTACTATTGTCAACAGGCTAACAGTTTCCCT +>243|IGKV1D-13 ENST00000611391|IGKV1D-13|5'UTR|IG|IGK|None|00 +GAGTCAGACCCACTCAGGACACAGC +>244|IGKV1D-13 ENST00000611391|IGKV1D-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTTCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGGGCATTAGCAGTGCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGATGCCTCCAGTTTGGAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTTTAATAGTTACCCT +>245|IGKV1D-16 ENST00000492446|IGKV1D-16|5'UTR|IG|IGK|None|00 +AGGAATCAGACCCAGTCAGGACACAGC +>246|IGKV1D-16 ENST00000492446|IGKV1D-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCTCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGTTTCCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCACTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGTCAGGGTATTAGCAGCTGGTTAGCCTGGTATCAGCAGAAACCAGAGAAAGCCCCTAAGTCCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGCCAACAGTATAATAGTTACCCT +>247|IGKV1D-17 ENST00000483379|IGKV1D-17|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGCTGCTGAGTTACTGAGATGAGCCAGCCCTGCAGCTGCGCCCAGCCTGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCATAGCCTCCTGCCCTGAAGCCTTATTAATAGGCTGGACACACTTCATGGAGGAATCAGTCCCACTCAGGACACAGC +>248|IGKV1D-17 ENST00000483379|IGKV1D-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTAACATCCAGATGACCCAGTCTCCATCTGCCATGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGTCGGGCGAGGCAGGGCATTAGCAATTATTTAGCCTGGTTTCAGCAGAAACCAGGGAAAGTCCCTAAGCACCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACAGAATTCACTCTCACAATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCTACAGCATAATAGTTACCCT +>249|IGKV1D-33 ENST00000390265|IGKV1D-33|5'UTR|IG|IGK|None|00 +ATGTTCGCAGAGCACAGCCCCCTGCCCTGAAGACTTATTAATAGGCTGGTCGCACCCTGTGCAGGAGTCAGTCCCAACCAGGACACAGC +>250|IGKV1D-33 ENST00000390265|IGKV1D-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCTGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCTCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCAGGCGAGTCAGGACATTAGCAACTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTACGATGCATCCAATTTGGAAACAGGGGTCCCATCAAGGTTCAGTGGAAGTGGATCTGGGACAGATTTTACTTTCACCATCAGCAGCCTGCAGCCTGAAGATATTGCAACATATTACTGTCAACAGTATGATAATCTCCCT +>251|IGKV1D-37 ENST00000509129|IGKV1D-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTACTGCTCTGGGTCCCAGGTGCCAGATGTGACATCCAGTTGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGTGAGTCAGGGCATTAGCAGTTATTTAAATTGGTATCGGCAGAAACCAGGGAAAGTTCCTAAGCTCCTGATCTATAGTGCATCCAATTTGCAATCTGGAGTCCCATCTCGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACTATCAGCAGCCTGCAGCCTGAAGATGTTGCAACTTATTACGGTCAACGGACTTACAATGCCCCTCC +>252|IGKV1D-39 ENST00000448155|IGKV1D-39|5'UTR|IG|IGK|None|00 +GTCAGTCTCAGTCAGGACACAGC +>253|IGKV1D-39 ENST00000448155|IGKV1D-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTACTCTGGCTCCGAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCAAGTCAGAGCATTAGCAGCTATTTAAATTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGATCTATGCTGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTCTGCAACCTGAAGATTTTGCAACTTACTACTGTCAACAGAGTTACAGTACCCCTCC +>254|IGKV1D-42 ENST00000390278|IGKV1D-42|5'UTR|IG|IGK|None|00 +AGTCCCAGTCAGGACACAGC +>255|IGKV1D-42 ENST00000390278|IGKV1D-42|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGTCAGATTTGACATCCAGATGACCCAGTCTCCATCTTTCCTGTCTGCATCTGTAGGAGACAGAGTCAGTATCATTTGCTGGGCAAGTGAGGGCATTAGCAGTAATTTAGCCTGGTATCTGCAGAAACCAGGGAAATCCCCTAAGCTCTTCCTCTATGATGCAAAAGATTTGCACCCTGGGGTCTCATCGAGGTTCAGTGGCAGGGGATCTGGGACGGATTTCACTCTCACCATCATCAGCCTGAAGCCTGAAGATTTTGCAGCTTATTACTGTAAACAGGACTTCAGTTACCCTCC +>256|IGKV1D-43 ENST00000468879|IGKV1D-43|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAACCAGCCCTGCAGCTGTGCCCAGCCTGCCTTGCCCCCTGCTAATTTGCATGTTCCCAGAGCACATCCTCCTACCCTGAAGACTTATTAATGCGCTGGTCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>257|IGKV1D-43 ENST00000468879|IGKV1D-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTGCCCGCTCAGCGCCTGGGGCTCCTGCTGCTCTGGTTCCCAGGTGCCAGATGTGCCATCCGGATGACCCAGTCTCCATTCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCTGGGCCAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGCAAAAGCCCCTAAGCTCTTCATCTATTATGCATCCAGTTTGCAAAGTGGGGTCCCATCAAGGTTCAGCGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTACCCCT +>258|IGKV1D-8 ENST00000471857|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>259|IGKV1D-8 ENST00000471857|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGCCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>260|IGKV1D-8 ENST00000628219|IGKV1D-8|5'UTR|IG|IGK|None|00 +GGGACACCTGGGGACACTGAGCTGGTGCTGAGTTACTGAGATGAGCCAGCTCTGCAGCTGTGCCCAGTCAGCCCCATCCCCTGCTCATTTGCATGTTCCCAGAGCACAACCTCCTGCACTGAAGCCTTATTAATAGGCTGGCCACACTTCATGCAGGAGTCAGACCCAGTCAGGACACAGC +>261|IGKV1D-8 ENST00000628219|IGKV1D-8|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTGCCAGATGTGTCATCTGGATGACCCAGTCTCCATCCTTACTCTCTGCATCTACAGGAGACAGAGTCACCATCAGTTGTCGGATGAGTCAGGGCATTAGCAGTTATTTAGCCTGGTATCAGCAAAAACCAGGGAAAGCCCCTGAGCTCCTGATCTATGCTGCATCCACTTTGCAAAGTGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGTTGCCTGCAGTCTGAAGATTTTGCAACTTATTACTGTCAACAGTATTATAGTTTCCCTCC +>262|IGKV2-24 ENST00000484817|IGKV2-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>263|IGKV2-24 ENST00000484817|IGKV2-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCACCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGATTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCATGCAAGCTACACAATTTCCT +>264|IGKV2-28 ENST00000482769|IGKV2-28|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>265|IGKV2-28 ENST00000482769|IGKV2-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>266|IGKV2-30 ENST00000468494|IGKV2-30|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACA +>267|IGKV2-30 ENST00000468494|IGKV2-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACCGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>268|IGKV2D-24 ENST00000462693|IGKV2D-24|5'UTR|IG|IGK|None|00 +AATTAGGACTCCTCAGGTCACCTTCTCACA +>269|IGKV2D-24 ENST00000462693|IGKV2D-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCTTGCTCAGCTTCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGGGGATATTGTGATGACCCAGACTCCACTCTCCTCGCCTGTCACCCTTGGACAGCCGGCCTCCATCTCCTTCAGGTCTAGTCAAAGCCTCGTACACAGTGATGGAAACACCTACTTGAGTTGGCTTCAGCAGAGGCCAGGCCAGCCTCCAAGACTCCTAATTTATAAGGTTTCTAACCGGTTCTCTGGGGTCCCAGACAGATTCAGTGGCAGTGGGGCAGGGACAGATTTCACACTGAAAATCAGCAGGGTGGAAGCTGAGGATGTCGGGGTTTATTACTGCACGCAAGCTACACAATTTCCT +>270|IGKV2D-26 ENST00000390268|IGKV2D-26|5'UTR|IG|IGK|None|00 +GATCAGGACTCCTCAGTTCACCTTCTCACT +>271|IGKV2D-26 ENST00000390268|IGKV2D-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCTTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGCAGAGATTGTGATGACCCAGACTCCACTCTCCTTGTCTATCACCCCTGGAGAGCAGGCCTCCATGTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTGATGGATACACCTATTTGTATTGGTTTCTGCAGAAAGCCAGGCCAGTCTCCACGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATTTTGGAGTTTATTACTGCATGCAAGATGCACAAGATCCT +>272|IGKV2D-28 ENST00000453166|IGKV2D-28|5'UTR|IG|IGK|None|00 +TTGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>273|IGKV2D-28 ENST00000453166|IGKV2D-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCTCTGGATCCAGTGGGGATATTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCCTGCATAGTAATGGATACAACTATTTGGATTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATTTGGGTTCTAATCGGGCCTCCGGGGTCCCTGACAGGTTCAGTGGCAGTGGATCAGGCACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGCTCTACAAACTCCT +>274|IGKV2D-29 ENST00000491977|IGKV2D-29|5'UTR|IG|IGK|None|00 +GATCAGGACTTCTCAGTTCATCTTCTCACC +>275|IGKV2D-29 ENST00000491977|IGKV2D-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGATACCTGGATCCAGTGCAGATATTGTGATGACCCAGACTCCACTCTCTCTGTCCGTCACCCCTGGACAGCCGGCCTCCATCTCCTGCAAGTCTAGTCAGAGCCTCCTGCATAGTGATGGAAAGACCTATTTGTATTGGTACCTGCAGAAGCCAGGCCAGCCTCCACAGCTCCTGATCTATGAAGTTTCCAACCGGTTCTCTGGAGTGCCAGATAGGTTCAGTGGCAGCGGGTCAGGGACAGATTTCACACTGAAAATCAGCCGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAAGTATACAGCTTCCT +>276|IGKV2D-30 ENST00000474213|IGKV2D-30|5'UTR|IG|IGK|None|00 +TGACTGATCAGGACTCCTCAGTTCACCTTCTCACA +>277|IGKV2D-30 ENST00000474213|IGKV2D-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCAGGATCCAGTGGGGATGTTGTGATGACTCAGTCTCCACTCTCCCTGCCCGTCACCCTTGGACAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAAAGCCTCGTATACAGTGATGGAAACACCTACTTGAATTGGTTTCAGCAGAGGCCAGGCCAATCTCCAAGGCGCCTAATTTATAAGGTTTCTAACTGGGACTCTGGGGTCCCAGACAGATTCAGCGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGGGTTTATTACTGCATGCAAGGTACACACTGGCCT +>278|IGKV3-11 ENST00000483158|IGKV3-11|5'UTR|IG|IGK|None|00 +GTCAGAGCCCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>279|IGKV3-11 ENST00000483158|IGKV3-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAACAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCCT +>280|IGKV3-15 ENST00000390252|IGKV3-15|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>281|IGKV3-15 ENST00000390252|IGKV3-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGTATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCAGCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCT +>282|IGKV3-20 ENST00000492167|IGKV3-20|5'UTR|IG|IGK|None|00 +CCTGGGTCAGAGCTCTGGAGAAGAGCTGCTCAGTTAGGACCCAGAGGGAACC +>283|IGKV3-20 ENST00000492167|IGKV3-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGGCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>284|IGKV3-7 ENST00000390247|IGKV3-7|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCCCTGGGAAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>285|IGKV3-7 ENST00000390247|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCTCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCAGAGAAATTGTAATGACACAGTCTCCACCCACCCTGTCTTTGTCTCCAGGGGAAAGAGTCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAACCTGGTATCAGCAGAAACCTGGCCAGGCGCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTAGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCT +>286|IGKV3/OR2-268 ENST00000421835|IGKV3/OR2-268|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCACAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>287|IGKV3D-11 ENST00000390277|IGKV3D-11|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCTGCCCTACCTTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>288|IGKV3D-11 ENST00000390277|IGKV3D-11|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGATGCATCCAACAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGCCTGGGACAGACTTCACTCTCACCATCAGCAGCCTAGAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGCGTAGCAACTGGCATCC +>289|IGKV3D-15 ENST00000417279|IGKV3D-15|5'UTR|IG|IGK|None|00 +GGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGACGGAACC +>290|IGKV3D-15 ENST00000417279|IGKV3D-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAGCCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACTGGAGAAATAGTGATGACGCAGTCTCCAGCCACCCTGTCTGTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAACTTAGCCTGGTACCAGCAGAAACCTGGCCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCATCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGAGTTCACTCTCACCATCAGCATCCTGCAGTCTGAAGATTTTGCAGTTTATTACTGTCAGCAGTATAATAACTGGCCTCC +>291|IGKV3D-20 ENST00000390270|IGKV3D-20|5'UTR|IG|IGK|None|00 +GCATGTCCCTCCCAGCCGCCCTGCAGTCCAGAGCCCATATCAATGCCTGGGTCAGAGCTCTGGGGAGGAACTGCTCAGTTAGGACCCAGAGGGAACC +>292|IGKV3D-20 ENST00000390270|IGKV3D-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACCCCAGCGCAGCTTCTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTGTTGACGCAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCGGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTAGCCTGGTACCAGCAGAAACCTGGCCTGGCGCCCAGGCTCCTCATCTATGATGCATCCAGCAGGGCCACTGGCATCCCAGACAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGACTGGAGCCTGAAGATTTTGCAGTGTATTACTGTCAGCAGTATGGTAGCTCACCT +>293|IGKV3D-7 ENST00000443397|IGKV3D-7|5'UTR|IG|IGK|None|00 +GAGGAACTGCTCAGTTAGGACCCAG +>294|IGKV3D-7 ENST00000443397|IGKV3D-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAACCATGGAAGCCCCAGCACAGCTTCTTCTTCCTCCTGCTACTCTGGCTCCCAGATACCACCGGAGAAATTGTAATGACACAGTCTCCAGCCACCCTGTCTTTGTCTCCAGGGGAAAGAGCCACCCTCTCCTGCAGGGCCAGTCAGAGTGTTAGCAGCAGCTACTTATCCTGGTACCAGCAGAAACCTGGGCAGGCTCCCAGGCTCCTCATCTATGGTGCATCCACCAGGGCCACTGGCATCCCAGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAGTTTATTACTGTCAGCAGGATTATAACTTACCTCC +>295|IGKV4-1 ENST00000390243|IGKV4-1|5'UTR|IG|IGK|None|00 +TTTGGCTCTTGATTTACATTGGGTACTTTCACAACCCACTGCTCATGAAATTTGCTTTTGTACTCACTGGTTGTTTTTGCATAGGCCCCTCCAGGCCACGACCAGCTGTTTGGATTTTATAAACGGGCCGTTTGCATTGTGAACTGAGCTACAACAGGCAGGCAGGGGCAGCAAG +>296|IGKV4-1 ENST00000390243|IGKV4-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTTGCAGACCCAGGTCTTCATTTCTCTGTTGCTCTGGATCTCTGGTGCCTACGGGGACATCGTGATGACCCAGTCTCCAGACTCCCTGGCTGTGTCTCTGGGCGAGAGGGCCACCATCAACTGCAAGTCCAGCCAGAGTGTTTTATACAGCTCCAACAATAAGAACTACTTAGCTTGGTACCAGCAGAAACCAGGACAGCCTCCTAAGCTGCTCATTTACTGGGCATCTACCCGGGAATCCGGGGTCCCTGACCGATTCAGTGGCAGCGGGTCTGGGACAGATTTCACTCTCACCATCAGCAGCCTGCAGGCTGAAGATGTGGCAGTTTATTACTGTCAGCAATATTATAGTACTCCT +>297|IGKV5-2 ENST00000390244|IGKV5-2|5'UTR|IG|IGK|None|00 +ATAAAATCTGTGCTGTCAAACTGATTAGGAACTGACTACCACCTGCAGGTCAGGGCCAAGGTT +>298|IGKV5-2 ENST00000390244|IGKV5-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGGTCCCAGGTTCACCTCCTCAGCTTCCTCCTCCTTTGGATCTCTGATACCAGGGCAGAAACGACACTCACGCAGTCTCCAGCATTCATGTCAGCGACTCCAGGAGACAAAGTCAACATCTCCTGCAAAGCCAGCCAAGACATTGATGATGATATGAACTGGTACCAACAGAAACCAGGAGAAGCTGCTATTTTCATTATTCAAGAAGCTACTACTCTCGTTCCTGGAATCCCACCTCGATTCAGTGGCAGCGGGTATGGAACAGATTTTACCCTCACAATTAATAACATAGAATCTGAGGATGCTGCATATTACTTCTGTCTACAACATGATAATTTCCCT +>299|IGKV6-21 ENST00000390256|IGKV6-21|5'UTR|IG|IGK|None|00 +ATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>300|IGKV6-21 ENST00000390256|IGKV6-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTTGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCTTCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAACGTATTACTGTCATCAGAGTAGTAGTTTACCT +>301|IGKV6D-21 ENST00000436451|IGKV6D-21|5'UTR|IG|IGK|None|00 +GGTATCTTAAAAGAGGTTCTTTCTCTGGGATGTGGCATGAGCAAAACTGACAAGTCAAGGCAGGAAG +>302|IGKV6D-21 ENST00000436451|IGKV6D-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGTCGCCATCACAACTCATTGGGTTTCTGCTGCTCTGGGTTCCAGCCTCCAGGGGTGAAATTGTGCTGACTCAGTCTCCAGACTTTCAGTCTGTGACTCCAAAGGAGAAAGTCACCATCACCTGCCGGGCCAGTCAGAGCATTGGTAGTAGCTTACACTGGTACCAGCAGAAACCAGATCAGTCTCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCCTCACCATCAATAGCCTGGAAGCTGAAGATGCTGCAGCGTATTACTGTCATCAGAGTAGTAGTTTACCT +>303|IGKV6D-41 ENST00000390271|IGKV6D-41|5'UTR|IG|IGK|None|00 +AGCAAAACTGAAGTCAAAACACTGAG +>304|IGKV6D-41 ENST00000390271|IGKV6D-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCCCGTTGCAATTCCTGCGGCTTCTGCTCCTCTGGGTTCCAGCCTCCAGGGGTGATGTTGTGATGACACAGTCTCCAGCTTTCCTCTCTGTGACTCCAGGGGAGAAAGTCACCATCACCTGCCAGGCCAGTGAAGGCATTGGCAACTACTTATACTGGTACCAGCAGAAACCAGATCAAGCCCCAAAGCTCCTCATCAAGTATGCTTCCCAGTCCATCTCAGGGGTCCCCTCGAGGTTCAGTGGCAGTGGATCTGGGACAGATTTCACCTTTACCATCAGTAGCCTGGAAGCTGAAGATGCTGCAACATATTACTGTCAGCAGGGCAATAAGCACCCT +>305|IGLC1 ENST00000390321|IGLC1|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCCAACCCCACTGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTCCAAGCCAACAAGGCCACACTAGTGTGTCTGATCAGTGACTTCTACCCGGGAGCTGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCAAACCCTCCAAACAGAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>306|IGLC2 ENST00000390323|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCGCCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTATCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>307|IGLC3 ENST00000390325|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCATAAGTGACTTCTACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATAGCAGCCCCGTCAAGGCGGGAGTGGAGACCACCACACCCTCCAAACAAAGCAACAACAAGTACGCGGCCAGCAGCTACCTGAGCCTGACGCCTGAGCAGTGGAAGTCCCACAAAAGCTACAGCTGCCAGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTACAGAATGTTCA +>308|IGLC7 ENST00000390331|IGLC7|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGGCTGCCCCCTCGGTCACTCTGTTCCCACCCTCCTCTGAGGAGCTTCAAGCCAACAAGGCCACACTGGTGTGTCTCGTAAGTGACTTCAACCCGGGAGCCGTGACAGTGGCCTGGAAGGCAGATGGCAGCCCCGTCAAGGTGGGAGTGGAGACCACCAAACCCTCCAAACAAAGCAACAACAAGTATGCGGCCAGCAGCTACCTGAGCCTGACGCCCGAGCAGTGGAAGTCCCACAGAAGCTACAGCTGCCGGGTCACGCATGAAGGGAGCACCGTGGAGAAGACAGTGGCCCCTGCAGAATGCTCT +>309|IGLJ1 ENST00000390320|IGLJ1|J-REGION|IG|IGL|None|00 +TTATGTCTTCGGAACTGGGACCAAGGTCACCGTCCTAG +>310|IGLJ2 ENST00000390322|IGLJ2|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTCATGAGCAG +>311|IGLJ2 ENST00000390322|IGLJ2|J-REGION|IG|IGL|None|00 +TGTGGTATTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>312|IGLJ3 ENST00000390324|IGLJ3|5'UTR|IG|IGL|None|00 +GTGTGGGGGCCATGTGGACTCCCTC +>313|IGLJ3 ENST00000390324|IGLJ3|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGCGGAGGGACCAAGCTGACCGTCCTAG +>314|IGLJ4 ENST00000390326|IGLJ4|J-REGION|IG|IGL|None|00 +GTATTTGGTGGAGGAACCCAGCTGATCATTTTA +>315|IGLJ5 ENST00000390327|IGLJ5|J-REGION|IG|IGL|None|00 +CAGAGAGGGTTTTTGTATGAGCCTGTGTCACAGCACTGGGTGTTTGGTGAGGGGACCGAGCTGACCGTCCTA +>316|IGLJ6 ENST00000390328|IGLJ6|J-REGION|IG|IGL|None|00 +GGAGGGTTTGTGTGCAGGGTTATATCACAGTGTAATGTGTTCGGCAGTGGCACCAAGGTGACCGTCCTCG +>317|IGLJ7 ENST00000390330|IGLJ7|J-REGION|IG|IGL|None|00 +TCACTGTGTGCTGTGTTCGGAGGAGGCACCCAGCTGACCGTCCTCG +>318|IGLV1-36 ENST00000390301|IGLV1-36|5'UTR|IG|IGL|None|00 +GCTGCGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>319|IGLV1-36 ENST00000390301|IGLV1-36|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCCCCTCTCTTCCTCACCCTCATCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCGGTGTCTGAAGCCCCCAGGCAGAGGGTCACCATCTCCTGTTCTGGAAGCAGCTCCAACATCGGAAATAATGCTGTAAACTGGTACCAGCAGCTCCCAGGAAAGGCTCCCAAACTCCTCATCTATTATGATGATCTGCTGCCCTCAGGGGTCTCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>320|IGLV1-40 ENST00000390299|IGLV1-40|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAAGAGGCAGCACTCAGGACAATCTCCAGC +>321|IGLV1-40 ENST00000390299|IGLV1-40|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTCCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATCGGGGCAGGTTATGATGTACACTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCCAGTCCTATGACAGCAGCCTGAGTGGTTC +>322|IGLV1-44 ENST00000390297|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>323|IGLV1-44 ENST00000390297|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTCC +>324|IGLV1-44 ENST00000628287|IGLV1-44|5'UTR|IG|IGL|None|00 +CTGATTTGCATGGATGGACTCTCCCCCTCTCAGAGTATGAAGAGAGGGAGAGATCTGGGGGAAGCTCAGCTTCAGCTGTGGGTAGAGAAGACAGGACTCAGGACAATCTCCAGC +>325|IGLV1-44 ENST00000628287|IGLV1-44|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCAGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATACTGTAAACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCAGTCTGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAATGGTC +>326|IGLV1-47 ENST00000390294|IGLV1-47|5'UTR|IG|IGL|None|00 +GGGGAAGCTCAGCTTCAGCTGTGGTAGAGAAGACAGGATTCAGGACAATCTCCAGC +>327|IGLV1-47 ENST00000390294|IGLV1-47|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCGGCTTCCCTCTCCTCCTCACCCTCCTCACTCACTGTGCAGGGTCCTGGGCCCAGTCTGTGCTGACTCAGCCACCCTCAGCGTCTGGGACCCCCGGGCAGAGGGTCACCATCTCTTGTTCTGGAAGCAGCTCCAACATCGGAAGTAATTATGTATACTGGTACCAGCAGCTCCCAGGAACGGCCCCCAAACTCCTCATCTATAGTAATAATCAGCGGCCCTCAGGGGTCCCTGACCGATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCAGTGGGCTCCGGTCCGAGGATGAGGCTGATTATTACTGTGCAGCATGGGATGACAGCCTGAGTGGT +>328|IGLV1-50 ENST00000390291|IGLV1-50|5'UTR|IG|IGL|None|00 +GCTCTGCTTCAGCTGTGGGCACAGGAGGCAGCACTCAGGACAATCTCCAGC +>329|IGLV1-50 ENST00000390291|IGLV1-50|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGTCTTCTCTCCTCCTCACTCTCCTCGCTCACTGCACAGGGTCCTGGGCCCAGTCTGTGCTGACGCAGCCGCCCTCAGTGTCTGGGGCCCCAGGGCAGAGGGTCACCATCTCCTGCACTGGGAGCAGCTCCAACATTGGGGCGGGTTATGTTGTACATTGGTACCAGCAGCTTCCAGGAACAGCCCCCAAACTCCTCATCTATGGTAACAGCAATCGGCCCTCAGGGGTCCCTGACCAATTCTCTGGCTCCAAGTCTGGCACCTCAGCCTCCCTGGCCATCACTGGACTCCAGTCTGAGGATGAGGCTGATTATTACTGCAAAGCATGGGATAACAGCCTGAATGCT +>330|IGLV1-51 ENST00000390290|IGLV1-51|5'UTR|IG|IGL|None|00 +TGAGCGCAGAAGGCAGGACTCGGGACAATCTTCATC +>331|IGLV1-51 ENST00000390290|IGLV1-51|L-REGION+V-REGION|IG|IGL|None|00 +ATGACCTGCTCCCCTCTCCTCCTCACCCTTCTCATTCACTGCACAGGGTCCTGGGCCCAGTCTGTGTTGACGCAGCCGCCCTCAGTGTCTGCGGCCCCAGGACAGAAGGTCACCATCTCCTGCTCTGGAAGCAGCTCCAACATTGGGAATAATTATGTATCCTGGTACCAGCAGCTCCCAGGAACAGCCCCCAAACTCCTCATTTATGACAATAATAAGCGACCCTCAGGGATTCCTGACCGATTCTCTGGCTCCAAGTCTGGCACGTCAGCCACCCTGGGCATCACCGGACTCCAGACTGGGGACGAGGCCGATTATTACTGCGGAACATGGGATAGCAGCCTGAGTGCTGG +>332|IGLV10-54 ENST00000390287|IGLV10-54|5'UTR|IG|IGL|None|00 +GGGAATCTGCACC +>333|IGLV10-54 ENST00000390287|IGLV10-54|L-REGION+V-REGION|IG|IGL|None|00 +ATGCCCTGGGCTCTGCTCCTCCTGACCCTCCTCACTCACTCTGCAGTGTCAGTGGTCCAGGCAGGGCTGACTCAGCCACCCTCGGTGTCCAAGGGCTTGAGACAGACCGCCACACTCACCTGCACTGGGAACAGCAACATTGTTGGCAACCAAGGAGCAGCTTGGCTGCAGCAGCACCAGGGCCACCCTCCCAAACTCCTATCCTACAGGAATAACAACCGGCCCTCAGGGATCTCAGAGAGATTCTCTGCATCCAGGTCAGGAAACACAGCCTCCCTGACCATTACTGGACTCCAGCCTGAGGACGAGGCTGACTATTACTGCTCAGCATTGGACAGCAGCCTCAGTGCTC +>334|IGLV11-55 ENST00000390286|IGLV11-55|5'UTR|IG|IGL|None|00 +GCTGTGTCCACT +>335|IGLV11-55 ENST00000390286|IGLV11-55|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCCTGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCGGCCCGTGCTGACTCAGCCGCCCTCCCTGTCTGCATCCCCGGGAGCAACAGCCAGACTCCCCTGCACCCTGAGCAGTGACCTCAGTGTTGGTGGTAAAAACATGTTCTGGTACCAGCAGAAGCTAGGGAGCTCTCCCAGGTTATTCCTGTATCACTACTCAGACTCAGACAAGCAGCTGGGACCTGGGGTCCCCAGTCGAGTCTCTGGCTCCAAGGAGACCTCAAGTAACACAGCGTTTTTGCTCATCTCTGGGCTCCAGCCTGAGGACGAGGCCGATTATTACTGCCAGGTGTACGAAAGTAGTGCTAAT +>336|IGLV2-11 ENST00000390314|IGLV2-11|5'UTR|IG|IGL|None|00 +TGCTGGGGTCTCAGGAGGCAGCACTCTCGGGACGTCTCCACC +>337|IGLV2-11 ENST00000390314|IGLV2-11|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCAGCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCGCTCAGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGATGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCTGCTCATATGCAGGCAGCTACACTTTCCACA +>338|IGLV2-14 ENST00000390312|IGLV2-14|5'UTR|IG|IGL|None|00 +GCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACATCTCCACC +>339|IGLV2-14 ENST00000390312|IGLV2-14|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTCATATACAAGCAGCAGCACTCTCCACAGTG +>340|IGLV2-18 ENST00000390310|IGLV2-18|5'UTR|IG|IGL|None|00 +GAATATCTCCACC +>341|IGLV2-18 ENST00000390310|IGLV2-18|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGATCCTGGGCTCAGTCTGCCCTGACTCAGCCTCCCTCCGTGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTAGTTATAACCGTGTCTCCTGGTACCAGCAGCCCCCAGGCACAGCCCCCAAACTCATGATTTATGAGGTCAGTAATCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGGTCCAAGTCTGGCAACACGGCCTCCCTGACCATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCAGCTTATATACAAGCAGCAGCACTTTC +>342|IGLV2-23 ENST00000390306|IGLV2-23|5'UTR|IG|IGL|None|00 +TCTCTGAGCCCAGGCCCACGTGAGGGTGGGGTGAGGAGAGGAGCCCAGGATGCTGATTTTCATGGAGGCCCCGCCCTCCTCTGAGGCAAAGGGGATAAGACAGGGCTGGGGCAGGGCCAGTGCTGGGGTCACAAGAGGCAGCGCTCTCGGGACGTCTCCACC +>343|IGLV2-23 ENST00000390306|IGLV2-23|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTGCTCCTCACTCTCCTCACTCAGGACACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTGCCTCCGTGTCTGGGTCTCCTGGACAGTCGATCACCATCTCCTGCACTGGAACCAGCAGTGATGTTGGGAGTTATAACCTTGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGGCAGTAAGCGGCCCTCAGGGGTTTCTAATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACAATCTCTGGGCTCCAGGCTGAGGACGAGGCTGATTATTACTGCTGCTCATATGCAG +>344|IGLV2-33 ENST00000390302|IGLV2-33|5'UTR|IG|IGL|None|00 +GGCTAGAGGCAGGCCCGGTGCTGGGGTCTCAAGGCAGCGCTCTCGGGACATCTCCACC +>345|IGLV2-33 ENST00000390302|IGLV2-33|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAATCTGCCCTGACTCAGCCTCCTTTTGTGTCCGGGGCTCCTGGACAGTCGGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGGGATTATGATCATGTCTTCTGGTACCAAAAGCGTCTCAGCACTACCTCCAGACTCCTGATTTACAATGTCAATACTCGGCCTTCAGGGATCTCTGACCTCTTCTCAGGCTCCAAGTCTGGCAACATGGCTTCCCTGACCATCTCTGGGCTCAAGTCCGAGGTTGAGGCTAATTATCACTGCAGCTTATATTCAAGTAGTTACACTTTC +>346|IGLV2-8 ENST00000620395|IGLV2-8|5'UTR|IG|IGL|None|00 +TCTCTAAGCCCAGGCCCAAGTGAGGGTGGGGTGAGAAGAGGAGCTCAGGATGCAGATTTGCATGGAGGTCCCGCCCTTCTCTGAGGCAGAGGGGATAAGACAGGGCTGGGGGCAGGCCCAGTGCTGGGGTCTCAGGAGGCAGCGCTCTCAGGACGTCACCACC +>347|IGLV2-8 ENST00000620395|IGLV2-8|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCTGCTCCTCCTCACCCTCCTCACTCAGGGCACAGGGTCCTGGGCCCAGTCTGCCCTGACTCAGCCTCCCTCCGCGTCCGGGTCTCCTGGACAGTCAGTCACCATCTCCTGCACTGGAACCAGCAGTGACGTTGGTGGTTATAACTATGTCTCCTGGTACCAACAGCACCCAGGCAAAGCCCCCAAACTCATGATTTATGAGGTCAGTAAGCGGCCCTCAGGGGTCCCTGATCGCTTCTCTGGCTCCAAGTCTGGCAACACGGCCTCCCTGACCGTCTCTGGGCTCCAGGCTGAGGATGAGGCTGATTATTACTGCAGCTCATATGCAGGCAGCAACAATTTC +>348|IGLV3-1 ENST00000390319|IGLV3-1|5'UTR|IG|IGL|None|00 +AAGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGAGGTGCCTCAGCC +>349|IGLV3-1 ENST00000390319|IGLV3-1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGATCCCTCTCTTCCTCGGCGTCCTTGCTTACTGCACAGGATCCGTGGCCTCCTATGAGCTGACTCAGCCACCCTCAGTGTCCGTGTCCCCAGGACAGACAGCCAGCATCACCTGCTCTGGAGATAAATTGGGGGATAAATATGCTTGCTGGTATCAGCAGAAGCCAGGCCAGTCCCCTGTGCTGGTCATCTATCAAGATAGCAAGCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACAGCCACTCTGACCATCAGCGGGACCCAGGCTATGGATGAGGCTGACTATTACTGTCAGGCGTGGGACAGCAGCACTGCACACA +>350|IGLV3-10 ENST00000390315|IGLV3-10|5'UTR|IG|IGL|None|00 +GTGGGCTCAGGAGGCAGAGCTCTGGGAATCTCACC +>351|IGLV3-10 ENST00000390315|IGLV3-10|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTGCTCCCCCTCCTCACTTTCTGCACAGTCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAAACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGTCAGGCCAGGCCCCTGTGCTGGTCATCTATGAGGACAGCAAACGACCCTCCGGGATCCCTGAGAGATTCTCTGGCTCCAGCTCAGGGACAATGGCCACCTTGACTATCAGTGGGGCCCAGGTGGAGGATGAAGCTGACTACTACTGTTACTCAACAGACAGCAGTGGTAATCATAG +>352|IGLV3-12 ENST00000390313|IGLV3-12|5'UTR|IG|IGL|None|00 +GCCTCAGCC +>353|IGLV3-12 ENST00000390313|IGLV3-12|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCCTCCTCAGCCTCCTCGCTCACTGCACAGGCTCTGCGACCTCCTATGAGCTGACTCAGCCACACTCAGTGTCAGTGGCCACAGCACAGATGGCCAGGATCACCTGTGGGGGAAACAACATTGGAAGTAAAGCTGTGCACTGGTACCAGCAAAAGCCAGGCCAGGACCCTGTGCTGGTCATCTATAGCGATAGCAACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACCCAGGGAACACCGCCACCCTAACCATCAGCAGGATCGAGGCTGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGTAGTAGTGATCATCC +>354|IGLV3-16 ENST00000390311|IGLV3-16|5'UTR|IG|IGL|None|00 +TCTGTGGGTCCAGGAGGCACAGCTCTGGGAATCTCACC +>355|IGLV3-16 ENST00000390311|IGLV3-16|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCTAGGACAGATGGCCAGGATCACCTGCTCTGGAGAAGCATTGCCAAAAAAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGTTCCCTGTGCTGGTGATATATAAAGACAGCGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAATAGTCACATTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCTATCAGCAGACAGCAGTGGTACTTATCC +>356|IGLV3-19 ENST00000390309|IGLV3-19|5'UTR|IG|IGL|None|00 +AGCTGTGGGCTCAGAAGCAGAGTTCTGGGGTGTCTCCACC +>357|IGLV3-19 ENST00000390309|IGLV3-19|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCTCTGGCTCACTCTCCTCACTCTTTGCATAGGTTCTGTGGTTTCTTCTGAGCTGACTCAGGACCCTGCTGTGTCTGTGGCCTTGGGACAGACAGTCAGGATCACATGCCAAGGAGACAGCCTCAGAAGCTATTATGCAAGCTGGTACCAGCAGAAGCCAGGACAGGCCCCTGTACTTGTCATCTATGGTAAAAACAACCGGCCCTCAGGGATCCCAGACCGATTCTCTGGCTCCAGCTCAGGAAACACAGCTTCCTTGACCATCACTGGGGCTCAGGCGGAAGATGAGGCTGACTATTACTGTAACTCCCGGGACAGCAGTG +>358|IGLV3-21 ENST00000390308|IGLV3-21|5'UTR|IG|IGL|None|00 +GCACAGAGGAGCTGTGCCCTGGAATGGGGCCTGTACCTGTCCAAGGCTTGTGCCGTCCCCTGTGGGAGATGAGAAGCGTCCCTGCATTGGGCTCTTGGGGACCCGTCTTGGACATGAATCTCCTCCAGCAGCAGCCTCTGACTCTGCTGATTTGCATCATGGGCCGCTCTCTCCAGCAAGGGGATAAGAGAGGCCTGGGAGGAACCTGCTCAGTCTGGGCCTAAGGAAGCAGCACTGGTGGTGCCTCAGCC +>359|IGLV3-21 ENST00000390308|IGLV3-21|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGTTCTCCTCCTCGGCCTCCTCTCTCACTGCACAGGCTCTGTGACCTCCTATGTGCTGACTCAGCCACCCTCGGTGTCAGTGGCCCCAGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAGTGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCGTCTATGATGATAGCGACCGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAACTCTGGGAACACGGCCACCCTGACCATCAGCAGGGTCGAAGCCGGGGATGAGGCCGACTATTACTGTCAGGTGTGGGATAGTAGTAGTGATCATCCCACG +>360|IGLV3-22 ENST00000390307|IGLV3-22|5'UTR|IG|IGL|None|00 +AAGAGAGGCCTGGGAAGCCCAGCTGTGCTGTGGGCTCAGGAGGCAGAGCTGTGGGTGTCTCACC +>361|IGLV3-22 ENST00000390307|IGLV3-22|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCATGGGCCACACTCCTGCTCCCACTCCTCAACCTCTACACAGGCTCTGTTGCCTCCTATGAGCTGACACAGCTACCCTCGGTGTCAGTGTCCCCAGGACAGACAGCCAGGATCACCTGCTCTGGAGATGTACTGGGGGAAAATTATGCTGACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGAGTTGGTGATATACGAAGATAGTGAGCGGTACCCTGGAATCCCTGAACGATTCTCTGGGTCCACCTCAGGGAACACGACCACCCTGACCATCAGCAGGGTCCTGACCGAAGACGAGGCTGACTATTACTGTTTGTCTGGGGATGAGGACAATCCCTCA +>362|IGLV3-25 ENST00000390305|IGLV3-25|5'UTR|IG|IGL|None|00 +GCTGTGCTGTGGGTCCAGGAGGCAGAACTCTGGGTGTCTCACC +>363|IGLV3-25 ENST00000390305|IGLV3-25|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTACTTCTCCCCCTCCTCACTCTCTGCACAGGCTCTGAGGCCTCCTATGAGCTGACACAGCCACCCTCGGTGTCAGTGTCCCCAGGACAGACGGCCAGGATCACCTGCTCTGGAGATGCATTGCCAAAGCAATATGCTTATTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATATATAAAGACAGTGAGAGGCCCTCAGGGATCCCTGAGCGATTCTCTGGCTCCAGCTCAGGGACAACAGTCACGTTGACCATCAGTGGAGTCCAGGCAGAAGACGAGGCTGACTATTACTGTCAATCAGCAGACAGCAGTG +>364|IGLV3-27 ENST00000390304|IGLV3-27|5'UTR|IG|IGL|None|00 +GCTGTAGGCTCAGGAGGCAGAGCTCTGAATGTCTCACC +>365|IGLV3-27 ENST00000390304|IGLV3-27|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATCCCTCTCCTGCTCCCCCTCCTCATTCTCTGCACAGTCTCTGTGGCCTCCTATGAGCTGACACAGCCATCCTCAGTGTCAGTGTCTCCGGGACAGACAGCCAGGATCACCTGCTCAGGAGATGTACTGGCAAAAAAATATGCTCGGTGGTTCCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTGATTTATAAAGACAGTGAGCGGCCCTCAGGGATCCCTGAGCGATTCTCCGGCTCCAGCTCAGGGACCACAGTCACCTTGACCATCAGCGGGGCCCAGGTTGAGGATGAGGCTGACTATTACTGTTACTCTGCGGCTGACAACAAT +>366|IGLV3-32 ENST00000390303|IGLV3-32|5'UTR|IG|IGL|None|00 +GCTGTGGACTCAGAGGCAGAGCTCTGGGGCATTTCCATT +>367|IGLV3-32 ENST00000390303|IGLV3-32|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCTCCCCTGCTCGTCCTCACTCTCTGCACAGGCTCCGTTATTTCCTCTGGGCCAACTCAGGTGCCTGCAGTGTCTGTGGCCTTGGGACAAATGGCCAGGATCACCTGCCAGGGAGACAGCATGGAAGGCTCTTATGAACACTGGTACCAGCAGAAGCCAGGCCAGGCCCCCGTGCTGGTCATCTATGATAGCAGTGACCGGCCCTCAAGGATCCCTGAGCGATTCTCTGGCTCCAAATCAGGCAACACAACCACCCTGACCATCACTGGGGCCCAGGCTGAGGATGAGGCTGATTATTACTATCAGTTGATAGACAACCATGCTACTCAACT +>368|IGLV3-9 ENST00000390316|IGLV3-9|5'UTR|IG|IGL|None|00 +CTTGACTCTGCTGATTTGCATCACAGGCTGCTCTCTTCAGCAAGGGGATAAGAGAGGGCTGGAAGGAACCTGCCCAGCCTGGGCCTCAGGAAGCAGCATCGGGGGTGCCGCAGCC +>369|IGLV3-9 ENST00000390316|IGLV3-9|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCGCTCTCCTTCTGAGCCTCCTTGCTCACTTTACAGGTTCTGTGGCCTCCTATGAGCTGACTCAGCCACTCTCAGTGTCAGTGGCCCTGGGACAGACGGCCAGGATTACCTGTGGGGGAAACAACATTGGAAGTAAAAATGTGCACTGGTACCAGCAGAAGCCAGGCCAGGCCCCTGTGCTGGTCATCTATAGGGATAGCAACCGGCCCTCTGGGATCCCTGAGCGATTCTCTGGCTCCAACTCGGGGAACACGGCCACCCTGACCATCAGCAGAGCCCAAGCCGGGGATGAGGCTGACTATTACTGTCAGGTGTGGGACAGCAGCACTGCACACA +>370|IGLV4-3 ENST00000390318|IGLV4-3|5'UTR|IG|IGL|None|00 +CTCGAATAGAGCTCTTGGAAGTCCCTCCAACC +>371|IGLV4-3 ENST00000390318|IGLV4-3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGTCTCCTTCTACCTACTGCCCTTCATTTTCTCCACAGGTCTCTGTGCTCTGCCTGTGCTGACTCAGCCCCCGTCTGCATCTGCCTTGCTGGGAGCCTCGATCAAGCTCACCTGCACCCTAAGCAGTGAGCACAGCACCTACACCATCGAATGGTATCAACAGAGACCAGGGAGGTCCCCCCAGTATATAATGAAGGTTAAGAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCCGATCGCTTCATGGGCTCCAGTTCTGGGGCTGACCGCTACCTCACCTTCTCCAACCTCCAGTCTGACGATGAGGCTGAGTATCACTGTGGAGAGAGCCACACGATTGATGGCCAAGTCGGT +>372|IGLV4-60 ENST00000390284|IGLV4-60|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACCCCACTCCTCCTCCTCTTCCCTCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCCTGTGCTGACTCAATCATCCTCTGCCTCTGCTTCCCTGGGATCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGTAGCTACATCATCGCATGGCATCAGCAGCAGCCAGGGAAGGCCCCTCGGTACTTGATGAAGCTTGAAGGTAGTGGAAGCTACAACAAGGGGAGCGGAGTTCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGACCGCTACCTCACCATCTCCAACCTCCAGTTTGAGGATGAGGCTGATTATTACTGTGAGACCTGGGACAGTAACACTCA +>373|IGLV4-69 ENST00000390282|IGLV4-69|5'UTR|IG|IGL|None|00 +AGGGTGGGTAAGAAATACCTGCAACTGTCAGCCTCAGCAGAGCTCTGGGGAGTCTGCACC +>374|IGLV4-69 ENST00000390282|IGLV4-69|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCTTGGACCCCACTCCTCTTCCTCACCCTCCTCCTCCACTGCACAGGGTCTCTCTCCCAGCTTGTGCTGACTCAATCGCCCTCTGCCTCTGCCTCCCTGGGAGCCTCGGTCAAGCTCACCTGCACTCTGAGCAGTGGGCACAGCAGCTACGCCATCGCATGGCATCAGCAGCAGCCAGAGAAGGGCCCTCGGTACTTGATGAAGCTTAACAGTGATGGCAGCCACAGCAAGGGGGACGGGATCCCTGATCGCTTCTCAGGCTCCAGCTCTGGGGCTGAGCGCTACCTCACCATCTCCAGCCTCCAGTCTGAGGATGAGGCTGACTATTACTGTCAGACCTGGGGCACTGGCATTCA +>375|IGLV5-37 ENST00000390300|IGLV5-37|5'UTR|IG|IGL|None|00 +CCACC +>376|IGLV5-37 ENST00000390300|IGLV5-37|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTTCTTCTCTTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCCTCCTCCGCATCTCCTGGAGAATCCGCCAGACTCACCTGCACCTTGCCCAGTGACATCAATGTTGGTAGCTACAACATATACTGGTACCAGCAGAAGCCAGGGAGCCCTCCCAGGTATCTCCTGTACTACTACTCAGACTCAGATAAGGGCCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAGCCAATACAGGGATTTTACTCATCTCCGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCCAAGCAATGCTTCT +>377|IGLV5-39 ENST00000630493|IGLV5-39|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGCTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGCCTGTGCTGACTCAGCCAACCTCCCTCTCAGCATCTCCTGGAGCATCAGCCAGATTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCTTCCCCGGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCAACCAATGCAGGCCTTTTACTCATCTCTGGGCTCCAGTCTGAAGATGAGGCTGACTATTACTGTGCCATTTGGTACAGCAGCACTTCT +>378|IGLV5-45 ENST00000390296|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>379|IGLV5-45 ENST00000390296|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGTGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>380|IGLV5-45 ENST00000626489|IGLV5-45|5'UTR|IG|IGL|None|00 +ACTGCGGGGGTAAGAGGTTGTGTCCACC +>381|IGLV5-45 ENST00000626489|IGLV5-45|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCCTCCTCCTGTTCCTCTCTCACTGCACAGGTTCCCTCTCGCAGGCTGTGCTGACTCAGCCGTCTTCCCTCTCTGCATCTCCTGGAGCATCAGCCAGTCTCACCTGCACCTTGCGCAGTGGCATCAATGTTGGTACCTACAGGATATACTGGTACCAGCAGAAGCCAGGGAGTCCTCCCCAGTATCTCCTGAGGTACAAATCAGACTCAGATAAGCAGCAGGGCTCTGGAGTCCCCAGCCGCTTCTCTGGATCCAAAGATGCTTCGGCCAATGCAGGGATTTTACTCATCTCTGGGCTCCAGTCTGAGGATGAGGCTGACTATTACTGTATGATTTGGCACAGCAGCGCTTCT +>382|IGLV5-52 ENST00000390289|IGLV5-52|5'UTR|IG|IGL|None|00 +CCACC +>383|IGLV5-52 ENST00000390289|IGLV5-52|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCTTCTCCTTCTCGTGCTCCTCTCTCACTGCACAGGTTCCCTCTCCCAGCCTGTGCTGACTCAGCCATCTTCCCATTCTGCATCTTCTGGAGCATCAGTCAGACTCACCTGCATGCTGAGCAGTGGCTTCAGTGTTGGGGACTTCTGGATAAGGTGGTACCAACAAAAGCCAGGGAACCCTCCCCGGTATCTCCTGTACTACCACTCAGACTCCAATAAGGGCCAAGGCTCTGGAGTTCCCAGCCGCTTCTCTGGATCCAACGATGCATCAGCCAATGCAGGGATTCTGCGTATCTCTGGGCTCCAGCCTGAGGATGAGGCTGACTATTACTGTGGTACATGGCACAGCAACTCTAAGACTCA +>384|IGLV6-57 ENST00000390285|IGLV6-57|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCACTACTTCTCACCCTCCTCGCTCACTGCACAGGTTCTTGGGCCAATTTTATGCTGACTCAGCCCCACTCTGTGTCGGAGTCTCCGGGGAAGACGGTAACCATCTCCTGCACCGGCAGCAGTGGCAGCATTGCCAGCAACTATGTGCAGTGGTACCAGCAGCGCCCGGGCAGTGCCCCCACCACTGTGATCTATGAGGATAACCAAAGACCCTCTGGGGTCCCTGATCGGTTCTCTGGCTCCATCGACAGCTCCTCCAACTCTGCCTCCCTCACCATCTCTGGACTGAAGACTGAGGACGAGGCTGACTACTACTGTCAGTCTTATGATAGCAGCAATCA +>385|IGLV7-43 ENST00000390298|IGLV7-43|5'UTR|IG|IGL|None|00 +TCTGGCGCCAGGGGTCCCTTCCAATATCAGCACC +>386|IGLV7-43 ENST00000390298|IGLV7-43|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCTCAGACTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGCTTCCAGCACTGGAGCAGTCACCAGTGGTTACTATCCAAACTGGTTCCAGCAGAAACCTGGACAAGCACCCAGGGCACTGATTTATAGTACAAGCAACAAACACTCCTGGACCCCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACACTGTCAGGTGTGCAGCCTGAGGACGAGGCTGAGTATTACTGCCTGCTCTACTATGGTGGTGCTCAG +>387|IGLV7-46 ENST00000390295|IGLV7-46|5'UTR|IG|IGL|None|00 +TCTGGCACCAGGGGTCCCTTCCAATATCAGCACC +>388|IGLV7-46 ENST00000390295|IGLV7-46|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTTCTGTTCCTCCTCACTTGCTGCCCAGGGTCCAATTCCCAGGCTGTGGTGACTCAGGAGCCCTCACTGACTGTGTCCCCAGGAGGGACAGTCACTCTCACCTGTGGCTCCAGCACTGGAGCTGTCACCAGTGGTCATTATCCCTACTGGTTCCAGCAGAAGCCTGGCCAAGCCCCCAGGACACTGATTTATGATACAAGCAACAAACACTCCTGGACACCTGCCCGGTTCTCAGGCTCCCTCCTTGGGGGCAAAGCTGCCCTGACCCTTTTGGGTGCGCAGCCTGAGGATGAGGCTGAGTATTACTGCTTGCTCTCCTATAGTGGTGCTCGG +>389|IGLV8-61 ENST00000390283|IGLV8-61|5'UTR|IG|IGL|None|00 +GAGGAAAACAAACCCCAGCTGGGAAGCCTGAGAACACTTAGCCTTC +>390|IGLV8-61 ENST00000390283|IGLV8-61|L-REGION+V-REGION|IG|IGL|None|00 +ATGAGTGTCCCCACCATGGCCTGGATGATGCTTCTCCTCGGACTCCTTGCTTATGGATCAGGAGTGGATTCTCAGACTGTGGTGACCCAGGAGCCATCGTTCTCAGTGTCCCCTGGAGGGACAGTCACACTCACTTGTGGCTTGAGCTCTGGCTCAGTCTCTACTAGTTACTACCCCAGCTGGTACCAGCAGACCCCAGGCCAGGCTCCACGCACGCTCATCTACAGCACAAACACTCGCTCTTCTGGGGTCCCTGATCGCTTCTCTGGCTCCATCCTTGGGAACAAAGCTGCCCTCACCATCACGGGGGCCCAGGCAGATGATGAATCTGATTATTACTGTGTGCTGTATATGGGTAGTGGCATTTC +>391|IGLV9-49 ENST00000427632|IGLV9-49|5'UTR|IG|IGL|None|00 +GAGAGACTGAAGAACCCAGCATTGCAGCAGCTCCACC +>392|IGLV9-49 ENST00000427632|IGLV9-49|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGGCTCCTCTGCTCCTCACCCTCCTCAGTCTCCTCACAGGGTCCCTCTCCCAGCCTGTGCTGACTCAGCCACCTTCTGCATCAGCCTCCCTGGGAGCCTCGGTCACACTCACCTGCACCCTGAGCAGCGGCTACAGTAATTATAAAGTGGACTGGTACCAGCAGAGACCAGGGAAGGGCCCCCGGTTTGTGATGCGAGTGGGCACTGGTGGGATTGTGGGATCCAAGGGGGATGGCATCCCTGATCGCTTCTCAGTCTTGGGCTCAGGCCTGAATCGGTACCTGACCATCAAGAACATCCAGGAAGAGGATGAGAGTGACTACCACTGTGGGGCAGACCATGGCAGTGGGAGCAACTTCGTG +>393|TRAC ENST00000611116|TRAC|C-REGION|TR|TRA|None|00 +ATATCCAGAACCCTGACCCTGCCGTGTACCAGCTGAGAGACTCTAAATCCAGTGACAAGTCTGTCTGCCTATTCACCGATTTTGATTCTCAAACAAATGTGTCACAAAGTAAGGATTCTGATGTGTATATCACAGACAAAACTGTGCTAGACATGAGGTCTATGGACTTCAAGAGCAACAGTGCTGTGGCCTGGAGCAACAAATCTGACTTTGCATGTGCAAACGCCTTCAACAACAGCATTATTCCAGAAGACACCTTCTTCCCCAGCCCAGAAAGTTCCTGTGATGTCAAGCTGGTCGAGAAAAGCTTTGAAACAGATACGAACCTAAACTTTCAAAACCTGTCAGTGATTGGGTTCCGAATCCTCCTCCTGAAAGTGGCCGGGTTTAATCTGCTCATGACGCTGCGGCTGTGGTCCAGC +>394|TRAJ1 ENST00000390536|TRAJ1|J-REGION|TR|TRA|None|00 +GTATGAAAGTATTACCTCCCAGTTGCAATTTGGCAAAGGAACCAGAGTTTCCACTTCTCCCC +>395|TRAJ10 ENST00000390527|TRAJ10|J-REGION|TR|TRA|None|00 +ATACTCACGGGAGGAGGAAACAAACTCACCTTTGGGACAGGCACTCAGCTAAAAGTGGAACTCA +>396|TRAJ11 ENST00000390526|TRAJ11|J-REGION|TR|TRA|None|00 +TGAATTCAGGATACAGCACCCTCACCTTTGGGAAGGGGACTATGCTTCTAGTCTCTCCAG +>397|TRAJ12 ENST00000390525|TRAJ12|J-REGION|TR|TRA|None|00 +GGATGGATAGCAGCTATAAATTGATCTTCGGGAGTGGGACCAGACTGCTGGTCAGGCCTG +>398|TRAJ13 ENST00000390524|TRAJ13|J-REGION|TR|TRA|None|00 +TGAATTCTGGGGGTTACCAGAAAGTTACCTTTGGAACTGGAACAAAGCTCCAAGTCATCCCAA +>399|TRAJ14 ENST00000390523|TRAJ14|J-REGION|TR|TRA|None|00 +ATTTATAGCACATTCATCTTTGGGAGTGGGACAAGATTATCAGTAAAACCTG +>400|TRAJ16 ENST00000390521|TRAJ16|J-REGION|TR|TRA|None|00 +GGTTTTCAGATGGCCAGAAGCTGCTCTTTGCAAGGGGGACCATGTTAAAGGTGGATCTTA +>401|TRAJ17 ENST00000390520|TRAJ17|J-REGION|TR|TRA|None|00 +TGATCAAAGCTGCAGGCAACAAGCTAACTTTTGGAGGAGGAACCAGGGTGCTAGTTAAACCAA +>402|TRAJ18 ENST00000390519|TRAJ18|J-REGION|TR|TRA|None|00 +CCGACAGAGGCTCAACCCTGGGGAGGCTATACTTTGGAAGAGGAACTCAGTTGACTGTCTGGCCTG +>403|TRAJ19 ENST00000390518|TRAJ19|J-REGION|TR|TRA|None|00 +GCTATCAAAGATTTTACAATTTCACCTTTGGAAAGGGATCCAAACATAATGTCACTCCAA +>404|TRAJ2 ENST00000390535|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGAACAATTGATAAACTCACATTTGGGAAAGGGACCCATGTATTCATTATATCTG +>405|TRAJ20 ENST00000390517|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTAACGACTACAAGCTCAGCTTTGGAGCCGGAACCACAGTAACTGTAAGAGCAA +>406|TRAJ21 ENST00000390516|TRAJ21|J-REGION|TR|TRA|None|00 +TACAACTTCAACAAATTTTACTTTGGATCTGGGACCAAACTCAATGTAAAACCAA +>407|TRAJ22 ENST00000390515|TRAJ22|J-REGION|TR|TRA|None|00 +TTTCTTCTGGTTCTGCAAGGCAACTGACCTTTGGATCTGGGACACAATTGACTGTTTTACCTG +>408|TRAJ23 ENST00000390514|TRAJ23|J-REGION|TR|TRA|None|00 +TGATTTATAACCAGGGAGGAAAGCTTATCTTCGGACAGGGAACGGAGTTATCTGTGAAACCCA +>409|TRAJ24 ENST00000390513|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGACAGCTGGGGGAAATTCCAGTTTGGAGCAGGGACCCAGGTTGTGGTCACCCCAG +>410|TRAJ25 ENST00000390512|TRAJ25|J-REGION|TR|TRA|None|00 +CAGAAGGACAAGGCTTCTCCTTTATCTTTGGGAAGGGGACAAGGCTGCTTGTCAAGCCAA +>411|TRAJ26 ENST00000390511|TRAJ26|J-REGION|TR|TRA|None|00 +GGGATAACTATGGTCAGAATTTTGTCTTTGGTCCCGGAACCAGATTGTCCGTGCTGCCCT +>412|TRAJ27 ENST00000390510|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATGCAGGCAAATCAACCTTTGGGGATGGGACTACGCTCACTGTGAAGCCAA +>413|TRAJ28 ENST00000390509|TRAJ28|J-REGION|TR|TRA|None|00 +CATACTCTGGGGCTGGGAGTTACCAACTCACTTTCGGGAAGGGGACCAAACTCTCGGTCATACCAA +>414|TRAJ29 ENST00000390508|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAACACACCTCTTGTCTTTGGAAAGGGCACAAGACTTTCTGTGATTGCAA +>415|TRAJ3 ENST00000390534|TRAJ3|J-REGION|TR|TRA|None|00 +GGGGTACAGCAGTGCTTCCAAGATAATCTTTGGATCAGGGACCAGACTCAGCATCCGGCCAA +>416|TRAJ30 ENST00000390507|TRAJ30|J-REGION|TR|TRA|None|00 +TGAACAGAGATGACAAGATCATCTTTGGAAAAGGGACACGACTTCATATTCTCCCCA +>417|TRAJ31 ENST00000390506|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAACAATGCCAGACTCATGTTTGGAGATGGAACTCAGCTGGTGGTGAAGCCCA +>418|TRAJ32 ENST00000390505|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGTGGTGCTACAAACAAGCTCATCTTTGGAACTGGCACTCTGCTTGCTGTCCAGCCAA +>419|TRAJ33 ENST00000390504|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTAATCTGGGGCGCTGGGACCAAGCTAATTATAAAGCCAG +>420|TRAJ34 ENST00000390503|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTATAACACCGACAAGCTCATCTTTGGGACTGGGACCAGATTACAAGTCTTTCCAA +>421|TRAJ35 ENST00000390502|TRAJ35|J-REGION|TR|TRA|None|00 +GATAGGCTTTGGGAATGTGCTGCATTGCGGGTCCGGCACTCAAGTGATTGTTTTACCAC +>422|TRAJ36 ENST00000614481|TRAJ36|J-REGION|TR|TRA|None|00 +TCAAACTGGGGCAAACAACCTCTTCTTTGGGACTGGAACGAGACTCACCGTTATTCCCT +>423|TRAJ37 ENST00000612375|TRAJ37|J-REGION|TR|TRA|None|00 +TGGCTCTAGCAACACAGGCAAACTAATCTTTGGGCAAGGGACAACTTTACAAGTAAAACCAG +>424|TRAJ38 ENST00000390499|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGCTGGCAACAACCGTAAGCTGATTTGGGGATTGGGAACAAGCCTGGCAGTAAATCCGA +>425|TRAJ39 ENST00000390498|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGCAACATGCTCACCTTTGGAGGGGGAACAAGGTTAATGGTCAAACCCC +>426|TRAJ4 ENST00000390533|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTTTCTGGTGGCTACAATAAGCTGATTTTTGGAGCAGGGACCAGGCTGGCTGTACACCCAT +>427|TRAJ40 ENST00000390497|TRAJ40|J-REGION|TR|TRA|None|00 +ACTACCTCAGGAACCTACAAATACATCTTTGGAACAGGCACCAGGCTGAAGGTTTTAGCAA +>428|TRAJ41 ENST00000390496|TRAJ41|J-REGION|TR|TRA|None|00 +GAACTCAAATTCCGGGTATGCACTCAACTTCGGCAAAGGCACCTCGCTGTTGGTCACACCCC +>429|TRAJ42 ENST00000390495|TRAJ42|J-REGION|TR|TRA|None|00 +TGAATTATGGAGGAAGCCAAGGAAATCTCATCTTTGGAAAAGGCACTAAACTCTCTGTTAAACCAA +>430|TRAJ43 ENST00000390494|TRAJ43|J-REGION|TR|TRA|None|00 +ACAATAACAATGACATGCGCTTTGGAGCAGGGACCAGACTGACAGTAAAACCAA +>431|TRAJ44 ENST00000390493|TRAJ44|J-REGION|TR|TRA|None|00 +TAAATACCGGCACTGCCAGTAAACTCACCTTTGGGACTGGAACAAGACTTCAGGTCACGCTCG +>432|TRAJ45 ENST00000390492|TRAJ45|J-REGION|TR|TRA|None|00 +TGTATTCAGGAGGAGGTGCTGACGGACTCACCTTTGGCAAAGGGACTCATCTAATCATCCAGCCCT +>433|TRAJ46 ENST00000390491|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAGAAAAGCAGCGGAGACAAGCTGACTTTTGGGACCGGGACTCGTTTAGCAGTTAGGCCCA +>434|TRAJ47 ENST00000390490|TRAJ47|J-REGION|TR|TRA|None|00 +TGGAATATGGAAACAAACTGGTCTTTGGCGCAGGAACCATTCTGAGAGTCAAGTCCT +>435|TRAJ48 ENST00000390489|TRAJ48|J-REGION|TR|TRA|None|00 +TATCTAACTTTGGAAATGAGAAATTAACCTTTGGGACTGGAACAAGACTCACCATCATACCCA +>436|TRAJ49 ENST00000390488|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACCGGTAACCAGTTCTATTTTGGGACAGGGACAAGTTTGACGGTCATTCCAA +>437|TRAJ5 ENST00000390532|TRAJ5|J-REGION|TR|TRA|None|00 +TGGACACGGGCAGGAGAGCACTTACTTTTGGGAGTGGAACAAGACTCCAAGTGCAACCAA +>438|TRAJ50 ENST00000390487|TRAJ50|J-REGION|TR|TRA|None|00 +TGAAAACCTCCTACGACAAGGTGATATTTGGGCCAGGGACAAGCTTATCAGTCATTCCAA +>439|TRAJ52 ENST00000390486|TRAJ52|J-REGION|TR|TRA|None|00 +CTAATGCTGGTGGTACTAGCTATGGAAAGCTGACATTTGGACAAGGGACCATCTTGACTGTCCATCCAA +>440|TRAJ53 ENST00000390485|TRAJ53|J-REGION|TR|TRA|None|00 +AGAATAGTGGAGGTAGCAACTATAAACTGACATTTGGAAAAGGAACTCTCTTAACCGTGAATCCAA +>441|TRAJ54 ENST00000390484|TRAJ54|J-REGION|TR|TRA|None|00 +TAATTCAGGGAGCCCAGAAGCTGGTATTTGGCCAAGGAACCAGGCTGACTATCAACCCAA +>442|TRAJ56 ENST00000390483|TRAJ56|J-REGION|TR|TRA|None|00 +TTATACTGGAGCCAATAGTAAGCTGACATTTGGAAAAGGAATAACTCTGAGTGTTAGACCAG +>443|TRAJ57 ENST00000390482|TRAJ57|J-REGION|TR|TRA|None|00 +TAACTCAGGGCGGATCTGAAAAGCTGGTCTTTGGAAAGGGAACGAAACTGACAGTAAACCCAT +>444|TRAJ58 ENST00000390481|TRAJ58|J-REGION|TR|TRA|None|00 +TTTAAGAAACCAGTGGCTCTAGGTTGACCTTTGGGGAAGGAACACAGCTCACAGTGAATCCTG +>445|TRAJ59 ENST00000390480|TRAJ59|J-REGION|TR|TRA|None|00 +GGAAGGAAGGAAACAGGAAATTTACATTTGGAATGGGGACGCAAGTGAGAGTGA +>446|TRAJ6 ENST00000390531|TRAJ6|J-REGION|TR|TRA|None|00 +TGCATCAGGAGGAAGCTACATACCTACATTTGGAAGAGGAACCAGCCTTATTGTTCATCCGT +>447|TRAJ61 ENST00000390479|TRAJ61|J-REGION|TR|TRA|None|00 +GGTACCGGGTTAATAGGAAACTGACATTTGGAGCCAACACTAGAGGAATCATGAAACTCA +>448|TRAJ7 ENST00000390530|TRAJ7|J-REGION|TR|TRA|None|00 +TGACTATGGGAACAACAGACTCGCTTTTGGGAAGGGGAACCAAGTGGTGGTCATACCAA +>449|TRAJ8 ENST00000390529|TRAJ8|J-REGION|TR|TRA|None|00 +TGAACACAGGCTTTCAGAAACTTGTATTTGGAACTGGCACCTGACTTCTGGTCAGTCCAA +>450|TRAJ9 ENST00000390528|TRAJ9|J-REGION|TR|TRA|None|00 +GGAAATACTGGAGGCTTCAAAACTATCTTTGGAGCAGGAACAAGACTATTTGTTAAAGCAA +>451|TRAV1-1 ENST00000542354|TRAV1-1|5'UTR|TR|TRA|None|00 +CTTCTGCAGACTACAGTGGCTCAGGAACCGGGGATGCAGTGCCAGGCTCATGGTATCCTGCAGCAG +>452|TRAV1-1 ENST00000542354|TRAV1-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGCTTTCCTTCTCTATGTTTCCATGAAGATGGGAGGCACTGCAGGACAAAGCCTTGAGCAGCCCTCTGAAGTGACAGCTGTGGAAGGAGCCATTGTCCAGATAAACTGCACGTACCAGACATCTGGGTTTTATGGGCTGTCCTGGTACCAGCAACATGATGGCGGAGCACCCACATTTCTTTCTTACAATGCTCTGGATGGTTTGGAGGAGACAGGTCGTTTTTCTTCATTCCTTAGTCGCTCTGATAGTTATGGTTACCTCCTTCTACAGGAGCTCCAGATGAAAGACTCTGCCTCTTACTTCTGCGCTGTGAGAGA +>453|TRAV1-2 ENST00000390423|TRAV1-2|5'UTR|TR|TRA|None|00 +CCCACATGAAGTGTCTACCTTCTGCAGACTCCAATGGCTCAGGAACTGGGAATGCAGTGCCAGGCTCGTGGTATCCTGCAGCAG +>454|TRAV1-2 ENST00000390423|TRAV1-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGTGGGGAGTTTTCCTTCTTTATGTTTCCATGAAGATGGGAGGCACTACAGGACAAAACATTGACCAGCCCACTGAGATGACAGCTACGGAAGGTGCCATTGTCCAGATCAACTGCACGTACCAGACATCTGGGTTCAACGGGCTGTTCTGGTACCAGCAACATGCTGGCGAAGCACCTACATTTCTGTCTTACAATGTTCTGGATGGTTTGGAGGAGAAAGGTCGTTTTTCTTCATTCCTTAGTCGGTCTAAAGGGTACAGTTACCTCCTTTTGAAGGAGCTCCAGATGAAAGACTCTGCCTCTTACCTCTGTGCT +>455|TRAV10 ENST00000390432|TRAV10|5'UTR|TR|TRA|None|00 +AGTCAACTTCTGGGAGCAGATCTCTGCAGAATAAAA +>456|TRAV10 ENST00000390432|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCATCTGACGACCTTCTTGGTGATTTTGTGGCTTTATTTTTATAGGGGGAATGGCAAAAACCAAGTGGAGCAGAGTCCTCAGTCCCTGATCATCCTGGAGGGAAAGAACTGCACTCTTCAATGCAATTATACAGTGAGCCCCTTCAGCAACTTAAGGTGGTATAAGCAAGATACGGGGAGAGGTCCTGTTTCCCTGACAATCATGACTTTCAGTGAGAACACAAAGTCGAACGGAAGATATACAGCAACTCTGGATGCAGACACAAAGCAAAGCTCTCTGCACATCACAGCCTCCCAGCTCAGCGATTCAGCCTCCTACATCTGTGTGGTGAGCG +>457|TRAV12-1 ENST00000390433|TRAV12-1|5'UTR|TR|TRA|None|00 +ATG +>458|TRAV12-1 ENST00000390433|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGATATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACGGAAGGAGGTGGAGCAGGATCCTGGACCCTTCAATGTTCCAGAGGGAGCCACTGTCGCTTTCAACTGTACTTACAGCAACAGTGCTTCTCAGTCTTTCTTCTGGTACAGACAGGATTGCAGGAAAGAACCTAAGTTGCTGATGTCCGTATACTCCAGTGGTAATGAAGATGGAAGGTTTACAGCACAGCTCAATAGAGCCAGCCAGTATATTTCCCTGCTCATCAGAGACTCCAAGCTCAGTGATTCAGCCACCTACCTCTGTGTGGTGAACA +>459|TRAV12-2 ENST00000390437|TRAV12-2|5'UTR|TR|TRA|None|00 +AAAGCAGATTCTTTTTATGATTTTTAAAGTAGAAATATCCATTCTAGGTGCATTTTTTAAGGGTTTAAAATTTGAATCCTCAGTGAACCAGGGCAGAGAAGAATG +>460|TRAV12-2 ENST00000390437|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGAGTTTTACTAGTGATCCTGTGGCTTCAGTTGAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGAATTCTGGACCCCTCAGTGTTCCAGAGGGAGCCATTGCCTCTCTCAACTGCACTTACAGTGACCGAGGTTCCCAGTCCTTCTTCTGGTACAGACAATATTCTGGGAAAAGCCCTGAGTTGATAATGTTCATATACTCCAATGGTGACAAAGAAGATGGAAGGTTTACAGCACAGCTCAATAAAGCCAGCCAGTATGTTTCTCTGCTCATCAGAGACTCCCAGCCCAGTGATTCAGCCACCTACCTCTGTGCCGTGAACA +>461|TRAV12-3 ENST00000390442|TRAV12-3|5'UTR|TR|TRA|None|00 +ATTATTTTTTTTTCGTGTTTAAGGTTTGAATCCTCAGTGAACCAGGGCAGAAAAGA +>462|TRAV12-3 ENST00000390442|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAATCCTTGAGAGTTTTACTGGTGATCCTGTGGCTTCAGTTAAGCTGGGTTTGGAGCCAACAGAAGGAGGTGGAGCAGGATCCTGGACCACTCAGTGTTCCAGAGGGAGCCATTGTTTCTCTCAACTGCACTTACAGCAACAGTGCTTTTCAATACTTCATGTGGTACAGACAGTATTCCAGAAAAGGCCCTGAGTTGCTGATGTACACATACTCCAGTGGTAACAAAGAAGATGGAAGGTTTACAGCACAGGTCGATAAATCCAGCAAGTATATCTCCTTGTTCATCAGAGACTCACAGCCCAGTGATTCAGCCACCTACCTCTGTGCAATGAGCG +>463|TRAV13-1 ENST00000390436|TRAV13-1|5'UTR|TR|TRA|None|00 +GATCTTAATTGGGAAGAACAAGG +>464|TRAV13-1 ENST00000390436|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACATCCATTCGAGCTGTATTTATATTCCTGTGGCTGCAGCTGGACTTGGTGAATGGAGAGAATGTGGAGCAGCATCCTTCAACCCTGAGTGTCCAGGAGGGAGACAGCGCTGTTATCAAGTGTACTTATTCAGACAGTGCCTCAAACTACTTCCCTTGGTATAAGCAAGAACTTGGAAAAGGACCTCAGCTTATTATAGACATTCGTTCAAATGTGGGCGAAAAGAAAGACCAACGAATTGCTGTTACATTGAACAAGACAGCCAAACATTTCTCCCTGCACATCACAGAGACCCAACCTGAAGACTCGGCTGTCTACTTCTGTGCAGCAAGTA +>465|TRAV13-2 ENST00000390439|TRAV13-2|5'UTR|TR|TRA|None|00 +CGATGATGGAAGTAGCTCTTATGGCTGGAGATTGCAGGTTTATGACTGATCCTATTTGGGAAGAACAATG +>466|TRAV13-2 ENST00000390439|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCAGGCATTCGAGCTTTATTTATGTACTTGTGGCTGCAGCTGGACTGGGTGAGCAGAGGAGAGAGTGTGGGGCTGCATCTTCCTACCCTGAGTGTCCAGGAGGGTGACAACTCTATTATCAACTGTGCTTATTCAAACAGCGCCTCAGACTACTTCATTTGGTACAAGCAAGAATCTGGAAAAGGTCCTCAATTCATTATAGACATTCGTTCAAATATGGACAAAAGGCAAGGCCAAAGAGTCACCGTTTTATTGAATAAGACAGTGAAACATCTCTCTCTGCAAATTGCAGCTACTCAACCTGGAGACTCAGCTGTCTACTTTTGTGCAGAGAATA +>467|TRAV14/DV4 ENST00000390440|TRAV14/DV4|5'UTR|TR|TRA|None|00 +GCCAGGTTCACTTCACAGTACAGAGTCCTGAAAATAAAGAAGAAAATTTTTTTTTATCTAGAAAAAGAACCAAAC +>468|TRAV14/DV4 ENST00000390440|TRAV14/DV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGTCACTTTCTAGCCTGCTGAAGGTGGTCACAGCTTCACTGTGGCTAGGACCTGGCATTGCCCAGAAGATAACTCAAACCCAACCAGGAATGTTCGTGCAGGAAAAGGAGGCTGTGACTCTGGACTGCACATATGACACCAGTGATCCAAGTTATGGTCTATTCTGGTACAAGCAGCCCAGCAGTGGGGAAATGATTTTTCTTATTTATCAGGGGTCTTATGACCAGCAAAATGCAACAGAAGGTCGCTACTCATTGAATTTCCAGAAGGCAAGAAAATCCGCCAACCTTGTCATCTCCGCTTCACAACTGGGGGACTCAGCAATGTACTTCTGTGCAATGAGAGAGGG +>469|TRAV16 ENST00000390444|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCCCACCCTCATCTCAGTGCTTGTGATAATATTTATACTCAGAGGAACAAGAGCCCAGAGAGTGACTCAGCCCGAGAAGCTCCTCTCTGTCTTTAAAGGGGCCCCAGTGGAGCTGAAGTGCAACTATTCCTATTCTGGGAGTCCTGAACTCTTCTGGTATGTCCAGTACTCCAGACAACGCCTCCAGTTACTCTTGAGACACATCTCTAGAGAGAGCATCAAAGGCTTCACTGCTGACCTTAACAAAGGCGAGACATCTTTCCACCTGAAGAAACCATTTGCTCAAGAGGAAGACTCAGCCATGTATTACTGTGCTCTAAGTGG +>470|TRAV17 ENST00000390445|TRAV17|5'UTR|TR|TRA|None|00 +AGGACTGAGCTTGCCTGTGACTGGCTAGGGAGGAACCTGAGACTAGGGGACAGAAAGACTAGGGATTCACCCAGTAAAGAGAGCTCATCTGTGACTGAGGAGCCTTGCTCCATTTCAGGTCTTCTGTGATTTCAATAAGGAAGAAGA +>471|TRAV17 ENST00000390445|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAAACTCTCCTGGGAGTGTCTTTGGTGATTCTATGGCTTCAACTGGCTAGGGTGAACAGTCAACAGGGAGAAGAGGATCCTCAGGCCTTGAGCATCCAGGAGGGTGAAAATGCCACCATGAACTGCAGTTACAAAACTAGTATAAACAATTTACAGTGGTATAGACAAAATTCAGGTAGAGGCCTTGTCCACCTAATTTTAATACGTTCAAATGAAAGAGAGAAACACAGTGGAAGATTAAGAGTCACGCTTGACACTTCCAAGAAAAGCAGTTCCTTGTTGATCACGGCTTCCCGGGCAGCAGACACTGCTTCTTACTTCTGTGCTACGGACG +>472|TRAV18 ENST00000390446|TRAV18|5'UTR|TR|TRA|None|00 +GATTTTGTAGAAGATTCCGCCAAAGACTCAACAACATAAAGAAATATATATACCTTTCGGTTTGGATATCTCTCAACAAAACCTTCTACTGCTTCTCAGCCAGCC +>473|TRAV18 ENST00000390446|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGTCTGCTTCCTGCTCAGGACTTGTGATCTTGTTGATATTCAGAAGGACCAGTGGAGACTCGGTTACCCAGACAGAAGGCCCAGTTACCCTCCCTGAGAGGGCAGCTCTGACATTAAACTGCACTTATCAGTCCAGCTATTCAACTTTTCTATTCTGGTATGTCCAGTATCTAAACAAAGAGCCTGAGCTCCTCCTGAAAAGTTCAGAAAACCAGGAGACGGACAGCAGAGGTTTTCAGGCCAGTCCTATCAAGAGTGACAGTTCCTTCCACCTGGAGAAGCCCTCGGTGCAGCTGTCGGACTCTGCCGTGTACTACTGCGCTCTGAGAGA +>474|TRAV19 ENST00000390447|TRAV19|5'UTR|TR|TRA|None|00 +CAGAAGCCTCACACAGCCCAGTAACTTTGCTAGTACCTCTTGAGTGCAAGGTGGAGAATTAAGATCTGGATTTGAGACGGAGCACGGAACATTTCACTCAGGGGAAGAGCTATGAAC +>475|TRAV19 ENST00000390447|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGACTGCCAGCCTGTTGAGGGCAGTCATAGCCTCCATCTGTGTTGTATCCAGCATGGCTCAGAAGGTAACTCAAGCGCAGACTGAAATTTCTGTGGTGGAGAAGGAGGATGTGACCTTGGACTGTGTGTATGAAACCCGTGATACTACTTATTACTTATTCTGGTACAAGCAACCACCAAGTGGAGAATTGGTTTTCCTTATTCGTCGGAACTCTTTTGATGAGCAAAATGAAATAAGTGGTCGGTATTCTTGGAACTTCCAGAAATCCACCAGTTCCTTCAACTTCACCATCACAGCCTCACAAGTCGTGGACTCAGCAGTATACTTCTGTGCTCTGAGTGAGGC +>476|TRAV2 ENST00000390424|TRAV2|5'UTR|TR|TRA|None|00 +CATTTTGGCC +>477|TRAV2 ENST00000390424|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTGCAGAGCACTCTGGGGGCGGTGTGGCTAGGGCTTCTCCTCAACTCTCTCTGGAAGGTTGCAGAAAGCAAGGACCAAGTGTTTCAGCCTTCCACAGTGGCATCTTCAGAGGGAGCTGTGGTGGAAATCTTCTGTAATCACTCTGTGTCCAATGCTTACAACTTCTTCTGGTACCTTCACTTCCCGGGATGTGCACCAAGACTCCTTGTTAAAGGCTCAAAGCCTTCTCAGCAGGGACGATACAACATGACCTATGAACGGTTCTCTTCATCGCTGCTCATCCTCCAGGTGCGGGAGGCAGATGCTGCTGTTTACTACTGTGCTGTGGAGGA +>478|TRAV20 ENST00000390448|TRAV20|5'UTR|TR|TRA|None|00 +ACAGAAGTGGCGCCTCTGAGAAAAGAAGGTTGGAATTATCGTAATTTGTTTCTAGGCTGAGATACCAGC +>479|TRAV20 ENST00000390448|TRAV20|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAAATGTTGGAGTGTGCATTCATAGTCTTGTGGCTTCAGCTTGGCTGGTTGAGTGGAGAAGACCAGGTGACGCAGAGTCCCGAGGCCCTGAGACTCCAGGAGGGAGAGAGTAGCAGTCTCAACTGCAGTTACACAGTCAGCGGTTTAAGAGGGCTGTTCTGGTATAGGCAAGATCCTGGGAAAGGCCCTGAATTCCTCTTCACCCTGTATTCAGCTGGGGAAGAAAAGGAGAAAGAAAGGCTAAAAGCCACATTAACAAAGAAGGAAAGCTTTCTGCACATCACAGCCCCTAAACCTGAAGACTCAGCCACTTATCTCTGTGCTGTGCAGG +>480|TRAV21 ENST00000390449|TRAV21|5'UTR|TR|TRA|None|00 +AGAAGGA +>481|TRAV21 ENST00000390449|TRAV21|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACCCTCTTGGGCCTGCTTATCCTTTGGCTGCAGCTGCAATGGGTGAGCAGCAAACAGGAGGTGACGCAGATTCCTGCAGCTCTGAGTGTCCCAGAAGGAGAAAACTTGGTTCTCAACTGCAGTTTCACTGATAGCGCTATTTACAACCTCCAGTGGTTTAGGCAGGACCCTGGGAAAGGTCTCACATCTCTGTTGCTTATTCAGTCAAGTCAGAGAGAGCAAACAAGTGGAAGACTTAATGCCTCGCTGGATAAATCATCAGGACGTAGTACTTTATACATTGCAGCTTCTCAGCCTGGTGACTCAGCCACCTACCTCTGTGCTGTGAGG +>482|TRAV22 ENST00000390450|TRAV22|5'UTR|TR|TRA|None|00 +GGCTTTGTCGGGTGGAGCTGATTGGTTGCAGGAGCAGCAACAGTTCCAGAGCCAAGTCATGACACCGACCTCCCCAAGGTTTAGTTAAATATATCTTATGGTGAAAATGCCCGGAGCAAGAAGGCAAAGCATC +>483|TRAV22 ENST00000390450|TRAV22|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGATATTGGGAGCTCTGCTGGGGCTCTTGAGTGCCCAGGTTTGCTGTGTGAGAGGAATACAAGTGGAGCAGAGTCCTCCAGACCTGATTCTCCAGGAGGGAGCCAATTCCACGCTGCGGTGCAATTTTTCTGACTCTGTGAACAATTTGCAGTGGTTTCATCAAAACCCTTGGGGACAGCTCATCAACCTGTTTTACATTCCCTCAGGGACAAAACAGAATGGAAGATTAAGCGCCACGACTGTCGCTACGGAACGCTACAGCTTATTGTACATTTCCTCTTCCCAGACCACAGACTCAGGCGTTTATTTCTGTGCTGTGGAGC +>484|TRAV23/DV6 ENST00000390451|TRAV23/DV6|5'UTR|TR|TRA|None|00 +CTGGAAGACCACCTGGGCTGTCATTGAGCTCTGGTGCCAGGAGGA +>485|TRAV23/DV6 ENST00000390451|TRAV23/DV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCTTAGGAGCATCATTTTTAGTTCTGTGGCTTCAACTATGCTGGGTGAGTGGCCAACAGAAGGAGAAAAGTGACCAGCAGCAGGTGAAACAAAGTCCTCAATCTTTGATAGTCCAGAAAGGAGGGATTTCAATTATAAACTGTGCTTATGAGAACACTGCGTTTGACTACTTTCCATGGTACCAACAATTCCCTGGGAAAGGCCCTGCATTATTGATAGCCATACGTCCAGATGTGAGTGAAAAGAAAGAAGGAAGATTCACAATCTCCTTCAATAAAAGTGCCAAGCAGTTCTCATCGCATATCATGGATTCCCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGCA +>486|TRAV24 ENST00000390453|TRAV24|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGAATCCTTTGGCAGCCCCATTACTAATCCTCTGGTTTCATCTTGACTGCGTGAGCAGCATACTGAACGTGGAACAAAGTCCTCAGTCACTGCATGTTCAGGAGGGAGACAGCACCAATTTCACCTGCAGCTTCCCTTCCAGCAATTTTTATGCCTTACACTGGTACAGATGGGAAACTGCAAAAAGCCCCGAGGCCTTGTTTGTAATGACTTTAAATGGGGATGAAAAGAAGAAAGGACGAATAAGTGCCACTCTTAATACCAAGGAGGGTTACAGCTATTTGTACATCAAAGGATCCCAGCCTGAAGACTCAGCCACATACCTCTGTGCCTTTA +>487|TRAV25 ENST00000390454|TRAV25|5'UTR|TR|TRA|None|00 +ACTATTTCTATTGATCTGGAAGAAGCTTGTACCAGGCAACCCATTTAGGAGAAGTTGGATGAAGAGGGAGAGGGAG +>488|TRAV25 ENST00000390454|TRAV25|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTACTCATCACATCAATGTTGGTCTTATGGATGCAATTGTCACAGGTGAATGGACAACAGGTAATGCAAATTCCTCAGTACCAGCATGTACAAGAAGGAGAGGACTTCACCACGTACTGCAATTCCTCAACTACTTTAAGCAATATACAGTGGTATAAGCAAAGGCCTGGTGGACATCCCGTTTTTTTGATACAGTTAGTGAAGAGTGGAGAAGTGAAGAAGCAGAAAAGACTGACATTTCAGTTTGGAGAAGCAAAAAAGAACAGCTCCCTGCACATCACAGCCACCCAGACTACAGATGTAGGAACCTACTTCTGTGCAGGG +>489|TRAV26-1 ENST00000390455|TRAV26-1|5'UTR|TR|TRA|None|00 +AGGAACATGACTAAACCTGGGGAGGAAGACATAGAAAAGCAACTGCTCTATCATTGGCTGACAAGATCCTGACAACAACACAATGAGAGCTGCACTCCTTGCAAGTCTTTACTAGTAGCTGTTGCTTCTGTTCTCTGGAAATTCTTTAAACCTAGAATCAGACACAAAAACTGAACTCTGGGTCCACAATCCTCATTTGTCCTTGAAGT +>490|TRAV26-1 ENST00000390455|TRAV26-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCTGGTGGCAAGAGTAACTGTGTTTCTGACCTTTGGAACTATAATTGATGCTAAGACCACCCAGCCCACCTCCATGGATTGCGCTGAAGGAAGAGCTGCAAACCTGCCTTGTAATCACTCTACCATCAGTGGAAATGAGTATGTGTATTGGTATCGACAGATTCACTCCCAGGGGCCACAGTATATCATTCATGGTCTAAAAAACAATGAAACCAATGAAATGGCCTCTCTGATCATCACAGAAGACAGAAAGTCCAGCACCTTGATCCTGCCCCACGCTACGCTGAGAGACACTGCTGTGTACTATTGCATCGTCAGAGTCG +>491|TRAV26-2 ENST00000390460|TRAV26-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTTGGTGACAAGCATTACTGTACTCCTATCTTTGGGTATTATGGGTGATGCTAAGACCACACAGCCAAATTCAATGGAGAGTAACGAAGAAGAGCCTGTTCACTTGCCTTGTAACCACTCCACAATCAGTGGAACTGATTACATACATTGGTATCGACAGCTTCCCTCCCAGGGTCCAGAGTACGTGATTCATGGTCTTACAAGCAATGTGAACAACAGAATGGCCTCTCTGGCAATCGCTGAAGACAGAAAGTCCAGTACCTTGATCCTGCACCGTGCTACCTTGAGAGATGCTGCTGTGTACTACTGCATCCTGAGAGAC +>492|TRAV27 ENST00000390457|TRAV27|5'UTR|TR|TRA|None|00 +AAGCACTCTTCTAGCCCAGAGAAGTCTGTTCCAGGACGGGCTCTTTCAGGAGCAGCTAAAGTCAGGGGCCATGTCCACCATGTGATAGAAAGACAAG +>493|TRAV27 ENST00000390457|TRAV27|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTCCTGAAATTCTCCGTGTCCATTCTTTGGATTCAGTTGGCATGGGTGAGCACCCAGCTGCTGGAGCAGAGCCCTCAGTTTCTAAGCATCCAAGAGGGAGAAAATCTCACTGTGTACTGCAACTCCTCAAGTGTTTTTTCCAGCTTACAATGGTACAGACAGGAGCCTGGGGAAGGTCCTGTCCTCCTGGTGACAGTAGTTACGGGTGGAGAAGTGAAGAAGCTGAAGAGACTAACCTTTCAGTTTGGTGATGCAAGAAAGGACAGTTCTCTCCACATCACTGCAGCCCAGACTGGTGATACAGGCCTCTACCTCTGTGCAGGAG +>494|TRAV29/DV5 ENST00000390458|TRAV29/DV5|5'UTR|TR|TRA|None|00 +ATATGTAAAATGAAGGGTCTGTGGAAGGACATGAATAAAGCACAGGAGGTTGAAGTCAGATTTGCAGCTTTCTAGGCAGGAGATAAGACAATCTGCATCTTCACAGGAGGG +>495|TRAV29/DV5 ENST00000390458|TRAV29/DV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCATGCTCCTGGGGGCATCAGTGCTGATTCTGTGGCTTCAGCCAGACTGGGTAAACAGTCAACAGAAGAATGATGACCAGCAAGTTAAGCAAAATTCACCATCCCTGAGCGTCCAGGAAGGAAGAATTTCTATTCTGAACTGTGACTATACTAACAGCATGTTTGATTATTTCCTATGGTACAAAAAATACCCTGCTGAAGGTCCTACATTCCTGATATCTATAAGTTCCATTAAGGATAAAAATGAAGATGGAAGATTCACTGTTTTCTTAAACAAAAGTGCCAAGCACCTCTCTCTGCACATTGTGCCCTCCCAGCCTGGAGACTCTGCAGTGTACTTCTGTGCAGCAAGCG +>496|TRAV3 ENST00000390425|TRAV3|5'UTR|TR|TRA|None|00 +CCGGTGTCGGGAAGCACCAGTGCCCTGAGGAAGGGCCATTTCCAAAAGCCCTGTGCTGACACAGGGTTGCTGGTTCCTCTTCAAGAGCCCACTCTCTGGGGTGGGGCCATATCTCCAGCAGAGGTGGGCTGGAAAGGACCCCCCCAATCCCGCCCGCCGTGAGCTTAGCTGGAGCC +>497|TRAV3 ENST00000390425|TRAV3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCCTCTGCACCCATCTCGATGCTTGCGATGCTCTTCACATTGAGTGGGCTGAGAGCTCAGTCAGTGGCTCAGCCGGAAGATCAGGTCAACGTTGCTGAAGGGAATCCTCTGACTGTGAAATGCACCTATTCAGTCTCTGGAAACCCTTATCTTTTTTGGTATGTTCAATACCCCAACCGAGGCCTCCAGTTCCTTCTGAAATACATCACAGGGGATAACCTGGTTAAAGGCAGCTATGGCTTTGAAGCTGAATTTAACAAGAGCCAAACCTCCTTCCACCTGAAGAAACCATCTGCCCTTGTGAGCGACTCCGCTTTGTACTTCTGTGCTGTGAGAGACA +>498|TRAV30 ENST00000557168|TRAV30|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTCTCCTGAAAGTGCTTTCAGGCACCTTGTTGTGGCAGTTGACCTGGGTGAGAAGCCAACAACCAGTGCAGAGTCCTCAAGCCGTGATCCTCCGAGAAGGGGAAGATGCTGTCATCAACTGCAGTTCCTCCAAGGCTTTATATTCTGTACACTGGTACAGGCAGAAGCATGGTGAAGCACCCGTCTTCCTGATGATATTACTGAAGGGTGGAGAACAGAAGGGTCATGACAAAATATCTGCTTCATTTAATGAAAAAAAGCAGCAAAGCTCCCTGTACCTTACGGCCTCCCAGCTCAGTTACTCAGGAACCTACTTCTGCGGCACAGAGA +>499|TRAV34 ENST00000390461|TRAV34|5'UTR|TR|TRA|None|00 +AATAGCTAAGGG +>500|TRAV34 ENST00000390461|TRAV34|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGACTGTTCTGCAAGTACTCCTAGGGATATTGGGGTTCCAAGCAGCCTGGGTCAGTAGCCAAGAACTGGAGCAGAGTCCTCAGTCCTTGATCGTCCAAGAGGGAAAGAATCTCACCATAAACTGCACGTCATCAAAGACGTTATATGGCTTATACTGGTATAAGCAAAAGTATGGTGAAGGTCTTATCTTCTTGATGATGCTACAGAAAGGTGGGGAAGAGAAAAGTCATGAAAAGATAACTGCCAAGTTGGATGAGAAAAAGCAGCAAAGTTCCCTGCATATCACAGCCTCCCAGCCCAGCCATGCAGGCATCTACCTCTGTGGAGCAGACA +>501|TRAV35 ENST00000390462|TRAV35|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTTGAACATTTATTAATAATCTTGTGGATGCAGCTGACATGGGTCAGTGGTCAACAGCTGAATCAGAGTCCTCAATCTATGTTTACCCAGGAAGGAGAAGATGTCTCCATGAACTGCACTTCTTCAAGCATATTTAACACCTGACTATGGTACAAGCAGGACCCTGGGGAAGGTCCTGTCCTCTTGATAGCCTTATATAAGGCTGGTGAATTGACCTCAAATGGAAGACTGACTGCTCAGTTTGGTATAACCAGAAAGGACAGCTTCCTGAATATCTCAGCATCCATACCTAGTGATGTAGGCATCTACTTCTGTGCTGGGCAG +>502|TRAV36/DV7 ENST00000390463|TRAV36/DV7|5'UTR|TR|TRA|None|00 +ACTTGATAACTGAAGG +>503|TRAV36/DV7 ENST00000390463|TRAV36/DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGATGAAGTGTCCACAGGCTTTACTAGCTATCTTTTGGCTTCTACTGAGCTGGGTGAGCAGTGAAGACAAGGTGGTACAAAGCCCTCTATCTCTGGTTGTCCACGAGGGAGACACCGTAACTCTCAATTGCAGTTATGAAGTGACTAACTTTCGAAGCCTACTATGGTACAAGCAGGAAAAGAAAGCTCCCACATTTCTATTTATGCTAACTTCAAGTGGAATTGAAAAGAAGTCAGGAAGACTAAGTAGCATATTAGATAAGAAAGAACTTTTCAGCATCCTGAACATCACAGCCACCCAGACCGGAGACTCGGCCATCTACCTCTGTGCTGTGGAGG +>504|TRAV38-1 ENST00000390464|TRAV38-1|5'UTR|TR|TRA|None|00 +AGC +>505|TRAV38-1 ENST00000390464|TRAV38-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGACACGAGTTAGCTTGCTGTGGGCAGTCGTGGTCTCCACCTGTCTTGAATCCGGCATGGCCCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACTGTGACCCTGAGTTGCACATATGACACCAGTGAGAATAATTATTATTTGTTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACGGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGACACTGCGATGTATTTCTGTGCTTTCATGAAGCA +>506|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|5'UTR|TR|TRA|None|00 +AGATCAGAAGAGGAGGCTTCTCACCCTGCAGCAGGGACCTGTGAGC +>507|TRAV38-2/DV8 ENST00000390465|TRAV38-2/DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCATGCCCTGGCTTCCTGTGGGCACTTGTGATCTCCACCTGTCTTGAATTTAGCATGGCTCAGACAGTCACTCAGTCTCAACCAGAGATGTCTGTGCAGGAGGCAGAGACCGTGACCCTGAGCTGCACATATGACACCAGTGAGAGTGATTATTATTTATTCTGGTACAAGCAGCCTCCCAGCAGGCAGATGATTCTCGTTATTCGCCAAGAAGCTTATAAGCAACAGAATGCAACAGAGAATCGTTTCTCTGTGAACTTCCAGAAAGCAGCCAAATCCTTCAGTCTCAAGATCTCAGACTCACAGCTGGGGGATGCCGCGATGTATTTCTGTGCTTATAGGAGCG +>508|TRAV39 ENST00000390466|TRAV39|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAAGCTACTAGCAATGATTCTGTGGCTTCAACTAGACCGGTTAAGTGGAGAGCTGAAAGTGGAACAAAACCCTCTGTTCCTGAGCATGCAGGAGGGAAAAAACTATACCATCTACTGCAATTATTCAACCACTTCAGACAGACTGTATTGGTACAGGCAGGATCCTGGGAAAAGTCTGGAATCTCTGTTTGTGTTGCTATCAAATGGAGCAGTGAAGCAGGAGGGACGATTAATGGCCTCACTTGATACCAAAGCCCGTCTCAGCACCCTCCACATCACAGCTGCCGTGCATGACCTCTCTGCCACCTACTTCTGTGCCGTGGACA +>509|TRAV4 ENST00000390426|TRAV4|5'UTR|TR|TRA|None|00 +CTGGGCTCATTGCAGCTCAGACACAGCAAAAGAGCCTAGAACCTGGGTCCTAGTTTGCACCTAGAAT +>510|TRAV4 ENST00000390426|TRAV4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAGGCAAGTGGCGAGAGTGATCGTGTTCCTGACCCTGAGTACTTTGAGCCTTGCTAAGACCACCCAGCCCATCTCCATGGACTCATATGAAGGACAAGAAGTGAACATAACCTGTAGCCACAACAACATTGCTACAAATGATTATATCACGTGGTACCAACAGTTTCCCAGCCAAGGACCACGATTTATTATTCAAGGATACAAGACAAAAGTTACAAACGAAGTGGCCTCCCTGTTTATCCCTGCCGACAGAAAGTCCAGCACTCTGAGCCTGCCCCGGGTTTCCCTGAGCGACACTGCTGTGTACTACTGCCTCGTGGGTGACA +>511|TRAV40 ENST00000390467|TRAV40|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCCTCTCTGGACTTTCTAATTCTGATCTTAATGTTTGGAGGAACCAGCAGCAATTCAGTCAAGCAGACGGGCCAAATAACCGTCTCGGAGGGAGCATCTGTGACTATGAACTGCACATACACATCCACGGGGTACCCTACCCTTTTCTGGTATGTGGAATACCCCAGCAAACCTCTGCAGCTTCTTCAGAGAGAGACAATGGAAAACAGCAAAAACTTCGGAGGCGGAAATATTAAAGACAAAAACTCCCCCATTGTGAAATATTCAGTCCAGGTATCAGACTCAGCCGTGTACTACTGTCTTCTGGGAGA +>512|TRAV41 ENST00000390468|TRAV41|L-REGION+V-REGION|TR|TRA|None|00 +ATGGTGAAGATCCGGCAATTTTTGTTGGCTATTTTGTGGCTTCAGCTAAGCTGTGTAAGTGCCGCCAAAAATGAAGTGGAGCAGAGTCCTCAGAACCTGACTGCCCAGGAAGGAGAATTTATCACAATCAACTGCAGTTACTCGGTAGGAATAAGTGCCTTACACTGGCTGCAACAGCATCCAGGAGGAGGCATTGTTTCCTTGTTTATGCTGAGCTCAGGGAAGAAGAAGCATGGAAGATTAATTGCCACAATAAACATACAGGAAAAGCACAGCTCCCTGCACATCACAGCCTCCCATCCCAGAGACTCTGCCGTCTACATCTGTGCTGTCAGA +>513|TRAV5 ENST00000390427|TRAV5|5'UTR|TR|TRA|None|00 +GTGGGGAGAACA +>514|TRAV5 ENST00000390427|TRAV5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATTTGCTGGATTTTCGTTCCTGTTTTTGTGGCTGCAGCTGGACTGTATGAGTAGAGGAGAGGATGTGGAGCAGAGTCTTTTCCTGAGTGTCCGAGAGGGAGACAGCTCCGTTATAAACTGCACTTACACAGACAGCTCCTCCACCTACTTATACTGGTATAAGCAAGAACCTGGAGCAGGTCTCCAGTTGCTGACGTATATTTTTTCAAATATGGACATGAAACAAGACCAAAGACTCACTGTTCTATTGAATAAAAAGGATAAACATCTGTCTCTGCGCATTGCAGACACCCAGACTGGGGACTCAGCTATCTACTTCTGTGCAGAGAGTA +>515|TRAV6 ENST00000390428|TRAV6|5'UTR|TR|TRA|None|00 +AAACAGA +>516|TRAV6 ENST00000390428|TRAV6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGCTTTTTGGCTGAGAAGCCTGGGTCTACATTTCAGGCCACATTTGGGGAGACGAATGGAGTCATTCCTGGGAGGTGTTTTGCTGATTTTGTGGCTTCAAGTGGACTGGGTGAAGAGCCAAAAGATAGAACAGAATTCCGAGGCTCTGAACATTCAGGAGGGTAAAACGGCCACCCTGACCTGCAACTATACAAACTATTCTCCAGCATACTTACAGTGGTACCGACAAGATCCAGGAAGAGGCCCTGTTTTCTTGCTACTCATACGTGAAAATGAGAAAGAAAAAAGGAAAGAAAGACTGAAGGTCACCTTTGATACCACCCTTAAACAGAGTTTGTTTCATATCACAGCCTCCCAGCCTGCAGACTCAGCTACCTACCTCTGTGCTCTAGACA +>517|TRAV7 ENST00000390429|TRAV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAAGATGCGGAGACCTGTCCTAATTATATTTTGTCTATGTCTTGGCTGGGCAAATGGAGAAAACCAGGTGGAGCACAGCCCTCATTTTCTGGGACCCCAGCAGGGAGACGTTGCCTCCATGAGCTGCACGTACTCTGTCAGTCGTTTTAACAATTTGCAGTGGTACAGGCAAAATACAGGGATGGGTCCCAAACACCTATTATCCATGTATTCAGCTGGATATGAGAAGCAGAAAGGAAGACTAAATGCTACATTACTGAAGAATGGAAGCAGCTTGTACATTACAGCCGTGCAGCCTGAAGATTCAGCCACCTATTTCTGTGCTGTAGATG +>518|TRAV8-1 ENST00000390430|TRAV8-1|5'UTR|TR|TRA|None|00 +CCAAAACAAGAGACTTGCCTAGCCCAACCTTCCTCACGCTCGCTATTCTCAAGACCTGGGTTCCAGCCACTTTCCTACTGGCCCCGAGGAGAATTTCCAAAGAGACGCCTGCAGTGTTTCCACAGCTCAGCC +>519|TRAV8-1 ENST00000390430|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGTTGCTCATACCAGTGCTGGGGATGATTTTTGCCCTGAGAGATGCCAGAGCCCAGTCTGTGAGCCAGCATAACCACCACGTAATTCTCTCTGAAGCAGCCTCACTGGAGTTGGGATGCAACTATTCCTATGGTGGAACTGTTAATCTCTTCTGGTATGTCCAGTACCCTGGTCAACACCTTCAGCTTCTCCTCAAGTACTTTTCAGGGGATCCACTGGTTAAAGGCATCAAGGGCTTTGAGGCTGAATTTATAAAGAGTAAATTCTCCTTTAATCTGAGGAAACCCTCTGTGCAGTGGAGTGACACAGCTGAGTACTTCTGTGCCGTGAATGC +>520|TRAV8-2 ENST00000390434|TRAV8-2|5'UTR|TR|TRA|None|00 +GGCTGATGTAGCTCACTGATGTCTGTGTAGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGACTCCTTAAGAGAAAGCCTTTCTGTTTTGGAAACTTTTCAAAGCCAGGGACTTGTCCAGCCCAACCTCCCCATTGCTCCTAGCTCCCGAGGCTCAGGACCCCTGGCTTCTGTCCTCCCTGCTCAGGGTCCTGCAGCGTTGCCTCTGCTCAGCC +>521|TRAV8-2 ENST00000390434|TRAV8-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGACAGCCACGTCTCTGTCTCTGAAGGAACCCCGGTGCTGCTGAGGTGCAACTACTCATCTTCTTATTCACCGTCTCTCTTCTGGTATGTGCAACACCCCAACAAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGTTGTGAGTGA +>522|TRAV8-3 ENST00000390435|TRAV8-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGAGCTTATCCCACTGCTGGGGATACATTTTGTCCTGAGAACTGCCAGAGCCCAGTCAGTGACCCAGCCTGACATCCACATCACTGTCTCTGAAGGAGCCTCACTGGAGTTGAGATGTAACTATTCCTATGGGGCAACACCTTATCTCTTCTGGTATGTCCAGTCCCCCGGCCAAGGCCTCCAGCTGCTCCTGAAGTACTTTTCAGGAGACACTCTGGTTCAAGGCATTAAAGGCTTTGAGGCTGAATTTAAGAGGAGTCAATCTTCCTTCAATCTGAGGAAACCCTCTGTGCATTGGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGC +>523|TRAV8-4 ENST00000390438|TRAV8-4|5'UTR|TR|TRA|None|00 +TTTTGAAACCCTTCAAAGGCAGAGACTTGTCCAGCCTAACCTGCCTGCTGCTCCTAGCTCCTGAGGCTCAGGGCCCTTGGCTTCTGTCCGCTCTGCTCAGGGCCCTCCAGCGTGGCCACTGCTCAGCC +>524|TRAV8-4 ENST00000390438|TRAV8-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGTGCTCGAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCGGTGACCCAGCTTGGCAGCCACGTCTCTGTCTCTGAAGGAGCCCTGGTTCTGCTGAGGTGCAACTACTCATCGTCTGTTCCACCATATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTACACATCAGCGGCCACCCTGGTTAAAGGCATCAACGGTTTTGAGGCTGAATTTAAGAAGAGTGAAACCTCCTTCCACCTGACGAAACCCTCAGCCCATATGAGCGACGCGGCTGAGTACTTCTGTGCTGTGAGTGA +>525|TRAV8-6 ENST00000390443|TRAV8-6|5'UTR|TR|TRA|None|00 +GTAGCTCGTTGATGTCTGTGTGGATAGGGAGCTGTGACGAGAGCAAGAGGTCAGAACACATCCAGGCTCCTTAAGGGAAAGCCTCTTTCTGTTTCTGAAACTTTTCAAAGCCAGGGACTTGTCCAATCCAACCTCCTCACAGTTCCTAGCTCCTGAGGCTCAGCGCCCTTGGCTTCTGTCCGCCCAGCTTAAGGTCCTGCAGCATTGCCACTGCTCAGCC +>526|TRAV8-6 ENST00000390443|TRAV8-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGCTGCTCGTCCCAGCGTTCCAGGTGATTTTTACCCTGGGAGGAACCAGAGCCCAGTCTGTGACCCAGCTTGACAGCCAAGTCCCTGTCTTTGAAGAAGCCCCTGTGGAGCTGAGGTGCAACTACTCATCGTCTGTTTCAGTGTATCTCTTCTGGTATGTGCAATACCCCAACCAAGGACTCCAGCTTCTCCTGAAGTATTTATCAGGATCCACCCTGGTTGAAAGCATCAACGGTTTTGAGGCTGAATTTAACAAGAGTCAAACTTCCTTCCACTTGAGGAAACCCTCAGTCCATATAAGCGACACGGCTGAGTACTTCTGTGCTGTGAGTGA +>527|TRAV8-7 ENST00000390456|TRAV8-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCTTAGTGGTCATTCTGCTGCTTGGAATGTTCTTCACACTGAGTAAAACCCAGTCGGTGACCCAGCTTGATGGCCACATCACTGTCTCTGAAGAAGCCCCTCTGGAACTGAAGTGCAACTATTCCTATAGTGGAGTTCCTTCTCTCTTCTGGTATGTCCAATACTCTAGCCAAAGCCTCCAGCTTCTCCTCAAAGACCTAACAAAGGCCACCCAGGTTAAAGGCATCAGAGGTTTTGAGGCTGAATTTAAGAAGAGCGAAACCTCCTTCTACCTGAGGAAACCATCAACCCATGTGAGTGATGCTGCTGAGTACTTCTGTGCTGTGGGTGACAGGAG +>528|TRAV9-1 ENST00000390431|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATTCTTCTCCAGGACCAGCGATTGCACTATTCTTAATGTTTGGGGGAATCAATGGAGATTCAGTGGTCCAGACAGAAGGCCAAGTGCTCCCCTCTGAAGGGGATTCCCTGATTGTGAACTGCTCCTATGAAACCACACAGTACCCTTCCCTTTTTTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCACCTGAAAGCCATGAAGGCCAATGACAAGGGAAGGAACAAAGGTTTTGAAGCCATGTACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGACTCAGTTCAAGAGTCAGACTCCGCTGTGTACTTCTGTGCTCTGAGTGA +>529|TRAV9-2 ENST00000390441|TRAV9-2|5'UTR|TR|TRA|None|00 +CACTGTGATTTCTTCATGTTAAGGATCAAGACCATTATTTGGGTAACACACTAAAG +>530|TRAV9-2 ENST00000390441|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGGCTTAGTATCTCTGATACTCTTACTGCTTGGAAGAACCCGTGGAGATTCAGTGACCCAGATGGAAGGGCCAGTGACTCTCTCAGAAGAGGCCTTCCTGACTATAAACTGCACGTACACAGCCACAGGATACCCTTCCCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCTACAGCTCCTCCTGAAAGCCACGAAGGCTGATGACAAGGGAAGCAACAAAGGTTTTGAAGCCACATACCGTAAAGAAACCACTTCTTTCCACTTGGAGAAAGGCTCAGTTCAAGTGTCAGACTCAGCGGTGTACTTCTGTGCTCTGAGTGA +>531|TRBC1 ENST00000633705|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>532|TRBC1 ENST00000632136|TRBC1|C-REGION|TR|TRB|None|00 +AGGACCTGAACAAGGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTTCCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACGGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCCGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTTACCTCGGTGTCCTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAGGCCACCCTGTATGCTGTGCTGGTCAGCGCCCTTGTGTTGATGGCCATGGTCAAGAGAAAGGATTTC +>533|TRBC2 ENST00000466254|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCAAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>534|TRBC2 ENST00000622053|TRBC2|C-REGION|TR|TRB|None|00 +AGGACCTGAAAAACGTGTTCCCACCCGAGGTCGCTGTGTTTGAGCCATCAGAAGCAGAGATCTCCCACACCCAAAAGGCCACACTGGTGTGCCTGGCCACAGGCTTCTACCCCGACCACGTGGAGCTGAGCTGGTGGGTGAATGGGAAGGAGGTGCACAGTGGGGTCAGCACAGACCCGCAGCCCCTCAAGGAGCAGCCCGCCCTCAATGACTCCAGATACTGCCTGAGCAGCCGCCTGAGGGTCTCGGCCACCTTCTGGCAGAACCCCCGCAACCACTTCCGCTGTCAAGTCCAGTTCTACGGGCTCTCGGAGAATGACGAGTGGACCCAGGATAGGGCCAAACCTGTCACCCAGATCGTCAGCGCCGAGGCCTGGGGTAGAGCAGACTGTGGCTTCACCTCCGAGTCTTACCAGCAAGGGGTCCTGTCTGCCACCATCCTCTATGAGATCTTGCTAGGGAAGGCCACCTTGTATGCCGTGCTGGTCAGTGCCCTCGTGCTGATGGCCATGGTCAAGAGAAAGGATTCCAGAGGC +>535|TRBD1 ENST00000631435|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>536|TRBJ1-1 ENST00000634213|TRBJ1-1|J-REGION|TR|TRB|None|00 +TGAACACTGAAGCTTTCTTTGGACAAGGCACCAGACTCACAGTTGTAG +>537|TRBJ1-2 ENST00000631745|TRBJ1-2|J-REGION|TR|TRB|None|00 +CTAACTATGGCTACACCTTCGGTTCGGGGACCAGGTTAACCGTTGTAG +>538|TRBJ1-3 ENST00000633780|TRBJ1-3|J-REGION|TR|TRB|None|00 +CTCTGGAAACACCATATATTTTGGAGAGGGAAGTTGGCTCACTGTTGTAG +>539|TRBJ1-4 ENST00000632041|TRBJ1-4|J-REGION|TR|TRB|None|00 +CAACTAATGAAAAACTGTTTTTTGGCAGTGGAACCCAGCTCTCTGTCTTGG +>540|TRBJ1-5 ENST00000634000|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAGCAATCAGCCCCAGCATTTTGGTGATGGGACTCGACTCTCCATCCTAG +>541|TRBJ1-6 ENST00000632228|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAACGGGACCAGGCTCACTGTGACAG +>542|TRBJ1-6 ENST00000633713|TRBJ1-6|J-REGION|TR|TRB|None|00 +CTCCTATAATTCACCCCTCCACTTTGGGAATGGGACCAGGCTCACTGTGACAG +>543|TRBJ2-1 ENST00000390412|TRBJ2-1|J-REGION|TR|TRB|None|00 +CTCCTACAATGAGCAGTTCTTCGGGCCAGGGACACGGCTCACCGTGCTAG +>544|TRBJ2-2 ENST00000390413|TRBJ2-2|J-REGION|TR|TRB|None|00 +CGAACACCGGGGAGCTGTTTTTTGGAGAAGGCTCTAGGCTGACCGTACTGG +>545|TRBJ2-2P ENST00000390414|TRBJ2-2P|J-REGION|TR|TRB|None|00 +CTGAGAGGCGCTGCTGGGCGTCTGGGCGGAGGACTCCTGGTTCTGG +>546|TRBJ2-3 ENST00000390415|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGCACAGATACGCAGTATTTTGGCCCAGGCACCCGGCTGACAGTGCTCG +>547|TRBJ2-4 ENST00000390416|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGCCAAAAACATTCAGTACTTCGGCGCCGGGACCCGGCTCTCAGTGCTGG +>548|TRBJ2-5 ENST00000390417|TRBJ2-5|J-REGION|TR|TRB|None|00 +ACCAAGAGACCCAGTACTTCGGGCCAGGCACGCGGCTCCTGGTGCTCG +>549|TRBJ2-6 ENST00000390418|TRBJ2-6|J-REGION|TR|TRB|None|00 +CTCTGGGGCCAACGTCCTGACTTTCGGGGCCGGCAGCAGGCTGACCGTGCTGG +>550|TRBJ2-7 ENST00000390419|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACTTCGGGCCGGGCACCAGGCTCACGGTCACAG +>551|TRBJ2-7 ENST00000633660|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTACGAGCAGTACGTCGGGCCGGGCACCAGGCTCACGGTCACAG +>552|TRBV10-1 ENST00000390364|TRBV10-1|5'UTR|TR|TRB|None|00 +ACTGAGAGCCCAACTTCAGTCTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>553|TRBV10-1 ENST00000390364|TRBV10-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACGAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGAAATCACCCAGAGCCCAAGACACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGGCGTGTCACCAGACTTGGAACCACAACAATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCCATTACTCATATGGTGTTCACGACACTAACAAAGGAGAAGTCTCAGATGGCTACAGTGTCTCTAGATCAAACACAGAGGACCTCCCCCTCACTCTGGAGTCTGCTGCCTCCTCCCAGACATCTGTATATTTCTGCGCCAGCAGTGAGTC +>554|TRBV10-2 ENST00000426318|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>555|TRBV10-2 ENST00000426318|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTACGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>556|TRBV10-2 ENST00000633575|TRBV10-2|5'UTR|TR|TRB|None|00 +AATTTGCCCACAGCAGGGCTGGGAGACACAAGATCCTGCCCTGGAGCTGAA +>557|TRBV10-2 ENST00000633575|TRBV10-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCTTCTTCTATGTGGCCCTTTGTCTGCTGTGGGCAGGACACAGGGATGCTGGAATCACCCAGAGCCCAAGATACAAGATCACAGAGACAGGAAGGCAGGTGACCTTGATGTGTCACCAGACTTGGAGCCACAGCTATATGTTCTGGTATCGACAAGACCTGGGACATGGGCTGAGGCTGATCTATTACTCAGCAGCTGCTGATATTACAGATAAAGGAGAAGTCCCCGATGGCTATGTTGTCTCCAGATCCAAGACAGAGAATTTCCCCCTCACTCTGGAGTCAGCTACCCGCTCCCAGACATCTGTGTATTTCTGCGCCAGCAGTGAGTC +>558|TRBV10-3 ENST00000611462|TRBV10-3|5'UTR|TR|TRB|None|00 +ATGAGATCCTGGCCTGGACCTGAA +>559|TRBV10-3 ENST00000611462|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCACCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>560|TRBV10-3 ENST00000631471|TRBV10-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGTTGTTCTTCTATGTGGCCCTTTGTCTCCTGTGGACAGGACACATGGATGCTGGAATCACCCAGAGCCCAAGACACAAGGTCACAGAGACAGGAACACCAGTGACTCTGAGATGTCATCAGACTGAGAACCACCGCTATATGTACTGGTATCGACAAGACCCGGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGTTAAAGATACTGACAAAGGAGAAGTCTCAGATGGCTATAGTGTCTCTAGATCAAAGACAGAGGATTTCCTCCTCACTCTGGAGTCCGCTACCAGCTCCCAGACATCTGTGTACTTCTGTGCCATCAGTGAGTC +>561|TRBV11-1 ENST00000390367|TRBV11-1|5'UTR|TR|TRB|None|00 +CCTGCCCTGACCCTGCC +>562|TRBV11-1 ENST00000390367|TRBV11-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCACCAGGCTTCTCTGCTGGATGGCCCTCTGTCTCCTGGGGGCAGAACTCTCAGAAGCTGAAGTTGCCCAGTCCCCCAGATATAAGATTACAGAGAAAAGCCAGGCTGTGGCTTTTTGGTGTGATCCTATTTCTGGCCATGCTACCCTTTACTGGTACCGGCAGATCCTGGGACAGGGCCCGGAGCTTCTGGTTCAATTTCAGGATGAGAGTGTAGTAGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>563|TRBV11-3 ENST00000611787|TRBV11-3|5'UTR|TR|TRB|None|00 +AGTGACCCTGATCTGGCAAAGCTTCCATCCTGCCCTGACCCTGCC +>564|TRBV11-3 ENST00000611787|TRBV11-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGGCTCCTCTGCTGGGTGGCCTTCTGTCTCCTGGTGGAAGAACTCATAGAAGCTGGAGTGGTTCAGTCTCCCAGATATAAGATTATAGAGAAAAAACAGCCTGTGGCTTTTTGGTGCAATCCTATTTCTGGCCACAATACCCTTTACTGGTACCTGCAGAACTTGGGACAGGGCCCGGAGCTTCTGATTCGATATGAGAATGAGGAAGCAGTAGACGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAGCCTGCAGAGCTTGGGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGA +>565|TRBV12-3 ENST00000620569|TRBV12-3|5'UTR|TR|TRB|None|00 +TTCTTTGCTCATGCTCACAGAGGGCCTGGTCTAGAATATTCCACATCTGCTCTCACTCTGCC +>566|TRBV12-3 ENST00000620569|TRBV12-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCTTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCGAAGCATACAGATGCTGGAGTTATCCAGTCACCCCGCCATGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGCCACAACTCCCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>567|TRBV12-4 ENST00000617347|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>568|TRBV12-4 ENST00000617347|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>569|TRBV12-4 ENST00000631824|TRBV12-4|5'UTR|TR|TRB|None|00 +TTTGCTCATGTTCACAGAGGGCCTGGTCTGGAATATTCCACATCTGCTCTCACTCTGCC +>570|TRBV12-4 ENST00000631824|TRBV12-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACTCCTGGACCCTCTGCTGTGTGTCCCTTTGCATCCTGGTAGCAAAGCACACAGATGCTGGAGTTATCCAGTCACCCCGGCACGAGGTGACAGAGATGGGACAAGAAGTGACTCTGAGATGTAAACCAATTTCAGGACACGACTACCTTTTCTGGTACAGACAGACCATGATGCGGGGACTGGAGTTGCTCATTTACTTTAACAACAACGTTCCGATAGATGATTCAGGGATGCCCGAGGATCGATTCTCAGCTAAGATGCCTAATGCATCATTCTCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTACTTCTGTGCCAGCAGTTTAGC +>571|TRBV12-5 ENST00000621184|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>572|TRBV12-5 ENST00000621184|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGCACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>573|TRBV12-5 ENST00000632829|TRBV12-5|5'UTR|TR|TRB|None|00 +AGCTCCTGTATTCGTGCCCACAAGGGCCTCATCTAGGTGAAGGCTCCACCTGCCCCACCCTGCC +>574|TRBV12-5 ENST00000632829|TRBV12-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCACCAGGCTCCTCTGCTGTGTGGTTCTTTGTCTCCTGGGAGAAGAGCTTATAGATGCTAGAGTCACCCAGACACCAAGGGACAAGGTGACAGAGATGGGACAAGAAGTAACAATGAGATGTCAGCCAATTTTAGGCCACAATACTGTTTTCTGGTACAGACAGACCATGATGCAAGGACTGGAGTTGCTGGCTTACTTCCGCAACCGGGCTCCTCTAGATGATTCGGGGATGCCGAAGGATCGATTCTCAGCAGAGATGCCTGATGCAACTTTAGCCACTCTGAAGATCCAGCCCTCAGAACCCAGGGACTCAGCTGTGTATTTTTGTGCTAGTGGTTTGGT +>575|TRBV13 ENST00000614171|TRBV13|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTTAGTCCTGACCTGCCTGACTCTGCCTGGAACACCAGGCTCCTCTGCCGTGTCATGCTTTGTCTCCTGGGAGCAGGTTCAGTGGCTGCTGGAGTCATCCAGTCCCCAAGACATCTGATCAAAGAAAAGAGGGAAACAGCCACTCTGAAATGCTATCCTATCCCTAGACACGACACTGTCTACTGGTACCAGCAGGGTCCAGGTCAGGACCCCCAGTTCCTCATTTCGTTTTATGAAAAGATGCAGAGCGATAAAGGAAGCATCCCTGATCGATTCTCAGCTCAACAGTTCAGTGACTATCATTCTGAACTGAACATGAGCTCCTTGGAGCTGGGGGACTCAGCCCTGTACTTCTGTGCCAGCAGCTTAGG +>576|TRBV14 ENST00000617639|TRBV14|5'UTR|TR|TRB|None|00 +CCTTTTTCTCATGCTTGTAAGCTCCTTCATCTGGAAATGTGATTTACCTGGGTCCTGCC +>577|TRBV14 ENST00000617639|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGTTTCCAGGCTTCTCAGTTTAGTGTCCCTTTGTCTCCTGGGAGCAAAGCACATAGAAGCTGGAGTTACTCAGTTCCCCAGCCACAGCGTAATAGAGAAGGGCCAGACTGTGACTCTGAGATGTGACCCAATTTCTGGACATGATAATCTTTATTGGTATCGACGTGTTATGGGAAAAGAAATAAAATTTCTGTTACATTTTGTGAAAGAGTCTAAACAGGATGAGTCCGGTATGCCCAACAATCGATTCTTAGCTGAAAGGACTGGAGGGACGTATTCTACTCTGAAGGTGCAGCCTGCAGAACTGGAGGATTCTGGAGTTTATTTCTGTGCCAGCAGCCAAGA +>578|TRBV15 ENST00000616518|TRBV15|5'UTR|TR|TRB|None|00 +ACTCCCACCTCTCAACCCAGGAATCAGAGCCTGAGACAGACAGATGCTTCATTCCTGTATGGGGTGGTATTCCTGCC +>579|TRBV15 ENST00000616518|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTCCTGGGCTTCTCCACTGGATGGCCCTTTGTCTCCTTGGAACAGGTCATGGGGATGCCATGGTCATCCAGAACCCAAGATACCAGGTTACCCAGTTTGGAAAGCCAGTGACCCTGAGTTGTTCTCAGACTTTGAACCATAACGTCATGTACTGGTACCAGCAGAAGTCAAGTCAGGCCCCAAAGCTGCTGTTCCACTACTATGACAAAGATTTTAACAATGAAGCAGACACCCCTGATAACTTCCAATCCAGGAGGCCGAACACTTCTTTCTGCTTTCTTGACATCCGCTCACCAGGCCTGGGGGACGCAGCCATGTACCTGTGTGCCACCAGCAGAGA +>580|TRBV16 ENST00000620773|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCCAATATTCACCTGCATCACAATCCTTTGTCTGCTGGCTGCAGGTTCTCCTGGTGAAGAAGTCGCCCAGACTCCAAAACATCTTGTCAGAGGGGAAGGACAGAAAGCAAAATTATATTGTGCCCCAATAAAAGGACACAGTTATGTTTTTTGGTACCAACAGGTCCTGAAAAACGAGTTCAAGTTCTTGATTTCCTTCCAGAATGAAAATGTCTTTGATGAAACAGGTATGCCCAAGGAAAGATTTTCAGCTAAGTGCCTCCCAAATTCACCCTGTAGCCTTGAGATCCAGGCTACGAAGCTTGAGGATTCAGCAGTGTATTTTTGTGCCAGCAGCCAATC +>581|TRBV17 ENST00000619103|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACACTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>582|TRBV17 ENST00000631663|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTCCTCTGCTGGGTGACCCTGTGTCTCTTGGCGGCAGGACACTCGGAGCCTGGAGTCAGCCAGACCCCCAGACACAAGGTCACCAACATGGGACAGGAGGTGATTCTGAGGTGCGATCCATCTTCTGGTCACATGTTTGTTCACTGGTACCGACAGAATCTGAGGCAAGAAATGAAGTTGCTGATTTCCTTCCAGTACCAAAACATTGCAGTTGATTCAGGGATGCCCAAGGAACGATTCACAGCTGAAAGACCTAACGGAACGTCTTCCACGCTGAAGATCCATCCCGCAGAGCCGAGGGACTCAGCCGTGTATCTCTACAGTAGCGGTGG +>583|TRBV18 ENST00000611520|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>584|TRBV18 ENST00000611520|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGACTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>585|TRBV18 ENST00000631559|TRBV18|5'UTR|TR|TRB|None|00 +AGCTGTGAGGTCTGGTTCCCCGACGTGCTGCAGCAAGTGCCTTTGCCCTGCCTGTGGGCTCCCTCCATGGCCAACTCTGCT +>586|TRBV18 ENST00000631559|TRBV18|L-REGION+V-REGION|TR|TRB|None|00 +ATGGACACCAGAGTACTCTGCTGTGCGGTCATCTGTCTTCTGGGGGCAGGTCTCTCAAATGCCGGCGTCATGCAGAACCCAAGACACCTGGTCAGGAGGAGGGGACAGGAGGCAAGACTGAGATGCAGCCCAATGAAAGGACACAGTCATGTTTACTGGTATCGGCAGCTCCCAGAGGAAGGTCTGAAATTCATGGTTTATCTCCAGAAAGAAAATATCATAGATGAGTCAGGAATGCCAAAGGAACGATTTTCTGCTGAATTTCCCAAAGAGGGCCCCAGCATCCTGAGGATCCAGCAGGTAGTGCGAGGAGATTCGGCAGCTTATTTCTGTGCCAGCTCACCACC +>587|TRBV19 ENST00000390393|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>588|TRBV19 ENST00000390393|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTCTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>589|TRBV19 ENST00000632638|TRBV19|5'UTR|TR|TRB|None|00 +GGAGGTGCGAATGACTCTGCTCTCTGTCCTGTCTCCTCATCTGCAAAATTAGGAAGCCTGTCTTGATTATCTCCAGGAACCTCCCACCTCTTCATTCCAGCCTCTGACAAACTCTGCACATTAGGCCAGGAGAAGCCCCCGAGCCAAGTCTCTTTTCTCATTCTCTTCCAACAAGTGCTTGGAGCTCCAAGAAGGCCCCCTTTGCACT +>590|TRBV19 ENST00000632638|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCAACCAGGTGCTCTGCTGTGTGGTCCTTTGTTTCCTGGGAGCAAACACCGTGGATGGTGGAATCACTCAGTCCCCAAAGTACCTGTTCAGAAAGGAAGGACAGAATGTGACCCTGAGTTGTGAACAGAATTTGAACCACGATGCCATGTACTGGTACCGACAGGACCCAGGGCAAGGGCTGAGATTGATCTACTACTCACAGATAGTAAATGACTTTCAGAAAGGAGATATAGCTGAAGGGTACAGCGTCTCTCGGGAGAAGAAGGAATCCTTTCCTCTCACTGTGACATCGGCCCAAAAGAACCCGACAGCTTTCTATCTCTGTGCCAGTAGTATAGA +>591|TRBV2 ENST00000455382|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>592|TRBV2 ENST00000455382|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCGCTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>593|TRBV2 ENST00000632828|TRBV2|5'UTR|TR|TRB|None|00 +AAAATGCCCCTCCTTTCCTCCACAGGACCAGATGCCTGAGCTAGGAAAGGCCTCATTCCTGCTGTGATCCTGCC +>594|TRBV2 ENST00000632828|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATACCTGGCTCGTATGCTGGGCAATTTTTAGTCTCTTGAAAGCAGGACTCACAGAACCTGAAGTCACCCAGACTCCCAGCCATCAGGTCACACAGATGGGACAGGAAGTGATCTTGCACTGTGTCCCCATCTCTAATCACTTATACTTCTATTGGTACAGACAAATCTTGGGGCAGAAAGTCGAGTTTCTGGTTTCCTTTTATAATAATGAAATCTCAGAGAAGTCTGAAATATTCGATGATCAATTCTCAGTTGAAAGGCCTGATGGATCAAATTTCACTCTGAAGATCCGGTCCACAAAGCTGGAGGACTCAGCCATGTACTTCTGTGCCAGCAGTGAAGC +>595|TRBV20-1 ENST00000390394|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>596|TRBV20-1 ENST00000390394|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>597|TRBV20-1 ENST00000633466|TRBV20-1|5'UTR|TR|TRB|None|00 +GTCATCCCTCCTCGCTGGTGAATGGAGGCAGTGGTCACAACTCTCCCCAGAGAAGGTGGTGTGAGGCCATCACGGAAG +>598|TRBV20-1 ENST00000633466|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCTGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>599|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|5'UTR|TR|TRB|None|00 +GATCAGTCATCCCTCCTCGCTGGTGA +>600|TRBV20/OR9-2 ENST00000379435|TRBV20/OR9-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGGCTCCGGGCTTAGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAACATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGCTCCGGAAACAGAGCCTCATGCTGATGGCAACTTCCAATGAGGGCTCCGAGGTCACATACGAGCAAGGCGTCAAGAAGGACAAGTTTCCCATCAACCATCCAAACCTGACCTTCTCCGCTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGA +>601|TRBV23-1 ENST00000390396|TRBV23-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCGGCTGTGCAGCCCTGTGTCTCCTGGCAGCAGACTCTTTTCATGCCAAAGTCACACAGACTCCAGGACATTTGGTCAAAGGAAAAGGACAGAAAACAAAGATGGATTGTACCCCCGAAAAAGGACATACTTTTGTTTATTGGTATCAACAGAATCAGAATAAAGAGTTTATGCTTTTGATTTCCTTTCAGAATGAACAAGTTCTTCAAGAAACGGAGATGCACAAGAAGCGATTCTCATCTCAATGCCCCAAGAACGCACCCTGCAGCCTGGCAATCCTGTCCTCAGAACCGGGAGACACGGCACTGTATCTCTGCGCCAGCAGTCAATC +>602|TRBV24-1 ENST00000390397|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>603|TRBV24-1 ENST00000390397|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACAGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>604|TRBV24-1 ENST00000633092|TRBV24-1|5'UTR|TR|TRB|None|00 +AGAGCTGGAAACACCTCCATCCTGCCTCTTCATGCC +>605|TRBV24-1 ENST00000633092|TRBV24-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCTCCCTGCTCTTCTTCTGTGGGGCCTTTTATCTCCTGGGAACAGGGTCCATGGATGCTGATGTTACCCAGACCCCAAGGAATAGGATCACAAAGACAGGAAAGAGGATTATGCTGGAATGTTCTCAGACTAAGGGTCATGATAGAATGTACTGGTATCGACAAGACCCAGGACTGGGCCTACGGTTGATCTATTACTCCTTTGATGTCAAAGATATAAACAAAGGAGAGATCTCTGATGGATACAGTGTCTCTCGACAGGCACAGGCTAAATTCTCCCTGTCCCTAGAGTCTGCCATCCCCAACCAGACAGCTCTTTACTTCTGTGCCACCAGTGATTTG +>606|TRBV25-1 ENST00000610439|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>607|TRBV25-1 ENST00000610439|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACATGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>608|TRBV25-1 ENST00000390398|TRBV25-1|5'UTR|TR|TRB|None|00 +ACTACTGGGAGACATCCTCTCTAGCCCCAACTGTGCC +>609|TRBV25-1 ENST00000390398|TRBV25-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGACTATCAGGCTCCTCTGCTACGTGGGCTTTTATTTTCTGGGGGCAGGCCTCATGGAAGCTGACATCTACCAGACCCCAAGATACCTTGTTATAGGGACAGGAAAGAAGATCACTCTGGAATGTTCTCAAACCATGGGCCATGACAAAATGTACTGGTATCAACAAGATCCAGGAATGGAACTACACCTCATCCACTATTCCTATGGAGTTAATTCCACAGAGAAGGGAGATCTTTCCTCTGAGTCAACAGTCTCCAGAATAAGGACGGAGCATTTTCCCCTGACCCTGGAGTCTGCCAGGCCCTCACATACCTCTCAGTACCTCTGTGCCAGCAGTGAATA +>610|TRBV27 ENST00000390399|TRBV27|5'UTR|TR|TRB|None|00 +ACCTGGAGCCCCCAGAACTGGCAGACACCTGCCTGATGCTGCC +>611|TRBV27 ENST00000390399|TRBV27|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCCAGCTCCTTGGCTATGTGGTCCTTTGCCTTCTAGGAGCAGGCCCCCTGGAAGCCCAAGTGACCCAGAACCCAAGATACCTCATCACAGTGACTGGAAAGAAGTTAACAGTGACTTGTTCTCAGAATATGAACCATGAGTATATGTCCTGGTATCGACAAGACCCAGGGCTGGGCTTAAGGCAGATCTACTATTCAATGAATGTTGAGGTGACTGATAAGGGAGATGTTCCTGAAGGGTACAAAGTCTCTCGAAAAGAGAAGAGGAATTTCCCCCTGATCCTGGAGTCGCCCAGCCCCAACCAGACCTCTCTGTACTTCTGTGCCAGCAGTTTATC +>612|TRBV28 ENST00000390400|TRBV28|5'UTR|TR|TRB|None|00 +ATTCTTTCTTCAAAGCAGCC +>613|TRBV28 ENST00000390400|TRBV28|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGAATCAGGCTCCTCTGTCGTGTGGCCTTTTGTTTCCTGGCTGTAGGCCTCGTAGATGTGAAAGTAACCCAGAGCTCGAGATATCTAGTCAAAAGGACGGGAGAGAAAGTTTTTCTGGAATGTGTCCAGGATATGGACCATGAAAATATGTTCTGGTATCGACAAGACCCAGGTCTGGGGCTACGGCTGATCTATTTCTCATATGATGTTAAAATGAAAGAAAAAGGAGATATTCCTGAGGGGTACAGTGTCTCTAGAGAGAAGAAGGAGCGCTTCTCCCTGATTCTGGAGTCCGCCAGCACCAACCAGACATCTATGTACCTCTGTGCCAGCAGTTTATG +>614|TRBV29-1 ENST00000422143|TRBV29-1|5'UTR|TR|TRB|None|00 +GAAGGAAAGATGAACTTGAGTTTCACTTCTTAGTGCCTTTTCTCAGGGGAGAGGCCATCACTTGAAG +>615|TRBV29-1 ENST00000422143|TRBV29-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGAGTCTTCTGCTCCTTCTCCTGGGACTAGGCTCTGTGTTCAGTGCTGTCATCTCTCAAAAGCCAAGCAGGGATATCTGTCAACGTGGAACCTCCCTGACGATCCAGTGTCAAGTCGATAGCCAAGTCACCATGATGTTCTGGTACCGTCAGCAACCTGGACAGAGCCTGACACTGATCGCAACTGCAAATCAGGGCTCTGAGGCCACATATGAGAGTGGATTTGTCATTGACAAGTTTCCCATCAGCCGCCCAAACCTAACATTCTCAACTCTGACTGTGAGCAACATGAGCCCTGAAGACAGCAGCATATATCTCTGCAGCGTTGAAGA +>616|TRBV3-1 ENST00000390387|TRBV3-1|5'UTR|TR|TRB|None|00 +AGACCAGAATCCTGCCCTGGGCCTTGCCTGGTCTGCCTCACTCTGCC +>617|TRBV3-1 ENST00000390387|TRBV3-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTCCTCTGCTGTGTGGTCTTCTGCCTCCTCCAAGCAGGTCCCTTGGACACAGCTGTTTCCCAGACTCCAAAATACCTGGTCACACAGATGGGAAACGACAAGTCCATTAAATGTGAACAAAATCTGGGCCATGATACTATGTATTGGTATAAACAGGACTCTAAGAAATTTCTGAAGATAATGTTTAGCTACAATAATAAGGAGCTCATTATAAATGAAACAGTTCCAAATCGCTTCTCACCTAAATCTCCAGACAAAGCTCACTTAAATCTTCACATCAATTCCCTGGAGCTTGGTGACTCTGCTGTGTATTTCTGTGCCAGCAGCCAAGA +>618|TRBV30 ENST00000417977|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>619|TRBV30 ENST00000417977|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTTCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>620|TRBV30 ENST00000631690|TRBV30|5'UTR|TR|TRB|None|00 +TTCCTCTGCTCTGGCAGCAGATCTCCCAGAGGGAGCAGCCTGACCACATCACTGGCCCAGAAGAGGAGGCGTCTGTCCCCCAGACTAGCTGAAGGAAAGGCTGGCTTGGATG +>621|TRBV30 ENST00000631690|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTCTGCTCTCTCCTTGCCCTTCTCCTGGGCACTTTCTTTGGGGTCAGATCTCAGACTATTCATCAATGGCCAGCGACCCTGGTGCAGCCTGTGGGCAGCCCGCTCTCTCTGGAGTGCACTGTGGAGGGAACATCAAACCCCAACCTATACTGGTACCGACAGGCTGCAGGCAGGGGCCTCCAGCTGCTCTTCTACTCCGTTGGTATTGGCCAGATCAGCTCTGAGGTGCCCCAGAATCTCTCAGCCTCCAGACCCCAGGACCGGCAGTTCATCCTGAGTTCTAAGAAGCTCCTCCTCAGTGACTCTGGCTTCTATCTCTGTGCCTGGAGTGT +>622|TRBV4-1 ENST00000390357|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>623|TRBV4-1 ENST00000390357|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>624|TRBV4-1 ENST00000632713|TRBV4-1|5'UTR|TR|TRB|None|00 +AGAGGCCCCATCTCAGACCCGAGGCTAGC +>625|TRBV4-1 ENST00000632713|TRBV4-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCAGTTCCCATAGACACTGAAGTTACCCAGACACCAAAACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATATGGGGCACAGGGCTATGTATTGGTACAAGCAGAAAGCTAAGAAGCCACCGGAGCTCATGTTTGTCTACAGCTATGAGAAACTCTCTATAAATGAAAGTGTGCGAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCTCTTAAACCTTCACCTACACGCCCTGCAGCCAGAAGACTCAGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>626|TRBV4-2 ENST00000390392|TRBV4-2|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>627|TRBV4-2 ENST00000390392|TRBV4-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGGCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAACTTTAAAGAACAGACTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGTGCCAGCAGCCAAGA +>628|TRBV4-3 ENST00000631427|TRBV4-3|5'UTR|TR|TRB|None|00 +AGGAGCAGTGACATCACAGGAAAAACCACCAACCAAGGCCAAGGAGACCAGAGCCCAGCACCTCACCCAGAGGACCCCAGTCAGAGGCCCCATCTCAGACCCGAGGCTAGC +>629|TRBV4-3 ENST00000631427|TRBV4-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGCAGGCTGCTCTGCTGTGCGGTTCTCTGTCTCCTGGGAGCGGTCCCCATGGAAACGGGAGTTACGCAGACACCAAGACACCTGGTCATGGGAATGACAAATAAGAAGTCTTTGAAATGTGAACAACATCTGGGTCATAACGCTATGTATTGGTACAAGCAAAGTGCTAAGAAGCCACTGGAGCTCATGTTTGTCTACAGTCTTGAAGAACGGGTTGAAAACAACAGTGTGCCAAGTCGCTTCTCACCTGAATGCCCCAACAGCTCTCACTTATTCCTTCACCTACACACCCTGCAGCCAGAAGACTCGGCCCTGTATCTCTGCGCCAGCAGCCAAGA +>630|TRBV5-1 ENST00000390381|TRBV5-1|5'UTR|TR|TRB|None|00 +CTCAGAGGACCAGTATCCCTCACAGGGTGACACCTGACCAGCTCTGTCCCACCTGGCCATGGGCTCCAGGTACCTCTGATGGGAAGACCTTTGTCTCTTGGGAACAAGTGAATCCTTGGCACAGGCCCAGTGGATTCTGCTGTGCAGAACAGAGAGCAGTGGACCTCAGGAGGCCTGCAAGGGGAGGACATAGGACAGTGACATCACAGTATGCCCCTCCCACCAGGAAAAGCAAGGCTGAGAATTTAGCTCTTTCCCAGGAGGACCAAGCCCTGAGCACAGACACAGTGCTGCCTGCCCCTTTGTGCC +>631|TRBV5-1 ENST00000390381|TRBV5-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTGCTCTGTTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTAAAGGCTGGAGTCACTCAAACTCCAAGATATCTGATCAAAACGAGAGGACAGCAAGTGACACTGAGCTGCTCCCCTATCTCTGGGCATAGGAGTGTATCCTGGTACCAACAGACCCCAGGACAGGGCCTTCAGTTCCTCTTTGAATACTTCAGTGAGACACAGAGAAACAAAGGAAACTTCCCTGGTCGATTCTCAGGGCGCCAGTTCTCTAACTCTCGCTCTGAGATGAATGTGAGCACCTTGGAGCTGGGGGACTCGGCCCTTTATCTTTGCGCCAGCAGCTTGG +>632|TRBV5-3 ENST00000390362|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTATTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>633|TRBV5-3 ENST00000634123|TRBV5-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGAACTGCTTTATCTCCTGGGAGCAGGCCCAGTGGAGGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAGCAGTGTGTCCTGGTACCAACAGGCCCCGGGTCAGGGGCCCCAGTTTATCTTTGAATATGCTAATGAGTTAAGGAGATCAGAAGGAAACTTCCCTAATCGATTCTCAGGGCGCCAGTTCCATGACTGTTGCTCTGAGATGAATGTGAGTGCCTTGGAGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGAAGCTTGG +>634|TRBV5-4 ENST00000454561|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACACAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGCCCCACTGTGCC +>635|TRBV5-4 ENST00000454561|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGAGACTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>636|TRBV5-4 ENST00000633696|TRBV5-4|5'UTR|TR|TRB|None|00 +TTCAGCTCTGCAGGACAGGTAGAGACTCCAGGATCATCCACTGAGCACTGGACATAAGGAAGGCTGCATGGGGAGGACTCAGGACAGTGACATCACAGGATACCCCTCCTATTAGGAAAATCAAGGCCCAGAATTCACTCGGCTCTTCCCCAGGAGGACCAAGCCCTGAATCAGGTGCAGTGCTGCCTGGCCCACTGTGCC +>637|TRBV5-4 ENST00000633696|TRBV5-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGCGCTGCTTTGTCTCCTGGGAGCAGGCTCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTTCTCAGTCTGGGCACAACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATAGGGAGGAAGAGAATGGCAGAGGAAACTTCCCTCCTAGATTCTCAGGTCTCCAGTTCCCTAATGATAGCTCTGAGCTGAATGTGAATGCCTTGGAGCTGGACGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>638|TRBV5-5 ENST00000390372|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>639|TRBV5-5 ENST00000390372|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGGAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>640|TRBV5-5 ENST00000632187|TRBV5-5|5'UTR|TR|TRB|None|00 +CTGTGCC +>641|TRBV5-5 ENST00000632187|TRBV5-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCTGGGCTCCTCTGCTGGGTGCTGCTTTGTCTCCTGGTAGCAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTATCTCTGGGCACAAGAGTGTGTCCTGGTACCAACAGGTCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCGATTCTCAGCTCGCCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>642|TRBV5-6 ENST00000390375|TRBV5-6|5'UTR|TR|TRB|None|00 +AAGCCCTGAATCAGATGCAGTGCTTCCTGTCCCTCTGTGCC +>643|TRBV5-6 ENST00000390375|TRBV5-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGCACTGCTTTGTCTCCTGGGAGCAGGCTTAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGTGACTCTGAGATGCTCTCCTAAGTCTGGGCATGACACTGTGTCCTGGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGGAGGAAGAGAGACAGAGAGGCAACTTCCCTGATCGATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTGGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>644|TRBV5-7 ENST00000390378|TRBV5-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCCCCGGGCTCCTCTGCTGGGTGCTGCTTTGTCCCCTAGGAGAAGGCCCAGTGGACGCTGGAGTCACCCAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCACGTGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTCCTCGTACCAACAGGCCCTGGGTCAGGGGCCCCAGTTTATCTTTCAGTATTATGAGAAAGAAGAGAGAGGAAGAGGAAACTTCCCTGATCAATTCTCAGGTCACCAGTTCCCTAACTATAGCTCTGAGCTGAATGTGAACGCCTTGTTGCTAGGGGACTCGGCCCTCTATCTCTGTGCCAGCAGCTTGG +>645|TRBV5-8 ENST00000631639|TRBV5-8|5'UTR|TR|TRB|None|00 +TGGCCACTGAGGAAAGGGAAGAGAATGTTGCCTGGGACAGGAAAATATAGAAAATGAAGGCCCAGAACTCACTCGGCTCTTCCCCAGGAAGACCAAGCCCTGAATCAGGTGCAGTGCCGCCTGGCCCACTGTGCC +>646|TRBV5-8 ENST00000631639|TRBV5-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGACCCAGGCTCCTCTTCTGGGCACTGCTTTGTCTCCTCGGAACAGGCCCAGTGGAGGCTGGAGTCACACAAAGTCCCACACACCTGATCAAAACGAGAGGACAGCAAGCGACTCTGAGATGCTCTCCTATCTCTGGGCACACCAGTGTGTACTGGTACCAACAGGCCCTGGGTCTGGGCCTCCAGTTCCTCCTTTGGTATGACGAGGGTGAAGAGAGAAACAGAGGAAACTTCCCTCCTAGATTTTCAGGTCGCCAGTTCCCTAATTATAGCTCTGAGCTGAATGTGAACGCCTTGGAGCTGGAGGACTCGGCCCTGTATCTCTGTGCCAGCAGCTTGG +>647|TRBV6-1 ENST00000390353|TRBV6-1|5'UTR|TR|TRB|None|00 +GTTCCCCTATCACCGATGCACAGACCCAGAAGACCCCTCCATCCTGTAGCACCTGCC +>648|TRBV6-1 ENST00000390353|TRBV6-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAAGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTCCATGTACTGGTATCGACAAGACCCAGGCATGGGACTGAGGCTGATTTATTACTCAGCTTCTGAGGGTACCACTGACAAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATTAAACAAACGGGAGTTCTCGCTCAGGCTGGAGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTGAAGC +>649|TRBV6-2 ENST00000632016|TRBV6-2|5'UTR|TR|TRB|None|00 +TCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>650|TRBV6-2 ENST00000632016|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>651|TRBV6-2 ENST00000634383|TRBV6-2|5'UTR|TR|TRB|None|00 +AGAATGACGCCCTTGAAAGACGTGTTCCCTTTTCACCAATGCACAGACCCAGAGGACCCCTCCATCCTGCAGTTCCTGCC +>652|TRBV6-2 ENST00000634383|TRBV6-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGGGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGGGTCCTGAAGACAGGACAGAGCATGACACTGCTGTGTGCCCAGGATATGAACCATGAATACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGAGGGTACAACTGCCAAAGGAGAGGTCCCTGATGGCTACAATGTCTCCAGATTAAAAAAACAGAATTTCCTGCTGGGGTTGGAGTCGGCTGCTCCCTCCCAAACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>653|TRBV6-4 ENST00000390360|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>654|TRBV6-4 ENST00000390360|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGACTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGAGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>655|TRBV6-4 ENST00000633472|TRBV6-4|5'UTR|TR|TRB|None|00 +CTCTGTCTTGTAGCATCTGCC +>656|TRBV6-4 ENST00000633472|TRBV6-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAATCAGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGATTGCTGGGATCACCCAGGCACCAACATCTCAGATCCTGGCAGCAGGACGGCGCATGACACTGAGATGTACCCAGGATATGAGACATAATGCCATGTACTGGTATAGACAAGATCTAGGACTGGGGCTAAGGCTCATCCATTATTCAAATACTGCAGGTACCACTGGCAAAGGAGAAGTCCCTGATGGTTATAGTGTCTCCAGAGCAAACACAGATGATTTCCCCCTCACGTTGGCGTCTGCTGTACCCTCTCAGACATCTGTGTACTTCTGTGCCAGCAGTGACTC +>657|TRBV6-5 ENST00000390368|TRBV6-5|5'UTR|TR|TRB|None|00 +GAGAGTCCTGCTCCCCTTTCATCAATGCACAGATACAGAAGACCCCTCCGTCATGCAGCATCTGCC +>658|TRBV6-5 ENST00000390368|TRBV6-5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGCCTCCTGTGCTGTGCAGCCTTGTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCAGGTCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGAATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCTGATTCATTACTCAGTTGGTGCTGGTATCACTGACCAAGGAGAAGTCCCCAATGGCTACAATGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGCTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>659|TRBV6-6 ENST00000390371|TRBV6-6|5'UTR|TR|TRB|None|00 +CAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>660|TRBV6-6 ENST00000390371|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGACAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGGATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>661|TRBV6-6 ENST00000633963|TRBV6-6|5'UTR|TR|TRB|None|00 +ATCAATGCACAGATACAGAAGACCCCTCCGTCCTGGAGCACCTGCC +>662|TRBV6-6 ENST00000633963|TRBV6-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCAGCCTCCTGTGCTGTGCAGCCTTTCCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCGCATCCTGAAGATAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATAACTACATGTACTGGTATCGACAAGACCCAGGCATGGGGCTGAAGCTGATTTATTATTCAGTTGGTGCTGGTATCACTGATAAAGGAGAAGTCCCGAATGGCTACAACGTCTCCAGATCAACCACAGAGTATTTCCCGCTCAGGCTGGAGTTGGCTGCTCCCTCCCAGACATCTGTGTACTTCTGTGCCAGCAGTTACTC +>663|TRBV6-7 ENST00000390373|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTGATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>664|TRBV6-7 ENST00000631511|TRBV6-7|5'UTR|TR|TRB|None|00 +ATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>665|TRBV6-7 ENST00000631511|TRBV6-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAATGAATGCTGGTGTCACTCAGACCCCAAAATTCCACGTCCTGAAGACAGGACAGAGCATGACTCTGCTGTGTGCCCAGGATATGAACCATGAATACATGTATCGGTATCGACAAGACCCAGGCAAGGGGCTGAGGCTTATTTACTACTCAGTTGCTGCTGCTCTCACTGACAAAGGAGAAGTTCCCAATGGCTACAATGTCTCCAGATCAAACACAGAGGATTTCCCCCTCAAGCTGGAGTCAGCTGCTCCCTCTCAGACTTCTGTTTACTTCTGTGCCAGCAGTTACTC +>666|TRBV6-8 ENST00000390376|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCCGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCAGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>667|TRBV6-8 ENST00000632425|TRBV6-8|5'UTR|TR|TRB|None|00 +GAGAGTCCTGTTCCCCTTTTATCAATGCACAGACCCAGAAGACCCCTCCGTCCTGCAGCCCCTGCC +>668|TRBV6-8 ENST00000632425|TRBV6-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCCTCGGGCTCCTGTGCTGTGCGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACATGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGACTGATTTACTACTCAGCTGCTGCTGGTACTACTGACAAAGAAGTCCCCAATGGCTACAATGTCTCTAGATTAAACACAGAGGATTTCCCACTCAGGCTGGTGTCGGCTGCTCCCTCCCGGACATCTGTGTACTTGTGTGCCAGCAGTTACTC +>669|TRBV6-9 ENST00000634093|TRBV6-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCATCGGGCTCCTGTGCTGTGTGGCCTTTTCTCTCCTGTGGGCAGGTCCAGTGAATGCTGGTGTCACTCAGACCCCAAAATTCCACATCCTGAAGACAGGACAGAGCATGACACTGCAGTGTGCCCAGGATATGAACCATGGATACTTGTCCTGGTATCGACAAGACCCAGGCATGGGGCTGAGGCGCATTCATTACTCAGTTGCTGCTGGTATCACTGACAAAGGAGAAGTCCCCGATGGCTACAATGTATCCAGATCAAACACAGAGGATTTCCCGCTCAGGCTGGAGTCAGCTGCTCCCTCCCAGACATCTGTATACTTCTGTGCCAGCAGTTATTC +>670|TRBV7-1 ENST00000547918|TRBV7-1|5'UTR|TR|TRB|None|00 +CTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>671|TRBV7-1 ENST00000547918|TRBV7-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACAAGGCTCCTCTGCTGGGCAGCCATATGTCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGTCCCTGAGACACAAGGTAGCAAAGAAGGGAAAGGATGTAGCTCTCAGATATGATCCAATTTCAGGTCATAATGCCCTTTATTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTCCAATTTACTTCCAAGGCAAGGATGCAGCAGACAAATCGGGGCTTCCCCGTGATCGGTTCTCTGCACAGAGGTCTGAGGGATCCATCTCCACTCTGAAGTTCCAGCGCACACAGCAGGGGGACTTGGCTGTGTATCTCTGTGCCAGCAGCTCAGC +>672|TRBV7-2 ENST00000631392|TRBV7-2|5'UTR|TR|TRB|None|00 +CCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>673|TRBV7-2 ENST00000631392|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>674|TRBV7-2 ENST00000634605|TRBV7-2|5'UTR|TR|TRB|None|00 +ACAGTGATCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACCCTGCC +>675|TRBV7-2 ENST00000634605|TRBV7-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTTCTGGGTGGCCTTCTGTCTCCTGGGGGCAGATCACACAGGAGCTGGAGTCTCCCAGTCCCCCAGTAACAAGGTCACAGAGAAGGGAAAGGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAGAGCCTGGGGCAGGGCCTGGAGTTTTTAATTTACTTCCAAGGCAACAGTGCACCAGACAAATCAGGGCTGCCCAGTGATCGCTTCTCTGCAGAGAGGACTGGGGGATCCGTCTCCACTCTGACGATCCAGCGCACACAGCAGGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>676|TRBV7-3 ENST00000390361|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>677|TRBV7-3 ENST00000390361|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAAGATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAAAGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCCGCGTATCTCCGTGCCAGCAGCTTAAC +>678|TRBV7-3 ENST00000631882|TRBV7-3|5'UTR|TR|TRB|None|00 +CTCACAGTGACCCTGATCTGGTAAAGCTCCCATCCTGCCCTGACTCTGTC +>679|TRBV7-3 ENST00000631882|TRBV7-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCAGCCCTGTGCCTCCTGGGGGCAGATCACACAGGTGCTGGAGTCTCCCAGACCCCCAGTAACAAGGTCACAGAGAAGGGAAAATATGTAGAGCTCAGGTGTGATCCAATTTCAGGTCATACTGCCCTTTACTGGTACCGACAAAGCCTGGGGCAGGGCCCAGAGTTTCTAATTTACTTCCAAGGCACGGGTGCGGCAGATGACTCAGGGCTGCCCAACGATCGGTTCTTTGCAGTCAGGCCTGAGGGATCCGTCTCTACTCTGAAGATCCAGCGCACAGAGCGGGGGGACTCAGCCGTGTATCTCTGTGCCAGCAGCTTAAC +>680|TRBV7-4 ENST00000390369|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGCGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>681|TRBV7-4 ENST00000633313|TRBV7-4|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCAAGGTACAAAGTCGCAAAGAGGGGACGGGATGTAGCTCTCAGGTGTGATTCAATTTCGGGTCATGTAACCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCTCAGAGGTTCTGACTTACTCCCAGAGTGATGCTCAACGAGACAAATCAGGGCGGCCCAGTGGTCGGTTCTCTGCAGAGAGGCCTGAGAGATCCGTCTCCACTCTGAAGATCCAGTGCACAGAGCAGGGGGACTCAGCTGTGTATCTCTGTGCCAGCAGCTTAGC +>682|TRBV7-6 ENST00000390374|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGTCCTGACCCTGCC +>683|TRBV7-6 ENST00000390374|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>684|TRBV7-6 ENST00000633265|TRBV7-6|5'UTR|TR|TRB|None|00 +AGTGACACTGATCTGGTAAAGCCCTCATCCTGGCCTGACCCTGCC +>685|TRBV7-6 ENST00000633265|TRBV7-6|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTATTGGTACCGACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCCCAACAAGACAAATCAGGGCTGCCCAATGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCGTCTCCACTCTGACGATCCAGCGCACAGAGCAGCGGGACTCGGCCATGTATCGCTGTGCCAGCAGCTTAGC +>686|TRBV7-7 ENST00000390377|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>687|TRBV7-8 ENST00000632560|TRBV7-8|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATCACACAGGTGCTGGAGTCTCCCAGTCCCCTAGGTACAAAGTCGCAAAGAGAGGACAGGATGTAGCTCTCAGGTGTGATCCAATTTCGGGTCATGTATCCCTTTTTTGGTACCAACAGGCCCTGGGGCAGGGGCCAGAGTTTCTGACTTATTTCCAGAATGAAGCTCAACTAGACAAATCGGGGCTGCCCAGTGATCGCTTCTTTGCAGAAAGGCCTGAGGGATCCGTCTCCACTCTGAAGATCCAGCGCACACAGCAGGAGGACTCCGCCGTGTATCTCTGTGCCAGCAGCTTAGC +>688|TRBV7-9 ENST00000612787|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGAACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>689|TRBV7-9 ENST00000632021|TRBV7-9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGCCTCCTCTGCTGGATGGCCCTGTGTCTCCTGGGGGCAGATCACGCAGATACTGGAGTCTCCCAGGACCCCAGACACAAGATCACAAAGAGGGGACAGAATGTAACTTTCAGGTGTGATCCAATTTCTGAACACAACCGCCTTTATTGGTACCGACAGACCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCCAGAATGAAGCTCAACTAGAAAAATCAAGGCTGCTCAGTGATCGGTTCTCTGCAGAGAGGCCTAAGGGATCTTTCTCCACCTTGGAGATCCAGCGCACAGAGCAGGGGGACTCGGCCATGTATCTCTGTGCCAGCAGCTTAGC +>690|TRBV9 ENST00000390363|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>691|TRBV9 ENST00000390363|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCACTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>692|TRBV9 ENST00000633328|TRBV9|5'UTR|TR|TRB|None|00 +AGAATGCTTACTACAGAGACACCAGCCCCAAGCTAGGAGATCCTGCC +>693|TRBV9 ENST00000633328|TRBV9|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTTCAGGCTCCTCTGCTGTGTGGCCTTTTGTCTCCTGGGAGCAGGCCCAGTGGATTCTGGAGTCACACAAACCCCAAAGCACCTGATCACAGCAACTGGACAGCGAGTGACGCTGAGATGCTCCCCTAGGTCTGGAGACCTCTCTGTGTACTGGTACCAACAGAGCCTGGACCAGGGCCTCCAGTTCCTCATTCAGTATTATAATGGAGAAGAGAGAGCAAAAGGAAACATTCTTGAACGATTCTCCGCACAACAGTTCCCTGACTTGCACTCTGAACTAAACCTGAGCTCTCTGGAGCTGGGGGACTCAGCTTTGTATTTCTGTGCCAGCAGCGTAG +>694|TRDC ENST00000390477|TRDC|C-REGION|TR|TRD|None|00 +GAAGTCAGCCTCATACCAAACCATCCGTTTTTGTCATGAAAAATGGAACAAATGTCGCTTGTCTGGTGAAGGAATTCTACCCCAAGGATATAAGAATAAATCTCGTGTCATCCAAGAAGATAACAGAGTTTGATCCTGCTATTGTCATCTCTCCCAGTGGGAAGTACAATGCTGTCAAGCTTGGTAAATATGAAGATTCAAATTCAGTGACATGTTCAGTTCAACACGACAATAAAACTGTGCACTCCACTGACTTTGAAGTGAAGACAGATTCTACAGATCACGTAAAACCAAAGGAAACTGAAAACACAAAGCAACCTTCAAAGAGCTGCCATAAACCCAAAGCCATAGTTCATACCGAGAAGGTGAACATGATGTCCCTCACAGTGCTTGGGCTACGAATGCTGTTTGCAAAGACTGTTGCCGTCAATTTTCTCTTGACTGCCAAGTTATTTTTCTTG +>695|TRDD1 ENST00000415118|TRDD1|D-REGION|TR|TRD|None|00 +GAAATAGT +>696|TRDD2 ENST00000434970|TRDD2|D-REGION|TR|TRD|None|00 +CCTTCCTAC +>697|TRDD3 ENST00000448914|TRDD3|D-REGION|TR|TRD|None|00 +ACTGGGGGATACG +>698|TRDJ1 ENST00000390473|TRDJ1|J-REGION|TR|TRD|None|00 +ACACCGATAAACTCATCTTTGGAAAAGGAACCCGTGTGACTGTGGAACCAA +>699|TRDJ2 ENST00000390475|TRDJ2|J-REGION|TR|TRD|None|00 +CTTTGACAGCACAACTCTTCTTTGGAAAGGGAACACAACTCATCGTGGAACCAG +>700|TRDJ3 ENST00000390476|TRDJ3|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTCGGAACTGGCATCAAACTCTTCGTGGAGCCCC +>701|TRDJ4 ENST00000390474|TRDJ4|J-REGION|TR|TRD|None|00 +CCAGACCCCTGATCTTTGGCAAAGGAACCTATCTGGAGGTACAACAAC +>702|TRDV1 ENST00000390452|TRDV1|5'UTR|TR|TRD|None|00 +CAAAGAGCTACATGCCAC +>703|TRDV1 ENST00000390452|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTGTTCTCCAGCCTGCTGTGTGTATTTGTGGCCTTCAGCTACTCTGGATCAAGTGTGGCCCAGAAGGTTACTCAAGCCCAGTCATCAGTATCCATGCCAGTGAGGAAAGCAGTCACCCTGAACTGCCTGTATGAAACAAGTTGGTGGTCATATTATATTTTTTGGTACAAGCAACTTCCCAGCAAAGAGATGATTTTCCTTATTCGCCAGGGTTCTGATGAACAGAATGCAAAAAGTGGTCGCTATTCTGTCAACTTCAAGAAAGCAGCGAAATCCGTCGCCTTAACCATTTCAGCCTTACAGCTAGAAGATTCAGCAAAGTACTTTTGTGCTCTTGGGGAACT +>704|TRDV2 ENST00000390469|TRDV2|5'UTR|TR|TRD|None|00 +ATTAGCAGGCAGCAGGCCCTGCGAGCCTCCTGTGATCAGCTAGATTTCTCTGGGGAATGAAACAGCTGCTGATAGGGACTGACTTCCTCAGTCACAAGTGTTTCACAAGTGTGTTGGTTCAGAGGAGGGACCAGGCAGAAGGTGGTTGAGAGGCAGAGCTGCCCCTGAGTGAGCC +>705|TRDV2 ENST00000390469|TRDV2|L-REGION+V-REGION|TR|TRD|None|00 +ATGCAGAGGATCTCCTCCCTCATCCATCTCTCTCTCTTCTGGGCAGGAGTCATGTCAGCCATTGAGTTGGTGCCTGAACACCAAACAGTGCCTGTGTCAATAGGGGTCCCTGCCACCCTCAGGTGCTCCATGAAAGGAGAAGCGATCGGTAACTACTATATCAACTGGTACAGGAAGACCCAAGGTAACACAATGACTTTCATATACCGAGAAAAGGACATCTATGGCCCTGGTTTCAAAGACAATTTCCAAGGTGACATTGATATTGCAAAGAACCTGGCTGTACTTAAGATACTTGCACCATCAGAGAGAGATGAAGGGTCTTACTACTGTGCCTGTGACACC +>706|TRDV3 ENST00000535880|TRDV3|5'UTR|TR|TRD|None|00 +TCTTTCATTAGAACCGTCAGATAGTCTCTGAGATCTTAGGAACCCTGTTTTGTTGTATATCCTCTGCCCTGATATGAAGAAAAG +>707|TRDV3 ENST00000535880|TRDV3|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTACTGTGGGCTTTAGCTTTTTGTTTTTCTACAGGGGCACGCTGTGTGACAAAGTAACCCAGAGTTCCCCGGACCAGACGGTGGCGAGTGGCAGTGAGGTGGTACTGCTCTGCACTTACGACACTGTATATTCAAATCCAGATTTATTCTGGTACCGGATAAGGCCAGATTATTCCTTTCAGTTTGTCTTTTATGGGGATAACAGCAGATCAGAAGGTGCAGATTTTACTCAAGGACGGTTTTCTGTGAAACACATTCTGACCCAGAAAGCCTTTCACTTGGTGATCTCTCCAGTAAGGACTGAAGACAGTGCCACTTACTACTGTGCCTTTAG +>708|TRGC1 ENST00000443402|TRGC1|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCAATTGCTGAAACAAAGCTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCTGATGTTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAAAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAGTTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCATCACAATGGATCCCAAAGACAATTGTTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACATGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>709|TRGC2 ENST00000436911|TRGC2|C-REGION|TR|TRG|None|00 +ATAAACAACTTGATGCAGATGTTTCCCCCAAGCCCACTATTTTTCTTCCTTCGATTGCTGAAACAAAACTCCAGAAGGCTGGAACATACCTTTGTCTTCTTGAGAAATTTTTCCCAGATATTATTAAGATACATTGGCAAGAAAAGAAGAGCAACACGATTCTGGGATCCCAGGAGGGGAACACCATGAAGACTAACGACACATACATGAAATTTAGCTGGTTAACGGTGCCAGAAGAGTCACTGGACAAAGAACACAGATGTATCGTCAGACATGAGAATAATAAAAACGGAATTGATCAAGAAATTATCTTTCCTCCAATAAAGACAGATGTCACCACAGTGGATCCCAAATACAATTATTCAAAGGATGCAAATGATGTCATCACAATGGATCCCAAAGACAATTGGTCAAAAGATGCAAATGATACACTACTGCTGCAGCTCACAAACACCTCTGCATATTACACGTACCTCCTCCTGCTCCTCAAGAGTGTGGTCTATTTTGCCATCATCACCTGCTGTCTGCTTAGAAGAACGGCTTTCTGCTGCAATGGAGAGAAATCA +>710|TRGJ1 ENST00000390337|TRGJ1|J-REGION|TR|TRG|None|00 +GAATTATTATAAGAAACTCTTTGGCAGTGGAACAACACTTGTTGTCACAG +>711|TRGJP ENST00000390338|TRGJP|J-REGION|TR|TRG|None|00 +GGGCAAGAGTTGGGCAAAAAAATCAAGGTATTTGGTCCCGGAACAAAGCTTATCATTACAG +>712|TRGJP1 ENST00000390339|TRGJP1|J-REGION|TR|TRG|None|00 +ATACCACTGGTTGGTTCAAGATATTTGCTGAAGGGACTAAGCTCATAGTAACTTCACCTG +>713|TRGJP2 ENST00000390334|TRGJP2|J-REGION|TR|TRG|None|00 +ATAGTAGTGATTGGATCAAGACGTTTGCAAAAGGGACTAGGCTCATAGTAACTTCGCCTG +>714|TRGV1 ENST00000390348|TRGV1|5'UTR|TR|TRG|None|00 +TACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>715|TRGV1 ENST00000390348|TRGV1|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGATATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCTGACTGGGTCATCTGCTGAAATCACCTGTGATCTTCCTGGAGCAAGTACCTTATACATCCACTGGTACCTGCACCAGGAGGGGAAGGCCCCACAGTGTCTTCTGTACTATGAACCCTACTACTCCAGGGTTGTGCTGGAATCAGGAATCACTCCAGGAAAGTATGACACTGGAAGCACAAGGAGCAATTGGAATTTGAGACTGCAAAATCTAATTAAAAATGATTCTGGGTTCTATTACTGTGCCACCTGGGACAGG +>716|TRGV10 ENST00000390341|TRGV10|5'UTR|TR|TRG|None|00 +ACTTTCCTGCCTTCTCCTTGGGTACACCGCCCCGAAGACAGGATGTCACTGCTGGAAGCATTTGCCTTCTCCTCCTGGGCTCCTGAGTTGCTGTCCGAACATTTCAGTCTAGCTGCGTGACCAAAATCATTCTTCAATGTTTCCCTCTTCTACTGTCAG +>717|TRGV10 ENST00000390341|TRGV10|L-REGION+V-REGION|TR|TRG|None|00 +ATGTTCATTGGAAATTCTCCTCTTTTACTTACAGTTGGACTTGGATTATCAAAAGTGGAGCAGTTCCAGCTATCCATTTCCACGGAAGTCAAGAAAAGTATTGACATACCTTGCAAGATATCGAGCACAAGGTTTGAAACAGATGTCATTCACTGGTACCGGCAGAAACCAAATCAGGCTTTGGAGCACCTGATCTATATTGTCTCAACAAAATCCGCAGCTCGACGCAGCATGGGTAAGACAAGCAACAAAGTGGAGGCAAGAAAGAATTCTCAAACTCTCACTTCAATCCTTACCATCAAGTCCGTAGAGAAAGAAGACATGGCCGTTTACTACTGTGCTGCGTGGGATTA +>718|TRGV2 ENST00000426402|TRGV2|5'UTR|TR|TRG|None|00 +GGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCCCTCTGCTTGTGTCTCAGGAAGACCACCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGAACCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCCCAGAGAGGAAGGC +>719|TRGV2 ENST00000426402|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTAACGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCAGTACTATGACTCCTACAACTCCAAGGTTGTGTTGGAATCAGGAGTCAGTCCAGGGAAGTATTATACTTACGCAAGCACAAGGAACAACTTGAGATTGATACTGCGAAATCTAATTGAAAATGACTTTGGGGTCTATTACTGTGCCACCTGGGACGGG +>720|TRGV3 ENST00000390346|TRGV3|5'UTR|TR|TRG|None|00 +CTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGTCTCAGGAAACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCGTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>721|TRGV3 ENST00000390346|TRGV3|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCACCAGGCAGACTGGGTCATCTGCTGAAATCACTTGCGATCTTACTGTAACAAATACCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCACCGCAAGGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGAGACTGCAAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>722|TRGV4 ENST00000390345|TRGV4|5'UTR|TR|TRG|None|00 +GGCCTGAGCTCTCCTGGCCCCTGGCTCTCTTCTGCAGAGGGCCTGCTCTCAGCTGCCACAAGAGGGCGCCGGAGAACGGACCTGAGCAAGAGAGGCAGGAGCTCCTCTGCAGGTCCTCCCAGGCACCAATCCTTCTGGGAGGGAGGAAGGCTTGGGAGTCCTCTTAGACAGATCCTCAGTCACTTCTCTCTGCTTGTGTCTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCTGAGTTTTAAGAGGATCTTCTGCTCCTCTTCATCTGGTCCCTTTCCTTCCAAGGCCTCAGAGAGGAAGGC +>723|TRGV4 ENST00000390345|TRGV4|L-REGION+V-REGION|TR|TRG|None|00 +ATGCAGTGGGCCCTAGCGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACGAAGTCAGTCATCAGGCAGACTGGGTCATCTGCTGAAATCACTTGTGATCTTGCTGAAGGAAGTACCGGCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACACCTCCAGCGTTGTGTTGGAATCAGGAATCAGCCCAGGGAAGTATGATACTTACGGAAGCACAAGGAAGAACTTGAGAATGATACTGCGAAATCTTATTGAAAATGACTCTGGAGTCTATTACTGTGCCACCTGGGATGGG +>724|TRGV5 ENST00000390344|TRGV5|5'UTR|TR|TRG|None|00 +TTCTGGGAGGAAGGCTTGGGAGTCCCCTAAGACACATCTTCAGTCACTTCTCTCTGCCTGTGACTCAGGAAGACCAGCTCCTCCTACTGTCTTCTGTGCTAGGGATCACTTCCTTGTTGAGTGGGGCCGGAGTTTTAAGAGGATCTTCTGCTCCTCCTCATCTGGTCCCTTTCCTTCCAAGGCCCCCGAGAGGAAGGC +>725|TRGV5 ENST00000390344|TRGV5|L-REGION+V-REGION|TR|TRG|None|00 +ATGCGGTGGGCCCTACTGGTGCTTCTAGCTTTCCTGTCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGGGAACGAAGTCAGTCACGAGGCCGACTAGGTCATCTGCTGAAATCACTTGTGACCTTACTGTAATAAATGCCTTCTACATCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACGTCTCCAACTCAAAGGATGTGTTGGAATCAGGACTCAGTCCAGGAAAGTATTATACTCATACACCCAGGAGGTGGAGCTGGATATTGATACTACGAAATCTAATTGAAAATGATTCTGGGGTCTATTACTGTGCCACCTGGGACAGG +>726|TRGV8 ENST00000390343|TRGV8|5'UTR|TR|TRG|None|00 +CTACTGTCTTCTGTGTTAGGGATCACTTCCTTGTTGAGTGGGACCTGAGTTTTGAGAGGGTCTTCTGCTCCTCTTCGTCTGGTCCCTTACTTCCAAGACCCCAGAGAGGAAGGC +>727|TRGV8 ENST00000390343|TRGV8|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTTGGCTCTAGCTCTGCTTCTAGCTTTCCTGCCTCCTGCCAGTCAGAAATCTTCCAACTTGGAAGGGAGAACAAAGTCAGTCACCAGGCCAACTGGGTCATCAGCTGTAATCACTTGTGATCTTCCTGTAGAAAATGCCGTCTACACCCACTGGTACCTACACCAGGAGGGGAAGGCCCCACAGCGTCTTCTGTACTATGACTCCTACAACTCCAGGGTTGTGTTGGAATCAGGAATCAGTCGAGAAAAGTATCATACTTATGCAAGCACAGGGAAGAGCCTTAAATTTATACTGGAAAATCTAATTGAACGTGACTCTGGGGTCTATTACTGTGCCACCTGGGATAGG +>728|TRGV9 ENST00000444775|TRGV9|5'UTR|TR|TRG|None|00 +AAAAAAATTCAAGTCAATCCATAGAAGTGGGTCGTGGAATTCCAGGCAGAAAGTGACTAAATGAAGATGGAAGGACAGGGAGGGGGTGGCCACATCACAGAGAACCTCTTATCCTAAGAACTCTGGACTTCATCTTCAGAGGCAAGGTAGAGAGAGCAAGGACTTTAGAGCAGGAAAAGGACCAGGTCAGTCTAGTGGCCATGGGGAAGGTGGGTGGGAGGGGCCGAGATGGGATGTATGGAGGTGCGTGAGGTGGAGGCAGTGGTGAGCCAGGAAATGTTTAGGACGTAGAATCCTCAGGAATTAGAGTGCGGTGAATTAGAGGGGAGAATTGAGGCTGATGCTCAAGCTCCTGGCTTGGGCAATGTGGGTAGTTATGTCATACAGGGAACTCGGAAGAAGATATGGTTTGGGGGAAGGGAATGAGTTCACTCTGGCTATGAGCAGACTTTGTTTGAGATCCCATGTCAGACGTACTTGAAAATGTCCAAGAGTTAGCTGGATATGGGTACAGACAGCTTTCGATTTAACTGAGGTCCGACTTAAGATTTTTTTTTACTTTATGATGGTGCAAAAGTGACACGCATTTGGTAGAAAACATAATTTGACCTTTGCTGTTTCCCCAGGACAGTGATATAAGGTTATGATACTCTCTTGCGATGCTGGGCAGTGGCAGTGAGCTGCAGCTCCCAGTGGGTAAATTAAGCATGGAAATCTGGAACACAGCAGCTTTTAAGGGATGCACTGGGGAGAGCAGTTTGTAAAAATACCTTGGGACGGATTAAATGTCTTGGCTTAGAGAAAGAACAACAGACAATAGGAAACTGTCATTGAGGAGAAGCCGGGATTCAGGAGATGTACATTATTCAGGTAGCTGAGGGAGGGGACAGGAACCTGAATCTTCAACAGAAGCAAACAAACTGGGATGGAGGGCCCAGCCTCATGAAGGTGACCAGAAGGACCCGGTGCTGCAGGCTGTGTGGGTAGCTGAGCAGAGCTAAGCGGCTTGACGGACCAACATCTCTCCAGCTGGTTGAAGACAAGCTCTCAGAAGACAATGCTGCATGTCACAGCCCCAGCAACCAACAACACCAGCCTGACAACTTGCTGGGGTGGCCGCCTTGTGGTCTGAGGTGGCCGTCTAAACTATGTGGTCTGATCTCAGGCTGCAGACCTTGCAGGACTGTCTTCACACAGACTGGAAGTGCTAACAGGTGGTGAGGACACCGCTTTACAACGATGCAGGGGGCCCCATGTCACCCTCACCCATGGGAAGTTTGACTTGGTGGACTCAGCCAAGCCACAGAGGTCTAACGCTTCTCTGCGGTGATTTCAGGCTGCCCTGGCAGAAAGCACAGTGCCTGCAGAC +>729|TRGV9 ENST00000444775|TRGV9|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGTCACTGCTCCACACATCAACGCTGGCAGTCCTTGGGGCTCTGTGTGTATATGGTGCAGGTCACCTAGAGCAACCTCAAATTTCCAGTACTAAAACGCTGTCAAAAACAGCCCGCCTGGAATGTGTGGTGTCTGGAATAACAATTTCTGCAACATCTGTATATTGGTATCGAGAGAGACCTGGTGAAGTCATACAGTTCCTGGTGTCCATTTCATATGACGGCACTGTCAGAAAGGAATCCGGCATTCCGTCAGGCAAATTTGAGGTGGATAGGATACCTGAAACGTCTACATCCACTCTCACCATTCACAATGTAGAGAAACAGGACATAGCTACCTACTACTGTGCCTTGTGGGAGGTG +>730|TRBD2 GRCh38-release94|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTAGCGGGAGGG +>731|TRAJ15 GRCh38-release94|TRAJ15|J-REGION|TR|TRA|None|00 +CCAACCAGGCAGGAACTGCTCTGATCTTTGGGAAGGGAACCACCTTATCAGTGAGTTCCA +>732|IGLV6-57 GRCh38-release94|IGLV6-57|5'UTR|IG|IGL|None|00 +TCTGAGGATACGCGTGACAGATAAGAAGGGCTGGTGGGATCAGTCCTGGTGGTAGCTCAGGAAGCAGAGCCTGGAGCATCTCCACT +>733|TRBV11-2 GRCh38-release94|TRBV11-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTCCTCTGCTGGGCGGCCCTCTGTCTCCTGGGAGCAGAACTCACAGAAGCTGGAGTTGCCCAGTCTCCCAGATATAAGATTATAGAGAAAAGGCAGAGTGTGGCTTTTTGGTGCAATCCTATATCTGGCCATGCTACCCTTTACTGGTACCAGCAGATCCTGGGACAGGGCCCAAAGCTTCTGATTCAGTTTCAGAATAACGGTGTAGTGGATGATTCACAGTTGCCTAAGGATCGATTTTCTGCAGAGAGGCTCAAAGGAGTAGACTCCACTCTCAAGATCCAACCTGCAAAGCTTGAGGACTCGGCCGTGTATCTCTGTGCCAGCAGC +>734|IGKV2D-40 GRCh38-release94|IGKV2D-40|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGCTCCCTGCTCAGCTCCTGGGGCTGCTAATGCTCTGGGTCCCTGGATCCAGTGAGGATATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCGGCCTCCATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGATGATGGAAACACCTATTTGGACTGGTACCTGCAGAAGCCAGGGCAGTCTCCACAGCTCCTGATCTATACGCTTTCCTATCGGGCCTCTGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGCACTGATTTCACACTGAAAATCAGCAGGGTGGAGGCTGAGGATGTTGGAGTTTATTACTGCATGCAACGTATAGAGTTTCCTTC +>735|TRGV11 AC244625.2|TRGV11|L-REGION+V-REGION|TR|TRG|None|00 +ATGCCACTGGTAGTAGCTGTTATCTTCTTCTCCCTCTGGGTTTTTGCACTTGGGCAGTTGGAACAACCTGAAATATCTATTTCCAGACCAGCAAATAAGAGTGCCCACATATCTTGGAAGGCATCCATCCAAGGCTTTAGCAGTAAAATCATACACTGGTACTGGCAGAAACCAAACAAAGGCTTAGAATATTTATTACATGTCTTCTTGACAATCTCTGCTCAAGATTGCTCAGGTGGGAAGACTAAGAAACTTGAGGTAAGTAAAAATGCTCACACTTCCACTTCCACTTTGAAAATAAAGTTCTTAGAGAAAGAAGATGAGGTGGTGTACCACTGTGCCTGCTGGATTAGGCAC +>736|IGHV1-8 AC_000146.1|IGHV1-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGACCTGGAGGATCCTCTTCTTGGTGGCAGCAGCTACAAGTGCCCACTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGATACACCTTCACCAGTTATGATATCAACTGGGTGCGACAGGCCACTGGACAAGGGCTTGAGTGGATGGGATGGATGAACCCTAACAGTGGTAACACAGGCTATGCACAGAAGTTCCAGGGCAGAGTCACCATGACCAGGAACACCTCCATAAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGG +>737|IGHJ6 GRCh38-release94|IGHJ6|J-REGION|IG|IGH|None|00 +ATTACTACTACTACTACGGTATGGACGTCTGGGGCCAAGGGACCACGGTCACCGTCTCCTCAG +>738|TRBV20-1 GRCh38-release94|TRBV20-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGCTGCTTCTGCTGCTTCTGGGGCCAGCAGGCTCCGGGCTTGGTGCTGTCGTCTCTCAACATCCGAGCAGGGTTATCTGTAAGAGTGGAACCTCTGTGAAGATCGAGTGCCGTTCCCTGGACTTTCAGGCCACAACTATGTTTTGGTATCGTCAGTTCCCGAAACAGAGTCTCATGCTGATGGCAACTTCCAATGAGGGCTCCAAGGCCACATACGAGCAAGGCGTCGAGAAGGACAAGTTTCTCATCAACCATGCAAGCCTGACCTTGTCCACTCTGACAGTGACCAGTGCCCATCCTGAAGACAGCAGCTTCTACATCTGCAGTGCTAGAGA +>739|TRBV7-7 GRCh38-release94|TRBV7-7|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTACCAGTCTCCTATGCTGGGTGGTCCTGGGTTTCCTAGGGACAGATTCTGTTTCCACAGATCACACAGGTGCTGGAGTCTCCCAGTCTCCCAGGTACAAAGTCACAAAGAGGGGACAGGATGTAACTCTCAGGTGTGATCCAATTTCGAGTCATGCAACCCTTTATTGGTATCAACAGGCCCTGGGGCAGGGCCCAGAGTTTCTGACTTACTTCAATTATGAAGCTCAACCAGACAAATCAGGGCTGCCCAGTGATCGGTTCTCTGCAGAGAGGCCTGAGGGATCCATCTCCACTCTGACGATTCAGCGCACAGAGCAGCGGGACTCAGCCATGTATCGCTGTGCCAGCAGCTTAGC +>740|IGHV4-30-4 GRCh38-release94|IGHV4-30-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAACACCTGTGGTTCTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGCTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGATTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCAGACACGGCCGTGTATTACTGT +>741|IGKV1-NL1 GRCh38-release94|IGKV1-NL1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTCCCCGCTCAGCTCCTGGGGCTCCTGCTGCTCTGGCTCCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCCTGTCTGCATCTGTAGGAGACAGAGTCACCATCACTTGCCGGGCGAGTCAGGGCATTAGCAATTCTTTAGCCTGGTATCAGCAGAAACCAGGGAAAGCCCCTAAGCTCCTGCTCTATGCTGCATCCAGATTGGAAAGTGGGGTCCCATCCAGGTTCAGTGGCAGTGGATCTGGGACGGATTACACTCTCACCATCAGCAGCCTGCAGCCTGAAGATTTTGCAACTTATTACTGT +>742|IGHV4-38-2 GRCh38-release94|IGHV4-38-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGCACCTGTGGTTTTTCCTCCTGCTGGTGGCAGCTCCCAGATGGGTCCTGTCCCAGGTGCAGCTGCAGGAGTCGGGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTTACTCCATCAGCAGTGGTTACTACTGGGGCTGGATCCGGCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATCATAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCCGTGTATTACTGT diff --git a/lib/rust/vdj_ann_ref/vdj_refs_old/mouse/fasta/regions.fa b/lib/rust/vdj_ann_ref/vdj_refs_old/mouse/fasta/regions.fa new file mode 100644 index 0000000..a66b964 --- /dev/null +++ b/lib/rust/vdj_ann_ref/vdj_refs_old/mouse/fasta/regions.fa @@ -0,0 +1,1286 @@ +>1|IGHA ENSMUST00000178282|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGGTAAACCCACCAATGTCAGCGTGTCTGTGATCATGTCAGAGGGAGATGGCATCTGCTAC +>2|IGHA ENSMUST00000194738|IGHA|C-REGION|IG|IGH|A|00 +AGTCTGCGAGAAATCCCACCATCTACCCACTGACACTCCCACGAGCTCTGTCAAGTGACCCAGTGATAATCGGCTGCCTGATTCACGATTACTTCCCTTCCGGCACGATGAATGTGACCTGGGGAAAGAGTGGGAAGGATATAACCACCGTAAACTTCCCACCTGCCCTGGCCTCTGGGGGAGGGTACACCATGAGCAGCCAGTTGACCCTGCCAGCTGTCGAGTGCCCAGAAGGAGAATCCGTGAAATGTTCCGTGCAACATGACTCTAACGCCGTCCAAGAATTGGATGTGAAGTGCTCTGGTCCTCCTCCTCCTTGTCCTCCTTGTCCTCCTTCCTGCCATCCCAGCCTGTCACTGCAGCGGCCAGCTCTTGAGGACCTGCTCCTGGGTTCAGATGCCAGCCTCACATGTACTCTGAATGGCCTGAGAAATCCTGAGGGAGCTGTCTTCACCTGGGAGCCCTCCACTGGGAAGGATGCAGTGCAGAAGAAAGCTGTGCAGAATTCCTGCGGCTGCTACAGTGTGTCCAGCGTCCTGCCTGGCTGTGCTGAGCGCTGGAACAGTGGCGCATCATTCAAGTGCACAGTTACCCATCCTGAGTCTGACACCTTAACTGGCACAATTGCCAAAATCACAGTGAACACCTTCCCACCCCAGGTCCACCTGCTACCGCCGCCGTCGGAGGAGCTGGCCCTGAATGAGCTCGTGTCCCTGACATGCCTGGTGCGAGCTTTCAACCCTAAAGAAGTGCTGGTGCGATGGCTGCATGGAAATGAGGAGCTGTCCCCAGAAAGCTACCTAGTGTTTGAGCCCCTAAAGGAGCCAGGCGAGGGAGCCACCACCTACCTGGTGACAAGCGTGTTGCGTGTATCAGCTGAACTCTGGAAACAGGGTGACCAGTACTCCTGCATGGTGGGCCACGAGGCCTTGCCCATGAACTTCACCCAGAAGACCATCGACCGTCTGTCGGAACGTCAAGAGCCACTTTCCTATGTGCTACTGGACCAGTCAGAAGACATCCTGGAGGAAGAGGCCCCAGGTGCCAGCCTGTGGCCCACCACTGTGACCTTCCTCACCCTCTTCCTACTGAGCTTGTTCTACAGCACAGCACTCACTGTTACAACTGTTCGAGGCCCGTTTGGCAGCAAAGAGGTCCCCCAGTAC +>3|IGHD ENSMUST00000192250|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGATGCTACCACCTCCTGCCTGAGTCAGACGGTCCTTCCAGGAGACCTGATGGTCCTGCCCTTGCC +>4|IGHD ENSMUST00000194162|IGHD|C-REGION|IG|IGH|D|00 +GTAATGAAAAGGGACCTGACATGTTCCTCCTCTCAGAGTGCAAAGCCCCAGAGGAAAATGAAAAGATAAACCTGGGCTGTTTAGTAATTGGAAGTCAGCCACTGAAAATCAGCTGGGAGCCAAAGAAGTCAAGTATAGTTGAACATGTCTTCCCCTCTGAAATGAGAAATGGCAATTATACAATGGTCCTCCAGGTCACTGTGCTGGCCTCAGAACTGAACCTCAACCACACTTGCACCATAAATAAACCCAAAAGGAAAGAAAAACCTTTCAAGTTTCCTGAGTCATGGGATTCCCAGTCCTCTAAGAGAGTCACTCCAACTCTCCAAGCAAAGAATCACTCCACAGAAGCCACCAAAGCTATTACCACCAAAAAGGACATAGAAGGGGCCATGGCACCCAGCAACCTCACTGTGAACATCCTGACCACATCCACCCATCCTGAGATGTCATCTTGGCTCCTGTGTGAAGTATCTGGCTTCTTCCCCGAAAATATCCACCTCATGTGGCTGAGTGTCCACAGTAAAATGAAGTCTACAAACTTTGTCACTGCAAACCCCACCCCCCAGCCTGGGGGCACATTCCAGACCTGGAGTGTCCTGAGACTACCAGTCGCTCTGAGCTCATCACTTGACACTTACACATGTGTGGTGGAACATGAGGCCTCAAAGACAAAGCTTAATGCCAGCAAGAGCCTAGCAATTAGTGGCATAGTCAACACCATCCAACACTCGTGTATCATGGATGAGCAAAGTGACAGCTACATGGACTTAGAGGAGGAGAACGGCCTGTGGCCCACAATGTGCACCTTCGTGGCCCTCTTCCTGCTCACACTGCTCTACAGTGGCTTCGTCACCTTCATCAAGGTGAAG +>5|IGHD1-1 ENSMUST00000103439|IGHD1-1|D-REGION|IG|IGH|None|00 +TTTATTACTACGGTAGTAGCTAC +>6|IGHD2-3 ENSMUST00000177839|IGHD2-3|D-REGION|IG|IGH|None|00 +TCTATGATGGTTACTAC +>7|IGHD2-4 ENSMUST00000179560|IGHD2-4|D-REGION|IG|IGH|None|00 +TCTACTATGATTACGAC +>8|IGHD2-5 ENSMUST00000178549|IGHD2-5|D-REGION|IG|IGH|None|00 +CCTACTATAGTAACTAC +>9|IGHD2-7 ENSMUST00000177965|IGHD2-7|D-REGION|IG|IGH|None|00 +TCTACTATGGTTACGAC +>10|IGHD2-8 ENSMUST00000180001|IGHD2-8|D-REGION|IG|IGH|None|00 +TCTACTATGGTAACTAC +>11|IGHD3-1 ENSMUST00000180266|IGHD3-1|D-REGION|IG|IGH|None|00 +GGCACAGCTCGGGCTAC +>12|IGHD3-2 ENSMUST00000179883|IGHD3-2|D-REGION|IG|IGH|None|00 +AGACAGCTCAGGCTAC +>13|IGHD4-1 ENSMUST00000179520|IGHD4-1|D-REGION|IG|IGH|None|00 +CTAACTGGGAC +>14|IGHD5-2 ENSMUST00000179166|IGHD5-2|D-REGION|IG|IGH|None|00 +GAATACCTAC +>15|IGHD5-5 ENSMUST00000178815|IGHD5-5|D-REGION|IG|IGH|None|00 +GACTACCTAC +>16|IGHD5-7 ENSMUST00000178483|IGHD5-7|D-REGION|IG|IGH|None|00 +AGGCAGCTAGCCTCTGCAGTGCCACAACC +>17|IGHD5-8 ENSMUST00000178909|IGHD5-8|D-REGION|IG|IGH|None|00 +AGACAGCTAGCCTCTGCAGTGCCACAACC +>18|IGHE ENSMUST00000137336|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGGTAACACCTCCCTCCATCCCTCC +>19|IGHE ENSMUST00000223335|IGHE|C-REGION|IG|IGH|E|00 +CCTCTATCAGGAACCCTCAGCTCTACCCCTTGAAGCCCTGTAAAGGCACTGCTTCCATGACCCTGGGCTGCCTGGTAAAGGACTACTTCCCTGGTCCTGTGACTGTGACCTGGTATTCAGACTCCCTGAACATGAGCACTGTGAACTTCCCTGCCCTTGGTTCTGAACTCAAGGTCACCACCAGCCAAGTGACCAGCTGGGGCAAGTCAGCCAAGAACTTCACATGCCACGTGACACATCCTCCATCATTCAACGAAAGTAGGACTATCCTAGTTCGACCTGTCAACATCACTGAGCCCACCTTGGAGCTACTCCATTCATCCTGCGACCCCAATGCTTTCCACTCCACCATCCAGCTGTACTGCTTCATTTATGGCCACATCCTAAATGATGTCTCTGTCAGCTGGCTAATGGACGATCGGGAGATAACTGATACACTTGCACAAACTGTTCTAATCAAGGAGGAAGGCAAACTAGCCTCTACCTGCAGTAAACTCAACATCACTGAGCAGCAATGGATGTCTGAAAGCACCTTCACCTGCAAGGTCACCTCCCAAGGCGTAGACTATTTGGCCCACACTCGGAGATGCCCAGATCATGAGCCACGGGGTGTGATTACCTACCTGATCCCACCCAGCCCCCTGGACCTGTATCAAAACGGTGCTCCCAAGCTTACCTGTCTGGTGGTGGACCTGGAAAGCGAGAAGAATGTCAATGTGACGTGGAACCAAGAGAAGAAGACTCCAGTCTCAGCATCCCAGTGGTACACTAAGCACCACCATAACGCCACAACCAGTATCACCTCCATCCTGCCTGTAGTTGCCAAGGACTGGATTGAAGGCTACGGCTATCAGTGCATAGTGGACCACCCTGATTTTCCCAAGCCCATTGTGCGTTCCATCACCAAGACCCCAGGCCAGCGCTCAGCCCCCGAGGTATATGTGTTCCCACCACCAGAGGAGGAGAGCGAGGACAAACGCACACTCACCTGCTTGATCCAGAACTTCTTCCCTGAGGATATCTCTGTGCAGTGGCTGGAGGATGGCAAACTGATCTCAAACAGCCATCACAGTACCACAACACCCCTGAAATCCAATGGCTCCAATCAAGGCTTCTTCATCTTCAGTCGCCTAGAGGTCGCCAAGACACTCTGGACACAGAGAAAACAGTTCACCTGCCAAGTGATCCATGAGGCACTTCAGAAACCCAGGAAACTGGAGAAAACAATATCCACGAGCCTTGAGCTAGACCTCCAGGACCTATGTATTGAAGAGGTGGAGGGCGAGGAGCTGGAAGAGCTGTGGACCAGTATTTGTGTCTTCATCACCCTGTTCCTGCTCAGTGTGAGCTATGGGGCCACTGTCACCGTCCTCAAGGTGAAGTGGGTCTTCTCCACACCGATGCAGGATACACCCCAGACCTTCCAAGACTATGCCAACATCTTCCAGACCAGGGCA +>20|IGHG1 ENSMUST00000103420|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGTAAA +>21|IGHG1 ENSMUST00000194304|IGHG1|C-REGION|IG|IGH|G1|00 +CCAAAACGACACCCCCATCTGTCTATCCACTGGCCCCTGGATCTGCTGCCCAAACTAACTCCATGGTGACCCTGGGATGCCTGGTCAAGGGCTATTTCCCTGAGCCAGTGACAGTGACCTGGAACTCTGGATCCCTGTCCAGCGGTGTGCACACCTTCCCAGCTGTCCTGCAGTCTGACCTCTACACTCTGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCCAGCCAGACCGTCACCTGCAACGTTGCCCACCCGGCCAGCAGCACCAAGGTGGACAAGAAAATTGTGCCCAGGGATTGTGGTTGTAAGCCTTGCATATGTACAGTCCCAGAAGTATCATCTGTCTTCATCTTCCCCCCAAAGCCCAAGGATGTGCTCACCATTACTCTGACTCCTAAGGTCACGTGTGTTGTGGTAGACATCAGCAAGGATGATCCCGAGGTCCAGTTCAGCTGGTTTGTAGATGATGTGGAGGTGCACACAGCTCAGACGAAACCCCGGGAGGAGCAGATCAACAGCACTTTCCGTTCAGTCAGTGAACTTCCCATCATGCACCAGGACTGGCTCAATGGCAAGGAGTTCAAATGCAGGGTCAACAGTGCAGCTTTCCCTGCCCCCATCGAGAAAACCATCTCCAAAACCAAAGGCAGACCGAAGGCTCCACAGGTGTACACCATTCCACCTCCCAAGGAGCAGATGGCCAAGGATAAAGTCAGTCTGACCTGCATGATAACAAACTTCTTCCCTGAAGACATTACTGTGGAGTGGCAGTGGAATGGGCAGCCAGCGGAGAACTACAAGAACACTCAGCCCATCATGGACACAGATGGCTCTTACTTCGTCTACAGCAAGCTCAATGTGCAGAAGAGCAACTGGGAGGCAGGAAATACTTTCACCTGCTCTGTGTTACATGAGGGCCTGCACAACCACCATACTGAGAAGAGCCTCTCCCACTCTCCTGGGCTGCAACTGGACGAGACCTGTGCTGAGGCCCAGGACGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGTGTGTGCTACAGCGCTGCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCGGTGGTGGAGCTGAAGCAGACACTGGTTCCTGAATACAAGAACATGATTGGGCAAGCACCC +>22|IGHG2B ENSMUST00000103418|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>23|IGHG2B ENSMUST00000192188|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCTGTGACTCTGGGATGCCTGGTCAAGGGCTACTTCCCTGAGTCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCGGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACATCTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTCCTGGACTCTGACGGTTCTTACTTCATATACAGCAAGCTCGATATAAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGGCTAGACCTGGATGATATCTGTGCTGAGGCCAAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCAGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>24|IGHG2C ENSMUST00000103416|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGGCTAGACCTGGATGATGTCTGTACTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACAACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGTTACAGCGCCTCTGTCACACTCTTCAAGGTAAAGTGGATCTTCTCCTCTGTGGTGGAGCTGAAGCAGAAGATCTCCCCTGACTACAGAAACATGATTGGGCAGGGAGCC +>25|IGHG2C ENSMUST00000195192|IGHG2C|C-REGION|IG|IGH|G2C|00 +CCAAAACAACAGCCCCATCGGTCTATCCACTGGCCCCTGTGTGTGGAGGTACAACTGGCTCCTCGGTGACTCTAGGATGCCTGGTCAAGGGTTATTTCCCTGAGCCAGTGACCTTGACCTGGAACTCTGGATCCCTGTCCAGTGGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGCCTCTACACCCTCAGCAGCTCAGTGACTGTAACCTCGAACACCTGGCCCAGCCAGACCATCACCTGCAATGTGGCCCACCCGGCAAGCAGCACCAAAGTGGACAAGAAAATTGAGCCCAGAGTGCCCATAACACAGAACCCCTGTCCTCCACTCAAAGAGTGTCCCCCATGCGCAGCTCCAGACCTCTTGGGTGGACCATCCGTCTTCATCTTCCCTCCAAAGATCAAGGATGTACTCATGATCTCCCTGAGCCCCATGGTCACATGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTCTCCGGGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTCAACAACAGAGCCCTCCCATCCCCCATCGAGAAAACCATCTCAAAACCCAGAGGGCCAGTAAGAGCTCCACAGGTATATGTCTTGCCTCCACCAGCAGAAGAGATGACTAAGAAAGAGTTCAGTCTGACCTGCATGATCACAGGCTTCTTACCTGCCGAAATTGCTGTGGACTGGACCAGCAATGGGCGTACAGAGCAAAACTACAAGAACACCGCAACAGTCCTGGACTCTGATGGTTCTTACTTCATGTACAGCAAGCTCAGAGTACAAAAGAGCACTTGGGAAAGAGGAAGTCTTTTCGCCTGCTCAGTGGTCCACGAGGGTCTGCACAATCACCTTACGACTAAGACCATCTCCCGGTCTCTGGGTAAA +>26|IGHG3 ENSMUST00000103423|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGGTAAA +>27|IGHG3 ENSMUST00000223179|IGHG3|C-REGION|IG|IGH|G3|00 +CTACAACAACAGCCCCATCTGTCTATCCCTTGGTCCCTGGCTGCGGTGACACATCTGGATCCTCGGTGACACTGGGATGCCTTGTCAAAGGCTACTTCCCTGAGCCGGTAACTGTAAAATGGAACTATGGAGCCCTGTCCAGCGGTGTGCGCACAGTCTCATCTGTACTGCAGTCTGGGTTCTATTCCCTCAGCAGCTTGGTGACTGTACCCTCCAGCACCTGGCCCAGCCAGACTGTCATCTGCAACGTAGCCCACCCAGCCAGCAAGACTGAGTTGATCAAGAGAATCGAGCCTAGAATACCCAAGCCCAGTACCCCCCCAGGTTCTTCATGCCCACCTGGTAACATCTTGGGTGGACCATCCGTCTTCATCTTCCCCCCAAAGCCCAAGGATGCACTCATGATCTCCCTAACCCCCAAGGTTACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGATGTCCATGTCAGCTGGTTTGTGGACAACAAAGAAGTACACACAGCCTGGACGCAGCCCCGTGAAGCTCAGTACAACAGTACCTTCCGAGTGGTCAGTGCCCTCCCCATCCAGCACCAGGACTGGATGAGGGGCAAGGAGTTCAAATGCAAGGTCAACAACAAAGCCCTCCCAGCCCCCATCGAGAGAACCATCTCAAAACCCAAAGGAAGAGCCCAGACACCTCAAGTATACACCATACCCCCACCTCGTGAACAAATGTCCAAGAAGAAGGTTAGTCTGACCTGCCTGGTCACCAACTTCTTCTCTGAAGCCATCAGTGTGGAGTGGGAAAGGAACGGAGAACTGGAGCAGGATTACAAGAACACTCCACCCATCCTGGACTCGGATGGGACCTACTTCCTCTACAGCAAGCTCACTGTGGATACAGACAGTTGGTTGCAAGGAGAAATTTTTACCTGCTCCGTGGTGCATGAGGCTCTCCATAACCACCACACACAGAAGAACCTGTCTCGCTCCCCTGAGCTGGAACTGAATGAGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTCTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>28|IGHJ1 ENSMUST00000103430|IGHJ1|J-REGION|IG|IGH|None|00 +CTACTGGTACTTCGATGTCTGGGGCACAGGGACCACGGTCACCGTCTCCTCAG +>29|IGHJ2 ENSMUST00000192746|IGHJ2|J-REGION|IG|IGH|None|00 +ACTACTTTGACTACTGGGGCCAAGGCACCACTCTCACAGTCTCCTCAG +>30|IGHJ3 ENSMUST00000103428|IGHJ3|J-REGION|IG|IGH|None|00 +CCTGGTTTGCTTACTGGGGCCAAGGGACTCTGGTCACTGTCTCTGCAG +>31|IGHJ4 ENSMUST00000103427|IGHJ4|J-REGION|IG|IGH|None|00 +ATTACTATGCTATGGACTACTGGGGTCAAGGAACCTCAGTCACCGTCTCCTCAG +>32|IGHM ENSMUST00000103426|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGGTAAACCCACACTGTACAATGTCTCCCTGATCATGTCTGACACAGGCGGCACCTGCTAT +>33|IGHM ENSMUST00000177715|IGHM|C-REGION|IG|IGH|M|00 +AGAGTCAGTCCTTCCCAAATGTCTTCCCCCTCGTCTCCTGCGAGAGCCCCCTGTCTGATAAGAATCTGGTGGCCATGGGCTGCCTGGCCCGGGACTTCCTGCCCAGCACCATTTCCTTCACCTGGAACTACCAGAACAACACTGAAGTCATCCAGGGTATCAGAACCTTCCCAACACTGAGGACAGGGGGCAAGTACCTAGCCACCTCGCAGGTGTTGCTGTCTCCCAAGAGCATCCTTGAAGGTTCAGATGAATACCTGGTATGCAAAATCCACTACGGAGGCAAAAACAAAGATCTGCATGTGCCCATTCCAGCTGTCGCAGAGATGAACCCCAATGTAAATGTGTTCGTCCCACCACGGGATGGCTTCTCTGGCCCTGCACCACGCAAGTCTAAACTCATCTGCGAGGCCACGAACTTCACTCCAAAACCGATCACAGTATCCTGGCTAAAGGATGGGAAGCTCGTGGAATCTGGCTTCACCACAGATCCGGTGACCATCGAGAACAAAGGATCCACACCCCAAACCTACAAGGTCATAAGCACACTTACCATCTCTGAAATCGACTGGCTGAACCTGAATGTGTACACCTGCCGTGTGGATCACAGGGGTCTCACCTTCTTGAAGAACGTGTCCTCCACATGTGCTGCCAGTCCCTCCACAGACATCCTAACCTTCACCATCCCCCCCTCCTTTGCCGACATCTTCCTCAGCAAGTCCGCTAACCTGACCTGTCTGGTCTCAAACCTGGCAACCTATGAAACCCTGAATATCTCCTGGGCTTCTCAAAGTGGTGAACCACTGGAAACCAAAATTAAAATCATGGAAAGCCATCCCAATGGCACCTTCAGTGCTAAGGGTGTGGCTAGTGTTTGTGTGGAAGACTGGAATAACAGGAAGGAATTTGTGTGTACTGTGACTCACAGGGATCTGCCTTCACCACAGAAGAAATTCATCTCAAAACCCAATGAGGTGCACAAACATCCACCTGCTGTGTACCTGCTGCCACCAGCTCGTGAGCAACTGAACCTGAGGGAGTCAGCCACAGTCACCTGCCTGGTGAAGGGCTTCTCTCCTGCAGACATCAGTGTGCAGTGGCTTCAGAGAGGGCAACTCTTGCCCCAAGAGAAGTATGTGACCAGTGCCCCGATGCCAGAGCCTGGGGCCCCAGGCTTCTACTTTACCCACAGCATCCTGACTGTGACAGAGGAGGAATGGAACTCCGGAGAGACCTATACCTGTGTTGTAGGCCACGAGGCCCTGCCACACCTGGTGACCGAGAGGACCGTGGACAAGTCCACTGAGGGGGAGGTGAATGCTGAGGAGGAAGGCTTTGAGAACCTGTGGACCACTGCCTCCACCTTCATCGTCCTCTTCCTCCTGAGCCTCTTCTACAGCACCACCGTCACCCTGTTCAAGGTGAAA +>34|IGHV1-11 ENSMUST00000191801|IGHV1-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCCAGATCACCCTCTTTCTGGTGGCAGCAATTACATGTGCCTACTCCCAGATCCAGCTGCAACAGTCAGGAGCTGAGCTGGCGAGTCCTGGGGCATCAGTGACACTGTCCTGCAAGGCTTCTGGCTACACATTTACTGACCATATTATGAATTGGGTAAAAAAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAGGATTTATCCAGTAAGTGGTGAAACTAACTACAATCAAAAGTTCATGGGCAAGGCCACATTCTCTGTAGACCGGTCCTCCAGCACAGTGTACATGGTGTTGAACAGCCTGACATCTGAGGACCCTGCTGTCTATTACTGTGGAAGG +>35|IGHV1-12 ENSMUST00000109711|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>36|IGHV1-12 ENSMUST00000109711|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>37|IGHV1-12 ENSMUST00000195469|IGHV1-12|5'UTR|IG|IGH|None|00 +CCTCTCCACAGTCCCTGAAGACACTGACTCTAACC +>38|IGHV1-12 ENSMUST00000195469|IGHV1-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATTCAGCAGGATCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGCTTATCTACAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTTACCAGTTACAATATGCACTGGGTAAAGCAGACACCTAGACAGGGCCTGGAATGGATTGGAGCTATTTATCCAGGAAATGGTGATACTTCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGA +>39|IGHV1-15 ENSMUST00000192077|IGHV1-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAATTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGACGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGGGTGAAGCAGACACCTGTGCATGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTGGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCATACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>40|IGHV1-18 ENSMUST00000194350|IGHV1-18|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCCTCTTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATACCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGGACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTATCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACACTGCAGTCTATTACTGTGCAAGA +>41|IGHV1-19 ENSMUST00000193855|IGHV1-19|5'UTR|IG|IGH|None|00 +AACAACACATGTCCAATGTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>42|IGHV1-19 ENSMUST00000193855|IGHV1-19|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGTAAGGCTTCTGGATACACATTCACTGACTACTATATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGTTATTAATCCTTACAACGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTTGACAAGTCCTCCAGCACAGCCTACATGGAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>43|IGHV1-20 ENSMUST00000194968|IGHV1-20|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGCAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGATTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGATGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCGGAGCCTGACATCTGAGGACTCTGCAGTCTATTATTGTGCAAGA +>44|IGHV1-22 ENSMUST00000103507|IGHV1-22|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGAAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACATTCACTGACTACAACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTAACCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAAACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCGGAGGATTCTGCAGTCTATTACTGTGCAAGA +>45|IGHV1-23 ENSMUST00000194625|IGHV1-23|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCAATCCCAGGTTCAACTGCAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCGGGCTACACATTTACTGACTATGAAATGCACTGTGTGAAGCAGACACCTGTGCACGGCCTGGAATGGATTGGAGCTATTGATCCTGAAACTTGTGGTACTGCCTACAATCAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCCGTCTATTACTGTACAAGA +>46|IGHV1-24 ENSMUST00000191861|IGHV1-24|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCGGCTGCAGCAGTCTGGACCTAAGGTAGTGAATGCTGGGGCTTCCGTGAAGCTGTCCTGCAAGTCTTCTGGTTACTCATTCAGTAGATACAAAATGGAATGTGTGAAACAGAGCCATGGAAAGAGCCTTGAGTGGATTGAACATATTAATCTTTTCAAAGGTGTTACTAACTACAATGGAAAGTTCAAAAGCAAGGCCACATTGACTGTAGACATATCCTCTAGCACAGCCTATATGGAGCTTAGCAGATTGACATCTGAAGACTCAGAGGTATATTACTGTGCAAGA +>47|IGHV1-26 ENSMUST00000103510|IGHV1-26|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAATCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATACACGTTCACTGACTACTACATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGAGATATTAATCCTAACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>48|IGHV1-31 ENSMUST00000195735|IGHV1-31|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTATCTGGATCTTTCTCTTCCTTCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAGAGCCATGGAAATATCCTCGATTGGATTGGATATATTTATCCTTACAATGGTGTTTCTAGCTACAACCAGAAATTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCTAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>49|IGHV1-34 ENSMUST00000103512|IGHV1-34|5'UTR|IG|IGH|None|00 +GTCCTCTCCACAGACACTGAACACACTGACTCTAACC +>50|IGHV1-34 ENSMUST00000103512|IGHV1-34|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGAGTTGGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGATATATTTATCCTAACAATGGTGGTAATGGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAGTCCTCCAGCACAGCCTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>51|IGHV1-36 ENSMUST00000191862|IGHV1-36|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGGTGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCTCTCTGAGGTCCAGCTGCAACAGTCTGGACCTGTGCTGGTGAAGCCTGGGCCTTCAGTGAAGATATCCTGTAAGGCTTCTGGATTCACATTCACTGACTACTACATGCACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACTTGTTTATCCTTACAATGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGGAGCTAAACAGCCTGACTTCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>52|IGHV1-37 ENSMUST00000193950|IGHV1-37|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTTCTCCTGTCAGTAACTGTAGGTGTGTTCTCTGAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTTACTGGCTACTTTATGAACTGGGTGAAGCAGAGCCATGGAAAGAGCCTTGAGTGGATTGGACGTATTAATCCTTACAATGGTGATACTTTCTACAACCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCTAGCACAGCCCACATGGAGCTCCTGAGCCTGACATCTGAGGACTTTGCAGTCTATTATTGTGCAAGA +>53|IGHV1-39 ENSMUST00000103515|IGHV1-39|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTCTCAGGAACTGCAGGTGTCCACTCTGAGTTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGCGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGACTACAACATGAACTGGGTGAAGCAGAGCAATGGAAAGAGCCTTGAGTGGATTGGAGTAATTAATCCTAACTATGGTACTACTAGCTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACCAATCTTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>54|IGHV1-4 ENSMUST00000103493|IGHV1-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTTCCTGTTGTCAGTAACTTCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAGACCTGGTGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACACGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTGAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>55|IGHV1-42 ENSMUST00000191868|IGHV1-42|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAACTGGATCTTTATTTTAATCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGAACTGGGTGAAGCAAAGTCCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTACCTACAACCAGAAGTTCAAGGCCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCAGTCTATTACTGTGCAAGA +>56|IGHV1-43 ENSMUST00000195417|IGHV1-43|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTACAGGTGTCCACTCTGAGGTCAAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGTTACTCATTCACTGGCTACTACATGCACTGGGTGAAGCAAAGTTCTGAAAAGAGCCTTGAGTGGATTGGAGAGATTAATCCTAGCACTGGTGGTACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCACATTAACTGTAGACAAGTCATCCAGCACAGCCTACATGCAGCTCAAGAGCCTGACATCTGAGGACTCTGCTGTCTATTACTGTGCAAGA +>57|IGHV1-47 ENSMUST00000194865|IGHV1-47|5'UTR|IG|IGH|None|00 +ATAAGATCAGTCTTCTCTATAATCACTGAGTGCAGAGGACCTCACA +>58|IGHV1-47 ENSMUST00000194865|IGHV1-47|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCGTGGATCTCTATCATCCTCTTCCTAGTGGCAACAGCTATAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTAGTGAAGCCTGGAGCCTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACTACCTATCCTATAGAGTGGATGAAGCAGAATCATGGAAAGAGCCTAGAGTGGATTGGAAATTTTCATCCTTACAATGATGATACTAAGTACAATGAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGAAAAATCCTCTAGCACAGTCTACTTGGAGCTCAGCCGATTAACATCTGATGACTCTGCTGTTTATTACTGTGCAAGG +>59|IGHV1-49 ENSMUST00000192724|IGHV1-49|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGGTCTTTCTCTTCCTCCTGTCAGGAACTGCAGGAGTCCACTCACAGCGTGAGCTGCAGCAGTCTGGAGCTGAGTTGGTGAGACCTGGGTCCTCAGTGAAGTTGTCCTGCAAGGATTCTTACTTTGCCTTCATGGCCAGTGCTATGCACTGGGTGAAGCAAAGACCTGGACATGGCCTGGAATGGATAGGATCTTTTACTATGTACAGTGATGCTACTGAGTACAGTGAAAACTTCAAGGGCAAGGCCACATTGACTGCAAACACATCCTCGAGCACAGCCTACATGGAACTCAGCAGCCTCACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>60|IGHV1-5 ENSMUST00000191803|IGHV1-5|5'UTR|IG|IGH|None|00 +GATCAGTATCCTCTTCACAGTCACTGAAAACATTGACTCTAATC +>61|IGHV1-5 ENSMUST00000191803|IGHV1-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGTAACTGGATACTTCCTTTTATTCTGTCGGTAACTTCAGGGGTCTACTCAGAGGTTCAGCTCCAGCAGTCTGGGACTGTGCTGGCAAGGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGACTTCTGGCTACACATTTACCAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATAGGGGCTATTTATCCTGGAAATAGTGATACTAGCTACAACCAGAAGTTCAAGGGCAAGGCCAAACTGACTGCAGTCACATCCGCCAGCACTGCCTACATGGAGCTCAGCAGCCTGACAAATGAGGACTCTGCGGTCTATTACTGTACAAGA +>62|IGHV1-50 ENSMUST00000103521|IGHV1-50|5'UTR|IG|IGH|None|00 +CTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCGCC +>63|IGHV1-50 ENSMUST00000103521|IGHV1-50|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCTCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGCTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>64|IGHV1-52 ENSMUST00000192554|IGHV1-52|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCATTGGGTGAAGCAGAGGCCTATACAAGGCCTTGAATGGATTGGTAACATTGACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>65|IGHV1-53 ENSMUST00000103523|IGHV1-53|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGACTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAAATATTAATCCTAGCAATGGTGGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>66|IGHV1-54 ENSMUST00000103525|IGHV1-54|5'UTR|IG|IGH|None|00 +AGTCCCTGAACACACTGACTCTCACC +>67|IGHV1-54 ENSMUST00000103525|IGHV1-54|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCAGAGTCTTTATCTTTCTCCTATCAGTAACTGCAGGTGTTCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGATACGCCTTCACTAATTACTTGATAGAGTGGGTAAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGTGATTAATCCTGGAAGTGGTGGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCAACACTGACTGCAGACAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>68|IGHV1-55 ENSMUST00000103526|IGHV1-55|5'UTR|IG|IGH|None|00 +CACCACACAAAAAAGCATAAGATCACTGTTCTCTCTACAGTTACTAAGCACACAGGATCTCACC +>69|IGHV1-55 ENSMUST00000103526|IGHV1-55|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCATTTTGGTAGCAGCAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGATGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATAACCTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAGATATTTATCCTGGTAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>70|IGHV1-56 ENSMUST00000194071|IGHV1-56|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGTTGGGTCTTTCTTTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTCCTGGCTATACCTTCACCAGCCACTGGATGCAGTGGGTAAGACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>71|IGHV1-58 ENSMUST00000103529|IGHV1-58|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGATCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCTGAGGTCCAGCTTCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGTCCTCAGTGAAGATGTCCTGCAAGACTTCTGGATATACATTCACAAGCTACGGTATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTGGAATGGATTGGATATATTTATATTGGAAATGGTTATACTGAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTTCAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAATCTATTTCTGTGCAAGA +>72|IGHV1-59 ENSMUST00000195359|IGHV1-59|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATTGTCCTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGACTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTAAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGTGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>73|IGHV1-61 ENSMUST00000103531|IGHV1-61|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTGAGGCCTGGGTCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGGATTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAATGGATTGGTAACATTTACCCTTCTGATAGTGAAACTCACTACAATCAAAAGTTCAAGGACAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>74|IGHV1-62-1 ENSMUST00000103503|IGHV1-62-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAACAGAGTTGGGTCTTACTCTTCCTCCTGTCAGAAACTGCAGGTGTCCACTGCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAGAGATTTTTCCTGGAAGTGGTAGTACTTATTATAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACAGCAGAGAACTCTGCAATCTATCTGTGCAAGG +>75|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|5'UTR|IG|IGH|None|00 +GAACACACTGACTCAAACC +>76|IGHV1-62-2 ENSMUST00000194581|IGHV1-62-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATTGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>77|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>78|IGHV1-62-3 ENSMUST00000103532|IGHV1-62-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTTCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCAGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>79|IGHV1-63 ENSMUST00000103534|IGHV1-63|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCGGGGTCTTTATCTTTCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTAAGGCCTGGGACTTCAGTGAAGATGTCCTGCAAGGCTTCTGGATACACCTTCACTAACTACTGGATAGGTTGGGCAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGATATTTACCCTGGAGGTGGTTATACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGTTCAGCAGCCTGACATCTGAGGACTCTGCCATCTATTACTGTGCAAGA +>80|IGHV1-64 ENSMUST00000103535|IGHV1-64|5'UTR|IG|IGH|None|00 +AAAAACATGAGATCACAGTTCTCTCTACAGTTACTGAGCACACAGGACCTCACA +>81|IGHV1-64 ENSMUST00000103535|IGHV1-64|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTATATCATCCTCTTTTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTGGTAAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACTTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATTGGAATGATTCATCCTAATAGTGGTAGTACTAACTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>82|IGHV1-66 ENSMUST00000103537|IGHV1-66|5'UTR|IG|IGH|None|00 +ATGATCAGTGTCCTCTCTACACAGTCCCTGACGACACTGACTCTAACC +>83|IGHV1-66 ENSMUST00000103537|IGHV1-66|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACAGCTTCACAAGCTACTATATACACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGTGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACGGCAGACACATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTAACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>84|IGHV1-69 ENSMUST00000199933|IGHV1-69|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATCCTCTTCTTGGTATCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGATGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACAAGGCCTTGAGTGGATCGGAGAGATTGATCCTTCTGATAGTTATACTAACTACAATCAAAAGTTCAAGGGCAAGTCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAAGA +>85|IGHV1-7 ENSMUST00000103496|IGHV1-7|5'UTR|IG|IGH|None|00 +GCATCCTCTCCACAGACACTGAAAACTCTGACTCAAC +>86|IGHV1-7 ENSMUST00000103496|IGHV1-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAAAGGCACTGGATCTTTCTCTCCCTGTTGTCAGTAATAGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGGGCTGAACTGGCAAAACCTGGGGCCTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTTACTAGCTACTGGATGCACTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATTGGATACATTAATCCTAGCAGTGGTTATACTAAGTACAATCAGAAGTTCAAGGACAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTGAGCAGCCTGACATATGAGGACTCTGCAGTCTATTACTGTGCAAGA +>87|IGHV1-71 ENSMUST00000196690|IGHV1-71|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGTGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTCCAGCTGCAGCAGTCTGGAGCTGAGCTGGTGAAACCCGGGGCATCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACTGAGTATACTATACACTGGGTAAAGCAGAGGTCTGGACAGGGTCTTGAGTGGATTGGGTGGTTTTACCCTGGAAGTGGTAGTATAAAGTACAATGAGAAATTCAAGGACAAGGCCACATTGACTGCGGACAAATCCTCCAGCACAGTCTATATGGAGCTTAGTAGATTGACATCTGAAGACTCTGCGGTCTATTTCTGTGCAAGACACGAAGA +>88|IGHV1-72 ENSMUST00000103541|IGHV1-72|5'UTR|IG|IGH|None|00 +AGATCACTGTTCTCTTTACAGTTACTGAGCACACAGGACCTCACC +>89|IGHV1-72 ENSMUST00000103541|IGHV1-72|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGTATCATGCTCTTCTTGGCAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAGCTTGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGACGAGGCCTTGAGTGGATTGGAAGGATTGATCCTAATAGTGGTGGTACTAAGTACAATGAGAAGTTCAAGAGCAAGGCCACACTGACTGTAGACAAACCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTATTGTGCAAGA +>90|IGHV1-74 ENSMUST00000196587|IGHV1-74|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGATGGAGCTGTATCATCCTCTTCTTGGTAGCAACAGCTACAGGTGTCCACTCCCAGGTCCAACTGCAGCAGCCTGGGGCTGAACTGGTGAAGCCTGGGGCTTCAGTGAAGGTGTCCTGCAAGGCTTCTGGCTACACCTTCACCAGCTACTGGATGCACTGGGTGAAGCAGAGGCCTGGCCAAGGCCTTGAGTGGATTGGAAGGATTCATCCTTCTGATAGTGATACTAACTACAATCAAAAGTTCAAGGGCAAGGCCACATTGACTGTAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGTGCAATA +>91|IGHV1-75 ENSMUST00000103544|IGHV1-75|5'UTR|IG|IGH|None|00 +CCTGACGACACTGACTCTAACC +>92|IGHV1-75 ENSMUST00000103544|IGHV1-75|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGGTCCAGCTACAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTTTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTTACTGTAGACAAATCCTCCAGCACAGCCTACATGTTGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>93|IGHV1-76 ENSMUST00000197537|IGHV1-76|5'UTR|IG|IGH|None|00 +CGACACTGATTCTAACC +>94|IGHV1-76 ENSMUST00000197537|IGHV1-76|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTTTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTGTCAGGTCCAGCTGAAGCAGTCTGGGGCTGAGCTGGTGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACTTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGCAAGGATTTATCCTGGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGAAAAATCCTCCAGCACTGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCTGTCTATTTCTGTGCAAGA +>95|IGHV1-77 ENSMUST00000198777|IGHV1-77|5'UTR|IG|IGH|None|00 +AAACAACCTATGATCAGTGTCCTCTCCACAGTCTCTGAACACCCTTACTCAAACC +>96|IGHV1-77 ENSMUST00000198777|IGHV1-77|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTGCCAGGTCCAGCTGAAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGCCTTGAGTGGATTGGAAAGATTGGTCCTGGAAGTGGTAGTACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>97|IGHV1-78 ENSMUST00000199373|IGHV1-78|5'UTR|IG|IGH|None|00 +GTCCCTGAACACACTGACTGTAACA +>98|IGHV1-78 ENSMUST00000199373|IGHV1-78|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAGCTGGGTCTCTCTCTTCTTCCTGTCAGTAACTACAGGTGTCCACTCCCAGGTTCAGCTGCAACAGTCTGACGCTGAGTTGGTGAAACCTGGAGCTTCAGTGAAGATATCCTGCAAGGTTTCTGGCTACACCTTCACTGACCATACTATTCACTGGATGAAGCAGAGGCCTGAACAGGGCCTGGAATGGATTGGATATATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAACAGCCTGACATCTGAGGACTCTGCAGTCTATTTCTGTGCAAGA +>99|IGHV1-80 ENSMUST00000103547|IGHV1-80|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTTGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAAGCTTCTGGCTACGCATTCAGTAGCTACTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACAGATTTATCCTGGAGATGGTGATACTAACTACAACGGAAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>100|IGHV1-81 ENSMUST00000103548|IGHV1-81|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGATCTGGATCTTTCTCTTCATCCTGTCAGGAACTGCAGGTGTCCAATCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGGCGAGGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTATGGTATAAGCTGGGTGAAGCAGAGAACTGGACAGGGCCTTGAGTGGATTGGAGAGATTTATCCTAGAAGTGGTAATACTTACTACAATGAGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCGTACATGGAGCTCCGCAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>101|IGHV1-82 ENSMUST00000196991|IGHV1-82|5'UTR|IG|IGH|None|00 +CTTCTCCACAGTCCCAGAACACACTCACTCTAACC +>102|IGHV1-82 ENSMUST00000196991|IGHV1-82|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCCTTGTATCTTTCTCTTCCTCCTGTCAGTAACTGAAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCCTCAGTGAAGATTTCCTGCAAGGCTTCTGGCTACGCATTCAGTAGCTCCTGGATGAACTGGGTGAAGCAGAGGCCTGGAAAGGGTCTTGAGTGGATTGGACGGATTTATCCTGGAGATGGAGATACTAACTACAATGGGAAGTTCAAGGGCAAGGCCACACTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTACTTCTGTGCAAGA +>103|IGHV1-84 ENSMUST00000103551|IGHV1-84|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTTTTCCTCCTGTCAGGAACTGCAGGTGTCCATTGCCAGATCCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGATATCCTGCAAGGCTTCTGGCTACACCTTCACTGACTACTATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTGGAAGCGGTAATACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAGCTCAGCAGCCTGACCTCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>104|IGHV1-85 ENSMUST00000103552|IGHV1-85|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGATGGAGCTGGATCTTTCTCTTCCTCCTGTCAGGAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGACCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGTTGTCCTGCAAGGCTTCTGGCTACACCTTCACAAGCTACGATATAAACTGGGTGAAGCAGAGGCCTGGACAGGGACTTGAGTGGATTGGATGGATTTATCCTAGAGATGGTAGTACTAAGTACAATGAGAAGTTCAAGGGCAAGGCCACATTGACTGTAGACACATCCTCCAGCACAGCGTACATGGAGCTCCACAGCCTGACATCTGAGGACTCTGCGGTCTATTTCTGTGCAAGA +>105|IGHV1-9 ENSMUST00000193893|IGHV1-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGACCTGGGTCTTTCTCTTCCTCCTGTCAGTAACTGCAGGTGTCCACTCCCAGGTTCAGCTGCAGCAGTCTGGAGCTGAGCTGATGAAGCCTGGGGCCTCAGTGAAGCTTTCCTGCAAGGCTACTGGCTACACATTCACTGGCTACTGGATAGAGTGGGTAAAGCAGAGGCCTGGACATGGCCTTGAGTGGATTGGAGAGATTTTACCTGGAAGTGGTAGTACTAACTACAATGAGAAGTTCAAGGGCAAGGCCACATTCACTGCAGATACATCCTCCAACACAGCCTACATGCAACTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>106|IGHV10-1 ENSMUST00000103492|IGHV10-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGCTGTTGGGGCTGAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGGTCATTGAAACTCTCATGTGCAGCCTCTGGATTCAGCTTCAATACCTACGCCATGAACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAATAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCAGAAAGCATGCTCTATCTGCAAATGAACAACTTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGACA +>107|IGHV10-3 ENSMUST00000103495|IGHV10-3|5'UTR|IG|IGH|None|00 +GACAATATAACATTGAAC +>108|IGHV10-3 ENSMUST00000103495|IGHV10-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGTGTTGGGGCTTAAGTGGGTTTTCTTTGTTGTTTTTTATCAAGGTGTGCATTGTGAGGTGCAGCTTGTTGAGTCTGGTGGAGGATTGGTGCAGCCTAAAGGATCATTGAAACTCTCATGTGCCGCCTCTGGTTTCACCTTCAATACCTATGCCATGCACTGGGTCCGCCAGGCTCCAGGAAAGGGTTTGGAATGGGTTGCTCGCATAAGAAGTAAAAGTAGTAATTATGCAACATATTATGCCGATTCAGTGAAAGACAGATTCACCATCTCCAGAGATGATTCACAAAGCATGCTCTATCTGCAAATGAACAACCTGAAAACTGAGGACACAGCCATGTATTACTGTGTGAGAGA +>109|IGHV11-1 ENSMUST00000103466|IGHV11-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGAAGGCTTGGTGCCACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGCTTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCTGAGGACACAGCCACGTATTTCTGTATGAGATA +>110|IGHV11-2 ENSMUST00000103468|IGHV11-2|5'UTR|IG|IGH|None|00 +ATGCAAATAGGGCCTCTTTCTACTCATGAAACGCAGACCAACCTATCCTTGCAGTTCAGACAGAGGAGCTTGGCTCTGGTTCCCAAGACCTCTTACTCACTTCTCAAC +>111|IGHV11-2 ENSMUST00000103468|IGHV11-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTGGGAACTGAGCTTAATTTTCATTTTTGCTCTTTTAAAAGATGTCCAGTGTGAAGTGCAGCTGTTGGAGACTGGAGGAGGCTTGGTGCAACCTGGGGGGTCACGGGGACTCTCTTGTGAAGGCTCAGGGTTCACTTTTAGTGGCTTCTGGATGAGCTGGGTTCGACAGACACCTGGGAAGACCCTGGAGTGGATTGGAGACATTAATTCTGATGGCAGTGCAATAAACTACGCACCATCCATAAAGGATCGATTCACTATCTTCAGAGACAATGACAAGAGCACCCTGTACCTGCAGATGAGCAATGTGCGATCGGAGGACACAGCCACGTATTTCTGTATGAGATA +>112|IGHV12-3 ENSMUST00000103485|IGHV12-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGCTGGGATTTGTGTGCCTGGTGACAGTCCTTCCTGGTAGCCTGTCTCAGATGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCCTCACAGTCACTCTTCCTTACCTGCTCTATTACTGGTTTCCCCATCACCAGTGGTTACTACTGGATCTGGATCCGTCAGTCACCTGGGAAACCCCTAGAATGGATGGGGTACATCACTCATAGTGGGGAAACTTTCTACAACCCATCTCTCCAGAGCCCCATCTCCATTACTAGAGAAACGTCAAAGAACCAGTTCTTCCTCCAATTGAACTCTGTGACCACAGAGGACACAGCCATGTATTACTGTGCAGGAGACAG +>113|IGHV13-2 ENSMUST00000125484|IGHV13-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTGGGACTGAGCTGGGTATTTCTTGTGGCTCTTTTGAACGGTGTCCAGTGTCAGGTGCAGCTTGTAGAGACCGGGGGAGGCTTGGTGAGGCCTGGAAATTCTCTGAAACTCTCCTGTGTTACCTCGGGATTCACTTTCAGTAACTACCGGATGCACTGGCTTCGCCAGCCTCCAGGGAAGAGGCTGGAGTGGATTGCTGTAATTACAGTCAAATCTGATAATTATGGAGCAAATTATGCAGAGTCTGTGAAAGGCAGATTCGCCATTTCAAGAGATGATTCAAAAAGCAGTGTCTACCTAGAGATGAACAGATTAAGAGAGGAAGACACTGCCACTTATTTTTGTAGTAGACA +>114|IGHV14-1 ENSMUST00000103463|IGHV14-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGATACTGAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATGACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>115|IGHV14-2 ENSMUST00000103467|IGHV14-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGATCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCAGAGCTTGTGAAGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAGACTACTATATGCACTGGGTGAAGCAGAGGACTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGAGGATGGTGAAACTAAATATGCCCCGAAATTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTGCTAGA +>116|IGHV14-3 ENSMUST00000103469|IGHV14-3|5'UTR|IG|IGH|None|00 +ATATGAGCCCTATATTCTCTACAGACACTGAATCTCAAGGTCCTTACA +>117|IGHV14-3 ENSMUST00000103469|IGHV14-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATTCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTACAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGTGGCAGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTCAACATTAAAAACACCTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGAAGGATTGATCCTGCGAATGGTAATACTAAATATGCCCCGAAGTTCCAGGGCAAGGCCACTATAACTGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCATCTATTACTGTGCTAGA +>118|IGHV14-4 ENSMUST00000195706|IGHV14-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAATGCAGCTGGGTCATCTTCTTCCTGATGGCAGTGGTTATAGGGGTCAATTCAGAGGTTCAGCTGCAGCAGTCTGGGGCTGAGCTTGTGAGGCCAGGGGCCTCAGTCAAGTTGTCCTGCACAGCTTCTGGCTTTAACATTAAAGACGACTATATGCACTGGGTGAAGCAGAGGCCTGAACAGGGCCTGGAGTGGATTGGATGGATTGATCCTGAGAATGGTGATACTGAATATGCCTCGAAGTTCCAGGGCAAGGCCACTATAACAGCAGACACATCCTCCAACACAGCCTACCTGCAGCTCAGCAGCCTGACATCTGAGGACACTGCCGTCTATTACTGTACTACA +>119|IGHV15-2 ENSMUST00000195337|IGHV15-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTGGATTTGGATCACTCTCCATCTGCTGGCAGCAGCTACAGGTATCCAATCCCAGGTTCACCTACAACAGTCTGGTTCTGAACTGAGGAGTCCTGGGTCTTCAGTAAAGCTGTCATGCAAGGATTTTGATTCAGAAGTCTTCCCTATTGCTTATATGAGTTGGGTAAGGCAGAAGCCTGGGCATGGATTTGAATGGATTGGAGGCATACTCCCAAGTATTGGTAGAACAATCTATGGAGAGAAGTTTGAGGACAAAGCCACATTGGATGCAGACACACTGTCCAACACAGCCTACTTGGAGCTCAACAGTCTGACATCCGAGGACTCTGCTATCTACTACTGTGCAAGG +>120|IGHV16-1 ENSMUST00000195641|IGHV16-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAGTTTGGACTTAGTTGGGCTTTCCTTGTTATTTTAAAAGGCATACAGGGTGAGGTGCAGCTGGTGGAATCTGGAGGCAGCTTGGGACAGCCTGGAGGGTCCACTAAACTCTCTTGTGAAGAAGCATCTGGATTCACTTTCAGTGATCATTGGATGGACTGGTTTCGCCAAGCCCCAGGCATGAGGCTAGAATGGTTAGCAAATACAAACCATGATGAGAGTGGAAAAGGCTATGCAGAGTCTGTGAAAGACAGATTCTCCATCTCCAGAGACAATTCTGAGAACTTATTGTATCTACAAATGAACAGTCTGAGAAACGAAGACACGGCTCTGTATTATTGTGCCAGAGA +>121|IGHV2-2 ENSMUST00000103443|IGHV2-2|5'UTR|IG|IGH|None|00 +GC +>122|IGHV2-2 ENSMUST00000103443|IGHV2-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCTTGGGGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCAGCTTTCATATCCAGACTGAGCATCAGCAAGGACAATTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACAGCCATATATTACTGTGCCAGAAA +>123|IGHV2-3 ENSMUST00000178229|IGHV2-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCACTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCAGGGTTCTCATTAACCAGCTATGGTGTAAGCTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGACGGGAGCACAAATTATCATTCAGCTCTCATATCCAGACTGAGCATCAGCAAGGATAACTCCAAGAGCCAAGTTTTCTTAAAACTGAACAGTCTGCAAACTGATGACACAGCCACGTACTACTGTGCCAA +>124|IGHV2-4 ENSMUST00000103447|IGHV2-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCTTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATCACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGTGGTGGAAGCACAGACTATAATGCTGCTTTCATATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>125|IGHV2-5 ENSMUST00000195707|IGHV2-5|5'UTR|IG|IGH|None|00 +ATCCTTGCTCATTGTTTCCTTTTATCCTTTCAGAAACCTCCCCCAATGCAAAGCAGCCCTCAGGCAGAGGATAAAAGCCCACACAAAGCTGAGAAGCCCCATCCTCTTCTCATAGAGCCTCCATCAGAGC +>126|IGHV2-5 ENSMUST00000195707|IGHV2-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGCTCCTCTGCCTGGTGACATTCCCAAGCTGTGTCCTATCCCAGGTGCAGCTGAAGCAGTCAGGACCTGGCCTAGTGCAGCCCTCACAGAGCCTGTCCATAACCTGCACAGTCTCTGGTTTCTCATTAACTAGCTATGGTGTACACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTGATATGGAGAGGTGGAAGCACAGACTACAATGCAGCTTTCATGTCCAGACTGAGCATCACCAAGGACAACTCCAAGAGCCAAGTTTTCTTTAAAATGAACAGTCTGCAAGCTGATGACACTGCCATATACTACTGTGCCAAAAA +>127|IGHV2-6 ENSMUST00000179657|IGHV2-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTTCTCTGCCTGGTGACTTTCCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACCGTCTCAGGGTTCTCATTAACCAGCTATGGTGTACACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGTAGTGATATGGAGTGATGGAAGCACAACCTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTCCAAACTGATGACACAGCCATGTACTACTGTGCCAGACA +>128|IGHV2-6-8 ENSMUST00000192911|IGHV2-6-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTATCCTTTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGTCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGTTGGAAGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAGGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAGTGA +>129|IGHV2-7 ENSMUST00000103456|IGHV2-7|5'UTR|IG|IGH|None|00 +AGAGC +>130|IGHV2-7 ENSMUST00000103456|IGHV2-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGGGCTGCTCCTCTGCCTGGTGACCTTTCCAAGCTGTGTCCTGTCACAAGTGCAGATGAAGGAGTCAGGACCTGACCTTGTGCAGCCATCACAGACTCTGTCTCTCACCTGCACTGTCTCTGGGTTCTCATTAAGTAGCTATGGTGTACATTGGTTTCGCAAGCCTCCGAGAAAGGGATTGGAATGGTTGGGAGGAATATGGTCTGGTGGAAGCATATACTATACTCCAGCTCTCAGTTCCCGACTGAGTGTCAGCAGGGACACCTCTAAGAGCCAAGTTTTCTTTAAAATGAGCAGTCTGCAAAGTGAAGACACGGCTGTGTACCACTGTGCCAGATA +>131|IGHV2-9 ENSMUST00000103451|IGHV2-9|5'UTR|IG|IGH|None|00 +CCCCATCAGAGC +>132|IGHV2-9 ENSMUST00000103451|IGHV2-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGTGCTGTTCCTCTGCCTGGTTGCATTTCCAAGCTGTGTCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACTTGCACTGTCTCTGGGTTTTCATTAACCAGCTATGGTGTAGACTGGGTTCGCCAGCCTCCAGGAAAGGGTCTGGAGTGGCTGGGAGTAATATGGGGTGGTGGAAGCACAAATTATAATTCAGCTCTCATGTCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGCCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCATGTACTACTGTGCCAAACA +>133|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|5'UTR|IG|IGH|None|00 +ATAGAGCCTCCATCAGAGC +>134|IGHV2-9-1 ENSMUST00000180013|IGHV2-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGCTGTCCTGGCGCTACTCCTCTGCCTGGTGACTTTCCCAAGCTGTGCCCTGTCCCAGGTGCAGCTGAAGGAGTCAGGACCTGGCCTGGTGGCGCCCTCACAGAGCCTGTCCATCACATGCACTGTCTCTGGGTTCTCATTAACCAGCTATGCTATAAGCTGGGTTCGCCAGCCACCAGGAAAGGGTCTGGAGTGGCTTGGAGTAATATGGACTGGTGGAGGCACAAATTATAATTCAGCTCTCAAATCCAGACTGAGCATCAGCAAAGACAACTCCAAGAGTCAAGTTTTCTTAAAAATGAACAGTCTGCAAACTGATGACACAGCCAGGTACTACTGTGCCAGAAA +>135|IGHV3-1 ENSMUST00000103478|IGHV3-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGCGTGCTGATTCTTTTGTGGCTGTTCACAGCCTTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCATGGTGAAACCTTCTCAGTCACTTTCCCTCACCTGCACTGTCACTGGCTACTCCATCACCAGTGGTTATGACTGGCACTGGATCCGACATTTTCCAGGAAACAAACTGGAGTGGATGGGCTACATAAGCTACAGTGGTAGCACTAACTACAACCCATCCCTCAAAAGTCGAATCTCCATCACTCATGACACATCTAAGAACCATTTCTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>136|IGHV3-3 ENSMUST00000191693|IGHV3-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAATGTTGAGTGTTCTGTACCTGTTGTCAGCCCTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTAGCCTGGTGAGACCTTCTCAGACACTCTCCCTTACCTGCACTGTTACTGGCTTCTCCATCAACAGTGATTGTTACTGGATCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTACATCGGGTACACATTCTACAGTGGTATCACTTACTACAACCCATCTCTTGAAAGTCGAACGTACATAACGCGTGACACATCTAAGAACCAGTTCTCACTGAAGTTGAGTTCTGTGACTACTGAGGACACAGCCACTTACTACTGTGCGAGAGA +>137|IGHV3-4 ENSMUST00000193408|IGHV3-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGAGTGTTGATTCTTGTGTACCTGTTGACAGCCCTTCCTGGTATCTTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGCCCTGGTGAAGCCTTCTCAGACAGTGTCCCTCACCTGCACTGTCACTGGCTACTCTATCACTAATGGTAATCACTGGTGGAACTGGATCCGGCAGGTTTCAGGAAGCAAACTGGAGTGGATAGGGTACATAAGCTCCAGTGGTAGCACTGACAGCAATCCATCTCTCAAAAGTCGAATCTCCATCACTAGAGACACTTCCAAGAACCAGTTATTCCTGCAGTTGAACTCTGTGACTACTGAAGATATAGCCACATATTACTGTGCAAGAGA +>138|IGHV3-5 ENSMUST00000195619|IGHV3-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAATGTTCACTCTTCTGTACCTGTTGACAGTCGTTCCTGGTATCCTGTCTGATGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGTGAAACCTTCTCAGACAGTGTTCCTCACCTGCACTGTCACTGGCATTTCCATCACCACTGGAAATTACAGGTGGAGCTGGATCCGGCAGTTTCCAGGAAACAAACTGGAGTGGATAGGGTACATATACTACAGTGGTACCATTACCTACAATCCATCTCTCACAAGTCGAACCACCATCACTAGAGACACTCCCAAGAACCAGTTCTTCCTGGAAATGAACTCTTTGACTGCTGAGGACACAGCCACATACTACTGTGCACGAGA +>139|IGHV3-6 ENSMUST00000195124|IGHV3-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAAGTGTTGAGTCTGTTGTACCTGTTGACAGCCATTCCTGGTATCCTGTCTGATGTACAGCTTCAGGAGTCAGGACCTGGCCTCGTGAAACCTTCTCAGTCTCTGTCTCTCACCTGCTCTGTCACTGGCTACTCCATCACCAGTGGTTATTACTGGAACTGGATCCGGCAGTTTCCAGGAAACAAACTGGAATGGATGGGCTACATAAGCTACGATGGTAGCAATAACTACAACCCATCTCTCAAAAATCGAATCTCCATCACTCGTGACACATCTAAGAACCAGTTTTTCCTGAAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGAGA +>140|IGHV3-8 ENSMUST00000103483|IGHV3-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGATGGTGTTAAGTCTTCTGTACCTGTTGACAGCCCTTCCGGGTATCCTGTCAGAGGTGCAGCTTCAGGAGTCAGGACCTGGCCTGGCAAAACCTTCTCAGACTCTGTCCCTCACCTGTTCTGTCACTGGCTACTCCATCACCAGTGATTACTGGAACTGGATCCGGAAATTCCCAGGGAATAAACTTGAGTACATGGGGTACATAAGCTACAGTGGTAGCACTTACTACAATCCATCTCTCAAAAGTCGAATCTCCATAACTCGAGACACATCCAAGAACCAGTATTACCTGCAGTTGAATTCTGTGACTACTGAGGACACAGCCACATATTACTGTGCAAGATACACAGTGTGGAGTCTTCAGTGTAGGCCCAGACATAAACCTCCTTGTA +>141|IGHV4-1 ENSMUST00000103464|IGHV4-1|5'UTR|IG|IGH|None|00 +GAAGCAAAGGGGATCAGCCCGAGATTCTCATTCAGTGATCAACACTGAACACACATCCCTTACC +>142|IGHV4-1 ENSMUST00000103464|IGHV4-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTTTGGGCTGATTTTTTTTATTGTTGCTCTTTTAAAAGGGGTCCAGTGTGAGGTGAAGCTTCTCCAGTCTGGAGGTGGCCTGGTGCAGCCTGGAGGATCCCTGAAACTCTCCTGTGCAGCCTCAGGAATCGATTTTAGTAGATACTGGATGAGTTGGGTTCGGCGGGCTCCAGGGAAAGGACTAGAATGGATTGGAGAAATTAATCCAGATAGCAGTACAATAAACTATGCACCATCTCTAAAGGATAAATTCATCATCTCCAGAGACAACGCCAAAAATACGCTGTACCTGCAAATGAGCAAAGTGAGATCTGAGGACACAGCCCTTTATTACTGTGCAAGACC +>143|IGHV5-12 ENSMUST00000103450|IGHV5-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTGGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATTACATGTATTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAATGGTGGTGGTAGCACCTATTATCCAGACACTGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCCGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>144|IGHV5-12-4 ENSMUST00000195381|IGHV5-12-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCATATTTTAAAAGGTGTCCAGTGTGAAGTGAAGCTCGTGGAGTCTGGGGGAGGTTTAGTGAAGCCTGGACAGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAACTATTACATGTCTTGGGTTCACCAGACTCCGGAGAAGAGGCTGGAGTGGGTTGCATACATTAGTAGTAGTGGTGTTAGCACCTATTATCCAGACAATGTAAAGGGCCGATTCGCCATCTCCAGAGACAATGCCAAGAACACCCTTTACCTGCAAATGACCAGTCTGAAGTCAGAGGACACGGCCTTGTATTACTGTGCAAGAGG +>145|IGHV5-15 ENSMUST00000192877|IGHV5-15|5'UTR|IG|IGH|None|00 +CACTCATC +>146|IGHV5-15 ENSMUST00000192877|IGHV5-15|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCAGGCTCAGCTTACTTATTTTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTACGGAATGGCGTGGGTTCGACAGGCTCCAAGGAAGGGGCCTGAGTGGGTAGCATTCATTAGTAATTTGGCATATAGTATCTACTATGCAGACACTGTGACGGGCCGATTCACCATCTCTAGAGAGAATGCCAAGAACACCCTGTACCTGGAAATGAGCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGACA +>147|IGHV5-16 ENSMUST00000193652|IGHV5-16|5'UTR|IG|IGH|None|00 +ATCAGGACTGAACACAGACCAGTCACC +>148|IGHV5-16 ENSMUST00000193652|IGHV5-16|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTCAGGCTCAGCTCAGTTTTTCTTGTTCTTATTTTAAAAGGAGTCCAGTGTGAAGTGAAGCTGGTGGAGTCTGAGGGAGGCTTAGTGCAGCCTGGAAGTTCCATGAAACTCTCCTGCACAGCCTCTGGATTCACTTTCAGTGACTATTACATGGCTTGGGTCCGCCAGGTTCCAGAAAAGGGTCTAGAATGGGTTGCAAACATTAATTATGATGGTAGTAGCACCTACTATCTGGACTCCTTGAAGAGCCGTTTCATCATCTCGAGAGACAATGCAAAGAACATTCTATACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCACGTATTACTGTGCAAGAGA +>149|IGHV5-17 ENSMUST00000103459|IGHV5-17|5'UTR|IG|IGH|None|00 +TGGATTCCCAGGTCCTCACATTCAGTGATCAGCACTGAACACAGACCACTCACC +>150|IGHV5-17 ENSMUST00000103459|IGHV5-17|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTCCAGGCTCAATTTAGTTTTCCTTGTCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTGACTATGGAATGCACTGGGTTCGTCAGGCTCCAGAGAAGGGGCTGGAGTGGGTTGCATACATTAGTAGTGGCAGTAGTACCATCTACTATGCAGACACAGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTTCCTGCAAATGACCAGTCTGAGGTCTGAGGACACGGCCATGTATTACTGTGCAAGG +>151|IGHV5-2 ENSMUST00000195468|IGHV5-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTCGGGCTCAGCTTGGTTTTCCTTGTCCTTATTTTAAAAAGTGTACAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGCAGCCTGGAGAGTCCCTGAAACTCTCCTGTGAATCCAATGAATACGAATTCCCTTCCCATGACATGTCTTGGGTCCGCAAGACTCCGGAGAAGAGGCTGGAGTTGGTCGCAGCCATTAATAGTGATGGTGGTAGCACCTACTATCCAGACACCATGGAGAGACGATTCATCATCTCCAGAGACAATACCAAGAAGACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACAGCCTTGTATTACTGTGCAAGACA +>152|IGHV5-4 ENSMUST00000103444|IGHV5-4|5'UTR|IG|IGH|None|00 +TGACAGAGGAGGCCGGTCCTGGATTCGAGTTCCTCACATTCAGTGATGAGCACTGAACACGGACCCCTCACC +>153|IGHV5-4 ENSMUST00000103444|IGHV5-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGTCCTTGTTTTAAAAGGTGTCCAGTGTGAAGTGCAGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCGGAAAAGAGGCTGGAGTGGGTCGCAACCATTAGTGATGGTGGTAGTTACACCTACTATCCAGACAATGTAAAGGGCCGATTCACCATCTCCAGAGACAATGCCAAGAACAACCTGTACCTGCAAATGAGCCATCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGAGA +>154|IGHV5-6 ENSMUST00000103446|IGHV5-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTCGGGCTCAGCTTGATTTTCCTTGCCCTTATTTTAAAAGGTGTCCAGTGTGAGGTGCAGCTGGTGGAGTCTGGGGGAGACTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGGCATGTCTTGGGTTCGCCAGACTCCAGACAAGAGGCTGGAGTGGGTCGCAACCATTAGTAGTGGTGGTAGTTACACCTACTATCCAGACAGTGTGAAGGGGCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTGCAAGACA +>155|IGHV5-9 ENSMUST00000103448|IGHV5-9|5'UTR|IG|IGH|None|00 +GGAGGCAGGTCCTAGATTTGAGTTCCTCACATTCAGTGATCAGCACTGAACACGGAACCCTCACC +>156|IGHV5-9 ENSMUST00000103448|IGHV5-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGAACTTTGGGCTGAGCTTGATTTTCCTTGTCCTAATTTTAAAAGGTGTCCAGTGTGAAGTGATGCTGGTGGAGTCTGGGGGAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATACCATGTCTTGGGTTCGCCAGACTCCGGAGAAGAGGCTGGAGTGGGTCGCAACCATTAGTGGTGGTGGTGGTAACACCTACTATCCAGACAGTGTGAAGGGTCGATTCACCATCTCCAGAGACAATGCCAAGAACACCCTGTACCTGCAAATGAGCAGTCTGAGGTCTGAGGACACGGCCTTGTATTACTGTGCAAGACA +>157|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|5'UTR|IG|IGH|None|00 +CTGGAATTGATTCCTAGTTCCTCACGTTCAGTG +>158|IGHV5-9-1 ENSMUST00000192264|IGHV5-9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGTACTGAACACAGACCCCTCACCATGAACTTCGGGCTCAGATTGATTTTCCTTGTCCTTACTTTAAAAGGTGTCCAGTGTGACGTGAAGCTGGTGGAGTCTGGGGAAGGCTTAGTGAAGCCTGGAGGGTCCCTGAAACTCTCCTGTGCAGCCTCTGGATTCACTTTCAGTAGCTATGCCATGTCTTGGGTTCGCCAGACTCCAGAGAAGAGGCTGGAGTGGGTCGCATACATTAGTAGTGGTGGTGATTACATCTACTATGCAGACACTGTGAAGGGCCGATTCACCATCTCCAGAGACAATGCCAGGAACACCCTGTACCTGCAAATGAGCAGTCTGAAGTCTGAGGACACAGCCATGTATTACTGTACAAGAGA +>159|IGHV6-3 ENSMUST00000103486|IGHV6-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGAGACTGAGCTGTGCTTTTATTATTGTTCTTTTAAAAGGGGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTCAGTAACTACTGGATGAACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTCAAATTAGATTGAAATCTGATAATTATGCAACACATTATGCGGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAACTTAAGGGCTGAAGACACTGGAATTTATTACTGCACAGG +>160|IGHV6-4 ENSMUST00000191918|IGHV6-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGAACTGAGCTGTGTTTTCATTGTTGTTCTCTTAAAAGGTGTCCAGAGTGATGTGAACCTGGAAGTGTCTGGAGGAGGCTTAGTTAAACCTGGAGGATCCATGCAACTCTTTTGTGTAGCCTCTGGATTTACTTTTGTAGATGGCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGTCTTGAGTGGGTTGCTGAAATTGCAAACAAAGCTAATAATTATGCAACATATTATCCCGAGTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTTCAAAAGTAGTGTCTACCTGCATATGAACAGCTTAAGAGCCGAAGATACAGGCATTTATTACTGTACAAGG +>161|IGHV6-5 ENSMUST00000193936|IGHV6-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACTTGGAACTGAACTGTGTTTTCATTGTTGTCCTCTTAAAAGGTGTCCAGAGTGAAGTGAAAATTGAGGAGTCAGGAGGAGGCTTGGTCCAACCTGGAGGATCCATGAAACTCTCTTGTGCAGCCTCTGGATTCACTTTCAGTGATTACAGGATGGACTGGGTCCACCACTCTACAGAGAATGGGTTGGAGTGGGTTGCTGAAATTAGAAACAAAGCTAGTAATTATGCAACATATTATGTGGAGTCTGTGAATGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGATACTGGCATTTATTACTGTACAAGG +>162|IGHV6-6 ENSMUST00000103489|IGHV6-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAACTGTGTATTCATAGTTTTTCTCTTAAAAGGTGTCCAGAGTGAAGTGAAGCTTGAGGAGTCTGGAGGAGGCTTGGTGCAACCTGGAGGATCCATGAAACTCTCTTGTGCTGCCTCTGGATTCACTTTTAGTGACGCCTGGATGGACTGGGTCCGCCAGTCTCCAGAGAAGGGGCTTGAGTGGGTTGCTGAAATTAGAAACAAAGCTAATAATCATGCAACATACTATGCTGAGTCTGTGAAAGGGAGGTTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTCTACCTGCAAATGAACAGCTTAAGAGCTGAAGACACTGGCATTTATTACTGTACCAGG +>163|IGHV6-7 ENSMUST00000193397|IGHV6-7|L-REGION+V-REGION|IG|IGH|None|00 +ATGTACTTGGGACTGAGCTGTGTATTCATTTTTTTTCTCTTAAAAGGTGTCCAGTGTGAGGAGAAGCTGGATGAGTCTGGAGGAGGCTTGGTGCAACCTGGGAGGTCCATGAAACTCTCCTGTGTTGCCTCTGGATTCACTTTTACTAACTCCTGGATGAACTGGTTCTGCCAGTCTCCAGAGAAAGGACTGGAGTGGGTAGCACAAATTAAAAGCAAACCTTATAATTATGAAACATATTATTCAGATTCTGTGAAAGGCAGATTCACCATCTCAAGAGATGATTCCAAAAGTAGTGTATACCTGCAAATGAACAACTTAAGAGCTGAAGACACGGGCATCTATTACTGTACATGG +>164|IGHV7-1 ENSMUST00000103474|IGHV7-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGTTAAACTGGGTTTTTCTTTTAACACTTTTACATGGTATCCAGTGTGAGGTGAAGCTGGTGGAATCTGGAGGAGGCTTGGTACAGTCTGGGCGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCAGTGATTTCTACATGGAGTGGGTCCGCCAAGCTCCAGGGAAGGGACTGGAGTGGATTGCTGCAAGTAGAAACAAAGCTAATGATTATACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCATCGTCTCCAGAGACACTTCCCAAAGCATCCTCTACCTTCAGATGAATGCCCTGAGAGCTGAGGACACTGCCATTTATTACTGTGCAAGAGATGCA +>165|IGHV7-2 ENSMUST00000193133|IGHV7-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGTTTAACATCATTATCTTCACAGTAACACCTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGAAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGACTCTCCTGTGCAACTTCTGGGTTCACCTTCACTGATTTCTACATGAACTGGGTCTGCCAGCCTCCAAGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGACTACAGTGCATCTATGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAACACACTGAGAACTGAGGACAGTGCCACTTATTACTGTGCAAGAGATACA +>166|IGHV7-3 ENSMUST00000103461|IGHV7-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGCTGAACTGGATTTTCCTTGTAACACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGGTGGAGTCTGGAGGAGGCTTGGTACAGCCTGGGGGTTCTCTGAGTCTCTCCTGTGCAGCTTCTGGATTCACCTTCACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACTTGAGTGGTTGGGTTTTATTAGAAACAAAGCTAATGGTTACACAACAGAGTACAGTGCATCTGTGAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAGCATCCTCTATCTTCAAATGAATGCCCTGAGAGCTGAGGACAGTGCCACTTATTACTGTGCAAGATATA +>167|IGHV7-4 ENSMUST00000192499|IGHV7-4|5'UTR|IG|IGH|None|00 +ATGAACCTAGTCTTGATTTCCCCAGCCTTCAGTTCCCAGATTCAGTGATCAGCCTTGAACACAGACCTGTCACC +>168|IGHV7-4 ENSMUST00000192499|IGHV7-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGAAGTTGTGGGTGAACTGGATTCTACTTGTAGCACTTTTAAATGGTATCCAGTGTGAGGTGAAGCTGATGGAATCTGGAGGAGGCTTGGTACAGCCTGGGGCTTCTCTGAGACTCTCCTGTGCAGCTTCTGGATTCACCTTTACTGATTACTACATGAGCTGGGTCCGCCAGCCTCCAGGGAAGGCACCTGAGTGGTTGGCTTTGATTAGAAACAAAGCTAATGGTTACACAACAGAGTATACTGCATCTGTTAAGGGTCGGTTCACCATCTCCAGAGATAATTCCCAAAACATCCTCTATCTTCAAATGAACACCCTGAGGGCTGAGGACAGTGCCACTTATTACTGTGTAAAAGCTGTA +>169|IGHV8-11 ENSMUST00000103536|IGHV8-11|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGCTACTGATTGTTCCTGCATATGTCCTCTCCCAGATTACTCAGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTAGGCTGGATTCATCAGCCTTCAGGGAATGGTCTGGAGTGGCTGGCACACATTTGGTGGAATGATAATAAGTACTATAACACAGCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCGCCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>170|IGHV8-12 ENSMUST00000199266|IGHV8-12|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTGCTGCTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGTCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGAAAGGGTCTGGAGTGGCTGGCACACATTTACTGGGATGATGACAAGCGCTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAGAAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAAGAG +>171|IGHV8-2 ENSMUST00000195037|IGHV8-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGACTTACATTCTCATTCCTGCTGCTGCTGCCTGTCCCTGCATATGTCCTATCTCAGGTTACTCTGAAAGTGTCTGGCCCTGGGATATTGCAGCCATCACAGACTCTCAGCCTGGCCTGTACTTTCTCTGGGATTTCACTGAGTACTTCTGGTATGGGTTTGAGCTGGCTTCGTAAGCCCTCAGGGAAGGCTTTAGAGTGGCTGGCAAGCATTTGGAATAATGATAACTACTACAACCCATCTTTGAAGAGCCGGCTCACAATCTCCAAGGAGACCTCCAACTACCAAGTATTCCTTAAACTCACCAGTGTGGACACTGCAGATTCTGCCACATACTACGGTGCTTGGAGAGA +>172|IGHV8-4 ENSMUST00000192298|IGHV8-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTATGTCTTCATTCCTGCTGCTGGTTGTCCCTATATATGTTCTGTCCCAGATTACTCTGAAACAGTCTGGCCCTGGGATAGTGCAGCCATCCCAGCCCGTCAGACTTACTTGCACTTTCTCTGGGTTTTCACTGAGCACTTCTGGTATAGGTGTAACCTGGATTCGTCAGCCCTCAGGGAAGGGTCTGGAGTGGCTGGCAACCATTTGGTGGGATGATGATAACCGCTACAACCCATCTCTAAAGAGCAGGCTCGCAGTCTCCAAAGACACCTCCAACAACCAAGCATTCCTGAATATCATCACTGTGGAAACTGCAGATACTGCCATATACTACTGTGCT +>173|IGHV8-5 ENSMUST00000194257|IGHV8-5|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCTTGCTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTCTAATATGGGTATAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTAGAGTGGCTGGCACACATTTGGTGGAATGATGATAAGTACTATAACCCATCCCTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCAGTGTGGACACTGCAGATACTGCCACATACTACTGTGCTCAAATAG +>174|IGHV8-6 ENSMUST00000193145|IGHV8-6|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCGCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGTACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGATCTGGAGTGGCTGGCACACATTTATTGGGATGATGACAAGCACTATAACCCATCCTTGAAGAGCCAGCTCAGAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGTAGATACTGCCACATACTACTGTGCTCGA +>175|IGHV8-8 ENSMUST00000192591|IGHV8-8|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGCAGGCTTACTTCTTCATTCCTGTTACTGATTGTCCCTGCATATGTCCTGTCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGGATATTGCAGCCCTCCCAGACCCTCAGTCTGACTTGTTCTTTCTCTGGGTTTTCACTGAGCACTTTTGGTATGGGTGTAGGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTGGTGGGATGATGATAAGTACTATAACCCAGCCCTGAAGAGTCGGCTCACAATCTCCAAGGATACCTCCAAAAACCAGGTATTCCTCAAGATCGCCAATGTGGACACTGCAGATACTGCCACATACTACTGTGCTCGAATAG +>176|IGHV9-1 ENSMUST00000195884|IGHV9-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATAGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCATGATATACACCGACACTGGAGAGCCAACATATGCTGAAGAGTTCAAGGGACGGTTTGCCTTCTCTTTGGAGACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGTAAGA +>177|IGHV9-2 ENSMUST00000103472|IGHV9-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGATTGGGTGTGGACCTTGCTATTCCTGATGGCAGCTGCCCAAAGGGCTCAAGCACAGATCCAGTTCGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGTGTATACCTTCACAGAATATCCAATGCACTGGGTGAAGCAGGCTCCAGGAAAGGGTTTCAAGTGGATGGGCTGGATAAACACCTACTCTGGAGAGCCAACATATGCTGACGACTTCAAGGGACGGTTTGCCTTTTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>178|IGHV9-3 ENSMUST00000103473|IGHV9-3|L-REGION+V-REGION|IG|IGH|None|00 +ATGGGTTGGCTGTGGAACTTGCTATTCCTGATGGCAGCTGCCCAAAGTGCCCAAGCACAGATCCAGTTGGTACAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACCTATGGAATGAGCTGGGTGAAACAGGCTCCAGGAAAGGGTTTAAAGTGGATGGGCTGGATAAACACCTACTCTGGAGTGCCAACATATGCTGATGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTGCAGATCAACAACCTCAAAAATGAGGACACGGCTACATATTTCTGTGCAAGA +>179|IGHV9-4 ENSMUST00000194159|IGHV9-4|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGCTGTGGAACTTGCTATTTCTCATGGCAGCAGCTCAAAGTATCCAAGCACAGATCCAGTTGGTGCAGTCTGGACCTGAGCTGAAGAAGCCTGGAGAGACAGTCAAGATCTCCTGCAAGGCTTCTGGGTATACCTTCACAACTGCTGGAATGCAGTGGGTGCAAAAGATGCCAGGAAAGGGTTTTAAGTGGATTGGCTGGATAAACACCCACTCTGGAGAGCCAAAATATGCAGAAGACTTCAAGGGACGGTTTGCCTTCTCTTTGGAAACCTCTGCCAGCACTGCCTATTTACAGATAAGCAACCTCAAAAATGAGGACACGGCTACGTATTTCTGTGCGAGA +>180|IGKC ENSMUST00000103410|IGKC|C-REGION|IG|IGK|None|00 +GGGCTGATGCTGCACCAACTGTATCCATCTTCCCACCATCCAGTGAGCAGTTAACATCTGGAGGTGCCTCAGTCGTGTGCTTCTTGAACAACTTCTACCCCAAAGACATCAATGTCAAGTGGAAGATTGATGGCAGTGAACGACAAAATGGCGTCCTGAACAGTTGGACTGATCAGGACAGCAAAGACAGCACCTACAGCATGAGCAGCACCCTCACGTTGACCAAGGACGAGTATGAACGACATAACAGCTATACCTGTGAGGCCACTCACAAGACATCAACTTCACCCATTGTCAAGAGCTTCAACAGGAATGAGTGT +>181|IGKJ1 ENSMUST00000103405|IGKJ1|J-REGION|IG|IGK|None|00 +GTGGACGTTCGGTGGAGGCACCAAGCTGGAAATCAAAC +>182|IGKJ2 ENSMUST00000198234|IGKJ2|J-REGION|IG|IGK|None|00 +TGTACACGTTCGGAGGGGGGACCAAGCTGGAAATAAAAC +>183|IGKJ3 ENSMUST00000199487|IGKJ3|J-REGION|IG|IGK|None|00 +AATCACATTCAGTGATGGGACCAGACTGGAAATAAAAC +>184|IGKJ4 ENSMUST00000103408|IGKJ4|J-REGION|IG|IGK|None|00 +ATTCACGTTCGGCTCGGGGACAAAGTTGGAAATAAAAC +>185|IGKJ5 ENSMUST00000199459|IGKJ5|J-REGION|IG|IGK|None|00 +GCTCACGTTCGGTGCTGGGACCAAGCTGGAGCTGAAAC +>186|IGKV1-110 ENSMUST00000103321|IGKV1-110|5'UTR|IG|IGK|None|00 +GATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>187|IGKV1-110 ENSMUST00000103321|IGKV1-110|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCCTTGTACACAGTAATGGAAACACCTATTTACATTGGTACCTGCAGAAGCCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTTCTGCTCTCAAAGTACACATGTTCCTCC +>188|IGKV1-117 ENSMUST00000103317|IGKV1-117|5'UTR|IG|IGK|None|00 +ACTGATCAGTCTCCTCAGGCTGTCTCCTCAGGTTGCCTCCTCAAA +>189|IGKV1-117 ENSMUST00000103317|IGKV1-117|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGTTTTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGATCTAGTCAGAGCATTGTACATAGTAATGGAAACACCTATTTAGAATGGTACCTGCAGAAACCAGGCCAGTCTCCAAAGCTCCTGATCTACAAAGTTTCCAACCGATTTTCTGGGGTCCCAGACAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATCTGGGAGTTTATTACTGCTTTCAAGGTTCACATGTTCCTCC +>190|IGKV1-122 ENSMUST00000103314|IGKV1-122|5'UTR|IG|IGK|None|00 +GTCTCCTCAGGCTCCCTCCTCAAA +>191|IGKV1-122 ENSMUST00000103314|IGKV1-122|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTGCCTGTTAGGCTGTTGGTGCTGATGTTCTGGATTCCTGCTTCCAGCAGTGATGCTGTGATGACCCAAACTCCACTCTCCCTGCCTGTCAGTCTTGGAGATCAAGCCTCCATCTCTTGCAGGTCTAGTCAGAGCCTTGAAAACAGTAATGGAAACACCTATTTGAACTGGTACCTCCAGAAACCAGGCCAGTCTCCACAGCTCCTGATCTACAGGGTTTCCAACCGATTTTCTGGGGTCCTAGACAGGTTCAGTGGTAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTTCTGCCTCCAAGTTACACATGTCCCTCC +>192|IGKV1-131 ENSMUST00000103306|IGKV1-131|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGCTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTACATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCGCCTATTCTATCTGGTATCCAAACTGGACCCTGGCATCCCTGACAGTTTCAGTGGCAGTGGATCAGAGACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCCTGCAAGGTACACATTTTCCTCT +>193|IGKV1-132 ENSMUST00000103305|IGKV1-132|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCAGTTCCTGTTTCTGTTAATGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTGTCTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAGACATATTTGAATTGGTTACAACAGAGGCCTGGCCAGGCTCCAAAGCACCTAATGTATCAGGTGTCCAAACTGGACCCTGGCATCCCTGACAGGTTCAGTGGCAGTGGATCAGAAACAGATTTTACACTTAAAATCAGCAGAGTGGAGGCTGAAGATTTGGGAGTTTATTACTGCTTGCAAGGTACATATTATCCTCA +>194|IGKV1-133 ENSMUST00000103304|IGKV1-133|5'UTR|IG|IGK|None|00 +TATTTCCTCAAA +>195|IGKV1-133 ENSMUST00000103304|IGKV1-133|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCAGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCTATCTCTTGCAAGTCAAGTCAGAGCCTCTTATATAGTAATGGAAAAACCTATTTGAATTGGTTATTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGAACAGATTTTACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCGTGCAAGGTACACATTTTCCTCA +>196|IGKV1-135 ENSMUST00000103303|IGKV1-135|5'UTR|IG|IGK|None|00 +ACTGATCACTCTCCTATGTTCATTTCCTCAAA +>197|IGKV1-135 ENSMUST00000103303|IGKV1-135|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGCCCAGTTCCTGTTTCTGTTAGTGCTCTGGATTCGGGAAACCAACGGTGATGTTGTGATGACCCAGACTCCACTCACTTTGTCGGTTACCATTGGACAACCAGCCTCCATCTCTTGCAAGTCAAGTCAGAGCCTCTTAGATAGTGATGGAAAGACATATTTGAATTGGTTGTTACAGAGGCCAGGCCAGTCTCCAAAGCGCCTAATCTATCTGGTGTCTAAACTGGACTCTGGAGTCCCTGACAGGTTCACTGGCAGTGGATCAGGGACAGATTTCACACTGAAAATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTGGCAAGGTACACATTTTCCTCA +>198|IGKV1-35 ENSMUST00000197820|IGKV1-35|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGAGTCCTGTCCACTCCATATTTATATTGTTGCTTTGGATTGTGGGAATCAGTGGTGACGTTGTGATGACCCAGACTCCACTCACTTTATCAGCTACCATTGGACAATCAGCCTCCGTCTCTTGCAGGTCAAGTCAGAGTCTCTTACATAGTAATGGAAACACATACTTGAATTGGTTTGTACAAAGGCCAGGCCCATCTCCACAGCTTCTAATTTATGGGGTGTTTGAACAGGAATCTGGGGTTCCTGACAGGTTCAGTGGCAGTGGGTCTGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTACTGCATGCAAGCTACCTATGAACCTCC +>199|IGKV1-88 ENSMUST00000103336|IGKV1-88|L-REGION+V-REGION|IG|IGK|None|00 +ATGAATTTGCCTGTTCATCTCTTGGTGCTTCTGTTGTTCTGGATTCCTGCTTCCAGAGGTGATGTTGTGGTGACTCAAACTCCACTCTCCCTGCCTGTCAGCTTTGGAGATCAAGTTTCTATCTCTTGCAGGTCTAGTCAGAGTCTTGCAAACAGTTATGGGAACACCTATTTGTCTTGGTACCTGCACAAGCCTGGCCAGTCTCCACAGCTCCTCATCTATGGGATTTCCAACAGATTTTCTGGGGTGCCAGACAGGTTCAGTGGCAGTGGTTCAGGGACAGATTTCACACTCAAGATCAGCACAATAAAGCCTGAGGACTTGGGAATGTATTACTGCTTACAAGGTACACATCAGCCTCC +>200|IGKV1-99 ENSMUST00000168090|IGKV1-99|5'UTR|IG|IGK|None|00 +GGCGCCTCATCAAA +>201|IGKV1-99 ENSMUST00000168090|IGKV1-99|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGCTGCCTGTTCTGCTAGTGGTGCTGCTATTGTTCACGAGTCCAGCCTCAAGCAGTGATGTTGTTCTGACCCAAACTCCACTCTCTCTGCCTGTCAATATTGGAGATCAAGCCTCTATCTCTTGCAAGTCTACTAAGAGTCTTCTGAATAGTGATGGATTCACTTATTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTAATATATTTGGTTTCTAATCGATTTTCTGGAGTTCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACAGATTTCACACTCAAGATCAGCAGAGTGGAGGCTGAGGATTTGGGAGTTTATTATTGCTTCCAGAGTAACTATCTTCCTCT +>202|IGKV10-94 ENSMUST00000103330|IGKV10-94|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGTGCAAGTCAGGGCATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAAGTTTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGACAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>203|IGKV10-95 ENSMUST00000198735|IGKV10-95|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTTTGTTTTCAAGGTACCAGATATGATATCCAGATGACACAGACTACTTCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTGAGGACATTAGCACTTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTATTACACATCAGGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGGCAGATTATTCTCTCACCATCAGCAACCTGGAACCTGAAGATATTGCCACTTACTATTGTCAGCAGTATAGTAAGCTTCCTCC +>204|IGKV10-96 ENSMUST00000103328|IGKV10-96|5'UTR|IG|IGK|None|00 +CTCAGCCTGGAC +>205|IGKV10-96 ENSMUST00000103328|IGKV10-96|L-REGION+V-REGION|IG|IGK|None|00 +ATGATGTCCTCTGCTCAGTTCCTTGGTCTCCTGTTGCTCTGTTTTCAAGGTACCAGATGTGATATCCAGATGACACAGACTACATCCTCCCTGTCTGCCTCTCTGGGAGACAGAGTCACCATCAGTTGCAGGGCAAGTCAGGACATTAGCAATTATTTAAACTGGTATCAGCAGAAACCAGATGGAACTGTTAAACTCCTGATCTACTACACATCAAGATTACACTCAGGAGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGAACAGATTATTCTCTCACCATTAGCAACCTGGAGCAAGAAGATATTGCCACTTACTTTTGCCAACAGGGTAATACGCTTCCTCC +>206|IGKV11-125 ENSMUST00000197406|IGKV11-125|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACACGAGGGCCCCTGCTGAGTTCCTTGGGTTCCTGTTGCTCTGGTTTTTAGGTGCCAGATGTGATGTCCAGATGATTCAGTCTCCATCCTCCCTGTCTGCATCTTTGGGAGACATAGTCACCATGACTTGCCAGGCAAGTCAGGGCACTAGCATTAATTTAAACTGGTTTCAGCAAAAACCAGGGAAAGCTCCTAAGCTCCTGATCTATGGTGCAAGCAACTTGGAAGATGGGGTCCCATCAAGGTTCAGTGGCAGTAGATATGGGACAGATTTCACTCTCACCATCAGCAGCCTGGAGGATGAAGATATGGCAACTTATTTCTGTCTACAGCATAGTTATCTCCCTCC +>207|IGKV12-38 ENSMUST00000198880|IGKV12-38|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAACTCCTGGGGTTGCTGCTGCTGTGGCTTACAGACGCAGGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTGGCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAACATTTACTACAGTTTAGCATGGTATCAGCAGAAGCAAGGGAAATCTCCTCAGCTCCTGATCTATAATGCAAACAGCTTGGAAGATGGTGTCCCATCGAGGTTCAGTGGCAGTGGATCTGGGACACAGTATTCTATGAAGATCAACAGCATGCAGCCTGAAGATACCGCAACTTATTTCTGTAAACAGGCTTATGACGTTCCTCC +>208|IGKV12-41 ENSMUST00000103369|IGKV12-41|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCTCACTCAGGTCCTGGCGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGGGAATATTCACAATTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGAACACAATATTCTCTCAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGAGTACTCCTCC +>209|IGKV12-44 ENSMUST00000103367|IGKV12-44|5'UTR|IG|IGK|None|00 +ATAGTCAGGTCACACCCTGTGCTGTAATCAGCATCACACTGAAAACACACAGAC +>210|IGKV12-44 ENSMUST00000103367|IGKV12-44|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGGTGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGCATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTTATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATAATGCAAAAACCTTAGCAGAAGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTTTTCTCTGAAGATCAACAGCCTGCAGCCTGAAGATTTTGGGAGTTATTACTGTCAACATCATTATGGTACTCCTCC +>211|IGKV12-46 ENSMUST00000103365|IGKV12-46|5'UTR|IG|IGK|None|00 +GAGTCAGCCTCACACTGATCACACACAGAC +>212|IGKV12-46 ENSMUST00000103365|IGKV12-46|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGTGTGCCCACTCAGGTCCTGGGGTTGCTGCTGCTGTGGCTTACAGATGCCAGATGTGACATCCAGATGACTCAGTCTCCAGCCTCCCTATCTGTATCTGTGGGAGAAACTGTCACCATCACATGTCGAGCAAGTGAGAATATTTACAGTAATTTAGCATGGTATCAGCAGAAACAGGGAAAATCTCCTCAGCTCCTGGTCTATGCTGCAACAAACTTAGCAGATGGTGTGCCATCAAGGTTCAGTGGCAGTGGATCAGGCACACAGTATTCCCTCAAGATCAACAGCCTGCAGTCTGAAGATTTTGGGAGTTATTACTGTCAACATTTTTGGGGTACTCCTCC +>213|IGKV12-98 ENSMUST00000196839|IGKV12-98|L-REGION+V-REGION|IG|IGK|None|00 +ATGAACATGCTCACTCAGCTCCTGGGATTACTGCTGCTCTGGTTTGCAGGTGGTAAATGTGACATTCAGATGACCCAGTCTCCTGCCTCCCAGTCTGCATCTCTGGGAGAAAGTGTCACCATCACATGCCTGGCAAGTCAGACCATTGGTACATGGTTAGCATGGTATCAGCAGAAACCAGGGAAATCTCCTCAGCTCCTGATTTATGCTGCAACCAGCTTGGCAGATGGGGTCCCATCAAGGTTCAGTGGTAGTGGATCTGGCACAAAATTTTCTTTCAAGATCAGCAGCCTACAGGCTGAAGATTTTGTAAGTTATTACTGTCAACAACTTTACAGTACTCCTCT +>214|IGKV13-84 ENSMUST00000103339|IGKV13-84|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTACTGCTGTTTGGAATCCCAGGCATGATATGTGACATCCAGATGACACAATCTTCATCCTCCTTTTCTGTATCTCTAGGAGACAGAGTCACCATTACTTGCAAGGCAAGTGAGGACATATATAATCGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>215|IGKV13-85 ENSMUST00000114212|IGKV13-85|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTTTCCTTCTCAACTTCTGCTCTTCCTGCTGTTCAGAATCACAGGCATAATATGTGACATCCAGATGACACAATCTTCATCCTACTTGTCTGTATCTCTAGGAGGCAGAGTCACCATTACTTGCAAGGCAAGTGACCACATTAATAATTGGTTAGCCTGGTATCAGCAGAAACCAGGAAATGCTCCTAGGCTCTTAATATCTGGTGCAACCAGTTTGGAAACTGGGGTTCCTTCAAGATTCAGTGGCAGTGGATCTGGAAAGGATTACACTCTCAGCATTACCAGTCTTCAGACTGAAGATGTTGCTACTTATTACTGTCAACAGTATTGGAGTACTCCTCC +>216|IGKV14-100 ENSMUST00000199510|IGKV14-100|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGATGGTCCTTGCTCAGTTTCTTGCATTCTTGTTGCTTTGGTTTCCAGGTGCAAGATGTGACATCCTGATGACCCAATCTCCATCCTCCATGTCTGTATCTCTGGGAGACACAGTCAGCATCACTTGCCATGCAAGTCAGGGCATTAGCAGTAATATAGGGTGGTTGCAGCAGAAACCAGGGAAATCATTTAAGGGCCTGATCTATCATGGAACCAACTTGGAAGATGGAGTTCCATCAAGGTTCAGTGGCAGTGGATCTGGAGCAGATTATTCTCTCACCATCAGCAGCCTGGAATCTGAAGATTTTGCAGACTATTACTGTGTACAGTATGCTCAGTTTCCTCC +>217|IGKV14-111 ENSMUST00000103320|IGKV14-111|5'UTR|IG|IGK|None|00 +CAGCCAGGACTCAGC +>218|IGKV14-111 ENSMUST00000103320|IGKV14-111|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGACCCCTGCTCAGTTTCTTGGAATCTTGTTGCTCTGGTTTCCAGGTATCAAATGTGACATCAAGATGACCCAGTCTCCATCTTCCATGTATGCATCTCTAGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAATAGCTATTTAAGCTGGTTCCAGCAGAAACCAGGGAAATCTCCTAAGACCCTGATCTATCGTGCAAACAGATTGGTAGATGGGGTCCCATCAAGGTTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTCACCATCAGCAGCCTGGAGTATGAAGATATGGGAATTTATTATTGTCTACAGTATGATGAGTTTCCTCC +>219|IGKV14-126 ENSMUST00000103310|IGKV14-126|5'UTR|IG|IGK|None|00 +TCAGC +>220|IGKV14-126 ENSMUST00000103310|IGKV14-126|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCCCCTGCTCAGTTTTTTGGGATCTTGTTGCTCTGGTTTCCAGGTATCAGATGTGACATCAAGATGACCCAGTCTCCATCCTCCATGTATGCATCGCTGGGAGAGAGAGTCACTATCACTTGCAAGGCGAGTCAGGACATTAAAAGCTATTTAAGCTGGTACCAGCAGAAACCATGGAAATCTCCTAAGACCCTGATCTATTATGCAACAAGCTTGGCAGATGGGGTCCCATCAAGATTCAGTGGCAGTGGATCTGGGCAAGATTATTCTCTAACCATCAGCAGCCTGGAGTCTGACGATACAGCAACTTATTACTGTCTACAGCATGGTGAGAGCCCTCC +>221|IGKV14-130 ENSMUST00000196006|IGKV14-130|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGTTTCTTGGGATCTTGTTGCTCTGGTTCCCAGGTGCCAGATGTGAAATCCAGATGACCCAGTCTCCATCCTCTATGTCTGCATCTCTGGGAGACAGAATAACCATCACTTGCCAGGCAACTCAAGACATTGTTAAGAATTTAAACTGGTATCAGCAGAAACCAGGGAAACCCCCTTCATTCCTGATCTATTATGCAACTGAACTGGCAGAAGGGGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGACTATTCTCTGACAATCAGCAACCTGGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGTTTTATGAGTTTCCTCC +>222|IGKV15-103 ENSMUST00000103324|IGKV15-103|5'UTR|IG|IGK|None|00 +TCACTCTCAGTGAGGATACACCATCAGC +>223|IGKV15-103 ENSMUST00000103324|IGKV15-103|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGGTCCTTGCTGAGCTCCTGGGGCTGCTGCTGTTCTGCTTTTTAGGTGTGAGATGTGACATCCAGATGAACCAGTCTCCATCCAGTCTGTCTGCATCCCTTGGAGACACAATTACCATCACTTGCCATGCCAGTCAGAACATTAATGTTTGGTTAAGCTGGTACCAGCAGAAACCAGGAAATATTCCTAAACTATTGATCTATAAGGCTTCCAACTTGCACACAGGCGTCCCATCAAGGTTTAGTGGCAGTGGATCTGGAACAGGTTTCACATTAACCATCAGCAGCCTGCAGCCTGAAGACATTGCCACTTACTACTGTCAACAGGGTCAAAGTTATCCTCT +>224|IGKV16-104 ENSMUST00000103323|IGKV16-104|5'UTR|IG|IGK|None|00 +AATCAGTTCCTGCCAGGACACAGTTTAGAT +>225|IGKV16-104 ENSMUST00000103323|IGKV16-104|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCCAGGTTCAGGTTCTGGGGCTCCTTCTGCTCTGGATATCAGGTGCCCAGTGTGATGTCCAGATAACCCAGTCTCCATCTTATCTTGCTGCATCTCCTGGAGAAACCATTACTATTAATTGCAGGGCAAGTAAGAGCATTAGCAAATATTTAGCCTGGTATCAAGAGAAACCTGGGAAAACTAATAAGCTTCTTATCTACTCTGGATCCACTTTGCAATCTGGAATTCCATCAAGGTTCAGTGGCAGTGGATCTGGTACAGATTTCACTCTCACCATCAGTAGCCTGGAGCCTGAAGATTTTGCAATGTATTACTGTCAACAGCATAATGAATACCCGTAC +>226|IGKV17-121 ENSMUST00000197515|IGKV17-121|5'UTR|IG|IGK|None|00 +AAGGCC +>227|IGKV17-121 ENSMUST00000197515|IGKV17-121|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGTTCTCACTAGCTCTTCTCCTCAGTCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCATGGCTATAGGAGAAAAAGTCACCATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGTACAGATTTTGTTTTTACAATTGAAAACATGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACTTGCCTCT +>228|IGKV17-127 ENSMUST00000200586|IGKV17-127|5'UTR|IG|IGK|None|00 +AAGGCC +>229|IGKV17-127 ENSMUST00000200586|IGKV17-127|L-REGION+V-REGION|IG|IGK|None|00 +ATGACCATGCTCTCACTAGCTCCTCTCCTCAGCCTTCTTCTCCTCTGTGTCTCTGATTCTAGGGCAGAAACAACTGTGACCCAGTCTCCAGCATCCCTGTCCGTGGCTACAGGAGAAAAAGTCACTATCAGATGCATAACCAGCACTGATATTGATGATGATATGAACTGGTACCAGCAGAAGCCAGGGGAACCTCCTAAGCTCCTTATTTCAGAAGGCAATACTCTTCGTCCTGGAGTCCCATCCCGATTCTCCAGCAGTGGCTATGGCACAGATTTTGTTTTTACAATTGAAAACACGCTCTCAGAAGATGTTGCAGATTACTACTGTTTGCAAAGTGATAACATGCCTCT +>230|IGKV18-36 ENSMUST00000200160|IGKV18-36|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAAACTCCAGCTTCATTTCTTTGCCTCCTTTTACTGTGGACCACGGCTGTCACTGGAGAAACAACACAGGCTCCAGCTTCTCTGAGTTTTTCTCTTGGTGAAACAGCAACACTGTCATGCAGGTCCAGTGAGAGTGTTGGCAGCTACTTAGCCTGGTACCAGCAGAAAGCAGAGCAAGTTCCCCGGCTCCTTATCCATAGTGCCTCCACTAGGGCCGGTGGTGTCCCAGTCCGGTTCAGTGGCACTGGGTCTGGGACAGACTTCACTCTCACCATCAGCAGTCTAGAACCTGAAGATGCTGCAGTTTACTACTGTCAACCTTTCAAAAGTTGGTCATA +>231|IGKV19-93 ENSMUST00000196863|IGKV19-93|5'UTR|IG|IGK|None|00 +AGGAGACGTTGTAGAA +>232|IGKV19-93 ENSMUST00000196863|IGKV19-93|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGACCGTCTATTCAGTTCCTGGGGCTCTTGTTGTTCTGGCTTCATGGTGCTCAGTGTGACATCCAGATGACACAGTCTCCATCCTCACTGTCTGCATCTCTGGGAGGCAAAGTCACCATCACTTGCAAGGCAAGCCAAGACATTAACAAGTATATAGCTTGGTACCAACACAAGCCTGGAAAAGGTCCTAGGCTGCTCATACATTACACATCTACATTACAGCCAGGCATCCCATCAAGGTTCAGTGGAAGTGGGTCTGGGAGAGATTATTCCTTCAGCATCAGCAACCTGGAGCCTGAAGATATTGCAACTTATTATTGTCTACAGTATGATAATCTTCTACC +>233|IGKV2-109 ENSMUST00000103322|IGKV2-109|5'UTR|IG|IGK|None|00 +CAAGTTCGCAGA +>234|IGKV2-109 ENSMUST00000103322|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCATTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAAGCCAGGCCAGTCTCCTCAGCTCCTGATTTATCAGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTAGCAGTGGGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTGCTCAAAATCTAGAACTTCCTCC +>235|IGKV2-112 ENSMUST00000103318|IGKV2-112|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCTCTCTTCAGTTCCTGGGGGTGCTTATGTTCTGGATCTCTGGAGTCAGTGGGGATATTGTGATAACCCAGGATGAACTCTCCAATCCTGTCACTTCTGGAGAATCAGTTTCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTATATAAGGATGGGAAGACATACTTGAATTGGTTTCTGCAGAGACCAGGACAATCTCCTCAGCTCCTGATCTATTTGATGTCCACCCGTGCATCAGGAGTCTCAGACCGGTTTAGTGGCAGTGGGTCAGGAACAGATTTCACCCTGGAAATCAGTAGAGTGAAGGCTGAGGATGTGGGTGTGTATTACTGTCAACAACTTGTAGAGTATCCTC +>236|IGKV2-137 ENSMUST00000103302|IGKV2-137|5'UTR|IG|IGK|None|00 +GGCTACTTTTCACACAGCTGCACCAAGCAGGGGATTTGCATATTGCTCCCTTGGGAGGATCTCTCCTGCAGGTCCAAGACAAAAGCTAGCCTCCATTTCTGTCTTGACTACTCAAGACTTTTTGTATCAAGTTCTCAGA +>237|IGKV2-137 ENSMUST00000103302|IGKV2-137|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTGCCTAGCTGAGTTCCTGGGGCTGCTTGTGCTCTGGATCCCTGGAGCCATTGGGGATATTGTGATGACTCAGGCTGCACCCTCTGTACCTGTCACTCCTGGAGAGTCAGTATCCATCTCCTGCAGGTCTAGTAAGAGTCTCCTGCATAGTAATGGCAACACTTACTTGTATTGGTTCCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGATGTCCAACCTTGCCTCAGGAGTCCCAGACAGGTTCAGTGGCAGTGGGTCAGGAACTGCTTTCACACTGAGAATCAGTAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGTATGCAACATCTAGAATATCCTTT +>238|IGKV20-101-2 ENSMUST00000200406|IGKV20-101-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGCTCTAGTTCAGCTCCTAGGGATGCTGATGCTCTGGCTCCAAGGCATGAGCTGTAATATCCAGGTGATCCAGTCACCATTTCTGTCTGCATCTGTGGGAGAGAGGGTCACAATCAGCTGCAAGACACATCAGCATATTAACAGTTCCATAGCCTGGTACCAGCAAAAAGTTGGAAAAGCTCCCATACTCCTGATAAGAGATGCAAGTTTTTCTCTAACAGACACCCCATCAAGGTTCACTGGGAATGGATTTGGCACAGATTTCACACTCAGCATCAGCAGTATGCAGTCTCAAGATGGTGCCACATATTTCTGCCAGCAGCATTTTCACTATTAC +>239|IGKV3-1 ENSMUST00000103404|IGKV3-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTCACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGAGCCACCATCTCCTGCAGAGCCAGTGAAAGTGTTGAATATTATGGCACAAGTTTAATGCAGTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACGTAGAATCTGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTGTGGAGGAGGATGATATTGCAATGTATTTCTGTCAGCAAAGTAGGAAGGTTCCTTC +>240|IGKV3-10 ENSMUST00000196940|IGKV3-10|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTAACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTGATCCTGTGGAGGCTGATGATGCTGCAACCTATTACTGTCAGCAAAATAATGAGGATCCTCC +>241|IGKV3-12 ENSMUST00000103396|IGKV3-12|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGTTATGGGTACTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCAAAAGTGTCAGTACATCTGGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCTTGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCACAGTAGGGAGCTTCCTCC +>242|IGKV3-2 ENSMUST00000103403|IGKV3-2|5'UTR|IG|IGK|None|00 +TCTCTTCCAGTTCTCAGAG +>243|IGKV3-2 ENSMUST00000103403|IGKV3-2|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGAAAGACACACTCCTGCTATGGGTCCTGCTTCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAGAGCCAGCGAAAGTGTTGATAATTATGGCATTAGTTTTATGAACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCAAGGATCCGGGGTCCCTGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCAGCCTCAACATCCATCCTATGGAGGAGGATGATACTGCAATGTATTTCTGTCAGCAAAGTAAGGAGGTTCCTCC +>244|IGKV3-3 ENSMUST00000103402|IGKV3-3|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGAGCCACTATCTTCTGCAGAGCCAGCCAGAGTGTCGATTATAATGGAATTAGTTATATGCACTGGTTCCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAAGATGCTGCAACCTATTACTGTCAGCAAAGTATTGAGGATCCTCC +>245|IGKV3-4 ENSMUST00000103401|IGKV3-4|5'UTR|IG|IGK|None|00 +G +>246|IGKV3-4 ENSMUST00000103401|IGKV3-4|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACAATCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATCTCCTGCAAGGCCAGCCAAAGTGTTGATTATGATGGTGATAGTTATATGAACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATGCTGCATCCAATCTAGAATCTGGGATCCCAGCCAGGTTTAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATGCTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>247|IGKV3-5 ENSMUST00000103400|IGKV3-5|5'UTR|IG|IGK|None|00 +ATCCTCTCTTCCAGCTCTCAGAG +>248|IGKV3-5 ENSMUST00000103400|IGKV3-5|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACAGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGGCAGAGGGCCACCATATCCTGCAGAGCCAGTGAAAGTGTTGATAGTTATGGCAATAGTTTTATGCACTGGTACCAGCAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGGATCCCTGCCAGGTTCAGTGGCAGTGGGTCTAGGACAGACTTCACCCTCACCATTAATCCTGTGGAGGCTGATGATGTTGCAACCTATTACTGTCAGCAAAGTAATGAGGATCCTCC +>249|IGKV3-7 ENSMUST00000197560|IGKV3-7|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACACACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGTTCCACTGGTGACATTGTGCTGACACAGTCTCCTGCTTCCTTAGCTGTATCTCTGGGGCAGAGGGCCACCATCTCATGCAGGGCCAGCCAAAGTGTCAGTACATCTAGCTATAGTTATATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCAAGTATGCATCCAACCTAGAATCTGGGGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGGGACAGACTTCACCCTCAACATCCATCCTGTGGAGGAGGAGGATACTGCAACATATTACTGTCAGCACAGTTGGGAGATTCCTCC +>250|IGKV3-9 ENSMUST00000103398|IGKV3-9|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACAGACCCACTCCTGCTATGGGTGCTGCTGCTCTGGGTTCCAGGCTCCACTGGTGACATTGTGCTGACCCAATCTCCAGCTTCTTTGGCTGTGTCTCTAGGACAGAGGGCCACCATATCCTGCCAAGCCAGCGAAAGTGTCAGTTTTGCTGGTACAAGTTTAATGCACTGGTACCAACAGAAACCAGGACAGCCACCCAAACTCCTCATCTATCGTGCATCCAACCTAGAATCTGGAGTCCCTGCCAGGTTCAGTGGCAGTGGGTCTGAGTCAGACTTCACTCTCACCATCGATCCTGTGGAGGAAGATGATGCTGCAATGTATTACTGTATGCAAAGTATGGAAGATCCTCC +>251|IGKV4-50 ENSMUST00000103363|IGKV4-50|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTATCTCAGTTGTAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGAAGGTCACCATGAGCTGCAGGGCCAGCTCAAGTGTAAATTACATGTACTGGTACCAGCAGAAGTCAGATGCCTCCCCCAAACTATGGATTTATTACACATCCAACCTGGCTCCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGAACTCTTATTCTCTCACAATCAGCAGCATGGAGGGTGAAGATGCTGCCACTTATTACTGCCAGCAGTTTACTAGTTCCCCATCCA +>252|IGKV4-51 ENSMUST00000103345|IGKV4-51|5'UTR|IG|IGK|None|00 +GCAGGAATTAGCCAGGGACTAAAATTCAAAGACACA +>253|IGKV4-51 ENSMUST00000103345|IGKV4-51|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCATTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCCCCCAAACTCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGGCTGGGATCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAAATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>254|IGKV4-53 ENSMUST00000198328|IGKV4-53|5'UTR|IG|IGK|None|00 +AAAAACACA +>255|IGKV4-53 ENSMUST00000198328|IGKV4-53|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCATGTGCAGATTTTCAGCTTCATGCTAATCAGTGTCACAGTCATATTGTCCAGTGGAGAAATTGTGCTCACCCAGTCTCCAGCACTCATGGCTGCATCTCCAGGGGAGAAGGTCACCATCACCTGCAGTGTCAGCTCAAGTATAAGTTCCAGCAACTTGCACTGGTACCAGCAGAAGTCAGAAACCTCCCCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGTCAACAGTGGAGTAGTTACCCACTCA +>256|IGKV4-54 ENSMUST00000199437|IGKV4-54|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACAGGTACCAGCAGAAGCCAGGATCCTCACCCAAACCCTGGATTTATGGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAATATCATAGTTACCCACCCA +>257|IGKV4-55 ENSMUST00000103359|IGKV4-55|5'UTR|IG|IGK|None|00 +AGCTAGGGACCAAAGTTCAAAGACAAA +>258|IGKV4-55 ENSMUST00000103359|IGKV4-55|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCCTGATTTATGACACATCCAACCTGGCTTCTGGAGTCCCTGTTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTTACCCACCCA +>259|IGKV4-57 ENSMUST00000103357|IGKV4-57|L-REGION+V-REGION|IG|IGK|None|00 +ATGCATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATAACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTTCCAGCAGAAGCCAGGCACTTCTCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGATCTGGGACCTCTTACTCTCTCACAATCAGCCGAATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAAAGGAGTAGTTACCCACCCA +>260|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|5'UTR|IG|IGK|None|00 +AAATTCAAATACACA +>261|IGKV4-57-1 ENSMUST00000103356|IGKV4-57-1|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCTGGTGCAGATTTTCAGCTTCTTGCTAATCAGTGCCTCAGTTGCAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGGGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGTGCCTCCCCCAAACTCTGGATTTATAGCACATCCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCACTCA +>262|IGKV4-58 ENSMUST00000197448|IGKV4-58|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTACAGGTGCAGATTATCAGCTTCCTGCTAATCAGTGTCACAGTCATAATGTCCAGAGGAGAAAATGTGCTCACCCAGTCTCCAGCAATAATGGCTGCCTCTCTGGGGCAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGTCAGGCGCTTCCCCCAAACCCTTGATTCATAGGACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCGTGGAGGCTGAAGATGATGCAACTTATTACTGCCAGCAGTGGAGTGGTTACCCATTCA +>263|IGKV4-59 ENSMUST00000103354|IGKV4-59|5'UTR|IG|IGK|None|00 +AAAATTCAAAGACAAA +>264|IGKV4-59 ENSMUST00000103354|IGKV4-59|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATATCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>265|IGKV4-61 ENSMUST00000199160|IGKV4-61|5'UTR|IG|IGK|None|00 +ATTAGCTAGGGACCAAAATTCAAAGACAGA +>266|IGKV4-61 ENSMUST00000199160|IGKV4-61|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATATCCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATCGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTATCATAGTTACCCACCCA +>267|IGKV4-62 ENSMUST00000198345|IGKV4-62|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGCCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAGGCTCCTCCCCCAGACTCTGGATTTATGACACATCCAACCTGGTTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTAGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTACAGTGGTTACCCATCCA +>268|IGKV4-63 ENSMUST00000196595|IGKV4-63|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGAGAAAATGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAAAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAAGCACCTCCCCCAAACTCTGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCAGGTCGCTTCAGTGGCAGTGGGTCTGGAAACTCTTACTCTCTCACGATCAGCAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTTTTCAGGGGAGTGGGTACCCACTCA +>269|IGKV4-68 ENSMUST00000103350|IGKV4-68|5'UTR|IG|IGK|None|00 +AGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>270|IGKV4-68 ENSMUST00000103350|IGKV4-68|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATGAGTGCCTCAGTCATAATGTCCAGGGGACAAATTGTTCTCACCCAGTCTCCAGCACTCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGTACTGGTACCAGCAGAAGCCAAGATCCTCCCCCAAACCCTGGATTTATCTCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>271|IGKV4-69 ENSMUST00000103349|IGKV4-69|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTTAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTCTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCGCCCAAACCCTGGATTTATGACACATCCAACCTGGCTTCTGGATTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCATAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>272|IGKV4-70 ENSMUST00000103348|IGKV4-70|5'UTR|IG|IGK|None|00 +AATTAGCTAGGGACCAAAATTCAAAGACAAA +>273|IGKV4-70 ENSMUST00000103348|IGKV4-70|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTATAAGTTACATGCACTGGTACCAGCAGAAGCCAGGCACCTCCCCCAAAAGATGGATTTATGACACATCCAAACTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCATCAGCGGAGTAGTTACCCA +>274|IGKV4-71 ENSMUST00000196201|IGKV4-71|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATACTATTCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAGACTCTGGATTTATTTAACATTCAACTTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCTCAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>275|IGKV4-72 ENSMUST00000103346|IGKV4-72|5'UTR|IG|IGK|None|00 +TACTTATGAGAATAGCAGTAATTAGCTAGGGACCAAAATTCAAAGACAAA +>276|IGKV4-72 ENSMUST00000103346|IGKV4-72|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAAGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCTTCAGTCATAATGTCCAGAGGACAAATTGTTCTCTCCCAGTCTCCAGCAATCCTGTCTGCATCTCCAGGGGAGAAGGTCACAATGACTTGCAGGGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACCCTGGATTTATGCCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGAGTGGAGGCTGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTAGTAACCCACCCA +>277|IGKV4-74 ENSMUST00000103344|IGKV4-74|5'UTR|IG|IGK|None|00 +GCAGTAATTAGCTAGGGACCAAAATTCAAAGGAAAA +>278|IGKV4-74 ENSMUST00000103344|IGKV4-74|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAACGGGTCACCATGACCTGCACTGCCAGCTCAAGTGTAAGTTCCAGTTACTTGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTATTACTGCCACCAGTATCATCGTTCCCCACCCA +>279|IGKV4-78 ENSMUST00000103343|IGKV4-78|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCATGACCTGCAGTGCCAGATCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTATTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCACTTTTTACTGCCAGCAGTACAGTGGTTACCCATCCA +>280|IGKV4-79 ENSMUST00000103342|IGKV4-79|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCTGGGGAGAAGGTCACCTTGACCTGCAGTGCCAGCTCAAGTGTAAGTTCCAGCTACTTGTACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCTCTTATTTCTGCCATCAGTGGAGTAGTTACCCACCCC +>281|IGKV4-80 ENSMUST00000103341|IGKV4-80|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGCCTCAGTCATAATGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCTAGGGGAGGAGATCACCCTAACCTGCAGTGCCAGCTCGAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACTTCTCCCAAACTCTTGATTTATAGCACATCCAACCTGGCTTCTGGAGTCCCTTCTCGCTTCAGTGGCAGTGGGTCTGGGACCTTTTATTCTCTCACAATCAGCAGTGTGGAGGCTGAAGATGCTGCCGATTATTACTGCCATCAGTGGAGTAGTTATCCA +>282|IGKV4-81 ENSMUST00000197966|IGKV4-81|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGTTAATCAGTGTCTCAGTCATAATGTCCAGAGGAGAAAATGTGCTGACCCAGTCTCCAGCAATCATGGCTGCATCTCCAGGGGAGAAGGTCACCATGACCTGCAGTGCCAGCTCAAGTGTAAGTTCTAGTAACTTGCACTGGTACCAGCAGAAGTCAGGCACTTCTACCAAATTCTGGATTTATAGGACATCCAACCTGGCTTCAGAAGTCCCAGCTCCCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTTACAATCAGCAGCGTGGAGGCCGAAGATGCTGCCACTTATTACTGCCAGCAGTGGAGTGGTTACCCACCCA +>283|IGKV4-86 ENSMUST00000200454|IGKV4-86|5'UTR|IG|IGK|None|00 +CACTAATTAGCCAGAGACCAAAATCCAAATACACA +>284|IGKV4-86 ENSMUST00000200454|IGKV4-86|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACTTTCGGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTGTCCAGAGGAGAAATTGTGCTCACTCAGTCTCCAGCCATCACAGCTGCATCTCTGGGGCAAAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGCACTGGTACCAGCAGAAGTCAGGCACCTCCCCCAAACCATGGATTTATGAAATATCCAAACTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGAGGCTGAAGATGCTGCCATTTATTACTGCCAGCAGTGGAATTATCCTCTTA +>285|IGKV4-90 ENSMUST00000103334|IGKV4-90|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGTGTCACAGTCATATTGACCAATGGAGAAATTTTGCTCACCCAGTCTCCAGCAATCATAGCTGCATCTCCTGGGGAGAAGGTCACCATCACCTGCAGTGCCAGCTCAAGTGTAAGTTACATGAACTGGTACCAGCAGAAACCAGGATCCTCCCCCAAAATATGGATTTATGGTATATCCAACCTGGCTTCTGGAGTTCCTGCTCGCTTCAGTGGCAGTGGGTCTGGGACATCTTTCTCTTTCACAATCAACAGCATGGAGGCTGAAGATGTTGCCACTTATTACTGTCAGCAAAGGAGTAGTTACCCACCCA +>286|IGKV4-91 ENSMUST00000103333|IGKV4-91|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGATGCAGATTATCAGCTTGCTGCTAATCAGTGTCACAGTCATAGTGTCTAATGGAGAAATTGTGCTCACCCAGTCTCCAACCACCATGGCTGCATCTCCCGGGGAGAAGATCACTATCACCTGCAGTGCCAGCTCAAGTATAAGTTCCAATTACTTGCATTGGTATCAGCAGAAGCCAGGATTCTCCCCTAAACTCTTGATTTATAGGACATCCAATCTGGCTTCTGGAGTCCCAGCTCGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATTGGCACCATGGAGGCTGAAGATGTTGCCACTTACTACTGCCAGCAGGGTAGTAGTATACCACGCA +>287|IGKV4-92 ENSMUST00000103332|IGKV4-92|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATATGTGGGTGCAGATTTTCAGCTTACTGCTAATCTGTGTCACAGTGTCAAAGGGAGAAATGGTTCTCACCCAGTCTCCAGTATCCATAACTGCATCTCGAGGGGAGAAGGTCACCATCACCTGCCGTGCCAGCTCAAGTATAAGTTCCAATTACTTACACTGGTACCAGCAGAAGCCAGGATCCTCCCCTAAACTTTTGATTTATAGGACATCCATCCTGGCATCTGGAGTCCTAGACAGCTTCAGTGGCAGTGGGTCTGAGAGCTCTTACACTCTGACAATCAGCTGCATGCAGGACGAAGTTGCTGCCACTTACTATTGTCAGCAGGGGAGTAGTAGCCCACCA +>288|IGKV5-37 ENSMUST00000103372|IGKV5-37|5'UTR|IG|IGK|None|00 +GAAAGCTTAAAG +>289|IGKV5-37 ENSMUST00000103372|IGKV5-37|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATTCACACCTCATATCCTTGGACTTCTGCTTTTCTGGATTTCAGCCTCCACAGGTGACATCCTGCTGACCCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGAAACAGTCAGTCTTTCCTGTAGGGCCAGCCAGAGTATTTACAAGAACCTACACTGGTATCAACAGAAATCACATCGGTCTCCAAGGCTTCTCATCAAGTATGCTTCTGATTCCATCTCTGGGATCCCCTCCAGGTTCACTGGCAGTGGATCAGGGACAGATTACACTCTCAGTATCAACAGTGTGAAGCCCGAAGATGAAGGAATATATTACTGTCTTCAAGGTTACAGCACACCTTC +>290|IGKV5-39 ENSMUST00000197290|IGKV5-39|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTGTCCACTTCTCAGCTCCTTGGACTTTTGCTTTTCTGGACTTCAGCCTCCAGATGTGACATTGTGATGACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCTCTCTTTCCTGCAGGGCCAGCCAGAGTATTAGCGACTACTTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAATATGCTTCCCAATCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGTCAGATTTCACTCTCAGTATCAACAGTGTGGAACCTGAAGATGTTGGAGTGTATTACTGTCAAAATGGTCACAGCTTTCCTCC +>291|IGKV5-43 ENSMUST00000103368|IGKV5-43|5'UTR|IG|IGK|None|00 +ATGAGCCACACAAACTCAGGGAAAGCTCGAAG +>292|IGKV5-43 ENSMUST00000103368|IGKV5-43|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATACTTGGACTTATGCTTTTTTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGCGTCAGTCTTTCCTGCAGGGCCAGCCAAAGTATTAGCAACAACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>293|IGKV5-45 ENSMUST00000103366|IGKV5-45|5'UTR|IG|IGK|None|00 +TGTGTCATGATCCACACAAACTCAGGGAAAGCTCGAAG +>294|IGKV5-45 ENSMUST00000103366|IGKV5-45|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTTTTCACACCTCAGATTCTTGGACTTATGCTTTTCTGGATTTCAGCCTCCAGAGGTGATATTGTGCTAACTCAGTCTCCAGCCACCCTGTCTGTGACTCCAGGAGATAGAGTCAGTCTTTCCTGCAGGGCCAGTCAAAGTATTAGCAACTACCTACACTGGTATCAACAAAAATCACATGAGTCTCCAAGGCTTCTCATCAAGTATGCTTCCCAGTCCATCTCTGGGATCCCCTCCAGGTTCAGTGGCAGTGGATCAGGGACAGATTTCACTCTCAGTATCAACAGTGTGGAGACTGAAGATTTTGGAATGTATTTCTGTCAACAGAGTAACAGCTGGCCTCA +>295|IGKV5-48 ENSMUST00000103364|IGKV5-48|5'UTR|IG|IGK|None|00 +GGAAAGTTTGAAG +>296|IGKV5-48 ENSMUST00000103364|IGKV5-48|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCCACACCTCAGTTCCTTGTATTTTTGCTTTTCTGGATTCCAGCCTCCAGAGGTGACATCTTGCTGACTCAGTCTCCAGCCATCCTGTCTGTGAGTCCAGGAGAAAGAGTCAGTTTCTCCTGCAGGGCCAGTCAGAGCATTGGCACAAGCATACACTGGTATCAGCAAAGAACAAATGGTTCTCCAAGGCTTCTCATAAAGTATGCTTCTGAGTCTATCTCTGGGATCCCTTCCAGGTTTAGTGGCAGTGGATCAGGGACAGATTTTACTCTTAGCATCAACAGTGTGGAGTCTGAAGATATTGCAGATTATTACTGTCAACAAAGTAATAGCTGGCCAAC +>297|IGKV6-13 ENSMUST00000198184|IGKV6-13|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGCTTCAAGATGGAGTCTCATACTCAGGCCTTTGTATTCGCGTTTCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCAATCGGTACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATATGCAGTCTGAAGACCTGGCAGATTATTTCTGCCAGCAATATAGCAGCTATCCTCT +>298|IGKV6-14 ENSMUST00000103394|IGKV6-14|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTCTTTGTATTCGTGTTGCTCTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGAATGTTCGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAGTCTCCTAAAGCACTGATTTACTTGGCATCCAACCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAATCTGAAGACCTGGCAGATTATTTCTGTCTGCAACATTGGAATTATCCTCT +>299|IGKV6-15 ENSMUST00000103393|IGKV6-15|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGACTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGATGGAGACATTGTGATGACCCAGTCTCAAAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCGTCACCTGCAAGGCCAGTCAGAATGTGGGTACTAATGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAAGCACTGATTTACTCGGCATCCTACCGGTACAGTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAATGTGCAGTCTGAAGACTTGGCAGAGTATTTCTGTCAGCAATATAACAGCTATCCTCT +>300|IGKV6-17 ENSMUST00000103391|IGKV6-17|5'UTR|IG|IGK|None|00 +GAAATGCATCACACCAGCATGGGCATCAAA +>301|IGKV6-17 ENSMUST00000103391|IGKV6-17|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGTCTTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGACAATCTCCTAAACTACTGATTTACTCGGCATCCTACCGGTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATCTGGGACGGATTTCACTTTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAACATTATAGTACTCCTCC +>302|IGKV6-20 ENSMUST00000103388|IGKV6-20|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>303|IGKV6-20 ENSMUST00000103388|IGKV6-20|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACACTGGGGTCCCCGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGAGTTACAGCTATCCTCC +>304|IGKV6-23 ENSMUST00000103386|IGKV6-23|5'UTR|IG|IGK|None|00 +TCAGACCAGCATGGGCATCAAG +>305|IGKV6-23 ENSMUST00000103386|IGKV6-23|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGACACATTCTCAGGTCTTTGTATACATGTTGCTGTGGTTGTCTGGTGTTGAAGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGGGTACTGCTGTAGCCTGGTATCAACAGAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATTAGCAATGTGCAGTCTGAAGACTTGGCAGATTATTTCTGTCAGCAATATAGCAGCTATCCTCT +>306|IGKV6-25 ENSMUST00000103383|IGKV6-25|5'UTR|IG|IGK|None|00 +TATGAAATGCATCGCACCAGCATGGGCATCAAG +>307|IGKV6-25 ENSMUST00000103383|IGKV6-25|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTCACAGATTCAGGCATTTGTATTCGTGTTTCTCTGGTTGTCTGGTGTTGACGGAGACATTGTGATGACCCAGTCTCACAAATTCATGTCCACATCAGTAGGAGACAGGGTCAGCATCACCTGCAAGGCCAGTCAGGATGTGAGTACTGCTGTAGCCTGGTATCAACAAAAACCAGGGCAATCTCCTAAACTACTGATTTACTGGGCATCCACCCGGCACACTGGAGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTATACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCACTTTATTACTGTCAGCAACATTATAGCACTCCTCC +>308|IGKV6-29 ENSMUST00000197371|IGKV6-29|5'UTR|IG|IGK|None|00 +AATGCATCAGACCAGCATGGGCATCAAG +>309|IGKV6-29 ENSMUST00000197371|IGKV6-29|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCTGGTCTTCATATCCATACTGCTCTGGTTATATGGTGCTGATGGGAACATTGTAATGACCCAATCTCCCAAATCCATGTCCATGTCAGTAGGAGAGAGGGTCACCTTGAGCTGCAAGGCCAGTGAGAATGTGGGTACTTATGTATCCTGGTATCAACAGAAACCAGAGCAGTCTCCTAAACTGCTGATATACGGGGCATCCAACCGGTACCCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGCAACAGATTTCACTCTGACCATCAGCAGTCTGCAGGCTGAAGACCTTGCAGATTATCACTGTGGACAGGGTTACAGCTATCTTCC +>310|IGKV6-32 ENSMUST00000103377|IGKV6-32|5'UTR|IG|IGK|None|00 +GGCAGGCAAGGGCATCAAG +>311|IGKV6-32 ENSMUST00000103377|IGKV6-32|L-REGION+V-REGION|IG|IGK|None|00 +ATGAAGTCACAGACCCAGGTCTTCGTATTTCTACTGCTCTGTGTGTCTGGTGCTCATGGGAGTATTGTGATGACCCAGACTCCCAAATTCCTGCTTGTATCAGCAGGAGACAGGGTTACCATAACCTGCAAGGCCAGTCAGAGTGTGAGTAATGATGTAGCTTGGTACCAACAGAAGCCAGGGCAGTCTCCTAAACTGCTGATATACTATGCATCCAATCGCTACACTGGAGTCCCTGATCGCTTCACTGGCAGTGGATATGGGACGGATTTCACTTTCACCATCAGCACTGTGCAGGCTGAAGACCTGGCAGTTTATTTCTGTCAGCAGGATTATAGCTCTCCTCC +>312|IGKV7-33 ENSMUST00000197429|IGKV7-33|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAGTTTCAGACCCAGGTACTCATGTCCCTGCTGCTCTGCATGTCTGGTGCCTGTGCAGACATTGTGATGACTCAGTCTCCAACTTTCCTTGCTGTGACAGCAAGTAAGAAGGTCACCATTAGTTGCACGGCCAGTGAGAGCCTTTATTCAAGCAAACACAAGGTGCACTACTTGGCTTGGTACCAGAAGAAACCAGAGCAATCTCCTAAACTGCTGATATACGGGGCATCCAACCGATACATTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTGACCATCAGCAGTGTACAGGTTGAAGACCTCACACATTATTACTGTGCACAGTTTTACAGCTATCCTCT +>313|IGKV8-16 ENSMUST00000195945|IGKV8-16|5'UTR|IG|IGK|None|00 +GGCAGGGGAGCAAT +>314|IGKV8-16 ENSMUST00000195945|IGKV8-16|L-REGION+V-REGION|IG|IGK|None|00 +ATGGTATCAGAGACCCATGTCCTCATATTTTTGCTGCTATGGGTGTCTGGTGCTTGTGGGGAAATTGTGTTGACCCAGTCTATACCATCCCTGACTGTGTCAGCAGGAGAGAGGGTCACTATCAGCTGCAAATCCAATCAGAATCTTTTATGGAGTGGAAACCAAAGGTACTGTTTGGTCTGGCACCAGTGGAAACCAGGGCAAACTCCTACACCGTTGATCACCTGGACATCTGATAGGTACTCTGGAGTCCCTGATCGTTTCATAGGCAGTGGATCTGTGACAGATTTCACTCTGACCATCAGCAGTGTGCAGGCTGAAGATGTGGCAGTTTATTTCTGTCAGCAGCATTTACACATTCCTCC +>315|IGKV8-18 ENSMUST00000103390|IGKV8-18|5'UTR|IG|IGK|None|00 +CATCAGTCAGGCAGGGGGGAGAAAG +>316|IGKV8-18 ENSMUST00000103390|IGKV8-18|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGATGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAATAACTACTTATCCTGGTACCAGCAGAAACAAGGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGATTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAGCACAATCATGGCAGCTTTCTCCCCC +>317|IGKV8-19 ENSMUST00000196599|IGKV8-19|5'UTR|IG|IGK|None|00 +GCAAG +>318|IGKV8-19 ENSMUST00000196599|IGKV8-19|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATGTCCCTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGACTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGACCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATTATAGTTATCCTCC +>319|IGKV8-21 ENSMUST00000103387|IGKV8-21|5'UTR|IG|IGK|None|00 +AGACAGGCAGTGGGAGCAAG +>320|IGKV8-21 ENSMUST00000103387|IGKV8-21|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATATTGCTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTGGCTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAATCCAGTCAGAGTCTGCTCAACAGTAGAACCCGAAAGAACTACTTGGCTTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGCAAGCAATCTTATAATCTTCC +>321|IGKV8-24 ENSMUST00000103384|IGKV8-24|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACCCAGGTCCTCATGTTTCTTCTGCTCTGGGTATCTGGTGCCTGTGCAGACATTGTGATGACACAGTCTCCATCCTCCCTGGCTATGTCAGTAGGACAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTAAATAGTAGCAATCAAAAGAACTATTTGGCCTGGTACCAGCAGAAACCAGGACAGTCTCCTAAACTTCTGGTATACTTTGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACAGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGATTACTTCTGTCAGCAACATTATAGCACTCCTCC +>322|IGKV8-26 ENSMUST00000103382|IGKV8-26|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGAACCATGTCCTCATGTTCTTGCTGCTTTGGGTATCTGATACCTGTGGGGACATTGTGATGACCCAGTCTCCATCCTCCCTGGCTGTGACAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTGTGGAGTGTAAACCAAAAGAACTACTTGTCCTGGTACCAGCAGAAACAAAGGCAGCCTCCTAAACTGCTTATCTATGGGGCATCCATTAGAGAATCTTGGGTCCCTGATCGGTTCACAGGAAGTGGATCTGGGACAGACTTCACTCTCACCATTAGCAATGTGCATGCTGAAGACCTAGCAGTTTATTACTGTCAACACAATCATGGCAGCTTTCTCCCCCC +>323|IGKV8-27 ENSMUST00000197272|IGKV8-27|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCTTCCTCTCCCTGCTGCTCTGGGTATCTGGTACCTGTGGGAACATTATGATGACACAGTCGCCATCATCTCTGGCTGTGTCTGCAGGAGAAAAGGTCACTATGAGCTGTAAGTCCAGTCAAAGTGTTTTATACAGTTCAAATCAGAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATCTACTGGGCATCCACTAGGGAATCTGGTGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTTACTCTTACCATCAGCAGTGTACAAGCTGAAGACCTGGCAGTTTATTACTGTCATCAATACCTCTCCTCG +>324|IGKV8-28 ENSMUST00000197525|IGKV8-28|5'UTR|IG|IGK|None|00 +GCAAG +>325|IGKV8-28 ENSMUST00000197525|IGKV8-28|L-REGION+V-REGION|IG|IGK|None|00 +ATGGAATCACAGACTCAGGTCCTCATCTCCTTGCTGTTCTGGGTATCTGGTACCTGTGGGGACATTGTGATGACACAGTCTCCATCCTCCCTGAGTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTGTTAAACAGTGGAAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGCCTCCTAAACTGTTGATCTACGGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGAACCGATTTCACTCTTACCATCAGCAGTGTGCAGGCTGAAGACCTGGCAGTTTATTACTGTCAGAATGATCATAGTTATCCTCC +>326|IGKV8-30 ENSMUST00000103378|IGKV8-30|5'UTR|IG|IGK|None|00 +AAG +>327|IGKV8-30 ENSMUST00000103378|IGKV8-30|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTTCTTATGTTACTGCTGCTATGGGTATCTGGTACCTGTGGGGACATTGTGATGTCACAGTCTCCATCCTCCCTAGCTGTGTCAGTTGGAGAGAAGGTTACTATGAGCTGCAAGTCCAGTCAGAGCCTTTTATATAGTAGCAATCAAAAGAACTACTTGGCCTGGTACCAGCAGAAACCAGGGCAGTCTCCTAAACTGCTGATTTACTGGGCATCCACTAGGGAATCTGGGGTCCCTGATCGCTTCACAGGCAGTGGATCTGGGACAGATTTCACTCTCACCATCAGCAGTGTGAAGGCTGAAGACCTGGCAGTTTATTACTGTCAGCAATATTATAGCTATCCTCC +>328|IGKV8-34 ENSMUST00000196959|IGKV8-34|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTCACAGGCCCAGGTCCTCATGTTGCTGCTGCTATCGGTATCTGGTACCTGTGGAGACATTTTGATGACCCAGTCTCCATCCTCCCTGACTGTGTCAGCAGGAGAGAAGGTCACTATGAGCTGCAAGTCCAGTCAGAGTCTTTTAGCTAGTGGCAACCAAAATAACTACTTGGCCTGGCACCAGCAGAAACCAGGACGATCTCCTAAAATGCTGATAATTTGGGCATCCACTAGGGTATCTGGAGTCCCTGATCGCTTCATAGGCAGTGGATCTGGGACGGATTTCACTCTGACCATCAACAGTGTGCAGGCTGAAGATCTGGCTGTTTATTACTGTCAGCAGTCCTACAGCGCTCCTAC +>329|IGKV9-120 ENSMUST00000103316|IGKV9-120|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCACAGATTTTTGGCTTCTTGTTGCTCTTGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGACATTGGTAGTAGCTTAAACTGGCTTCAGCAGGAACCAGATGGAACTATTAAACGCCTGATCTACGCCACATCCAGTTTAGATTCTGGTGTCCCCAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGTAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>330|IGKV9-123 ENSMUST00000103313|IGKV9-123|5'UTR|IG|IGK|None|00 +TTGTCATTGCATTCAGAACTCAGC +>331|IGKV9-123 ENSMUST00000103313|IGKV9-123|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATCAGGGCTCCTGCTCAGTTTCTTGGCATCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGATTCAGTCTCCATCGTCCATGTTTGCCTCTCTGGGAGACAGAGTCAGTCTCTCTTGTCGGGCTAGTCAGGGCATTAGAGGTAATTTAGACTGGTATCAGCAGAAACCAGGTGGAACTATTAAACTCCTGATCTACTCCACATCCAATTTAAATTCTGGTGTCCCATCAAGGTTCAGTGGCAGTGGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTAGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAGCGTAATGCGTATCCTCT +>332|IGKV9-124 ENSMUST00000196768|IGKV9-124|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGTTCCTGCTCACGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTACCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGTCGGGCAAGTCAGGAAATTAGTGGTTACTTAAGCTGGCTTCAGCAGAAACCAGATGGAACTATTAAACGCCTGATCTACGCCGCATCCACTTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCACCATCAGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTATCCTCC +>333|IGKV9-129 ENSMUST00000200578|IGKV9-129|L-REGION+V-REGION|IG|IGK|None|00 +ATGGACATGAGGGCTCCTGCTCAGGTTTTTGGCTTCTTGTTGCTCTGGTTTCCAGGTGCCAGATGTGACATCCAGATGACCCAGTCTCCATCCTCCTTATCTGCCTCTCTGGGAGAAAGAGTCAGTCTCACTTGCCGGGCAAGTCAGGACATTCATGGTTATTTAAACTTGTTTCAGCAGAAACCAGGTGAAACTATTAAACACCTGATCTATGAAACATCCAATTTAGATTCTGGTGTCCCAAAAAGGTTCAGTGGCAGTAGGTCTGGGTCAGATTATTCTCTCATTATCGGCAGCCTTGAGTCTGAAGATTTTGCAGACTATTACTGTCTACAATATGCTAGTTCTCCTCC +>334|IGLC1 ENSMUST00000200568|IGLC1|C-REGION|IG|IGL|None|00 +GCCAGCCCAAGTCTTCGCCATCAGTCACCCTGTTTCCACCTTCCTCTGAAGAGCTCGAGACTAACAAGGCCACACTGGTGTGTACGATCACTGATTTCTACCCAGGTGTGGTGACAGTGGACTGGAAGGTAGATGGTACCCCTGTCACTCAGGGTATGGAGACAACCCAGCCTTCCAAACAGAGCAACAACAAGTACATGGCTAGCAGCTACCTGACCCTGACAGCAAGAGCATGGGAAAGGCATAGCAGTTACAGCTGCCAGGTCACTCATGAAGGTCACACTGTGGAGAAGAGTTTGTCCCGTGCTGACTGTTCC +>335|IGLC2 ENSMUST00000198182|IGLC2|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACTCTCACCGTGTTTCCACCTTCCTCTGAGGAGCTCAAGGAAAACAAAGCCACACTGGTGTGTCTGATTTCCAACTTTTCCCCGAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGGCAACAAGTTCATGGCCAGCAGCTTCCTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGTCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>336|IGLC3 ENSMUST00000200235|IGLC3|C-REGION|IG|IGL|None|00 +GTCAGCCCAAGTCCACTCCCACACTCACCATGTTTCCACCTTCCCCTGAGGAGCTCCAGGAAAACAAAGCCACACTCGTGTGTCTGATTTCCAATTTTTCCCCAAGTGGTGTGACAGTGGCCTGGAAGGCAAATGGTACACCTATCACCCAGGGTGTGGACACTTCAAATCCCACCAAAGAGGACAACAAGTACATGGCCAGCAGCTTCTTACATTTGACATCGGACCAGTGGAGATCTCACAACAGTTTTACCTGCCAAGTTACACATGAAGGGGACACTGTGGAGAAGAGTCTGTCTCCTGCAGAATGTCTC +>337|IGLC4 ENSMUST00000197046|IGLC4|C-REGION|IG|IGL|None|00 +GCCAACCCAAGGCTACACCCTCAGTTAATCTGTTCCCACCTTCCTCTGAAGAGCTCAAGACTAAAAAGGCCACACTGGTGTGTATGATCACTGAGTTCTACGCAGCTGCTGTGAGAGTGGCCTGGAAGGCAGATGGTACCCCTTTCACTCAGGGTGTAGAGACTACCCAGCCTCCCAAACAGAGGGACAACATGGCTAGCAGTTACCTGCTCTTCACAGCAGAAGCGTGGGAATCTCATAGCAGTTACAGCTGCCATGTCACTCATGAAGGGAACACTGTGGAGAAGAGTTTGTCCCGTGCTGAGTGTTCCTAG +>338|IGLJ1 ENSMUST00000199490|IGLJ1|J-REGION|IG|IGL|None|00 +CTGGGTGTTCGGTGGAGGAACCAAACTGACTGTCCTAG +>339|IGLJ2 ENSMUST00000197969|IGLJ2|J-REGION|IG|IGL|None|00 +TTATGTTTTCGGCGGTGGAACCAAGGTCACTGTCCTAG +>340|IGLJ3 ENSMUST00000200211|IGLJ3|J-REGION|IG|IGL|None|00 +GTTTATTTTCGGCAGTGGAACCAAGGTCACTGTCCTAG +>341|IGLJ3PSEUDOGENE ENSMUST00000200074|IGLJ3PSEUDOGENE|J-REGION|IG|IGL|None|00 +AGGTTCTTTTTCCTCAAATGGCCTATTGTATGCAGGAG +>342|IGLJ4 ENSMUST00000198313|IGLJ4|J-REGION|IG|IGL|None|00 +TTGGGTGTTCGGAGGTGGAACCAGATTGACTGTCCTAGATGA +>343|IGLV1 ENSMUST00000103746|IGLV1|5'UTR|IG|IGL|None|00 +GCTGACCAATATTGAAAAGAATAGACCTGGTTTGTGAATT +>344|IGLV1 ENSMUST00000103746|IGLV1|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGATTTCACTTATACTCTCTCTCCTGGCTCTCAGCTCAGGGGCCATTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGAAACAGTCACACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAACAACCGAGCTCCAGGTGTTCCTGCCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGAGGCAATATATTTCTGTGCTCTATGGTACAGCAACCATTTC +>345|IGLV2 ENSMUST00000197518|IGLV2|5'UTR|IG|IGL|None|00 +CTTGGTTTGTGAATT +>346|IGLV2 ENSMUST00000197518|IGLV2|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTTCACTTATACTCTCTCTCCTGGCTCTCTGCTCAGGAGCCAGTTCCCAGGCTGTTGTGACTCAGGAATCTGCACTCACCACATCACCTGGTGGAACAGTCATACTCACTTGTCGCTCAAGTACTGGGGCTGTTACAACTAGTAACTATGCCAACTGGGTCCAAGAAAAACCAGATCATTTATTCACTGGTCTAATAGGTGGTACCAGCAACCGAGCTCCAGGTGTTCCTGTCAGATTCTCAGGCTCCCTGATTGGAGACAAGGCTGCCCTCACCATCACAGGGGCACAGACTGAGGATGATGCAATGTATTTCTGTGCTCTATGGTACAGCACCCATTTC +>347|IGLV3 ENSMUST00000103751|IGLV3|5'UTR|IG|IGL|None|00 +GTACCTGCATT +>348|IGLV3 ENSMUST00000103751|IGLV3|L-REGION+V-REGION|IG|IGL|None|00 +ATGGCCTGGACTCCTCTCTTCTTCTTCTTTGTTCTTCATTGCTCAGGTTCTTTCTCCCAACTTGTGCTCACTCAGTCATCTTCAGCCTCTTTCTCCCTGGGAGCCTCAGCAAAACTCACGTGCACCTTGAGTAGTCAGCACAGTACGTACACCATTGAATGGTATCAGCAACAGCCACTCAAGCCTCCTAAGTATGTGATGGAGCTTAAGAAAGATGGAAGCCACAGCACAGGTGATGGGATTCCTGATCGCTTCTCTGGATCCAGCTCTGGTGCTGATCGCTACCTTAGCATTTCCAACATCCAGCCTGAAGATGAAGCAATATACATCTGTGGTGTGGGTGATACAATTAAGGAACAATTTGTGTAAC +>349|TRAC ENSMUST00000198398|TRAC|C-REGION|TR|TRA|None|00 +ACATCCAGAACCCAGAACCTGCTGTGTACCAGTTAAAAGATCCTCGGTCTCAGGACAGCACCCTCTGCCTGTTCACCGACTTTGACTCCCAAATCAATGTGCCGAAAACCATGGAATCTGGAACGTTCATCACTGACAAAACTGTGCTGGACATGAAAGCTATGGATTCCAAGAGCAATGGGGCCATTGCCTGGAGCAACCAGACAAGCTTCACCTGCCAAGATATCTTCAAAGAGACCAACGCCACCTACCCCAGTTCAGACGTTCCCTGTGATGCCACGTTGACTGAGAAAAGCTTTGAAACAGATATGAACCTAAACTTTCAAAACCTGTCAGTTATGGGACTCCGAATCCTCCTGCTGAAAGTAGCCGGATTTAACCTGCTCATGACGCTGAGGCTGTGGTCCAGT +>350|TRAJ11 ENSMUST00000103730|TRAJ11|J-REGION|TR|TRA|None|00 +TGACTCGGGATACAACAAACTCACTTTTGGAAAGGGCACGGTGCTTCTAGTCTCTCCAG +>351|TRAJ12 ENSMUST00000103729|TRAJ12|J-REGION|TR|TRA|None|00 +GGGACTGGAGGCTATAAAGTGGTCTTTGGAAGTGGGACTCGATTGCTGGTAAGCCCTG +>352|TRAJ13 ENSMUST00000103728|TRAJ13|J-REGION|TR|TRA|None|00 +CAAATTCTGGGACTTACCAGAGGTTTGGAACTGGGACAAAACTCCAAGTCGTTCCAA +>353|TRAJ15 ENSMUST00000103726|TRAJ15|J-REGION|TR|TRA|None|00 +CCTACCAGGGAGGCAGAGCTCTGATATTTGGAACAGGAACCACGGTATCAGTCAGCCCCA +>354|TRAJ16 ENSMUST00000103725|TRAJ16|J-REGION|TR|TRA|None|00 +GCAACTTCAAGTGGCCAGAAGCTGGTTTTTGGCCAGGGGACCATATTAAAGGTGTACCTGC +>355|TRAJ17 ENSMUST00000103724|TRAJ17|J-REGION|TR|TRA|None|00 +TGACTAACAGTGCAGGGAACAAGCTAACTTTTGGAATCGGAACCAGGGTGCTGGTCAGGCCAG +>356|TRAJ18 ENSMUST00000103723|TRAJ18|J-REGION|TR|TRA|None|00 +TAGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTTGGAGCTGGGACTCAGCTGATTGTCATACCTG +>357|TRAJ19 ENSMUST00000103722|TRAJ19|J-REGION|TR|TRA|None|00 +ATCTATCGAGGTTTTCATAAGTTCAGCTCTGGAATAGAATCCAAGCATAATGTAAGTCCTA +>358|TRAJ2 ENSMUST00000103738|TRAJ2|J-REGION|TR|TRA|None|00 +TGAATACTGGAGGACTAAGTGGTAAATTAACATTCGGGGAAGGGACCCAAGTGACGGTAATATCTG +>359|TRAJ20 ENSMUST00000103721|TRAJ20|J-REGION|TR|TRA|None|00 +GTTCTGGTAACTACAAGCTCGGTGTTGAGTCAGTAACCATGATGTCTGTAAGAGCAGG +>360|TRAJ21 ENSMUST00000103720|TRAJ21|J-REGION|TR|TRA|None|00 +TGTCTAATTACAACGTGCTTTACTTCGGATCTGGCACCAAACTCACTGTAGAGCCAA +>361|TRAJ22 ENSMUST00000103719|TRAJ22|J-REGION|TR|TRA|None|00 +CATCTTCTGGCAGCTGGCAACTCATCTTTGGATCTGGAACCCAACTGACAGTTATGCCTG +>362|TRAJ23 ENSMUST00000103718|TRAJ23|J-REGION|TR|TRA|None|00 +TGAATTATAACCAGGGGAAGCTTATCTTTGGACAGGGAACCAAGTTATCTATCAAGCCCA +>363|TRAJ24 ENSMUST00000103717|TRAJ24|J-REGION|TR|TRA|None|00 +TGACAACTGCCAGTTTGGGGAAACTGCAGTTTGGAACAGGAACCCAGGTTGTGGTGACCCCAG +>364|TRAJ25 ENSMUST00000103716|TRAJ25|J-REGION|TR|TRA|None|00 +GAAGGACAAAAGTCTCCTCTGTCTTTGGGACAGGGAGAAGGCTGCTGGTGAAGCCAA +>365|TRAJ26 ENSMUST00000103715|TRAJ26|J-REGION|TR|TRA|None|00 +GAAATAACTATGCCCAGGGATTAACCTTCGGTCTTGGCACCAGAGTATCTGTGTTTCCCT +>366|TRAJ27 ENSMUST00000103714|TRAJ27|J-REGION|TR|TRA|None|00 +TAACACCAATACAGGCAAATTAACCTTTGGGGATGGGACCGTGCTCACAGTGAAGCCAA +>367|TRAJ28 ENSMUST00000103713|TRAJ28|J-REGION|TR|TRA|None|00 +TCTACCAGGCACTGGGAGTAACAGGCTCACTTTTGGGAAAGGCACCAAATTCTCACTCATCCCGA +>368|TRAJ29 ENSMUST00000103712|TRAJ29|J-REGION|TR|TRA|None|00 +GGAATTCAGGAAGCAGGGAGCTTGTCTTAGGAAGGGAAGCAAGGCTTTCTATGATTGAAA +>369|TRAJ3 ENSMUST00000103737|TRAJ3|J-REGION|TR|TRA|None|00 +GGAATTCAGCTATAGCTCTAAACTAATCTTTGGAGCTGAAACCAAACTCAGAAATCCACCATATAC +>370|TRAJ30 ENSMUST00000103711|TRAJ30|J-REGION|TR|TRA|None|00 +TGACACAAATGCTTACAAAGTCATCTTTGGAAAAGGGACACATCTTCATGTTCTCCCTA +>371|TRAJ31 ENSMUST00000103710|TRAJ31|J-REGION|TR|TRA|None|00 +GGAATAGCAATAACAGAATCTTCTTTGGTGATGGGACGCAGCTGGTGGTGAAGCCCA +>372|TRAJ32 ENSMUST00000103709|TRAJ32|J-REGION|TR|TRA|None|00 +TGAATTATGGGAGCAGTGGCAACAAGCTCATCTTTGGAATTGGGACTCTGCTTTCTGTCAAGCCAA +>373|TRAJ33 ENSMUST00000103708|TRAJ33|J-REGION|TR|TRA|None|00 +TGGATAGCAACTATCAGTTGATCTGGGGCTCTGGGACCAAGCTAATTATAAAGCCAG +>374|TRAJ34 ENSMUST00000103707|TRAJ34|J-REGION|TR|TRA|None|00 +TCTTCCAATACCAACAAAGTCGTCTTTGGAACAGGGACCAGATTACAAGTATTACCAA +>375|TRAJ35 ENSMUST00000103706|TRAJ35|J-REGION|TR|TRA|None|00 +GCAGACAGGCTTTGCAAGTGCGCTGACATTTGGATCTGGCACAAAAGTCATTCCATGTCTACCAT +>376|TRAJ37 ENSMUST00000103705|TRAJ37|J-REGION|TR|TRA|None|00 +TAACAGGCAATACCGGAAAACTCATCTTTGGACTGGGGACAACTTTACAAGTGCAACCAG +>377|TRAJ38 ENSMUST00000103704|TRAJ38|J-REGION|TR|TRA|None|00 +TAATGTTGGTGACAACAGTAAGCTGATTTGGGGCTTGGGGACAAGTCTGGTAGTAAATCCAA +>378|TRAJ39 ENSMUST00000103703|TRAJ39|J-REGION|TR|TRA|None|00 +TGAATAATAATGCAGGTGCCAAGCTCACATTCGGAGGGGGAACAAGGTTAACGGTCAGACCCG +>379|TRAJ4 ENSMUST00000103736|TRAJ4|J-REGION|TR|TRA|None|00 +TGTTATCTGGTAGCTTCAATAAGTTGACCTTTGGAGCAGGGACCAGACTGGCTGTGTGCCCAT +>380|TRAJ40 ENSMUST00000103702|TRAJ40|J-REGION|TR|TRA|None|00 +GTTAATACAGGAAACTACAAATACGTCTTTGGAGCAGGTACCAGACTGAAGGTTATAGCAC +>381|TRAJ41 ENSMUST00000103701|TRAJ41|J-REGION|TR|TRA|None|00 +GGTCTCAAACACTAGCTCCATGTTGGCAGAAGCACCTCATTATTGGTCACACCCG +>382|TRAJ42 ENSMUST00000103700|TRAJ42|J-REGION|TR|TRA|None|00 +AATTCTGGAGGAAGCAATGCAAAGCTAACCTTCGGGAAAGGCACTAAACTCTCTGTTAAATCAA +>383|TRAJ43 ENSMUST00000103699|TRAJ43|J-REGION|TR|TRA|None|00 +GCAATAACAACAATGCCCCACGATTTGGAGCGGGAACCAAATTATCAGTAAAACCAA +>384|TRAJ44 ENSMUST00000103698|TRAJ44|J-REGION|TR|TRA|None|00 +GTTACTGGCAGTGGTGGAAAACTCACTTTGGGGGCTGGAACAAGACTTCAGGTCAACCTTG +>385|TRAJ45 ENSMUST00000103697|TRAJ45|J-REGION|TR|TRA|None|00 +TGAATACAGAAGGTGCAGATAGACTCACCTTTGGGAAAGGAACTCAGCTGATCATCCAGCCCT +>386|TRAJ46 ENSMUST00000103696|TRAJ46|J-REGION|TR|TRA|None|00 +AGAAAGACAGCAGTGTAGACATGCTGGCTTTGGGGATGGGGATGAACTTGGAGTGAGCACAAA +>387|TRAJ47 ENSMUST00000197949|TRAJ47|J-REGION|TR|TRA|None|00 +TGGACTATGCAAACAAGATGATCTTTGGCTTGGGAACCATTTTGAGAGTCAGACCTC +>388|TRAJ48 ENSMUST00000200046|TRAJ48|J-REGION|TR|TRA|None|00 +GCCAACTATGGAAATGAGAAAATAACTTTTGGGGCTGGAACCAAACTCACCATTAAACCCA +>389|TRAJ49 ENSMUST00000199452|TRAJ49|J-REGION|TR|TRA|None|00 +GAACACGGGTTACCAGAACTTCTATTTTGGGAAAGGAACAAGTTTGACTGTCATTCCAA +>390|TRAJ5 ENSMUST00000103735|TRAJ5|J-REGION|TR|TRA|None|00 +GGGGACACAGGTTGTGGGGCAGCTCACTTTCGGGAGGGGGACAAGACTCCAAGTTTATGCAA +>391|TRAJ50 ENSMUST00000103693|TRAJ50|J-REGION|TR|TRA|None|00 +TAGCATCCTCCTCCTTCAGCAAGCTGGTGTTTGGGCAGGGGACATCCTTATCAGTCGTTCCAA +>392|TRAJ52 ENSMUST00000103691|TRAJ52|J-REGION|TR|TRA|None|00 +CTAACACTGGAGCTAACACTGGAAAGCTCACGTTTGGACACGGCACCATCCTTAGGGTCCATCCAA +>393|TRAJ53 ENSMUST00000103690|TRAJ53|J-REGION|TR|TRA|None|00 +GGAACAGTGGAGGCAGCAATTACAAACTGACATTTGGGAAAGGAACTCTCTTAACTGTGACTCCAA +>394|TRAJ56 ENSMUST00000103689|TRAJ56|J-REGION|TR|TRA|None|00 +TGGCTACTGGAGGCAATAATAAGCTGACTTTTGGTCAAGGAACCGTTCTGAGTGTTATACCAG +>395|TRAJ57 ENSMUST00000196977|TRAJ57|J-REGION|TR|TRA|None|00 +TGAATCAAGGAGGGTCTGCGAAGCTCATCTTTGGGGAGGGGACAAAGCTGACAGTGAGCTCAT +>396|TRAJ58 ENSMUST00000103687|TRAJ58|J-REGION|TR|TRA|None|00 +TGCAGCAAGGCACTGGGTCTAAGCTGTCATTTGGGAAGGGGGCAAAGCTCACAGTGAGTCCAG +>397|TRAJ59 ENSMUST00000197589|TRAJ59|J-REGION|TR|TRA|None|00 +CTACTAAAAAGAGAAGATAAAGCTACCTTTGCAACTGGAGGGTATGAAGCTGAGGAAGACCT +>398|TRAJ6 ENSMUST00000103734|TRAJ6|J-REGION|TR|TRA|None|00 +AACCTCAGGAGGAAACTACAAACCTACGTTTGGGAAAGGGACCAGCCTCGTGGTTCATCCAT +>399|TRAJ7 ENSMUST00000103733|TRAJ7|J-REGION|TR|TRA|None|00 +GGACTACAGCAACAACAGACTTACTTTGGGGAAGGGAACCCAGGTGGTGGTGTTACCAA +>400|TRAJ9 ENSMUST00000103731|TRAJ9|J-REGION|TR|TRA|None|00 +AGCAACATGGGCTACAAACTTACCTTCGGGACAGGAACAAGCTTGTTGGTTGATCCAA +>401|TRAV1 ENSMUST00000103567|TRAV1|5'UTR|TR|TRA|None|00 +GCTCAGGAGCTGGGGACTCAGTGTCAGGCTGGTGGTGTC +>402|TRAV1 ENSMUST00000103567|TRAV1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGCAGATGTGGGGGTTTGTTCTCTATCTCTTCCTGACGGTGGGAGGTGCTGCAGGACAGGGTGTGGAGCAGCCTGCCAAATTGATGTCTGTGGAGGGAACCTTTGCTCGGGTCAACTGCACATACAGCACCTCAGGGTTCAACGGGTTATCCTGGTACCAGCAACGTGAAGGCCAAGCCCCTGTATTTCTTTCTTATGTTGTTTTGGATGGTTTGAAGGACAGTGGGCATTTCTCCACTTTCCTGAGCCGCTCGAATGGGTACAGTTACCTGCTTCTGACAGAGCTCCAGATCAAAGACTCTGCCTCATACCTCTGTGCTGTGAGGGA +>403|TRAV10 ENSMUST00000103583|TRAV10|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>404|TRAV10 ENSMUST00000103583|TRAV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTATGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACATGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCTTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>405|TRAV10D ENSMUST00000103646|TRAV10D|5'UTR|TR|TRA|None|00 +AAATACAAACAGCTTGCATGGCAAGAGATTGCAAGTCTGCATTGATCCCAGGCAGGAAGAATG +>406|TRAV10D ENSMUST00000103646|TRAV10D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAGAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTATAGTTTTGTTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>407|TRAV10N ENSMUST00000103612|TRAV10N|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACATCCCTTCACACTGTATTCCTATTCTTGTGGCTGTGGATGGACTGGGAAAGCCATGGAGAGAAGGTCGAGCAACACGAGTCTACACTGAGTGTTCGAGAGGGAGACAGCGCTGTCATCAACTGCACTTACACAGATACTGCCTCATCATACTTCCCTTGGTACAAGCAAGAAGCTGGAAAGAGTCTCCACTTTGTGATAGACATTCGTTCAAATGTGGACAGAAAACAGAGCCAAAGACTTACAGTTTTATTGGATAAGAAAGCCAAACGATTCTCCCTGCACATCACAGCCACACAGCCTGAAGATTCAGCCATCTACTTCTGTGCAGCAAGCA +>408|TRAV11 ENSMUST00000103585|TRAV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGCG +>409|TRAV11D ENSMUST00000103648|TRAV11D|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAAGCGCCTGAGTGCCTGCTGGGTGGTCTTGTGGCTGCATTATCAGTGGGTGGCTGGCAAGACCCAAGTGGAGCAGAGTCCTCAGTCCCTGGTTGTCCGTCAGGGAGAGAACTGCGTCCTTCAATGTAATTACAGTGTGACCCCCGACAACCACTTAAGGTGGTTCAAACAGGACACAGGCAAAGGTCTTGTGTCCCTGACAGTCCTGGTTGACCAAAAAGACAAAACGTCAAATGGGAGATACTCAGCAACTCTGGATAAAGATGCTAAGCACAGCACGCTGCACATCACAGCCACCCTGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGC +>410|TRAV12-1 ENSMUST00000200115|TRAV12-1|5'UTR|TR|TRA|None|00 +GTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCT +>411|TRAV12-1 ENSMUST00000200115|TRAV12-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTCCTCAGTTCTCGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACCGAGGGGTTGCCTGTGAAGCTGAACTGCACCTATCAGACTACTTATTTAACTATTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTCAGGTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>412|TRAV12-2 ENSMUST00000180972|TRAV12-2|5'UTR|TR|TRA|None|00 +GTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>413|TRAV12-2 ENSMUST00000180972|TRAV12-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAACAATGGAGACTCTGTGACCCAGACAGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGAGTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTTTTGAAGAGCTTCACAGACAACAAGAGGCCCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTTTGAGTGA +>414|TRAV12-3 ENSMUST00000103657|TRAV12-3|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTTTGAGGAGATCCTGCAGTAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCTATGAAC +>415|TRAV12-3 ENSMUST00000103657|TRAV12-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGGCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGAGATGGAGACTCAGTGACCCAGAAGGAAGGCCTGGTCACTCTCACCGAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATGCTTTCCTTTTCTGGTATGTGCACTATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>416|TRAV12D-1 ENSMUST00000181360|TRAV12D-1|5'UTR|TR|TRA|None|00 +CTTGTCTGTGAGTGAGGAGTGTGAGGAGATCCTGCAGGAGGATTGCCCTGTGAGATTGGTGCACTCAAGGACCAAGTGTCATTTCTTCC +>417|TRAV12D-1 ENSMUST00000181360|TRAV12D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGAAGGAGCAATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTGTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTGCTTACTCAGATGTTGCCTTTTTCTGGTATGTGCAATATCTCAACGAAGCCCCTAAACTACTCCTGCGGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>418|TRAV12D-2 ENSMUST00000197007|TRAV12D-2|5'UTR|TR|TRA|None|00 +GAGACTGTGCAGACAGAGGCCCTTGTCTGTGAGTGAGGAGTGTGAGGAGATTCTGCAGGAGGATTGCCCTGGGAGATTGGTGCACTCAGGGACCAAGTGTCATTTCTTCCATGAAC +>419|TRAV12D-2 ENSMUST00000197007|TRAV12D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGACACCTGCTCAGTTCTTGTGCTCCTCTTAATGCTCAGAAGGAGCAATGGAGACTCAGTGACCCAGACAGAAGGCCTGGTCACTCTCACCAAGGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTACTTACTCACCTTTCCTTTTCTGGTATGTGCAACATCTCAACGAAGCCCCTAAGCTACTCCTGAAGAGCTCCACAGACAACAAGAGGACCGAGCACCAAGGGTTCTACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGTGCAGCTGTCAGACTCTGCCCTGTACTTCTGTGCTTTGAGTGA +>420|TRAV12D-3 ENSMUST00000177703|TRAV12D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>421|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|5'UTR|TR|TRA|None|00 +CTGAAC +>422|TRAV12N-3 ENSMUST00000179583|TRAV12N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCGTCCTGTCACCTGCTCAGTTCTTGTGCTCCTCCTAATGCTCAGGAGGAGCAATGGCGATGGAGACTCCGTGACCCAGACAGAAGGCCTGGTCACTCTCACAGAAGGGTTGCCTGTGATGCTGAACTGCACCTATCAGACTATTTACTCAAATCCTTTCCTTTTCTGGTATGTGCAACATCTCAATGAATCCCCTCGGCTACTCCTGAAGAGCTTCACAGACAACAAGAGGACCGAGCACCAAGGGTTCCACGCCACTCTCCATAAGAGCAGCAGCTCCTTCCATCTGCAGAAGTCCTCAGCGCAGCTGTCAGACTCTGCCCTGTACTACTGTGCTCTGAGTGA +>423|TRAV13-1 ENSMUST00000103651|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGAGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCATAGTGGGAGACTGACATCCACTACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>424|TRAV13-2 ENSMUST00000103658|TRAV13-2|5'UTR|TR|TRA|None|00 +TGACACAACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCATCCACACAAGCACC +>425|TRAV13-2 ENSMUST00000103658|TRAV13-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGTTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACATCCTGGGGGAAGACTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAACGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATAGATC +>426|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGACTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>427|TRAV13-4-DV7 ENSMUST00000180380|TRAV13-4-DV7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCGGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>428|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|5'UTR|TR|TRA|None|00 +CCACCCTGACACCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>429|TRAV13D-1 ENSMUST00000103588|TRAV13D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCGTCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>430|TRAV13D-2 ENSMUST00000197954|TRAV13D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCAGCTGCAGTGGTTTTACCAAAGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTCCAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAGGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATCTCTGTGCTATAGATC +>431|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|5'UTR|TR|TRA|None|00 +CCACAGCCCAGGGGCTGGTTACTTGCTTCTGTCTCCAGCAGCCACACAAGCACC +>432|TRAV13D-3 ENSMUST00000179512|TRAV13D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAATGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>433|TRAV13D-4 ENSMUST00000196079|TRAV13D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACACAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCTGCATCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGTAACTTTTCCTCCACAGCAACCCGGCTGCAGTGGTTTTACCAACGTCCTGGGGGAAGCCTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCACACTGGAAGACTGACATCCACCACAGTCACTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGACAACAGACTCAGGCACTTATTTCTGTGCTATGGAAC +>434|TRAV13N-1 ENSMUST00000198359|TRAV13N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGTCCCACGTCCTTGGTTCTGCAGGAGGGGGAAAACGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGTCTCATCAGCGTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGCCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>435|TRAV13N-3 ENSMUST00000179580|TRAV13N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAACGCAGAGCTGCAGTGCACCTATTCCACAACTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAGTCCTTCTTGGGCAGAGCAGAGAGGTGGAAGACTGACATCCTCCGCAGCCAGTAACGAAAGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>436|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|5'UTR|TR|TRA|None|00 +GACTGGTTGCAGAAGAAGGAGGGGACACTTCAACAGCCACCCTGACACCACAGCCCAGGAGCTGGTTACTTGCTTCTGTCTCCAGCAGCTACACAAGCACC +>437|TRAV13N-4 ENSMUST00000196105|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>438|TRAV14-1 ENSMUST00000198297|TRAV14-1|5'UTR|TR|TRA|None|00 +CACCTGAGTTTCCCCCAAGCTTCAGTCTAGGAGGA +>439|TRAV14-1 ENSMUST00000198297|TRAV14-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATTCTGACAGCATCATTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGAAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGGAACCACAGTTCTGACCTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAACAGTTCCCTGGGGAAGGCCCTGCACTTCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAACCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCATAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>440|TRAV14-2 ENSMUST00000179267|TRAV14-2|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAAGAGGA +>441|TRAV14-2 ENSMUST00000179267|TRAV14-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACCATCAGTTCCCTGGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGTTCTCCTTGCACATCGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>442|TRAV14-3 ENSMUST00000103589|TRAV14-3|5'UTR|TR|TRA|None|00 +CCCCAAGCTTCAGTCTAGGAGAA +>443|TRAV14-3 ENSMUST00000103589|TRAV14-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCATTTTTACTTCTAGGCCTTCACCTATCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTAAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCCACTTACTTCTGTGCAGCAAGTG +>444|TRAV14D-1 ENSMUST00000181038|TRAV14D-1|5'UTR|TR|TRA|None|00 +GTGGGAGACAAAAGGTCACCTGAGTTCCCTTCAAGCTTCAGTCTAGGAGGA +>445|TRAV14D-1 ENSMUST00000181038|TRAV14D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCAACGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAATGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTAACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCACTCCTGATATCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>446|TRAV14D-2 ENSMUST00000196802|TRAV14D-2|5'UTR|TR|TRA|None|00 +GGAGCCTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGGCCACCTGAGTTCCCCCAAGCTTCAGTCTAGGAGGA +>447|TRAV14D-2 ENSMUST00000196802|TRAV14D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTCCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACAGCAATTCTGAACTGCAGTTATGAGGACAGCACTTTTGACTACTTCCCATGGTACTGGCAGTTCCCTAGGGAAAGCCCTGCACTCCTGATAGCCATACGTCCAGTGTCCAATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATCACAGACTCTCAGCCTGGAGACTCAGCTACCTACTTCTGTGCAGCAAGTG +>448|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|5'UTR|TR|TRA|None|00 +CTGCTCAGAGAGCTGAGGTGCCTGTGAAGTTGGAGTCAGTGTTCTGTGGGAGACAAAAGACCACAGAGTTTCTCCCAAGCTTCAGTCTAGGAGGA +>449|TRAV14D-3-DV8 ENSMUST00000103608|TRAV14D-3-DV8|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATCGTTTTTACTTCTAGGCCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACGTGACCAGCAGCAGGTGAGACAAAGTCCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGTCCCGCTCTCCTGATATCCATACTTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAAGCTCTCCTTGCACATTGCAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>450|TRAV14N-3 ENSMUST00000103652|TRAV14N-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACAAGATCCTGACAGCATTGTTTTTACTTCTAGGTCTTCACCTAGCTGGGGTGAGTGGCCAGCAGGAGAAACATGACCAGCAGCAGGTGAGACAAAGTTCCCAATCTCTGACAGTCTGGGAAGGAGAGACCGCAATTCTGAACTGCAGTTATGAGAACAGTGCTTTTGACTACTTCCCATGGTACCAGCAGTTCCCTGGGGAAGGCCCTGCTCTCCTGATAGCCATACGTTCAGTGTCCGATAAAAAGGAAGATGGACGATTCACAATCTTCTTCAATAAAAGGGAGAAAAATCTCTCCTTGCACATCAAAGACTCTCAGCCTGGAGACTCAGCCACCTACTTCTGTGCAGCAAGTG +>451|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|5'UTR|TR|TRA|None|00 +GCTGAGGCAGAGCAGACACACTCATGCAGAGGACAGTGTGTCAC +>452|TRAV15-1-DV6-1 ENSMUST00000200101|TRAV15-1-DV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCCAGAAAGTGATTCAGGTCTGGTCAACAACAAGCAGGCAGGAGGGCGAAAAACTCACACTGGACTGTTCATATAAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTGCTTATTCGACAAATGCCTTCTACTATTGCAATAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACGCAAATCCATCAGCCTTGTCATTTCAACCTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>453|TRAV15-2-DV6-2 ENSMUST00000103660|TRAV15-2-DV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGGACATGTGTCACATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGTCAACAGGCAGCAGTCAGTGGGGAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTCCTACCTTATTCTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGATACTCAGAACCAGAGGAGCGGCCACTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>454|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|5'UTR|TR|TRA|None|00 +GCACTTAGACACTGATCTCTGAGCTGAGGCAGAGCAGACACACTC +>455|TRAV15D-1-DV6D-1 ENSMUST00000103616|TRAV15D-1-DV6D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGACAGTGTGTCACATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>456|TRAV15D-2-DV6D-2 ENSMUST00000199800|TRAV15D-2-DV6D-2|5'UTR|TR|TRA|None|00 +GAGCTGAGGCAGAGCAGACACACTCATGCAGAGGGACATGTGTCAC +>457|TRAV15D-2-DV6D-2 ENSMUST00000199800|TRAV15D-2-DV6D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCAGAGCCTGCTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATGCAATGTGGCCCAGAGAGTGACTCAGGTCCAGCCAACAGGCAGCAGTCAGTGGGGAGAAGAAGTCACCCTGGACTGTTCATATGAGACAAGTGAATACTTCTACCGTATTTTTTGGTACAGGCAGCTTTTTAGTGGAGAGATGGTTTTCCTTATTTACCAACCTTCTTTTGACACTCAGAACCAGAGGAGCGGCCGCTACTCTGTAGTCTTCCAGAAATCATTCAAGTCCATCAGCCTTGTCATTTCAGCCTCACAGCCAGAGGATTCAGGGACGTACTTCTGCGCTCTCTCGGAACTGA +>458|TRAV15N-1 ENSMUST00000197433|TRAV15N-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCCTCCTCACAGCCTGTTCTGTGTGCTGGTGGCCTTGGCTTTCTCTGGATCTAATGTGGCCGAGAAAGTGATTCAGGTCTGGTCAACAGCAAGCAGGCAGGAGGGCGAAGAACTCACCCTGGACTGTTCATATGAGACAAGTCAGGTCTTATACCATCTTTTCTGGTACAAGCACCTTCTTAGTGGAGAGATGGTTTTCCTTATTCGACAAACGTCTTCTTCTACTGCAAAAGAGAGGAGCGGCCGCTATTCTGTAGTCTTCCAGAAATCACTCAAATCCATCAGCCTTATCATTTCAGCTTTACAACCAGACGATTCGGGAAAGTATTTCTGTGCTCTCTGGGAGCTGG +>459|TRAV16 ENSMUST00000103667|TRAV16|5'UTR|TR|TRA|None|00 +CACAAAGTATAGATTAAGATCTGGTTGAGAGAGGACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>460|TRAV16 ENSMUST00000103667|TRAV16|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGCTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGAAGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACTGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>461|TRAV16D-DV11 ENSMUST00000103606|TRAV16D-DV11|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCTCCATTTTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGATGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCAGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCGGCAGTATATTTCTGTGCTATGAGAGAGGG +>462|TRAV16N ENSMUST00000199280|TRAV16N|5'UTR|TR|TRA|None|00 +ATAGATTAAGATCTGGTTGAGAGAGAACATAGACAACTTCACTCAAGACCAGAGCTAACAGT +>463|TRAV16N ENSMUST00000199280|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>464|TRAV17 ENSMUST00000103672|TRAV17|L-REGION+V-REGION|TR|TRA|None|00 +ATGTTCCCAGTGACCATTCTGCTGCTCAGCGCGTTCTTCTCACTGAGAGGAAACAGTGCCCAGTCCGTGGACCAGCCTGATGCTCATGTCACGCTCTCTGAAGGAGCCTCCCTGGAGCTCAGATGCAGTTATTCATACAGTGCAGCACCTTACCTCTTCTGGTACGTGCAGTATCCTGGCCAGAGCCTCCAGTTTCTCCTCAAATACATCACAGGAGACACCGTTGTTAAAGGCACCAAGGGCTTTGAGGCCGAGTTTAGGAAGAGTAACTCCTCTTTCAACCTGAAGAAATCCCCAGCCCATTGGAGCGACTCAGCCAAGTACTTCTGTGCACTGGAGGG +>465|TRAV18 ENSMUST00000103673|TRAV18|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGAAACTCTCTGTGTTGCTCCTTTGGAATCAAGTGGCCCGTGTGGCCACTCAACGGCTGGAGCAGAGTCCTCGGTTTCTGAGTATCCAGGAGGGGCAAGATTTCACTGCACGCTGCAGCTCCTCAACCACCTTCCCCCAACTTTACTGGTACCGACAGGTCCCCAGGGAAGGTCCTGTCATCCTGGTGACATTGGTCAAGAGTGGAGAGGTAAAGGAGCAGAGGAGGATGACTGCTAAGTTTGGTGAAGCAAGAAAGAACAGCTCCCTATTCATCGCCAGAGCTCAGCCTGGAGACGCAGGCATCTACTTCTGTACAGGAA +>466|TRAV19 ENSMUST00000103674|TRAV19|5'UTR|TR|TRA|None|00 +AAAGGGAATAAAGTCAGGACAGGAAGATGAAATCTGAGTTGCAGTTCCCTGAGTAGAAGGAGAGACAACTCAAAGCTTCAGAGAAGAC +>467|TRAV19 ENSMUST00000103674|TRAV19|L-REGION+V-REGION|TR|TRA|None|00 +ATGACTGGCTTCCTGAAGGCCTTGCTGTTGGTTCTGTGCCTGCGGCCAGAATGGGTAAAGAGTCAACAGAAGACTAGTGGCCAGCAAGTTAAACAAAGCTCTCCATCGCTGACTGTTCAAGAGGGAGGGATATCGATCCTGAATTGTGACTACGAGAATGATATGTTTGACTATTTTGCCTGGTACAAAAAATACCCTGACAACAGCCCCACACTCCTGATATCCGTACGCTCAAATGTGGATAAGAGGGAAGACGGAAGACTCACAGTTTTCTTGAACAAAAGCGGCAAACACTTCTCACTGCACATCACAGCCTCCCAGCCTGAAGACACAGCAGTGTACCTCTGCGCAGCAGGTG +>468|TRAV2 ENSMUST00000196939|TRAV2|5'UTR|TR|TRA|None|00 +CAGTGGCTTCTGAGTCTCCTCCTTGGTTCGTATTCTGGTCTAAGCTCAGATTCAGCAAAGAATCTGGAATCTGGGCCTGTGCTTACAAAGAGAAT +>469|TRAV2 ENSMUST00000196939|TRAV2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGCAGGTGGCAAAAGTGACTGTGCTCCTGATCTTGGTCTCATGGAGCCTTGCCAAGACCACCCAGCCCCCCTCCATGGAGGCCTATGAAGGGCAAGAAGTGAACGTGTCCTGCAGCCATACAAACATTGCTACAAGCGAGTACATCTACTGGTACCGACAGGTTCCCCACCAGGGACCACAGTTTATCATTCAAGGATATAAGGACTATGTGGTAAATGAAGTGGCATCTCTGTTTATCTCTGCTGACCGGAAGCTCAGCACTCTGAGCCTGCCCTGGGTTTCCCTGAGAGATGCTGCTGTGTATTACTGCATTGTGACTGACA +>470|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|5'UTR|TR|TRA|None|00 +ACAGATCTGAGCTCATCCATTTGCTCTTAACT +>471|TRAV21-DV12 ENSMUST00000180938|TRAV21-DV12|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGATGTGTGAGTGGAATTGCCATTCTCCTGGCTTTGGGTATTGCGGGTGATGCTAAGACTACACAACCAGATTCAATGGAAAGTACTGAAGGAGAAACGGTGCACTTGCCTTGTAGCCACGCCACAATCAGTGGAAACGAGTACATCTATTGGTACCGACAGGTTCCTCTTCAGGGTCCAGAATATGTGACTCACGGTCTACAACAAAATACAACCAATAGTATGGCTTTCCTGGCTATTGCCTCTGACAGAAAGTCAAGCACCTTGATCCTGCCTCATGTCAGCCTGAGAGACGCGGCTGTGTACCACTGTATCCTGAGAGTAG +>472|TRAV3-1 ENSMUST00000103569|TRAV3-1|5'UTR|TR|TRA|None|00 +GGCATCTTGTCTGGCTGAAGGCCACAGTCCAGAGGGAGAGCA +>473|TRAV3-1 ENSMUST00000103569|TRAV3-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTGCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCATTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTCCTGGTACAAGCAAGAGGCGGGGGCAGGTCTTCAGTTGCTTATGAGTGTCCTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>474|TRAV3-3 ENSMUST00000181768|TRAV3-3|5'UTR|TR|TRA|None|00 +GAAGATGCCTCAGTGCTGTGGAGGTGATCACAGAGGCATCTTGTCTGGCTGAAGGTCAGAGTCTGGAGGGAGAGCA +>475|TRAV3-3 ENSMUST00000181768|TRAV3-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCACCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAAGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGCGTACTTCTGCGCAGTCAGTG +>476|TRAV3-4 ENSMUST00000103670|TRAV3-4|5'UTR|TR|TRA|None|00 +CAGTAGCCTTCTGTGCAGACAGGTGAAGTAGCCTCAGTGCTGTGGAGAACAGAGGAGGTGAGCTGATCACAGAGGCATCTTGTCTGGCTGAAGGCCAGAGTCTGGAGGGAGAGCA +>477|TRAV3-4 ENSMUST00000103670|TRAV3-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACAGTGGCTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGTTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGCGCCTTTATCATCTGCACCTACACAGACAGTGCCACTGCTTACTTCTACTGGTACAAGCAAGAGCCAGGGGCAGGTCTTCAGTTGCTTATGAGTGTCTTTTCAAATGTGGACAGAAAAGAAGAACAAGGACTCACTGTCTTACTGAACAAGAAAGACAAACGACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCTGTGTACTTCTGCGCAGTCAGTG +>478|TRAV3D-3 ENSMUST00000196023|TRAV3D-3|5'UTR|TR|TRA|None|00 +ACACAGCTGAAGATGCCTCCGTGTTGTGGAGGTGATCACAGAGGCATCCTGTCTGGCTAAAGGTCAGAGTCTGGAGGGAGCGCA +>479|TRAV3D-3 ENSMUST00000196023|TRAV3D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGTGACTGGACCTTTGTTCCTGTGCTTCTGGCTGCAGCTGAACTGTGTGAGCAGAGGCGAGCAGGTGGAGCAGCGCCCTCCTCACCTGAGTGTCCGGGAGGGAGACAGTGCCGTTATCATCTGCACCTACACAGACCCTAACAGTTATTACTTCTTCTGGTACAAGCAAGAGCCGGGGGCAGGTCTTCAGTTGCTTATGAAGGTTTTCTCAAGTACGGAAATAAACGAAGGACAAGGATTCACTGTCCTACTGAACAAGAAAGACAAACAACTCTCTCTGAACCTCACAGCTGCCCATCCTGGGGACTCAGCCGTGTACTTCTGCGCAGTCAGTG +>480|TRAV4-2 ENSMUST00000103637|TRAV4-2|5'UTR|TR|TRA|None|00 +CCCTGCTGACTGTTGGAAATCAGCAGCTTGACAGGGTCA +>481|TRAV4-2 ENSMUST00000103637|TRAV4-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAGCCCGGGAACTGTGCTGGGGCTGCTGTTGGTGCCGCTATGCTGGGTAAGAGGAATGCCGGTGGAACAGAATCCTCCAGCCCTGAGTCTTTATGAAGGAGCTGAGTCTGGTCTGAGATGCAATTTTTCTACCACCATGAAAGGTGTCCAGTGGTTTCAACAAAATCACAGAGGCAGACTTATCACTCTGTTTTACCTGGCTCAAGGAACAAAGGAGAATGGAAGGTTAAAGTCAACATTCAATTCTAAGGAGCGCTACAGCACCCTGCACATCAAGGATGCACAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGTTGAGG +>482|TRAV4-3 ENSMUST00000103655|TRAV4-3|5'UTR|TR|TRA|None|00 +AGTCTGTAAGCACAAGTGTGTCTGGGCATAAGACACCCTTCAGAGCTGGAGAGAAGACAACCAGCGATTGGACAGGGGCC +>483|TRAV4-3 ENSMUST00000103655|TRAV4-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAACAAAGTCCCTCAGCGCTGAGTCTCCAAGAAGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCCGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATCAATCTTTTTTACCTGGTTCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTCGATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>484|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|5'UTR|TR|TRA|None|00 +GAGAAGACAACCAGCGATTGGACAGGGGCC +>485|TRAV4-4-DV10 ENSMUST00000103663|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGGCTGTGCAGTGGTTCCAACAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAACATTCAATTCTAAGGAGAGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>486|TRAV4D-3 ENSMUST00000103592|TRAV4D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGGAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGCGGAGATAAGGTGAAGCAAAGTCCCTCAGCGCTGAGTCTCCAAGAGGGAACCAATTCTGCTCTGAGATGCAATTTTTCTATCGCTGCGACAACTGTGCAGTGGTTCCTACAGAATCCCAGGGGCAGCCTCATGAATCTTTTTTACCTGGTGCCAGGAACAAAGGAGAATGGGAGGTTAAAGTCAGCATTTGATTCTAAGGAGAGCTACAGCACCCTGCACATTAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>487|TRAV4D-4 ENSMUST00000103600|TRAV4D-4|5'UTR|TR|TRA|None|00 +ATCCCAGCGATTGGACAGGGGCC +>488|TRAV4D-4 ENSMUST00000103600|TRAV4D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGAGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGGTTCTGCTCTGAGATGCAATTTTACTACCACCATGAGGGCTGTGCAGTGGTTCCGAAAGAATTCCAGGGGCAGCCTCATCAATCTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>489|TRAV5-1 ENSMUST00000103570|TRAV5-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGACAGCTATTCATGCTTTATTTATTTTCTTCTGGCTACAGATGGACTGGAAGAGCCAAGGTGAGCAGGTGGAACAGCTCCCTTCCTCCCTGATTGTCCAGGAGGGAGCCAGTGTTCTGATCAACTGCTCCTACACAGACAGTGCCTCTGTCTACTTCCCTTGGTATAAGCAAGAGCCTGGGAAGCGTCTTCAGTTCATCATAGACATCCGTTCAAATATGGAAAGAAAGCAGACTCAAAGACTCACCCTTTTATTTGATAAGAAAACCAAACACCTTTCCCTGCACATTACAGCCACTCAGCCTGGAGACTCAGCCATCTACTTCTGCTCAGCAAGTA +>490|TRAV5-4 ENSMUST00000103664|TRAV5-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGCGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCAGTTATGAAGACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGATCCAAGAACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>491|TRAV5D-4 ENSMUST00000179701|TRAV5D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAAACATATGCTCCTACATTATTCATGTTTCTATGGCTGCAGCTGGATGGGATGAGCCAAGGTGAGCAGGTGGAGCAGCTTCCTTCCATCCTGAGAGTCCAGGAGGGATCCAGTGCCAGCATCAACTGCACTTATGAGAACAGTGCCTCCAACTACTTCCCTTGGTATAAGCAAGAACCTGGAGAGAATCCTAAGCTCATCATTGACATTCGTTCAAATATGGAAAGAAAGCAGACCCAAGGACTCATCGTTTTACTGGATAAGAAAGCCAAACGCTTCTCCCTGCACATCACAGACACCCAGCCTGGAGACTCAGCCATGTACTTCTGTGCTGCAAGTG +>492|TRAV6-1 ENSMUST00000103571|TRAV6-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTATTCTCCAGCTTTAGTGACTGTGATGCTGTTTGTGTTTGGGAGGACCCATGGAGACTCAGTAACCCAGATGCAAGGTCAAGTGACCCTCTCAGAAGACGACTTCCTATTTATAAACTGTACTTATTCAACCACATGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAACAAGGGAATCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACAACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCTGCTGTGTACTACTGTGTTCTGGGTGA +>493|TRAV6-2 ENSMUST00000198058|TRAV6-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACACTTCTCCAGCTTTAGTGACTGTGATGCTGCTGTTCATGCTTGAGAGGACACATGGAAATTCAGTGACCCAGATGCAAGGTCAAGTGACCCTTTCAGAAGAGGAGTTTCTATTTATAAACTGTACCTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATCCTGGAGAAGGTCCACAGCTCCTTTTGAAAGTCACAACAGCCAACAATAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>494|TRAV6-3 ENSMUST00000180549|TRAV6-3|5'UTR|TR|TRA|None|00 +ATCATTTCTTCATGTGAAGAGTTGAGAGCATCACTCTGGTGACACTGAAG +>495|TRAV6-3 ENSMUST00000180549|TRAV6-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGAGA +>496|TRAV6-4 ENSMUST00000180711|TRAV6-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCAGCACTCTACACTGAAC +>497|TRAV6-4 ENSMUST00000180711|TRAV6-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTAACTGTGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACATACCCAACTCTTTTGTGGTATGTCCAATATCTTGGACAAGGTCCACAGCTCCTTCTGAAAGTGACAACTGCCAACAATAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACGTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>498|TRAV6-5 ENSMUST00000181210|TRAV6-5|5'UTR|TR|TRA|None|00 +AAAATATTTGTATTCACACACTCCAGTGGCTCAGAAA +>499|TRAV6-5 ENSMUST00000181210|TRAV6-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>500|TRAV6-6 ENSMUST00000103584|TRAV6-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTTGGAAGGACCCACGGAGATTCCGTGACTCAAACAGAAGGCCCAGTGACCGTCTCAGAAAGCGAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGCTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>501|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|5'UTR|TR|TRA|None|00 +AC +>502|TRAV6-7-DV9 ENSMUST00000103638|TRAV6-7-DV9|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTAAGAATCATGAACACTGTCGAGATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGGCCACAGCTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCTTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGAGTGA +>503|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|5'UTR|TR|TRA|None|00 +ACACTGAAG +>504|TRAV6D-3 ENSMUST00000181483|TRAV6D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAATTCCCCAGCTTTAGTGACTGTGATGCTGTTTATACTTGGGAGGACCCATGGAGACTCAGTGATCCAGATGCAAGGTCAAGTGACCCTTTCAGAAAACGACTTCTTATTTATAAACTGCACTTATTCAACCACAGGGTACCCGACTCTTTTCTGGTATGTCCAATATTCTGGAGAAGGTCCACAGCTCCTTCTGCAAGTCACAACTGCCAACAACAAGGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGAACCACTTCCTTCCACTTGCAGAAAACCTCAGTGCAAGAGATAGATTCGGCTGTGTACTACTGTGCTATGAGTGA +>505|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|5'UTR|TR|TRA|None|00 +GAAGAGTTGAGAGCATCACTCTACACTGAAC +>506|TRAV6D-4 ENSMUST00000180717|TRAV6D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAATACTTCTCCAGTTTTAGTGACTGCGATGCTGCTGTTCATGCTTGGGATGAGAAAGACCCACGGAGATTCAGTGACCCAGAAACAAGGTCAAGTGACCCTTTCAGAAGATGACTTCCTATTTATAAATTGCACTTATTCTACCACAACGTACCCAACTCTTTTCTGGTATGTCCAATATCCTGGACAAGGTCCACAGCTCCTTCTGAAAGTCACAACTGCCAACAACAAGGGAATCAGCAGAGGCTTTGAAGCTACATATGACAAAGGGACCACCTCCTTCCACTTACAGAAAGCCTCAGTGCAGGAGTCAGACTCAGCCGTGTACTTCTGTGCTCTGGTTGA +>507|TRAV6D-5 ENSMUST00000180687|TRAV6D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGGATTCTACTCTTCCTAATGCTTGGAGAAAGCAATGGAGACTCGGTGACTCAGACAAAAGGTCCAGTGACATTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACGTATGATAAAGGGACCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAGGAGTCAGACTCGGCTGTGTACTACTGTGTTCTGGGTGA +>508|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|5'UTR|TR|TRA|None|00 +CTGTCGAGATGGGTCTAAAG +>509|TRAV6D-7 ENSMUST00000178650|TRAV6D-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>510|TRAV6N-5 ENSMUST00000103611|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>511|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|5'UTR|TR|TRA|None|00 +ACTTTCTAGATGACACTAAAG +>512|TRAV6N-6 ENSMUST00000181793|TRAV6N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGGACTCTTCTCCAGGCTTCGTGGCTGTGATACTTCTCATACTGGGAAGGACCCATGGAGATTCCGTGACTCAAACAGAAGGCCAAGTGACTGTCTCAGAAAGCAAGTCCCTGATAATAAATTGCACGTATTCAGCCACAAGCATAGGTTACCCTAATCTTTTCTGGTATGTTCGATATCCTGGAGAAGGTCTACAACTCCTCCTGAAAGTCATTACGGCTGGCCAGAAGGGAAGCAGCAGAGGGTTTGAAGCCACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGCGCTCTGAGTGA +>513|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|5'UTR|TR|TRA|None|00 +CTGTCGAG +>514|TRAV6N-7 ENSMUST00000179607|TRAV6N-7|L-REGION+V-REGION|TR|TRA|None|00 +ATGGGTCTAAAGATGAACTCTTCTCCAGGCTTCATGACTGTGATGCTCCTCATATTCACAAGGGCCCATGGAGACTCAGTGACTCAGACGGAAGGTCAAGTGGCCCTCTCAGAAGAGGACTTTCTTACGATACACTGCAACTACTCAGCCTCAGGGTACCCAGCTCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGTTCCTCTTTAGAGCCTCAAGGGACAAAGAGAAAGGAAGCAGCAGAGGTTTTGAAGCTACATATGATAAAGGGACCACCTCCTTCCACTTGCGGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>515|TRAV7-1 ENSMUST00000198019|TRAV7-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGTCCTTGTGTGTTTCACTAGTGGTCCTGTGGCTTCAGCTACACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTAATTCTCAGTATTTCTGGTGGTACAGACAGCATTCTGGGGAAGGCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGACAAGAAGGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTATCCCTGCACATCAAAGACTCCCAACCCAGTGACTCTGCTCTCTACTTCTGTGCAGTGAGCA +>516|TRAV7-2 ENSMUST00000103636|TRAV7-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGC +>517|TRAV7-3 ENSMUST00000177622|TRAV7-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAACTTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAGGAAGAGAGA +>518|TRAV7-3 ENSMUST00000177622|TRAV7-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>519|TRAV7-4 ENSMUST00000181728|TRAV7-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>520|TRAV7-4 ENSMUST00000181728|TRAV7-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCAATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>521|TRAV7-5 ENSMUST00000200609|TRAV7-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGCAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACGTTCAGTGATGGTACTTCTAACAACTTCAGGTGGTACAGACAGCATTCTGCGAAAGGCCTTGAGGTGCTAGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGATTTACAGCTCACCTCAATAGAGCCAACTTGCATGTTTCCCTACACATCAGAGAACCACAACCCAGTGACTCTGCTGTCTACCTCTGTGCAGTGAGCA +>522|TRAV7-6 ENSMUST00000103641|TRAV7-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>523|TRAV7-6 ENSMUST00000103641|TRAV7-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGGTCTCCCTCAACTGCAGTTTCAGCGACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCAAAGCACTAATATCCATCTTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAAAGACTCCCAGCCCAGTGACTCCGCTGTCTACCTCTGTGCAGTGAGCA +>524|TRAV7D-2 ENSMUST00000200127|TRAV7D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTTAGTATTTCCCTAGTGGTCCTGTGGCTTCAGCTAAACTGGGTGAACAGCCAACAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTTCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCCAGTGATCGTAATGTTGACTACTTCTGGTGGTACAGACAGCACTCTGGGAAAAGCCCCAAGATGCTGATGTCTATCTTCTCCAATGGTGAAAAGGAAGAAGGCAGATTCACAGTTCACCTCAATAAAGCCAGCCTGCATACTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGCAAGCA +>525|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|5'UTR|TR|TRA|None|00 +CTCTTTTCTAGCTGCCAAATTAGAGTTGAGGATCTCAGTCCTCAGTGAAGAGGAAAGAAGAGAGA +>526|TRAV7D-3 ENSMUST00000179789|TRAV7D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAACAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGACCTCTCTCAACTGCACTTTCAGCGACAGTGCTTCTCAGTATTTTGCATGGTACAGACAGCATTCTGGGAAAGCCCCCAAGGCACTGATGTCCATCTTCTCCAATGGTGAAAAAGAAGAAGGCAGATTCACAATTCACCTCAATAAAGCCAGTCTGCATTTCTCGCTACACATCAGAGACTCCCAGCCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>527|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|5'UTR|TR|TRA|None|00 +AGCAAAGCTGCTTTTTATGTTTCCTATAGGAGATGTGAAAACTTATGAACACAACTATATGAGTTTAGGATTGAGAATCTAAATCCACAGCGAAGAGGGAAGAGGAGAGA +>528|TRAV7D-4 ENSMUST00000178768|TRAV7D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTTACTAGTGGTCCTGTGGCTCCAGTTAAACTGCGTGAGGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTACTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAGGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGCTAGTGAGCA +>529|TRAV7D-5 ENSMUST00000197128|TRAV7D-5|5'UTR|TR|TRA|None|00 +ATG +>530|TRAV7D-5 ENSMUST00000197128|TRAV7D-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCACTAGTGGTCCTGTGGCTCCAGTTTAATTGGGTGAGAAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCACTGTCTCAGAGGGAGCCATGGCCTCTCTCAACTGCACTTTCAGTGATCGTTCTTCTGACAACTTCAGGTGGTACAGACAGCATTCTGGGAAAGGCCTTGAGGTGCTGGTGTCCATCTTCTCTGATGGTGAAAAGGAAGAAGGCAGTTTTACAGCTCACCTCAATAGAGCCAGCCTGCATGTTTTCCTACACATCAGAGAGCCGCAACCCAGTGACTCTGCTCTCTACCTCTGTGCAGTGAGCA +>531|TRAV7N-4 ENSMUST00000103609|TRAV7N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAATCCTTGAGTGTTTCCCTAGTGGTCCTGTGGCTCCAGTTAAACTGGGTGAAGAGCCAGCAGAAGGTGCAGCAGAGCCCAGAATCCCTCAGTGTCCCAGAGGGAGGCATGGCCTCTCTCAACTGCACTTCAAGTGATCGTAATTTTCAGTATTTCTGGTGGTACAGACAGCATTCTGGAGAAGGCCCCAAAGCACTGATGTCCATCTTCTCTGATGGTGACAAGAAAGAAGGCAGATTCACAGCTCACCTCAATAAGGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCCGCTCTCTACTTCTGTGCAGTTAGTGAGCA +>532|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|5'UTR|TR|TRA|None|00 +CTCCTTTTGCTGGCTTGAAGTGTGAATCTTCAGTGAAAAGAGTA +>533|TRAV7N-6 ENSMUST00000178100|TRAV7N-6|L-REGION+V-REGION|TR|TRA|None|00 +ATGCATTCCTTACATGTTTCACTAGTGTTCCTCTGGCTTCAACTAGGTGGGGTGAGCAGCCAGGAGAAGGTACAGCAGAGCCCAGAATCCCTCATTGTCCCAGAGGGAGCCATGTCCTCCCTCAACTGCACTTTCAGCAACAGTGCTTCTCAGTCCATCTGGTGGTACCAACAGCATCCTGGGAAAGGCCCCGAAGCACTAATATCCATATTCTCTAATGGCAACAAGAAAGAAGGCAGATTGACAGTTTACCTCAATAGAGCCAGCCTGCATGTTTCCCTGCACATCAGAGACTCCCAGCCCAGTGACTCTGCCGTCTACCTCTGTGCAGTGAGCA +>534|TRAV8-1 ENSMUST00000103643|TRAV8-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGTTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATTCGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>535|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|5'UTR|TR|TRA|None|00 +AAACCAACCACCTTGAACAGGCCTGGAGCTGTATCTCTTGCGATCTGATCTTCATAGGGAAGA +>536|TRAV8D-1 ENSMUST00000103580|TRAV8D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCACAGCCTCCTGGGGTTGTTGATGGTGTCACTGTGGCTGCAACTGACAAGGGTGAATAGTCAACTAGCAGAAGAGAATCTGTGGGCCCTGAGCGTCCACGAGGGTGAAAGTGTCACGGTGAATTGTAGTTACAAGACATCCATAACTGCCCTACAGTGGTACAGACAGAAGTCAGGCGAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGAGAGAGAAGCGCAATGGAAGACTCAGAGCCACCCTTGACACCTCCAGCCAGAGCAGCTCCTTGTCCATCACTGCTACTCGGTGTGAAGACACCGCTGTGTACTTCTGTGCTACTGATG +>537|TRAV8D-2 ENSMUST00000198439|TRAV8D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCGAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTATACAACTGTTGTACACTGGTACAGGCAAGACTCAGGCAGAGGCCCTGCCCTGATAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTAAGAGCCACCCTTGACACCTCCAGCCAAAGTAGCTCTCTGTCCATCACTGCTGCTCAGTGTGAAGACACTGCTGTGTACTTCTGTGCTACAGATG +>538|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|5'UTR|TR|TRA|None|00 +CTGTCCTAGGAACCAGGTTCCACTTCAGGGTGCAGCACAGCCTTTCCTGTGACATCAATAAAGCAAGAAAA +>539|TRAV8N-2 ENSMUST00000103632|TRAV8N-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGATTCCTGGGAATATCTTTGGTGACTCTATGGTTTCAAGTGGCCTGGGCAAAGAGCCAATGGGGAGAAGAGAATCTTCAGGCTCTGAGCATCCAGGAGGGTGAAGATGTCACCATGAACTGCAGTTACAAGACTTACACAACTGTTGTTCAGTGGTACAGACAGAAGTCAGGCAAAGGCCCTGCCCAGCTAATCTTAATACGTTCAAATGAGCGAGAGAAGCGCAGTGGAAGACTCAGAGCCACCCTTGACACTTCCAGCCAGAGCAGCTCCCTGTCCATCACTGGTACTCTAGCTACAGACACTGCTGTGTACTTCTGTGCTACTGATG +>540|TRAV9-1 ENSMUST00000103581|TRAV9-1|5'UTR|TR|TRA|None|00 +TCTTTCCTGCACGAGCCAGGTTTTTCCAGAAAGGCACCAGAGCTGTTTCCAGTGTGCAGCC +>541|TRAV9-1 ENSMUST00000103581|TRAV9-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCATGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCGAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>542|TRAV9-2 ENSMUST00000103654|TRAV9-2|5'UTR|TR|TRA|None|00 +TTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCCTACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCTTTTCCAAGGCTCAGCC +>543|TRAV9-2 ENSMUST00000103654|TRAV9-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCTGCTGTGTACTTCTGTGTTTTGAGCG +>544|TRAV9-4 ENSMUST00000103662|TRAV9-4|5'UTR|TR|TRA|None|00 +TGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>545|TRAV9-4 ENSMUST00000103662|TRAV9-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCACTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGGGACGCCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCATCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>546|TRAV9D-1 ENSMUST00000178426|TRAV9D-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGTTCTCATCTCGTTCCTCGGGATACATTTCTTCCTGGATGTCCAAACACAGACAGTTTCCCAGTCTGATGCCCATGTCACTGTCTTCGAAGGAGACTCGGTGGAGCTGAGATGCAACTATTCCTATGGTGGATCCATTTACCTCTCCTGGTACATCCAGCACCATGGCCGTGGCCTCCAGTTTCTCCTCAAGTACTATTCGGGAAACCCAGTGGTTCAAGGAGTGAACGGCTTCAAGGCTGAGTTCAGCAAGAGCGACTCTTCCTTCCACCTTCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTGTGAGCG +>547|TRAV9D-2 ENSMUST00000199746|TRAV9D-2|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTCCTCTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCCGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGTTCTGAGCG +>548|TRAV9D-3 ENSMUST00000178252|TRAV9D-3|5'UTR|TR|TRA|None|00 +ATCTCATCCCTCTTGCAGCTGGCTGAGTATTTAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGTTCGCGTATGCAGCGTCAGTTTTTATGTGAACGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCTGCTTTCCTGCCTGTCCTGTTCCAGAGTTTCTCCACAACAGAGCTGCAGCCTTCTCAAGGCTCAGTC +>549|TRAV9D-3 ENSMUST00000178252|TRAV9D-3|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTCTCCTGAGAGATGCCCAAGCTCAGTCAGTGACGCAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTTTGGGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATCCAGGAGACCCAGTGGTTCAAGGAGTGAATGGCTTTGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCGGAAAGCCTCTGTGCACTGGAGCGACTGGGCTGTGTACTTCTGTGCTGTGAGCA +>550|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>551|TRAV9D-4 ENSMUST00000200548|TRAV9D-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>552|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|5'UTR|TR|TRA|None|00 +GAAGATCTTCACCTGCTCACATCTCATCCTTCTTGCAGCTGGCTGAGTATATAGCAAAGGCAAGTGACAAGAATCAGATATTCAAAACCTTCCAGGCTCGTGTTTGCAGCGTCAGTTTTTATGTGAGCGGGAGACTTCTCCAGCAGACTCTTCCCTACACCTGCTTTCAAGCTCTTGCTTTCCTCAGCCTCTTTCCTGCCTGTCCTGTTCCAGAGTTCCTCCACAACAGAGCTGCAGCCTTCCCAAGGCTCAGCC +>553|TRAV9N-4 ENSMUST00000103626|TRAV9N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTCCTGGCGCTCCTCCCAGTGCTGGGGATACACTTTGTCCTGAGAGATGCCCAAGCTCAGTCAGTGACACAGCCCGATGCTCGCGTCACTGTCTCTGAAGGAGCCTCTCTGCAGCTGAGATGCAAGTATTCCTACTCTGCGACACCTTATCTGTTCTGGTATGTCCAGTACCCGCGGCAGGGGCTGCAGCTGCTCCTCAAGTACTATTCAGGAGACCCAGTGGTTCAAGGAGTGAACAGCTTCGAGGCTGAGTTCAGCAAGAGTAACTCTTCCTTCCACCTGCAGAAAGCCTCTGTGCACTGGAGCGACTCGGCTGTGTACTTCTGTGCTCTGAGCA +>554|TRBC1 ENSMUST00000192856|TRBC1|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGCAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGGATTACCTCAGCATCCTATCAACAAGGGGTCTTGTCTGCCACCATCCTCTATGAGATCCTGCTAGGGAAAGCCACCCTGTATGCTGTGCTTGTCAGTACACTGGTGGTGATGGCTATGGTCAAAAGAAAGAATTCA +>555|TRBC2 ENSMUST00000103299|TRBC2|C-REGION|TR|TRB|None|00 +AGGATCTGAGAAATGTGACTCCACCCAAGGTCTCCTTGTTTGAGCCATCAAAAGCAGAGATTGCAAACAAACAAAAGGCTACCCTCGTGTGCTTGGCCAGGGGCTTCTTCCCTGACCACGTGGAGCTGAGCTGGTGGGTGAATGGCAAGGAGGTCCACAGTGGGGTCAGCACGGACCCTCAGGCCTACAAGGAGAGCAATTATAGCTACTGCCTGAGCAGCCGCCTGAGGGTCTCTGCTACCTTCTGGCACAATCCTCGAAACCACTTCCGCTGCCAAGTGCAGTTCCATGGGCTTTCAGAGGAGGACAAGTGGCCAGAGGGCTCACCCAAACCTGTCACACAGAACATCAGTGCAGAGGCCTGGGGCCGAGCAGACTGTGGAATCACTTCAGCATCCTATCATCAGGGGGTTCTGTCTGCAACCATCCTCTATGAGATCCTACTGGGGAAGGCCACCCTATATGCTGTGCTGGTCAGTGGCCTGGTGCTGATGGCCATGGTCAAGAAAAAAAATTCC +>556|TRBD1 ENSMUST00000178537|TRBD1|D-REGION|TR|TRB|None|00 +GGGACAGGGGGC +>557|TRBD2 ENSMUST00000178862|TRBD2|D-REGION|TR|TRB|None|00 +GGGACTGGGGGGGC +>558|TRBJ1-1 ENSMUST00000103284|TRBJ1-1|J-REGION|TR|TRB|None|00 +CAAACACAGAAGTCTTCTTTGGTAAAGGAACCAGACTCACAGTTGTAG +>559|TRBJ1-2 ENSMUST00000103285|TRBJ1-2|J-REGION|TR|TRB|None|00 +CAAACTCCGACTACACCTTCGGCTCAGGGACCAGGCTTTTGGTAATAG +>560|TRBJ1-3 ENSMUST00000192366|TRBJ1-3|J-REGION|TR|TRB|None|00 +TTCTGGAAATACGCTCTATTTTGGAGAAGGAAGCCGGCTCATTGTTGTAG +>561|TRBJ1-4 ENSMUST00000103287|TRBJ1-4|J-REGION|TR|TRB|None|00 +TTTCCAACGAAAGATTATTTTTCGGTCATGGAACCAAGCTGTCTGTCCTGG +>562|TRBJ1-5 ENSMUST00000103288|TRBJ1-5|J-REGION|TR|TRB|None|00 +TAACAACCAGGCTCCGCTTTTTGGAGAGGGGACTCGACTCTCTGTTCTAG +>563|TRBJ1-6 ENSMUST00000103289|TRBJ1-6|J-REGION|TR|TRB|None|00 +TTCCTATAATTCGCCCCTCTACTTTGCGGCAGGCACCCGGCTCACTGTGACAG +>564|TRBJ1-7 ENSMUST00000193061|TRBJ1-7|J-REGION|TR|TRB|None|00 +CCTGTGTTGGATGACCATGGTCTTGGAAAGGAACTTAGGTATAAGA +>565|TRBJ2-1 ENSMUST00000103293|TRBJ2-1|J-REGION|TR|TRB|None|00 +TAACTATGCTGAGCAGTTCTTCGGACCAGGGACACGACTCACCGTCCTAG +>566|TRBJ2-2 ENSMUST00000103294|TRBJ2-2|J-REGION|TR|TRB|None|00 +CAAACACCGGGCAGCTCTACTTTGGTGAAGGCTCAAAGCTGACAGTGCTGG +>567|TRBJ2-3 ENSMUST00000103295|TRBJ2-3|J-REGION|TR|TRB|None|00 +AGTGCAGAAACGCTGTATTTTGGCTCAGGAACCAGACTGACTGTTCTCG +>568|TRBJ2-4 ENSMUST00000103296|TRBJ2-4|J-REGION|TR|TRB|None|00 +AGTCAAAACACCTTGTACTTTGGTGCGGGCACCCGACTATCGGTGCTAG +>569|TRBJ2-5 ENSMUST00000103297|TRBJ2-5|J-REGION|TR|TRB|None|00 +AACCAAGACACCCAGTACTTTGGGCCAGGCACTCGGCTCCTCGTGTTAG +>570|TRBJ2-7 ENSMUST00000103298|TRBJ2-7|J-REGION|TR|TRB|None|00 +CTCCTATGAACAGTACTTCGGTCCCGGCACCAGGCTCACGGTTTTAG +>571|TRBV1 ENSMUST00000103262|TRBV1|5'UTR|TR|TRB|None|00 +GGATTCTCTTCTCTTGCCTGATGCCCTGCATGCCCCACAGAGATAGAGAGAACCTGAGGTCTCAGAG +>572|TRBV1 ENSMUST00000103262|TRBV1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGCAGTTTTGCATTCTGTGCCTCTGTGTACTCATGGCTTCTGTGGCTACAGACCCCACAGTGACTTTGCTGGAGCAAAACCCAAGGTGGCGTCTGGTACCACGTGGTCAAGCTGTGAACCTACGCTGCATCTTGAAGAATTCCCAGTATCCCTGGATGAGCTGGTATCAGCAGGATCTCCAAAAGCAACTACAGTGGCTGTTCACTCTGCGGAGTCCTGGGGACAAAGAGGTCAAATCTCTTCCCGGTGCTGATTACCTGGCCACACGGGTCACTGATACGGAGCTGAGGCTGCAAGTGGCCAACATGAGCCAGGGCAGAACCTTGTACTGCACCTGCAGTGCAGA +>573|TRBV10 ENSMUST00000103265|TRBV10|5'UTR|TR|TRB|None|00 +TCTGATAGCTGCAGTAGGTAGGGCTTATTTGCCCTGCCTTGACCCAACT +>574|TRBV10 ENSMUST00000103265|TRBV10|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTGTAGGCTCCTAAGCTGTGTGGCCTTCTGCCTCTTGGGAATAGGCCCTTTGGAGACGGCTGTTTTCCAGACTCCAAACTATCATGTCACACAGGTGGGAAATGAAGTGTCTTTCAATTGTAAGCAAACTCTGGGCCACGATACTATGTATTGGTACAAGCAAGACTCTAAGAAATTGCTGAAGATTATGTTTAGCTACAATAATAAGCAACTCATTGTAAACGAAACAGTTCCAAGGCGCTTCTCACCTCAGTCTTCAGATAAAGCTCATTTGAATCTTCGAATCAAGTCTGTAGAGCCGGAGGACTCTGCTGTGTATCTCTGTGCCAGCAGCTAAGA +>575|TRBV12-1 ENSMUST00000103267|TRBV12-1|5'UTR|TR|TRB|None|00 +GCATCCTGAGAAGAAGC +>576|TRBV12-1 ENSMUST00000103267|TRBV12-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGTCCTCGCTGATTCTGCCTGGGGCATCACCCTGCTATCTTGGGTTACTGTCTTTCTCTTGGGAACAAGTTCAGCAGATTCTGGGGTTGTCCAGTCTCCAAGACACATAATCAAAGAAAAGGGAGGAAGGTCCGTTCTGACGTGTATTCCCATCTCTGGACATAGCAATGTGGTCTGGTACCAGCAGACTCTGGGGAAGGAATTAAAGTTCCTTATTCAGCATTATGAAAAGGTGGAGAGAGACAAAGGATTCCTACCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAAATGAACATGAGTGCCTTGGAACTGGAGGACTCTGCTATGTACTTCTGTGCCAGCTCTCTC +>577|TRBV12-2 ENSMUST00000103269|TRBV12-2|5'UTR|TR|TRB|None|00 +CCTGAGAGGAAGC +>578|TRBV12-2 ENSMUST00000103269|TRBV12-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAGTTCAGCAAATTCTGGGGTTGTCCAGTCTCCAAGATACATAATCAAAGGAAAGGGAGAAAGGTCCATTCTAAAATGTATTCCCATCTCTGGACATCTCTCTGTGGCCTGGTATCAACAGACTCAGGGGCAGGAACTAAAGTTCTTCATTCAGCATTATGATAAAATGGAGAGAGATAAAGGAAACCTGCCCAGCAGATTCTCAGTCCAACAGTTTGATGACTATCACTCTGAGATGAACATGAGTGCCTTGGAGCTAGAGGACTCTGCCGTGTACTTCTGTGCCAGCTCTCTC +>579|TRBV13-1 ENSMUST00000194399|TRBV13-1|5'UTR|TR|TRB|None|00 +AACATACAAGAGCCTGACTTGGTCGCGAG +>580|TRBV13-1 ENSMUST00000194399|TRBV13-1|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTTCTGGTCTTGAGCCTCCTGTGTACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCTAGAAACAAGGTGACAGTAACAGGAGGAAACGTGACATTGAGCTGTCGCCAGACTAATAGCCACAACTACATGTACTGGTATCGGCAGGACACTGGGCATGGGCTGAGGCTGATCCATTACTCATATGGTGCTGGCAACCTTCAAATAGGAGATGTCCCTGATGGGTACAAGGCCACCAGAACAACGCAAGAAGACTTCTTCCTCCTGCTGGAATTGGCTTCTCCCTCTCAGACATCTTTGTACTTCTGTGCCAGCAGTGATG +>581|TRBV13-2 ENSMUST00000103270|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>582|TRBV13-3 ENSMUST00000103271|TRBV13-3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGACTCTTCTTTGTGGTTTTGATTCTCCTGTGTGCAAAACACATGGAGGCTGCAGTCACCCAAAGTCCAAGAAGCAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTCACCAGACTAATAACCATGACTATATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTACTCATATGTCGCTGACAGCACGGAGAAAGGAGATATCCCTGATGGGTACAAGGCCTCCAGACCAAGCCAAGAGAATTTCTCTCTCATTCTGGAGTTGGCTTCCCTTTCTCAGACAGCTGTATATTTCTGTGCCAGCAGTGATG +>583|TRBV14 ENSMUST00000103272|TRBV14|5'UTR|TR|TRB|None|00 +CCTCCTCTGCCCTCAATCTGCC +>584|TRBV14 ENSMUST00000103272|TRBV14|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCACCAGGCTTCTTGGCTGGGCAGTGTTCTGTCTCCTTGACACAGTACTGTCTGAAGCTGGAGTCACCCAGTCTCCCAGATATGCAGTCCTACAGGAAGGGCAAGCTGTTTCCTTTTGGTGTGACCCTATTTCTGGACATGATACCCTTTACTGGTATCAGCAGCCCAGAGACCAGGGGCCCCAGCTTCTAGTTTACTTTCGGGATGAGGCTGTTATAGATAATTCACAGTTGCCCTCGGATCGATTTTCTGCTGTGAGGCCTAAAGGAACTAACTCCACTCTCAAGATCCAGTCTGCAAAGCAGGGCGACACAGCCACCTATCTCTGTGCCAGCAGTTTCT +>585|TRBV15 ENSMUST00000103273|TRBV15|5'UTR|TR|TRB|None|00 +GTCACATCAGTGCTCATCCCACT +>586|TRBV15 ENSMUST00000103273|TRBV15|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCATCCAGACCCTCTGTTGTGTGATCTTTTATGTTCTGATAGCAAATCACACAGATGCTGGAGTTACCCAGACACCCAGACATGAGGTGGCAGAGAAAGGACAAACAATAATCCTGAAGTGTGAGCCAGTTTCAGGCCACAATGACCTTTTCTGGTACAGACAGACCAAGATACAGGGACTAGAGTTGCTGAGCTACTTCCGCAGCAAGTCTCTTATGGAAGATGGTGGGGCTTTCAAGGATCGATTCAAAGCTGAGATGCTAAATTCATCCTTCTCCACTCTGAAGATTCAACCTACAGAACCCAAGGACTCAGCTGTGTATCTGTGTGCCAGCAGTTTAGC +>587|TRBV16 ENSMUST00000103274|TRBV16|5'UTR|TR|TRB|None|00 +TCTCGTGCTTACGTGGAGTTTCTATGAGTGAAGCCACTGCCTCATCTTGCC +>588|TRBV16 ENSMUST00000103274|TRBV16|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCCCCCAGGCTCCTTTTCTGTCTGGTTCTTTGCTTCTTGAGAGCAGAACCAACAAATGCTGGTGTCATCCAAACACCTAGGCACAAGGTGACAGGGAAGGGACAAGAAGCAACTCTGTGGTGTGAGCCAATTTCAGGACATAGTGCTGTTTTCTGGTACAGACAGACCATTGTGCAGGGCCTGGAGTTCCTGACTTACTTTCGAAATCAAGCTCCTATAGATGATTCAGGGATGCCCAAGGAACGATTCTCAGCTCAGATGCCCAATCAGTCGCACTCAACTCTGAAGATCCAGAGCACGCAACCCCAGGACTCAGCGGTGTATCTTTGTGCAAGCAGCTTAGA +>589|TRBV17 ENSMUST00000103275|TRBV17|5'UTR|TR|TRB|None|00 +CAAATATTCCTTTCCTGTTCTGGACCATCC +>590|TRBV17 ENSMUST00000103275|TRBV17|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATCCTAGACTTCTTTGCTGTGTGATCTTCTGTCTTCTTGCAGCCACTTTTGTGGATACTACGGTTAAGCAGAACCCAAGATACAAGCTTGCAAGAGTTGGAAAACCAGTGAATTTGATCTGTTCTCAGACTATGAATCATGATACCATGTACTGGTACCAAAAGAAGCCAAACCAAGCACCAAAGCTTCTTCTTTTCTACTATGATAAGATTTTGAACAGGGAAGCTGACACTTTTGAGAAGTTCCAATCCAGTCGGCCTAACAATTCTTTCTGCTCTCTCTACATTGGCTCTGCAGGCCTAGAGTATTCTGCCATGTACCTCTGTGCTAGCAGTAGAGA +>591|TRBV19 ENSMUST00000103276|TRBV19|5'UTR|TR|TRB|None|00 +CCCCTCTTCTCAGAACTGGTGCAGATGCTTGGAGCCAGTGTCTGGCTCTCTGGTCTCCCTCTCCTTCTGCCACACCAGGAAGCTCCTTTTGAACATCTCAAGAGTCTTCCTACCATTCTAGTCATCATAGTTAGCCAGGTGGAGCCCCTGCATAGCGCGTCTCCTTGTTTCTCTTTTAACTAATGCCCAGAGCCAAAGAAAGTCCCTCCAAACT +>592|TRBV19 ENSMUST00000103276|TRBV19|L-REGION+V-REGION|TR|TRB|None|00 +ATGAACAAGTGGGTTTTCTGCTGGGTAACCCTTTGTCTCCTTACTGTAGAGACCACACATGGTGATGGTGGCATCATTACTCAGACACCCAAATTCCTGATTGGTCAGGAAGGGCAAAAACTGACCTTGAAATGTCAACAGAATTTCAATCATGATACAATGTACTGGTACCGACAGGATTCAGGGAAAGGATTGAGACTGATCTACTATTCAATAACTGAAAACGATCTTCAAAAAGGCGATCTATCTGAAGGCTATGATGCGTCTCGAGAGAAGAAGTCATCTTTTTCTCTCACTGTGACATCTGCCCAGAAGAACGAGATGGCCGTTTTTCTCTGTGCCAGCAGTATAG +>593|TRBV2 ENSMUST00000103263|TRBV2|5'UTR|TR|TRB|None|00 +GCACAAGAAACTGTCTGAGGAGACCCAAGAGGTAGCTGGGTATGGTCTAGGTCTGGGAGCCTATGCCCTGACAAGCATGAAGGGCAAAGAGGAAGTGTGAGCTGAAACCATCTACACAACAGGGAGCATCCAAGCAAAGCATTTTACAGGTCAGCAAAAGGCACCCAGACAGCCAGGATCCAAAGAGAAAGAGATCCTATCCTGTGTGACACTGCT +>594|TRBV2 ENSMUST00000103263|TRBV2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCATTTTCCTCAGTTGCCTGGCCGTTTGTCTCCTGGTGGCAGGTCCAGTCGACCCGAAAATTATCCAGAAACCAAAATATCTGGTGGCAGTCACAGGGAGCGAAAAAATCCTGATATGCGAACAGTATCTAGGCCACAATGCTATGTATTGGTATAGACAAAGTGCTAAGAAGCCTCTAGAGTTCATGTTTTCCTACAGCTATCAAAAACTTATGGACAATCAGACTGCCTCAAGTCGCTTCCAACCTCAAAGTTCAAAGAAAAACCATTTAGACCTTCAGATCACAGCTCTAAAGCCTGATGACTCGGCCACATACTTCTGTGCCAGCAGCCAAGA +>595|TRBV20 ENSMUST00000103277|TRBV20|L-REGION+V-REGION|TR|TRB|None|00 +ATGTTACTGCTTCTATTACTTCTGGGGCCTGGCTGTGGGCTTGGAGCACTCGTCTATCAATATCCCAGAAGAACCATCTGTAAGAGTGGAACTTCCATGAGGATGGAGTGTCAAGCTGTGGGTTTTCAGGCAACTTCTGTAGCTTGGTATCGTCAATCGCCTCAAAAGACATTTGAACTGATAGCACTTTCTACTGTGAACTCAGCAATCAAATATGAACAAAATTTTACCCAGGAAAAATTTCCCATCAGTCATCCCAACTTATCCTTTTCATCTATGACAGTTTTAAATGCATATCTTGAAGACAGAGGCTTATATCTCTGTGGTGCTAGGGA +>596|TRBV21 ENSMUST00000195087|TRBV21|5'UTR|TR|TRB|None|00 +AGACAGCTAGCTGATCAGCACTCTCTATGAATCAACCATGCACTGCAAACTTTTCTACTGTGTGCCCTTTTATTCTGGACATCAAGCTCC +>597|TRBV23 ENSMUST00000193997|TRBV23|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGTGCACGGCTCATTTGCTATGTAGCACTTTGCCTCCTGGGGGCAGGCTCTTTTGATGCTGCAGTTACACAGAAGCCAAGATATTTGATCAAAATGAAAGGCCAGGAAGCAGAGATGAAATGTATCCCTGAAAAGGGGCACACTGCTGTTTTCTGGTATCAACAAAAGCAGAGCAAAGAATTAAAGTTCCTGATTTACTTTCAGAATCAACAGCCTCTTGATCAAATAGACATGGTCAAGGAGAGATTCTCAGCTGTGTGCCCCTCCAGCTCACTCTGCAGCCTGGGAATCAGAACGTGCGAAGCAGAAGACTCAGCACTGTACTTGTGCTCCAGCAGTCAATC +>598|TRBV26 ENSMUST00000193064|TRBV26|5'UTR|TR|TRB|None|00 +TTTCGTACTTCTAAGCCACC +>599|TRBV26 ENSMUST00000193064|TRBV26|L-REGION+V-REGION|TR|TRB|None|00 +ATGGCTACAAGGCTCCTCTGTTACACAGTACTTTGTCTCCTGGGTGCAAGAATTTTGAATTCAAAAGTCATTCAGACTCCAAGATATCTGGTGAAAGGGCAAGGACAAAAAGCAAAGATGAGGTGTATCCCTGAAAAGGGACATCCAGTTGTATTCTGGTATCAACAAAATAAGAACAATGAGTTTAAATTTTTGATTAACTTTCAGAATCAAGAAGTTCTTCAGCAAATAGACATGACTGAAAAACGATTCTCTGCTGAGTGTCCTTCAAACTCACCTTGCAGCCTAGAAATTCAGTCCTCTGAGGCAGGAGACTCAGCACTGTACCTCTGTGCCAGCAGTCTGTC +>600|TRBV29 ENSMUST00000103281|TRBV29|5'UTR|TR|TRB|None|00 +AAAACCACC +>601|TRBV29 ENSMUST00000103281|TRBV29|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGAGTTAGGCTCATCTCTGCTGTGGTGCTGTGTTTCCTAGGAACAGGCCTTGTGGACATGAAAGTAACCCAGATGCCAAGATACCTGATCAAAAGAATGGGAGAGAATGTTTTGCTGGAATGTGGACAGGACATGAGCCATGAAACAATGTACTGGTATCGACAAGACCCTGGTCTGGGGCTACAGCTGATTTATATCTCATACGATGTTGATAGTAACAGCGAAGGAGACATCCCTAAAGGATACAGGGTCTCACGGAAGAAGCGGGAGCATTTCTCCCTGATTCTGGATTCTGCTAAAACAAACCAGACATCTGTGTACTTCTGTGCTAGCAGTTTATC +>602|TRBV3 ENSMUST00000103264|TRBV3|5'UTR|TR|TRB|None|00 +GTCAGACCTTGCCTATGGGACCATAGGATGCTAGCATACCCCTCCTGTTTCTGATGTGCAGTCAGTCAAGCTAGGAGAAACTACATTCCTGCCGTGACCCTACT +>603|TRBV3 ENSMUST00000103264|TRBV3|L-REGION+V-REGION|TR|TRB|None|00 +ATGGATATCTGGCTTCTAGGTTGGATAATTTTTAGTTTCTTGGAAGCAGGACACACAGGACCCAAAGTCTTACAGATCCCAAGTCATCAAATAATAGATATGGGGCAGATGGTGACCCTCAATTGTGACCCAGTTTCTAATCACCTATATTTTTATTGGTATAAACAGATTTTAGGACAGCAGATGGAGTTTCTGGTTAATTTCTACAATGGTAAAGTCATGGAGAAGTCTAAACTGTTTAAGGATCAGTTTTCAGTTGAAAGACCAGATGGTTCATATTTCACTCTGAAAATCCAACCCACAGCACTGGAGGACTCAGCTGTGTACTTCTGTGCCAGCAGCTTAGCCACA +>604|TRBV30 ENSMUST00000191646|TRBV30|L-REGION+V-REGION|TR|TRB|None|00 +ATGTGGACATTCCTGCTACTTCTTTGGAGCCAAGGTTCTGTATTCAGTGTCCTCCTCTACCAAAAGCCAAACAGGGACATCTGTCAAAGTGGCACTTCACTGAAAATCCAGTGTGTGGCTGACAGTCAAGTTGTTTCGATGTTTTGGTACCAACAGTTCCAGGAACAGAGCTTGATGCTCATGGCAACTGCAAATGAAGGCTCTGAAGCCACATACGAGAGTGGATTCACCAAGGACAAGTTTCCAATCAGCCGGCCAAACCTAACATTCTCAACGTTGACAGTGAACAATGCAAGGCCTGGAGACAGCAGTATCTATTTCTGTAGTTCTAGAGA +>605|TRBV31 ENSMUST00000193003|TRBV31|5'UTR|TR|TRB|None|00 +GGAGGGGCCTGTGCATCTCTGGCTTAGAAAAGGAAGTACAAGTGCAGAGTAGACAAGCCTAGACAAAGACCATCTTGAACT +>606|TRBV31 ENSMUST00000193003|TRBV31|L-REGION+V-REGION|TR|TRB|None|00 +ATGCTGTACTCTCTCCTTGCCTTTCTCCTGGGCATGTTCTTGGGTGTTAGTGCTCAGACTATCCATCAATGGCCAGTTGCCGAGATCAAGGCTGTGGGCAGCCCACTGTCTCTGGGGTGTACCATAAAGGGGAAATCAAGCCCTAACCTCTACTGGTACTGGCAGGCCACAGGAGGCACCCTCCAGCAACTCTTCTACTCTATTACTGTTGGCCAGGTAGAGTCGGTGGTGCAACTGAACCTCTCAGCTTCCAGGCCGAAGGACGACCAATTCATCCTAAGCACGGAGAAGCTGCTTCTCAGCCACTCTGGCTTCTACCTCTGTGCCTGGAGTCT +>607|TRBV5 ENSMUST00000103266|TRBV5|5'UTR|TR|TRB|None|00 +AATACCCGTCTGGAGCCTGATTCCACC +>608|TRBV5 ENSMUST00000103266|TRBV5|L-REGION+V-REGION|TR|TRB|None|00 +ATGAGCTGCAGGCTTCTCCTCTATGTTTCCCTATGTCTTGTGGAAACAGCACTCATGAACACTAAAATTACTCAGTCACCAAGATATCTAATCCTGGGAAGAGCAAATAAGTCTTTGGAATGTGAGCAACATCTGGGACATAATGCTATGTACTGGTATAAACAGAGCGCTGAGAAGCCGCCAGAGCTCATGTTTCTCTACAATCTTAAACAGTTGATTCGAAATGAGACGGTGCCCAGTCGTTTTATACCTGAATGCCCAGACAGCTCCAAGCTACTTTTACATATATCTGCCGTGGATCCAGAAGACTCAGCTGTCTATTTTTGTGCCAGCAGCCAAGA +>609|TRDC ENSMUST00000196323|TRDC|C-REGION|TR|TRD|None|00 +AAAGCCAGCCTCCGGCCAAACCATCTGTTTTCATCATGAAAAATGGAACAAATGTTGCTTGTCTGGTGAAAGATTTCTACCCTAAAGAGGTGACTATAAGTCTCAGATCATCCAAGAAGATTGTGGAATTCGACCCTGCTATAGTCATCTCCCCCAGCGGGAAGTACAGTGCTGTCAAGCTTGGTCAGTATGGAGATTCGAATTCAGTGACATGTTCAGTTCAGCACAACAGTGAAACTGTGCACTCGACTGACTTTGAACCATATGCAAATTCTTTCAATAATGAAAAACTACCAGAACCTGAAAATGACACACAAATTTCAGAGCCTTGCTATGGCCCAAGAGTCACAGTTCACACTGAGAAGGTAAACATGATGTCCCTCACGGTGCTGGGCCTACGACTGCTGTTTGCCAAGACCATTGCCATCAATTTTCTCTTGACTGTTAAGTTATTCTTT +>610|TRDD1 ENSMUST00000196221|TRDD1|D-REGION|TR|TRD|None|00 +ATGGCATAT +>611|TRDD2 ENSMUST00000177564|TRDD2|D-REGION|TR|TRD|None|00 +ATCGGAGGGATACGAG +>612|TRDJ1 ENSMUST00000103682|TRDJ1|J-REGION|TR|TRD|None|00 +CTACCGACAAACTCGTCTTTGGACAAGGAACCCAAGTGACTGTGGAACCAA +>613|TRDJ2 ENSMUST00000103683|TRDJ2|J-REGION|TR|TRD|None|00 +CTCCTGGGACACCCGACAGATGTTTTTTGGAACTGGCATAGAGCTCTTTGTGGAGCCCC +>614|TRDV1 ENSMUST00000103676|TRDV1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGGGATGCGCCTTCAAGTGCTTGCTTGGCTATTGACATTTCAGGCTGCCTGGGTCAACACCCAAATGTTGCATCAGAGTCCTCAGTCTCTGACAATCCAAGAAGGAGATGAAGTCACCATGAGCTGCAATTTATCAACATCTTTATATGCCTTACTCTGGTATAGGCAGGGGGATGATGGCAGCCTCGTCTCCTTGGTGACATTACAGAAAGGAGGAGATGAGAAAAGTAAGGACAAAATAACCGCTAATCTGGATAAGAAAATGCAACAAAGTTCCCTGTGGATCCAAGCCTCCCAGCCCAGCCACTCAGGCACTTACCTCTGTGGAGGGAAAG +>615|TRDV2-1 ENSMUST00000197130|TRDV2-1|L-REGION+V-REGION|TR|TRD|None|00 +ATGGCAGTCCTTAGCTCACTGTGGGCAGTTGTGATCACCACCTGTCTAGGAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAGTCGGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCACTCAGGGGGAGC +>616|TRDV2-2 ENSMUST00000103678|TRDV2-2|5'UTR|TR|TRD|None|00 +AGTGCTAGCGCAGCTGAGAGCAAGGACTGATCTGAAGCCGGCTTCTAGC +>617|TRDV2-2 ENSMUST00000103678|TRDV2-2|L-REGION+V-REGION|TR|TRD|None|00 +ATGGTACGGCCGTTCTTCCTGTGGGTGCTCTTCCTTTCCACTTCTCTTGAAGCCAGCATGGCTCAGACAGTGTCTCAGCCTCAGAAGAAAAAGTCTGTGCAGGTGGCAGAATCAGCAACCCTGGACTGCACCTATGACACAAGTGATACTAATTACCTCTTGTTCTGGTACAAACAGCAAGGAGGGCAGGTGACTCTCGTCATTCTCCAAGAAGCATACAAGCAGTATAATGCAACGTTAAACCGCTTCTCTGTGAACTTCCAGAAAGCAGCTAAGTCCTTCAGCCTGGAGATCTCCGACTCGCAGCTGGGGGATGCTGCGACGTATTTCTGTGCTCTCATGGAGCGC +>618|TRDV4 ENSMUST00000103679|TRDV4|5'UTR|TR|TRD|None|00 +AGCAGATAAGGATTCTCACGGAGACAGAGACAGAGGTGAGGCTCAGCAGGGCAGCCCAGGAAAGCACCAGCCGATTACAAACTCATCCTCAGTGAAACT +>619|TRDV4 ENSMUST00000103679|TRDV4|L-REGION+V-REGION|TR|TRD|None|00 +ATGCTTTGGAGATGTCCAGTCCTCTGCATATTCATCTTCAGTACAGGGACCTCTTTGGATGTATATTTGGAACCAGTTGCCAAAACTTTTACTGTTGTAGCTGGGGATCCTGCCTCCTTCTACTGCACTGTAACAGGAGGGGACATGAAGAATTATCATATGAGCTGGTATAAGAAGAATGGAACTAATGCTCTGTTTTTAGTATACAAGCTAAATAGCAATTCTACTGATGGTGGAAAGAGCAACCTCAAAGGGAAAATTAACATTTCAAAAAATCAGTTTATACTCGACATTCAGAAGGCAACAATGAAAGACGCTGGTACGTACTACTGTGGGTCAGATATC +>620|TRDV5 ENSMUST00000103685|TRDV5|5'UTR|TR|TRD|None|00 +CCCTCCTGTCCCCTCCCTAGACAAAGCAATAGGGATGGTTAAAGAGAGTCCAGCAGCCCTCCTCCACGCTGTGCCCCTGTACCGACTGGAAGG +>621|TRDV5 ENSMUST00000103685|TRDV5|L-REGION+V-REGION|TR|TRD|None|00 +ATGATTCTTGCCGCGACCCTTACCCTTCTGTTTGCCTACAAGGATGTGCTGTGCATCACGCTGACCCAGAGCTCCACTGACCAGACAGTGGCAAGCGGCACTGAAGTAACACTGCTCTGCACGTACAATGCGGATTCTCCAAACCCAGATTTATTTTGGTATCGCAAAAGGCCAGACAGATCCTTCCAGTTCATCCTTTATAGGGACGACACTAGTTCCCATGATGCAGATTTTGTTCAAGGTCGATTTTCTGTGAAGCACAGCAAGGCCAACAGAACCTTCCATCTGGTGATCTCTCCAGTGAGCCTTGAAGACAGCGCTACTTATTACTGTGCCTCGGGGTAT +>622|TRGJ1 ENSMUST00000200495|TRGJ1|J-REGION|TR|TRG|None|00 +ATAGCTCAGGTTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCCTCTG +>623|TRGJ2 ENSMUST00000197113|TRGJ2|J-REGION|TR|TRG|None|00 +ATAGCTCGGGCTTTCACAAGGTATTTGCAGAAGGAACAAAGCTCATAGTAATTCCCTCCG +>624|TRGJ3 ENSMUST00000103562|TRGJ3|J-REGION|TR|TRG|None|00 +ATAGTTGGGACTTTCACAAGGTATTTGCAGAAGGAACTAAGCTCATAGTAATTCCTTCTG +>625|TRGJ4 ENSMUST00000184430|TRGJ4|J-REGION|TR|TRG|None|00 +TCAGGCACATCATGGGTCAAGATATTTGCCAAAGGGACAAAGCTCGTAGTAATTCCCCCAG +>626|TRGV2 ENSMUST00000103563|TRGV2|5'UTR|TR|TRG|None|00 +AACAGATCATGACCAACCCTGGGGGAACCCACTGACTGCATTTTTCTGAGACTATAGCACAGTCCCACCCTCCAGCTGGTGACCTGAAATTCCAGCCTGCAGAGCACTTCCTGCCTCCCTGTGAAGCAGTCCAACCTTGGG +>627|TRGV2 ENSMUST00000103563|TRGV2|L-REGION+V-REGION|TR|TRG|None|00 +ATGCTGCTCCTGAGATGGTTCACCTCCTGCTGCCTCTGGGTTTTTGGGCTTGGGCAGCTGGAGCAAACTGAATTATCGGTCACCAGAGAGACAGATGAGAATGTGCAAATATCCTGTATAGTTTATCTTCCATATTTCTCCAACACAGCTATACATTGGTACCGGCAAAAAACAAATCAACAGTTTGAGTATCTAATATATGTCGCAACAAACTACAATCAACGACCCTTAGGAGGGAAGCACAAAAAAATTGAAGCAAGTAAAGATTTTAAAAGTTCTACCTCAACCTTGGAAATAAATTACTTGAAGAAAGAAGATGAAGCCACCTACTACTGTGCAGTCTGGATGAG +>628|IGKV12-89 GRCm38-release94|IGKV12-89|L-REGION+V-REGION|IG|IGK|None|00 +ATGGGTGTACCCACTCAGCTCCTGTTGCTGTGGCTTACAGTCGTAGTTGTCAGATGTGACATCCAGATGACTCAGTCTCCAGCTTCACTGTCTGCATCTGTGGGAGAAACTGTCACCATCACATGTGGAGCAAGTGAGAATATTTACGGTGCTTTAAATTGGTATCAGCGGAAACAGGGAAAATCTCCTCAGCTCCTGATCTATGGTGCAACCAACTTGGCAGATGGCATGTCATCGAGGTTCAGTGGCAGTGGATCTGGTAGACAGTATTCTCTCAAGATCAGTAGCCTGCATCCTGACGATGTTGCAACGTATTACTGTCAAAATGTGTTAAGTACTCCTCC +>629|IGHV12-1 AJ851868.3|IGHV12-1|L-REGION+V-REGION|IG|IGH|None|00 +ATGAGACTACTAGGGTTTCTCCTGTGCTTGGCAGCAGCTCTAAAAAGTGTTCTGTCCCAGATTCAGCTTAAGGAGTCTGGACCTGCTGTCATCAAGCCATCACAGTCACTGTCTCTCACCTGCATAGTCTCTGGATTCTCCATCACAAGTAGTAGTTATTGCTGGCACTGGATCCGCCAGCCCCCAGGAAAGGGGTTAGAGTGGATGGGGCGCATATGTTATGAAGGTTCAATATACTATAGTCCATCCATCAAAAGCCGCAGCACCATCTCCAGAGACACATCTCTGAACAAATTCTTTATCCAGCTGAGCTCTGTGACAAATGAGGACACAGCCATGTACTACTGTTCC +>630|IGHV1-unknown1 LVXK01034187.1|IGHV1-unknown1|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGGTCGTTCTCTTCCTCCTGTCATTAACTGCAGGTGTCTATGCCCAGGGTCAGATGCAGCAGTCTGGAGCTGAGCTGGTGAAGCCTGGGGCTTCAGTGAAGCTGTCCTGCAAGACTTCTGGCTTCACCTTCAGCAGTAGCTATATAAGTTGGTTGAAGCAAAAGCCTGGACAGAGTCTTGAGTGGATTGCATGGATTTATGCTGGAACTGGTGGTACTAGCTATAATCAGAAGTTCACAGGCAAGGCCCAACTGACTGTAGACACATCCTCCAGCACAGCCTACATGCAATTCAGCAGCCTGACAACTGAGGACTCTGCCATCTATTACTGTGCAAGA +>631|TRAV4-4-DV10 GRCm38-release94|TRAV4-4-DV10|L-REGION+V-REGION|TR|TRA|None|00 +ATGCAGAGGAACCTGGGAGCTGTGCTGGGGATTCTGTGGGTGCAGATTTGCTGGGTGAGAGGGGATCAGGTGGAGCAGAGTCCTTCAGCCCTGAGCCTCCACGAGGGAACCGATTCTGCTCTGAGATGCAATTTTACGACCACCATGAGGAGTGTGCAGTGGTTCCGACAGAATTCCAGGGGCAGCCTCATCAGTTTGTTCTACTTGGCTTCAGGAACAAAGGAGAATGGGAGGCTAAAGTCAGCATTTGATTCTAAGGAGCGGCGCTACAGCACCCTGCACATCAGGGATGCCCAGCTGGAGGACTCAGGCACTTACTTCTGTGCTGCTGAGG +>632|TRAV13-1 GRCm38-release94|TRAV13-1|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACAGGCTGCTGTGCTCTCTGCTGGGGCTTCTGTGCACCCAGGTTTGCTGGGTGAAAGGACAGCAAGTGCAGCAGAGCCCCGCGTCCTTGGTTCTGCAGGAGGGGGAGAATGCAGAGCTGCAGTGTAACTTTTCCACATCTTTGAACAGTATGCAGTGGTTTTACCAACGTCCTGAGGGAAGTCTCGTCAGCCTGTTCTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATCAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTTTGGAAC +>633|TRBV12-2+TRBV13-2 GRCm38-release94|TRBV12-2+TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGTCTAACACTGCCTTCCCTGACCCCGCCTGGAACACCACCCTGCTATCTTGGGTTGCTCTCTTTCTCCTGGGAACAAAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>634|TRAV16N GRCm38-release94|TRAV16N|L-REGION+V-REGION|TR|TRA|None|00 +ATGCTGATTCTAAGCCTGTTGGGAGCAGCCTTTGGCTCCATTTGTTTTGCAGCAACCAGCATGGCCCAGAAGGTAACACAGACTCAGACTTCAATTTCTGTGGTGGAGAAGACAACGGTGACAATGGACTGTGTGTATGAAACCCGGGACAGTTCTTACTTCTTATTCTGGTACAAGCAAACAGCAAGTGGGGAAATAGTTTTCCTTATTCGTCAGGACTCTTACAAAAAGGAAAATGCAACAGTGGGTCATTATTCTCTGAACTTTCAGAAGCCAAAAAGTTCCATCGGACTCATCATCACCGCCACACAGATTGAGGACTCAGCAGTATATTTCTGTGCTATGAGAGAGGG +>635|TRAV6N-5 GRCm38-release94|TRAV6N-5|L-REGION+V-REGION|TR|TRA|None|00 +ATGAACCTTTGTCCTGAACTGGGTATTCTACTCTTCCTAATGCTTTTTGGAGAAAGCAATGGAGACTCAGTGACTCAGACAGAAGGCCCAGTGACACTGTCTGAAGGGACTTCTCTGACTGTGAACTGTTCCTATGAAACCAAACAGTACCCAACCCTGTTCTGGTATGTGCAGTATCCCGGAGAAGGTCCACAGCTCCTCTTTAAAGTCCCAAAGGCCAACGAGAAGGGAAGCAACAGAGGTTTTGAAGCTACATACAATAAAGAAGCCACCTCCTTCCACTTGCAGAAAGCCTCAGTGCAAGAGTCAGACTCGGCTGTGTACTACTGTGCTCTGGGTGA +>636|TRAV13N-4 GRCm38-release94|TRAV13N-4|L-REGION+V-REGION|TR|TRA|None|00 +ATGAAGAGGCTGCTGTGCTCTCTGCTGGGGCTCCTGTGCACCCAGGTTTGCTGTGCTTCTCAATTAGGGCTGAAAGAACAGCAAGTGCAGCAGAGTCCCGCATCCTTGGTTCTGCAGGAGGCGGAGAACGCAGAGCTCCAGTGTAGCTTTTCCATCTTTACAAACCAGGTGCAGTGGTTTTACCAACGTCCTGGGGGAAGACTCGTCAGCCTGTTGTACAATCCTTCTGGGACAAAGCAGAGTGGGAGACTGACATCCACAACAGTCATTAAAGAACGTCGCAGCTCTTTGCACATTTCCTCCTCCCAGATCACAGACTCAGGCACTTATCTCTGTGCTATGGAAC +>637|TRBV13-2 GRCm38-release94|TRBV13-2|L-REGION+V-REGION|TR|TRB|None|00 +ATGGGCTCCAGGCTCTTCTTCGTGCTCTCCAGTCTCCTGTGTTCAAGTTTTGTCTTTCTTTTTATAGAACACATGGAGGCTGCAGTCACCCAAAGCCCAAGAAACAAGGTGGCAGTAACAGGAGGAAAGGTGACATTGAGCTGTAATCAGACTAATAACCACAACAACATGTACTGGTATCGGCAGGACACGGGGCATGGGCTGAGGCTGATCCATTATTCATATGGTGCTGGCAGCACTGAGAAAGGAGATATCCCTGATGGATACAAGGCCTCCAGACCAAGCCAAGAGAACTTCTCCCTCATTCTGGAGTTGGCTACCCCCTCTCAGACATCAGTGTACTTCTGTGCCAGCGGTGATG +>638|IGHG3 GRCm38-release94|IGHG3|C-REGION|IG|IGH|G3|00 +AGCTGGAACTGAATGGGACCTGTGCTGAGGCCCAGGATGGGGAGCTGGACGGGCTCTGGACGACCATCACCATCTTCATCAGCCTCTTCCTGCTCAGCGTGTGCTACAGCGCCTCTGTCACCCTGTTCAAGGTGAAGTGGATCTTCTCCTCAGTGGTGCAGGTGAAGCAGACGGCCATCCCTGACTACAGGAACATGATTGGACAAGGTGCC +>639|IGHG2B GRCm38-release94|IGHG2B|C-REGION|IG|IGH|G2B|00 +CCAAAACAACACCCCCATCAGTCTATCCACTGGCCCCTGGGTGTGGAGATACAACTGGTTCCTCCGTGACCTCTGGGTGCCTGGTCAAGGGGTACTTCCCTGAGCCAGTGACTGTGACTTGGAACTCTGGATCCCTGTCCAGCAGTGTGCACACCTTCCCAGCTCTCCTGCAGTCTGGACTCTACACTATGAGCAGCTCAGTGACTGTCCCCTCCAGCACCTGGCCAAGTCAGACCGTCACCTGCAGCGTTGCTCACCCAGCCAGCAGCACCACGGTGGACAAAAAACTTGAGCCCAGCGGGCCCATTTCAACAATCAACCCCTGTCCTCCATGCAAGGAGTGTCACAAATGCCCAGCTCCTAACCTCGAGGGTGGACCATCCGTCTTCATCTTCCCTCCAAATATCAAGGATGTACTCATGATCTCCCTGACACCCAAGGTCACGTGTGTGGTGGTGGATGTGAGCGAGGATGACCCAGACGTCCAGATCAGCTGGTTTGTGAACAACGTGGAAGTACACACAGCTCAGACACAAACCCATAGAGAGGATTACAACAGTACTATCCGGGTGGTCAGCACCCTCCCCATCCAGCACCAGGACTGGATGAGTGGCAAGGAGTTCAAATGCAAGGTGAACAACAAAGACCTCCCATCACCCATCGAGAGAACCATCTCAAAAATTAAAGGGCTAGTCAGAGCTCCACAAGTATACACTTTGCCGCCACCAGCAGAGCAGTTGTCCAGGAAAGATGTCAGTCTCACTTGCCTGGTCGTGGGCTTCAACCCTGGAGACATCAGTGTGGAGTGGACCAGCAATGGGCATACAGAGGAGAACTACAAGGACACCGCACCAGTTCTTGACTCTGACGGTTCTTACTTCATATATAGCAAGCTCAATATGAAAACAAGCAAGTGGGAGAAAACAGATTCCTTCTCATGCAACGTGAGACACGAGGGTCTGAAAAATTACTACCTGAAGAAGACCATCTCCCGGTCTCCGGGTAAA +>640|IGHV8-9 GRCm38-release94|IGHV8-9|L-REGION+V-REGION|IG|IGH|None|00 +ATGGACAGGCTTACTTCCTCATTCCTACTGCTGATTGTCCCTGTCTATGTCCTATCCCAGGTTACTCTGAAAGAGTCTGGCCCTGGTATATTGCAGCCCTCCCAGACCCTCAGTCTGACCTGTTCTTTCTCTGTGTTTTCACTGAGCACTTTTGGTATGGGTGTGAGCTGGATTCGTCAGCCTTCAGGGAAGGGTCTGGAGTGGCTGGCACACATTTATTGGGATGAGGACAAGCACTATAAACCATCCTTGAAGAGCCGGCTCACAATCTCCAAGGATACCTCCAACAACCAGGTATTCCTCAAGATCACCACTGTGGACACTGCAGATACTGCCACATACTACTGT +>641|IGKV2-109 GRCm38-release94|IGKV2-109|L-REGION+V-REGION|IG|IGK|None|00 +ATGAGGTTCTCTGCTCAGCTTCTGGGGCTGCTTGTGCTCTGGATCCCTGGATCCACTGCAGATATTGTGATGACGCAGGCTGCCTTCTCCAATCCAGTCACTCTTGGAACATCAGCTTCCATCTCCTGCAGGTCTAGTAAGAATCTCCTACATAGTAATGGCATCACTTATTTGTATTGGTATCTGCAGAGGCCAGGCCAGTCTCCTCAGCTCCTGATATATCGGGTGTCCAATCTGGCCTCAGGAGTCCCAAACAGGTTCAGTGGCAGTGAGTCAGGAACTGATTTCACACTGAGAATCAGCAGAGTGGAGGCTGAGGATGTGGGTGTTTATTACTGT +>642|IGKV4-56 GRCm38-release94|IGKV4-56|L-REGION+V-REGION|IG|IGK|None|00 +ATGGATTTTCAGGTGCAGATTTTCAGCTTCCTGCTAATCAGCAGAGTCATACTGTCCAGAGGACAAATTGTTCTCACCCAGTCTCCAGCAATCATGTCTGCATCTCCAGGGCAGAAAGTCACCATAACCTGCAGTGCCATCTCAAGTGTAAATTACATGCACTGGTACCAGCAGAAGCCAGGATCCTCCCCCAAACTCTGGATTTATGCAACATCCAAACTGGCTCTTGGAGTCCCTGCTTGCTTCAGTGGCAGTGGGTCTGGGACCTCTTACTCTCTCACAATCAGCAGCATGGTGGCTGAAGATGCCACCTCTTATTTCTGT +>643|IGHV1-2 GRCm38-release94|IGHV1-2|L-REGION+V-REGION|IG|IGH|None|00 +ATGGAATGGAACTGGATACTTCCTTTTATTATGTCAGTAACTGCAGGTGTCTACTCACAGGTTCAGCTCCAGCAGTCTGGGCCTGAGCTGGCAAGGCCTTGGGCTTCAGTGAAGATATCCTGCCAGGCTTTCTACACCTTTTCCAGAAGGGTGCACTTTGCCATTAGGGATACCAACTACTGGATGCAGTGGGTAAAACAGAGGCCTGGACAGGGTCTGGAATGGATCGGGGCTATTTATCCTGGAAATGGTGATACTAGTTACAATCAGAAGTTCAAGGGCAAGGCCACATTGACTGCAGACAAATCCTCCAGCACAGCCTACATGCAACTCAGCAGCCTGACATCTGAGGACTCTGCGGTCTATTACTGT diff --git a/lib/rust/vdj_asm_asm/Cargo.toml b/lib/rust/vdj_asm_asm/Cargo.toml index e792504..f6c1e99 100644 --- a/lib/rust/vdj_asm_asm/Cargo.toml +++ b/lib/rust/vdj_asm_asm/Cargo.toml @@ -1,29 +1,43 @@ [dependencies] -bio = '1' -bitflags = '2' -debruijn = '0.3' -fxhash = '0.2' -hostname = '0.3' -lz4 = '1' - [dependencies.anyhow] workspace = true [dependencies.barcode] path = '../barcode' +[dependencies.bio] +workspace = true + +[dependencies.bitflags] +workspace = true + [dependencies.byteseq] path = '../byteseq' +[dependencies.cr_h5] +path = '../cr_h5' + +[dependencies.cr_lib] +path = '../cr_lib' + [dependencies.cr_types] path = '../cr_types' +[dependencies.debruijn] +workspace = true + [dependencies.fastq_set] workspace = true -[dependencies.io_utils] +[dependencies.fxhash] +workspace = true + +[dependencies.hdf5] workspace = true +[dependencies.io_utils] +path = '../io_utils' + [dependencies.itertools] workspace = true @@ -31,11 +45,14 @@ workspace = true path = '../json_report_derive' [dependencies.kmer_lookup] -workspace = true +path = '../kmer_lookup' [dependencies.libc] workspace = true +[dependencies.lz4] +workspace = true + [dependencies.martian] workspace = true @@ -51,9 +68,6 @@ path = '../metric' [dependencies.parameters_toml] path = '../parameters_toml' -[dependencies.perf_stats] -workspace = true - [dependencies.rust-htslib] workspace = true @@ -64,22 +78,25 @@ workspace = true workspace = true [dependencies.string_utils] -workspace = true +path = '../string_utils' [dependencies.vdj_ann] -workspace = true +path = '../vdj_ann' [dependencies.vdj_asm_utils] path = '../vdj_asm_utils' +[dependencies.vdj_filter_barcodes] +path = '../vdj_filter_barcodes' + [dependencies.vdj_reference] path = '../vdj_reference' [dependencies.vdj_types] -workspace = true +path = '../vdj_types' [dependencies.vector_utils] -workspace = true +path = '../vector_utils' [features] default = [] diff --git a/lib/rust/vdj_asm_asm/src/airrfilter.rs b/lib/rust/vdj_asm_asm/src/airrfilter.rs index fdcb84e..c507b2f 100644 --- a/lib/rust/vdj_asm_asm/src/airrfilter.rs +++ b/lib/rust/vdj_asm_asm/src/airrfilter.rs @@ -274,6 +274,7 @@ impl MartianMain for AirrFilter { #[cfg(test)] mod tests { use super::*; + use insta::{assert_ron_snapshot, assert_snapshot}; use martian_filetypes::FileTypeRead; #[test] @@ -287,7 +288,7 @@ mod tests { let outs = AirrFilter.test_run(&run_dir, args).unwrap(); let airr_annotations = outs.airr_annotations.unwrap(); let tsv_contents: Vec = airr_annotations.read().unwrap(); - insta::assert_ron_snapshot!(tsv_contents); - insta::assert_snapshot!(std::fs::read_to_string(&airr_annotations).unwrap()); + assert_ron_snapshot!(tsv_contents); + assert_snapshot!(std::fs::read_to_string(&airr_annotations).unwrap()); } } diff --git a/lib/rust/vdj_asm_asm/src/asm_call_cells.rs b/lib/rust/vdj_asm_asm/src/asm_call_cells.rs index 75168b9..9cc2738 100644 --- a/lib/rust/vdj_asm_asm/src/asm_call_cells.rs +++ b/lib/rust/vdj_asm_asm/src/asm_call_cells.rs @@ -8,18 +8,20 @@ use cr_types::{Fingerprint, FingerprintFile}; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::json_file::JsonFile; -use martian_filetypes::lz4_file::Lz4; use martian_filetypes::{FileTypeRead, LazyFileTypeIO, LazyWrite}; use serde::{Deserialize, Serialize}; use std::collections::{BTreeSet, HashMap, HashSet}; use std::path::PathBuf; use vdj_ann::annotate::ContigAnnotation; -use vdj_asm_utils::barcode_data::analyze_barcode_data_brief; -use vdj_asm_utils::filter_barcodes::{ - cell_filter, confidence_filter, overhang_demux_filter, BarcodeCellInfo, BarcodeFilteringParams, - Contigs, +use vdj_asm_utils::exact_clonotyping::generate_exact_contigs; +use vdj_filter_barcodes::filter_barcode_level::{ + barcode_has_chimeric_contig, cell_filter, confidence_filter, overhang_demux_filter, + BarcodeCellInfo, BarcodeFilteringParams, Contigs, }; -use vdj_asm_utils::filter_log::{FilterLogEntry, FilterLogger, FilterSwitch}; +use vdj_filter_barcodes::filter_library_level::{ + analyze_barcode_data_brief, whitelist_indel_filter, +}; +use vdj_filter_barcodes::filter_log::{FilterLogger, FilterSwitch, VdjFilterLogFormat}; use vdj_reference::VdjReceptor; use vdj_types::VdjChain; use vector_utils::bin_member; @@ -29,7 +31,7 @@ pub struct AsmCallCellsStageInputs { pub receptor: Option, pub denovo: bool, pub vdj_reference_path: Option, - pub count_chemistry_defs: Option, + pub vdj_chemistry_def: ChemistryDefs, pub contig_annotations: JsonFile>, pub barcode_brief: BarcodeDataBriefFile, pub n50_n50_rpu: u32, @@ -41,7 +43,7 @@ pub struct AsmCallCellsStageInputs { pub struct AsmCallCellsStageOutputs { pub contig_annotations: JsonFile>, #[mro_retain] - pub filter_diagnostics: Lz4>>, + pub filter_diagnostics: VdjFilterLogFormat, } // This is our stage struct @@ -67,24 +69,27 @@ impl MartianMain for AsmCallCells { args.receptor == Some(VdjReceptor::TR) || args.receptor == Some(VdjReceptor::TRGD); let is_bcr = args.receptor == Some(VdjReceptor::IG); let gd_mode = args.receptor == Some(VdjReceptor::TRGD); - let filter_diagnostics_file: Lz4> = rover.make_path("filter_diagnostics"); + let filter_diagnostics_file: VdjFilterLogFormat = rover.make_path("filter_diagnostics"); let mut filter_logger = FilterLogger::new(&filter_diagnostics_file)?; let mut barcode_cell_info = Vec::::new(); let mut confident_bcs = HashSet::new(); + let mut initial_cell_bcs = HashSet::new(); let reader = args.barcode_brief.lazy_reader()?; + let contigs_by_bc = contigs_by_bc; // make it immutable. for brief in reader { let mut bc: BarcodeCellInfo = brief?.into(); - let contigs = contigs_by_bc.remove(&bc.barcode).unwrap_or_default(); + let default_contigs = Contigs::default(); + let contigs = contigs_by_bc.get(&bc.barcode).unwrap_or(&default_contigs); let filtering_params = - BarcodeFilteringParams::build(&contigs, &bc, args.denovo, n50_n50_rpu, gd_mode)?; + BarcodeFilteringParams::build(contigs, &bc, args.denovo, n50_n50_rpu, gd_mode)?; let mut low_confidence_reasons = Vec::new(); bc.high_confidence = confidence_filter(&filtering_params, n50_n50_rpu, &mut low_confidence_reasons); if bc.high_confidence { confident_bcs.insert(bc.barcode.clone()); - }; + } bc.now_a_cell = cell_filter( &filtering_params, &bc, @@ -95,12 +100,30 @@ impl MartianMain for AsmCallCells { Some(&mut filter_logger), low_confidence_reasons, ); + if bc.now_a_cell { + initial_cell_bcs.insert(bc.barcode.clone()); + } bc.paired = filtering_params.paired; bc.chimdata = contigs.build_chimdata(bc.now_a_cell, args.denovo)?; bc.jundata = contigs.build_jundata(bc.high_confidence)?; barcode_cell_info.push(bc); } + // Filter contaminating indel errors in gel bead oligos on the set of initial cell bcs + let exact_contigs = + generate_exact_contigs(&args.contig_annotations, initial_cell_bcs).unwrap(); + let indel_contam_bcs = whitelist_indel_filter(exact_contigs, Some(&mut filter_logger)); + for bc in &mut barcode_cell_info { + if bc.now_a_cell && indel_contam_bcs.contains(&bc.barcode) { + bc.now_a_cell = false; + bc.chimdata = bc + .chimdata + .iter() + .map(|c| c.clone().update_productive(false)) + .collect(); + } + } + let mut kills = Vec::::new(); let mut killsc = Vec::::new(); analyze_barcode_data_brief( @@ -113,29 +136,43 @@ impl MartianMain for AsmCallCells { // Update now_a_cell field in barcode_cell_info. for bc in &mut barcode_cell_info { - if bc.now_a_cell && bin_member(&kills, &bc.barcode) { + // We are deliberately including the chimera filter here so that the + // behavior of the library level filtering does not change. + let default_contigs = Contigs::default(); + let contigs = contigs_by_bc.get(&bc.barcode).unwrap_or(&default_contigs); + + let all_contigs: Vec = contigs + .good_contigs + .iter() + .chain(contigs.reject_contigs.iter()) + .cloned() + .collect(); + let has_chimeric_contigs = barcode_has_chimeric_contig( + &all_contigs, + bc.barcode.clone(), + Some(&mut filter_logger), + ); + if bc.now_a_cell && (bin_member(&kills, &bc.barcode) || has_chimeric_contigs) { bc.now_a_cell = false; } } - // OH demux filter - if let (Some(count_chems), Some(fingerprint)) = - (args.count_chemistry_defs, args.sample_fingerprint) - { - if let Some(overhang_read_barcode) = count_chems.overhang_read_barcode() { - let valid_overhang_ids: HashSet = fingerprint - .read()? - .iter() - .flat_map(Fingerprint::tag_names) - .map(|tag_name| BarcodeId::pack(tag_name)) - .collect(); - overhang_demux_filter( - overhang_read_barcode, - valid_overhang_ids, - &mut barcode_cell_info, - Some(&mut filter_logger), - ); - } + if let (Some(overhang_read_barcode), Some(fingerprint)) = ( + args.vdj_chemistry_def.overhang_read_barcode(), + args.sample_fingerprint, + ) { + let valid_overhang_ids: HashSet = fingerprint + .read()? + .iter() + .flat_map(Fingerprint::tag_names) + .map(|tag_name| BarcodeId::pack(tag_name)) + .collect(); + overhang_demux_filter( + overhang_read_barcode, + valid_overhang_ids, + &mut barcode_cell_info, + Some(&mut filter_logger), + ); } let mut asm_cell_barcodes = BTreeSet::new(); @@ -148,7 +185,7 @@ impl MartianMain for AsmCallCells { // In GD mode, take a pass to identify cells which have at least one productive G/D chain let mut gd_barcodes = HashSet::new(); if gd_mode { - for can in args.contig_annotations.lazy_reader()? { + for can in args.contig_annotations.clone().lazy_reader()? { let can: ContigAnnotation = can?; if can.productive.unwrap_or(false) && can diff --git a/lib/rust/vdj_asm_asm/src/asm_metrics.rs b/lib/rust/vdj_asm_asm/src/asm_metrics.rs new file mode 100644 index 0000000..cc5f447 --- /dev/null +++ b/lib/rust/vdj_asm_asm/src/asm_metrics.rs @@ -0,0 +1,93 @@ +//! AsmMetrics stage code + +use crate::assembly::{BarcodeDataFile, VdjPrimers}; +use anyhow::Result; +use cr_types::chemistry::ChemistryDef; +use cr_types::MetricsFile; +use io_utils::read_to_string_safe; +use martian::prelude::*; +use martian_derive::{make_mro, martian_filetype, MartianStruct}; +use martian_filetypes::json_file::JsonFile; +use martian_filetypes::{FileTypeRead, LazyFileTypeIO}; +use metric::JsonReporter; +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; +use vdj_ann::refx::{make_vdj_ref_data_core, RefData}; +use vdj_asm_utils::barcode_data::{metrics_json, BarcodeData, BarcodeDataSum}; +use vdj_reference::VdjReceptor; + +martian_filetype!(TxtFile, "txt"); + +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] +pub struct AsmMetricsStageInputs { + pub chemistry_def: ChemistryDef, + pub vdj_reference_path: Option, + pub receptor: Option, + pub inner_enrichment_primers: Option, + pub total_read_pairs: Option, + pub barcode_full: BarcodeDataFile, +} + +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] +pub struct AsmMetricsStageOutputs { + pub metrics_summary_json: MetricsFile, + pub report: TxtFile, +} + +// This is our stage struct +pub struct AsmMetrics; + +#[make_mro(mem_gb = 8)] +impl MartianMain for AsmMetrics { + type StageInputs = AsmMetricsStageInputs; + type StageOutputs = AsmMetricsStageOutputs; + fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { + let single_end = !args.chemistry_def.is_paired_end(); + let is_tcr = + args.receptor == Some(VdjReceptor::TR) || args.receptor == Some(VdjReceptor::TRGD); + let is_bcr = args.receptor == Some(VdjReceptor::IG); + let mut refdata = RefData::new(); + if let Some(ref ref_path) = args.vdj_reference_path { + let fasta = read_to_string_safe(format!("{}/fasta/regions.fa", ref_path.display())); + make_vdj_ref_data_core(&mut refdata, &fasta, "", is_tcr, is_bcr, None); + }; + let primers = VdjPrimers::new( + args.vdj_reference_path.clone(), + args.inner_enrichment_primers, + args.receptor, + )?; + let bc_data: Vec = args + .barcode_full + .lazy_reader()? + .map(std::result::Result::unwrap) + .collect(); + let bc_data_sum = BarcodeDataSum::sum(&bc_data, &refdata); + let report_file: TxtFile = rover.make_path("report"); + let mut report = report_file.buf_writer()?; + let metrics_reporter = metrics_json( + &bc_data_sum, + single_end, + &refdata, + &primers.inner_primers, + &primers.outer_primers, + args.total_read_pairs, + &mut report, + ); + let reference_reporter = if let Some(ref_path) = args.vdj_reference_path { + let report: JsonReporter = JsonFile::new(ref_path, "reference").read()?; + report.add_prefix("vdj_reference") + } else { + JsonReporter::default() + }; + let metrics_summary_json = MetricsFile::from_reporter( + &rover, + "metrics_summary_json", + &(metrics_reporter + reference_reporter), + )?; + + Ok(AsmMetricsStageOutputs { + metrics_summary_json, + report: report_file, + }) + } +} diff --git a/lib/rust/vdj_asm_asm/src/assembly.rs b/lib/rust/vdj_asm_asm/src/assembly.rs index de202ed..8fe9ee0 100644 --- a/lib/rust/vdj_asm_asm/src/assembly.rs +++ b/lib/rust/vdj_asm_asm/src/assembly.rs @@ -14,10 +14,10 @@ use crate::assembly_types::{ ContigSummaryRow, FastqFile, UmiList, UmiSummaryRow, }; use crate::contig_aligner::ContigAligner; -use anyhow::Result; +use anyhow::{Error, Result}; use cr_types::chemistry::ChemistryDef; use cr_types::rna_read::RnaRead; -use cr_types::{LibraryType, MetricsFile}; +use cr_types::LibraryType; use debruijn::dna_string::DnaString; use debruijn::kmer::Kmer20; use debruijn::Mer; @@ -32,9 +32,8 @@ use martian_filetypes::json_file::JsonFile; use martian_filetypes::lz4_file::Lz4; use martian_filetypes::tabular_file::{CsvFile, TsvFile, TsvFileNoHeader}; use martian_filetypes::{FileTypeRead, FileTypeWrite, LazyFileTypeIO, LazyWrite}; -use metric::{JsonReporter, Metric, SerdeFormat, SimpleHistogram}; +use metric::SimpleHistogram; use parameters_toml::vdj_max_reads_per_barcode; -use perf_stats::{available_mem_gb, elapsed, mem_usage_gb, peak_mem_usage_gb, ps_me}; use rust_htslib::bam; use rust_htslib::bam::HeaderView; use serde::{Deserialize, Serialize}; @@ -43,13 +42,12 @@ use std::fs::{remove_file, rename, File}; use std::io::{BufRead, BufReader, BufWriter, Write}; use std::path::{Path, PathBuf}; use std::process::Command; -use std::time::Instant; use std::{env, fs}; use string_utils::{stringme, strme, TextUtils}; use vdj_ann::annotate::{chain_type, ContigAnnotation, JunctionSupport}; use vdj_ann::refx::{make_vdj_ref_data_core, RefData}; use vdj_asm_utils::asm::write_sam_record_simple; -use vdj_asm_utils::barcode_data::{metrics_json, BarcodeData, BarcodeDataBrief, BarcodeDataSum}; +use vdj_asm_utils::barcode_data::{BarcodeData, BarcodeDataBrief}; use vdj_asm_utils::constants::{ ReadType, CHAIN_TYPESX, CLIP, GAP_EXTEND, GAP_OPEN, KMER_LEN_BANDED_ALIGN, MATCH_SCORE, MISMATCH_SCORE, OR_CHAIN_TYPES, WINDOW_SIZE_BANDED_ALIGN, @@ -70,6 +68,9 @@ martian_filetype!(BinFile, "bin"); martian_filetype!(_BarcodeDataBriefFile, "bdf"); pub type BarcodeDataBriefFile = BinaryFormat<_BarcodeDataBriefFile, Vec>; +martian_filetype!(_BarcodeDataFile, "bd"); +pub type BarcodeDataFile = BinaryFormat<_BarcodeDataFile, Vec>; + // martian_filetype!(_ContigAnnFile, "can"); // impl FileStorage> for _ContigAnnFile {} // pub type ContigAnnFormat = BinaryFormat<_ContigAnnFile>; @@ -193,8 +194,6 @@ where // FIND ENRICHMENT PRIMERS // ================================================================================= -// ◼ This should be run only once, but it's not. - fn enrichment_primers( primer_file: Option<&Path>, refdata: &RefData, @@ -291,7 +290,6 @@ fn sam_to_bam(out_bam_file: &Path, sam_header: bam::header::Header, out_sam_file // exists in case you're debugging this code, as if it's left around it will crash // samtools. - println!("sorting bam, mem = {:.2}", mem_usage_gb()); let out_bam_sorted_filename = out_bam_filename_str.rev_before("/").to_string() + "/contig_bam_sorted.bam"; let tmp_filename = out_bam_sorted_filename.clone() + ".tmp.0000.bam"; @@ -320,9 +318,9 @@ pub struct AssemblyStageOutputs { pub contig_bam_bai: BamBaiFile, pub summary_tsv: TsvFile, pub umi_summary_tsv: TsvFile, - pub metrics_summary_json: MetricsFile, pub contig_annotations: JsonFile>, pub barcode_brief: BarcodeDataBriefFile, + pub barcode_full: BarcodeDataFile, pub barcode_support: CsvFile, pub barcodes_in_chunks: Vec>>, pub assemblable_reads_per_bc: AsmReadsPerBcFormat, @@ -330,7 +328,6 @@ pub struct AssemblyStageOutputs { // The outputs below are simply bubbled up to the outs folder pub align_info: TxtFile, pub unmapped_sample_fastq: FastqFile, - pub report: TxtFile, } // ================================================================================= @@ -340,8 +337,8 @@ pub struct AssemblyStageOutputs { #[derive(Clone, Serialize, Deserialize, MartianStruct)] pub struct AssemblyChunkInputs { pub chunk_rna_reads: Lz4>>, - pub perf_track: Option, pub chunk_id: usize, + pub primers: VdjPrimers, } #[derive(Clone, Serialize, Deserialize, MartianStruct)] @@ -353,12 +350,48 @@ pub struct AssemblyChunkOutputs { pub barcodes_in_chunk: JsonFile>, pub align_info: TxtFile, pub unmapped_sample_fastq: FastqFile, - pub barcode_data: BinFile, - pub barcode_data_sum: BinFile, + pub barcode_data: BarcodeDataFile, pub barcode_data_brief: BinFile, pub outs_builder: BincodeFile>, } +#[derive(Clone, Serialize, Deserialize, MartianStruct)] +pub struct VdjPrimers { + pub inner_primers: Vec>, + pub outer_primers: Vec>, +} + +impl VdjPrimers { + pub fn new( + ref_path: Option, + primer_file: Option, + receptor: Option, + ) -> Result { + let is_tcr = receptor == Some(VdjReceptor::TR) || receptor == Some(VdjReceptor::TRGD); + let is_bcr = receptor == Some(VdjReceptor::IG); + let mut refdata = RefData::new(); + if let Some(ref ref_path) = ref_path { + let fasta = read_to_string_safe(format!("{}/fasta/regions.fa", ref_path.display())); + make_vdj_ref_data_core(&mut refdata, &fasta, "", is_tcr, is_bcr, None); + } + let mut inner_primersx = Vec::>::new(); + let mut outer_primersx = Vec::>::new(); + enrichment_primers( + primer_file.as_deref(), + &refdata, + is_tcr, + is_bcr, + &mut inner_primersx, + &mut outer_primersx, + ); + + Ok(VdjPrimers { + inner_primers: inner_primersx, + outer_primers: outer_primersx, + }) + } +} + // ================================================================================= // STAGE CODE BOILERPLATE // ================================================================================= @@ -379,6 +412,13 @@ impl MartianStage for Assembly { args: Self::StageInputs, _rover: MartianRover, ) -> Result> { + // If the customer has not specified primers, we use the + // reference sequence to decide if the species is human or mouse. + let primers = VdjPrimers::new( + args.vdj_reference_path, + args.inner_enrichment_primers, + args.receptor, + )?; // Set up chunks. // ◼ Join memory highwater mark was 5.4 GB (rounded). // ◼ See comments about memory inefficiency in the join step. @@ -391,8 +431,8 @@ impl MartianStage for Assembly { ( AssemblyChunkInputs { chunk_rna_reads, - perf_track: Some(false), chunk_id: i, + primers: primers.clone(), }, Resource::with_mem_gb(2), ) @@ -411,21 +451,6 @@ impl MartianStage for Assembly { split_args: Self::ChunkInputs, rover: MartianRover, ) -> Result { - // Print some environment info. - - println!("\nstarting vdj_asm_asm, mem = {:.2}", mem_usage_gb()); - match available_mem_gb() { - None => { - println!("available mem = unknown"); - } - Some(m) => { - println!("available mem = {m:.2} GB"); - } - } - if split_args.perf_track == Some(true) { - println!("host = {}", hostname::get().unwrap().to_string_lossy()); - } - // Print the command. println!("{}", env::args().collect::>().join(" ")); @@ -440,20 +465,6 @@ impl MartianStage for Assembly { load_refdata(args.vdj_reference_path.as_deref(), is_tcr, is_bcr); let refs = &refdata.refs; - // Specify inner primers. If the customer has not specified primers, we use the - // reference sequence to decide if the species is human or mouse. - - let mut inner_primersx = Vec::>::new(); - let mut outer_primersx = Vec::>::new(); - enrichment_primers( - args.inner_enrichment_primers.as_deref(), - &refdata, - is_tcr, - is_bcr, - &mut inner_primersx, - &mut outer_primersx, - ); - // Get filenames and set up writers. let contig_annotations_file: JsonFile> = @@ -471,13 +482,7 @@ impl MartianStage for Assembly { // Start of new code to process all barcodes. - let t = Instant::now(); - let mut log_opts = LogOpts::new(); - if split_args.perf_track == Some(true) { - log_opts.clock = true; - log_opts.mem = true; - log_opts.keep_all = true; - } + let log_opts = LogOpts::default(); // Set up for alignment. @@ -498,8 +503,6 @@ impl MartianStage for Assembly { &refdata, refdatax, refdata_full, - inner_primersx, - outer_primersx, rkmers_plus_full_20, is_tcr, is_bcr, @@ -510,12 +513,9 @@ impl MartianStage for Assembly { // Write barcode data. - let barcode_data_file = rover.make_path("barcode_data.bin"); - write_obj(&barcode_data, &barcode_data_file); - let barcode_data_sum_file = rover.make_path("barcode_data_sum.bin"); - let barcode_data_sum = BarcodeDataSum::sum(&barcode_data, &refdata); + let barcode_data_file: BarcodeDataFile = rover.make_path("barcode_data"); + barcode_data_file.write(&barcode_data)?; drop(barcode_data); - write_obj(&barcode_data_sum, &barcode_data_sum_file); let barcode_data_brief_file = rover.make_path("barcode_data_brief.bin"); write_obj(&barcode_data_brief, &barcode_data_brief_file); drop(barcode_data_brief); @@ -530,28 +530,6 @@ impl MartianStage for Assembly { barcodes_in_chunk_file.write(&barcodes)?; drop(barcodes); - // Print. - - println!( - "\n▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n" - ); - println!( - "{:.3} seconds used processing barcodes, peak mem = {:.2}", - elapsed(&t), - peak_mem_usage_gb() - ); - - // See how much memory is in use, for debugging. - - if log_opts.clock { - ps_me(); - println!( - "\nexiting main program, mem = {:.2}, peak = {:.2}", - mem_usage_gb(), - peak_mem_usage_gb() - ); - } Ok(AssemblyChunkOutputs { contig_bam: out_bam_filename, summary_tsv: summary_file, @@ -561,7 +539,6 @@ impl MartianStage for Assembly { align_info: align_info_file, unmapped_sample_fastq: unmapped_sample_fastq_file, barcode_data: barcode_data_file, - barcode_data_sum: barcode_data_sum_file, barcode_data_brief: barcode_data_brief_file, outs_builder: ob_file, }) @@ -578,21 +555,10 @@ impl MartianStage for Assembly { chunk_outs: Vec, rover: MartianRover, ) -> Result { - // Set up logging. - - let t = Instant::now(); - let log_opts = LogOpts::new(); - log_opts.report_perf_stats_now(&t, "upon entering join"); - // CELLRANGER-7889: "VDJ" is hardcoded in mro injection of chemistry defs map. let chemistry_def = &args.chemistry_defs[&LibraryType::VdjAuto]; - // Get the number of read pairs. This is from the beginning, before we - // throw out non-whitelisted barcodes. - let total_read_pairs = args.total_read_pairs as usize; - // Merge summary_tsv and umi_summary_tsv files. - let summary_tsv_file: TsvFile = rover.make_path("summary_tsv"); write_contig_summary_tsv(&summary_tsv_file, &chunk_outs)?; @@ -608,11 +574,6 @@ impl MartianStage for Assembly { } drop(align_info); - // Set up report file. - - let report_file: TxtFile = rover.make_path("report"); - let mut report = report_file.buf_writer()?; - // Merge unmapped fastq files. let unmapped_sample_fastq_file: FastqFile = rover.make_path("unmapped_sample_fastq"); @@ -686,14 +647,13 @@ impl MartianStage for Assembly { // Merge bam files, then index. let out_bam_filename: BamFile = rover.make_path("contig_bam.bam"); - log_opts.report_perf_stats_now(&t, "before merging bam files"); + let bams: Vec<_> = chunk_outs.iter().map(|co| co.contig_bam.clone()).collect(); let contig_bam_bai_filename: BamBaiFile = rover.make_path("contig_bam.bam.bai"); if !chunk_outs.is_empty() { merge_bams(&bams, out_bam_filename.as_ref()).unwrap(); - log_opts.report_perf_stats_now(&t, "before indexing bam"); + index_bam(&out_bam_filename); - log_opts.report_perf_stats_now(&t, "after sorting"); } else { out_bam_filename.buf_writer()?; } @@ -703,84 +663,12 @@ impl MartianStage for Assembly { let is_tcr = args.receptor == Some(VdjReceptor::TR) || args.receptor == Some(VdjReceptor::TRGD); let is_bcr = args.receptor == Some(VdjReceptor::IG); - let is_gd = Some(args.receptor == Some(VdjReceptor::TRGD)); if let Some(ref ref_path) = args.vdj_reference_path { let fasta = read_to_string_safe(format!("{}/fasta/regions.fa", ref_path.display())); make_vdj_ref_data_core(&mut refdata, &fasta, "", is_tcr, is_bcr, None); } - // Read in barcode data sum files and merge. Then generate metrics from - // that. - - log_opts.report_perf_stats_now(&t, "before reading barcode data"); - let mut barcode_data_sum = Vec::::new(); - for co in &chunk_outs { - let barcode_data_sum_this: BarcodeDataSum = read_obj(&co.barcode_data_sum); - barcode_data_sum.push(barcode_data_sum_this); - } - - log_opts.report_perf_stats_now(&t, "after reading"); - let mut inner_primersx = Vec::>::new(); - let mut outer_primersx = Vec::>::new(); - enrichment_primers( - args.inner_enrichment_primers.as_deref(), - &refdata, - is_tcr, - is_bcr, - &mut inner_primersx, - &mut outer_primersx, - ); - let mut json = Vec::::new(); - - println!("Just before metrics json"); - let single_end = !chemistry_def.is_paired_end(); - metrics_json( - rover.files_path().to_str().unwrap(), - is_tcr, - &barcode_data_sum, - &mut json, - single_end, - &refdata, - &inner_primersx, - &outer_primersx, - total_read_pairs, - &mut report, - is_gd, - ); - println!("Done with metrics json"); - log_opts.report_perf_stats_now(&t, "after computing json metrics"); - drop(barcode_data_sum); - let metrics_file: MetricsFile = rover.make_path("asm_metrics"); - let mut metrics_out = metrics_file.buf_writer()?; - fwrite!(metrics_out, "{}", strme(&json)); - drop(metrics_out); - - // Validate json structure of metrics_summary_json.json. - println!("Validate json structure"); - let json2 = read_to_string_safe(&metrics_file); - let _: serde_json::Value = serde_json::from_str(&json2).unwrap_or_else(|_| { - panic!( - "{} is not well-formatted", - metrics_file.as_ref().to_str().unwrap() - ) - }); - - println!("Validated"); - - let metrics_reporter: JsonReporter = metrics_file.read()?; - let reference_reporter = if let Some(ref_path) = args.vdj_reference_path { - let report: JsonReporter = JsonFile::new(ref_path, "reference").read()?; - report.add_prefix("vdj_reference") - } else { - JsonReporter::default() - }; - let metrics_summary_json = MetricsFile::from_reporter( - &rover, - "metrics_summary_json", - &(metrics_reporter + reference_reporter), - )?; - // Merge barcode support files. let barcode_support_file: CsvFile = rover.make_path("barcode_support.csv"); write_bc_support_csv(&barcode_support_file, &chunk_outs)?; @@ -788,6 +676,9 @@ impl MartianStage for Assembly { let barcode_data_brief_file: BarcodeDataBriefFile = rover.make_path("barcode_data_brief"); barcode_data_brief_file.write(&barcode_data_brief)?; + let barcode_data_full_file: BarcodeDataFile = rover.make_path("barcode_data_full"); + write_bc_data_full(&barcode_data_full_file, &chunk_outs)?; + let assemblable_reads_per_bc = { let path: AsmReadsPerBcFormat = rover.make_path("assemblable_reads_per_bc"); let mut hist = SimpleHistogram::default(); @@ -800,27 +691,24 @@ impl MartianStage for Assembly { // Return results. - log_opts.report_perf_stats_now(&t, "before making barcodes_in_chunks"); let barcodes_in_chunks = chunk_outs .iter() .map(|co| co.barcodes_in_chunk.clone()) .collect(); - log_opts.report_perf_stats_now(&t, "join at Ok"); Ok(AssemblyStageOutputs { contig_bam: out_bam_filename, contig_bam_bai: contig_bam_bai_filename, summary_tsv: summary_tsv_file, umi_summary_tsv: umi_summary_tsv_file, - metrics_summary_json, contig_annotations: contig_annotations_file, barcode_brief: barcode_data_brief_file, + barcode_full: barcode_data_full_file, barcode_support: barcode_support_file, barcodes_in_chunks, assemblable_reads_per_bc, align_info: align_info_file, unmapped_sample_fastq: unmapped_sample_fastq_file, - report: report_file, }) } } @@ -899,8 +787,6 @@ fn write_simple_sam( refdata: &RefData, refdatax: RefData, refdata_full: RefData, - inner_primersx: Vec>, - outer_primersx: Vec>, rkmers_plus_full_20: Vec<(Kmer20, i32, i32)>, is_tcr: bool, is_bcr: bool, @@ -931,9 +817,10 @@ fn write_simple_sam( let contam = FlowcellContam::new(); let n50_n50_rpu = args.n50_n50_rpu; // Compute primer extensions. - - let inner_primer_exts = get_primer_exts(&inner_primersx, refdata); - let outer_primer_exts = get_primer_exts(&outer_primersx, refdata); + let inner_primersx = &split_args.primers.inner_primers; + let outer_primersx = &split_args.primers.outer_primers; + let inner_primer_exts = get_primer_exts(inner_primersx, refdata); + let outer_primer_exts = get_primer_exts(outer_primersx, refdata); let mut log = Vec::::new(); let mut ann_writer = contig_annotations_file.lazy_writer()?; @@ -985,8 +872,7 @@ fn write_simple_sam( // Scope to force closure of simple_sam_writer2. { - let barcode_counts_full = - SimpleHistogram::::from_file(&args.corrected_bc_counts, SerdeFormat::Json); + let barcode_counts_full = args.corrected_bc_counts.read()?; let mut trimmer = crate::adapter::VdjTrimmer::new(&vdj_adapters); let mut simple_sam_writer2 = BufWriter::new(&mut simple_sam_writer); @@ -1016,6 +902,7 @@ fn write_simple_sam( let actual_reads = barcode_counts_full.get(&barcode_string); let read_data = (barcode_string, read_inner_data, actual_reads); barcode_data_this.nreads = read_data.2 as i32; + barcode_data_this.nreads_used_for_assembly = this_bc_reads.len() as i32; // Assign fraction of reads used for assembly of each barcode let max_read_pairs_per_barcode = get_max_reads_per_barcode(chemistry_def); barcode_data_this.frac = @@ -1073,7 +960,7 @@ fn write_simple_sam( let barcode = read_data.0.clone(); barcodes.push(barcode.clone()); - let t = Instant::now(); + // if track { println!( "START {}", chbid ); } let mut log2 = Vec::::new(); @@ -1084,8 +971,8 @@ fn write_simple_sam( ); fwriteln!(log2, "BARCODE {} = {}\n", chbid, read_data.0); fwriteln!(log2, "using {} reads", read_data.1.len()); - barcode_data_this.barcode = read_data.0.clone(); - log_opts.report_perf_stats(&mut log2, &t, "before preprocessing reads"); + barcode_data_this.barcode.clone_from(&read_data.0); + drop(read_data); let (corrected, umi_sorted_reads) = @@ -1111,7 +998,7 @@ fn write_simple_sam( let mut invalidated_umis = Vec::>::new(); let mut barcode_data_brief_this = BarcodeDataBrief::new(); let mut junction_support = Vec::>::new(); - barcode_data_brief_this.barcode = barcode.clone(); + barcode_data_brief_this.barcode.clone_from(&barcode); barcode_data_brief_this.read_pairs = barcode_data_this.nreads as u64; barcode_data_brief_this.frac_reads_used = barcode_data_this.frac; process_barcode( @@ -1120,8 +1007,8 @@ fn write_simple_sam( is_tcr, is_bcr, is_gd, - &inner_primersx, - &outer_primersx, + inner_primersx, + outer_primersx, &inner_primer_exts, &outer_primer_exts, &mut reads, @@ -1152,14 +1039,13 @@ fn write_simple_sam( log_opts, &heur, ); - log_opts.report_perf_stats(&mut log2, &t, "upon return from process_barcodes"); // Write contigs and annotation for them. for i in 0..conx.len() { let tigname = format!("{barcode}_contig_{}", i + 1); // Build annotation. - let can = ContigAnnotation::from_seq( + let mut can = ContigAnnotation::from_seq( &conx[i], &conxq[i], &tigname, @@ -1171,10 +1057,11 @@ fn write_simple_sam( Some(non_validated_umis[i].clone()), Some(invalidated_umis[i].clone()), false, // determined in ASM_CALL_CELLS stage - is_gd, junction_support[i].as_ref().cloned(), ); + can.sample = Some(args.sample_id.clone()); + // confirm that productive labels assigned to contigs // match up with assembler con and con2 piles. // this is not true for denovo mode @@ -1185,7 +1072,6 @@ fn write_simple_sam( // Output as json with four space indentation ann_writer.write_item(&can)?; } - log_opts.report_perf_stats(&mut log2, &t, "after writing contigs"); // Make a vector showing which umis/reads are assigned to which contigs. // By design, each UMI is assigned to at most one contig, and each @@ -1281,7 +1167,6 @@ fn write_simple_sam( r.flags = flags[i]; // flags readsx.push(r); } - log_opts.report_perf_stats(&mut log2, &t, "after creating readsx"); // Add to the sam file. First gather contig names. // ◼ The creation of bam headers here is gratuituous, since what @@ -1365,15 +1250,13 @@ fn write_simple_sam( } // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - log_opts.report_perf_stats(&mut log2, &t, "after simple sam"); - // Finish up. bid += 1; barcode_data.push(barcode_data_this); barcode_data_brief.push(barcode_data_brief_this); - log_opts.report_perf_stats(&mut log2, &t, "after pushing result"); - if nedges > 0 || log_opts.keep_all { + + if nedges > 0 { log.append(&mut log2); } } @@ -1452,3 +1335,16 @@ fn write_bc_support_csv( writer.finish()?; Ok(()) } + +fn write_bc_data_full(file: &BarcodeDataFile, chunk_outs: &[AssemblyChunkOutputs]) -> Result<()> { + let mut writer = file.lazy_writer()?; + for chunk in chunk_outs { + let reader = chunk.barcode_data.lazy_reader()?; + for bc_data in reader { + let bc_data = bc_data?; + writer.write_item(&bc_data)?; + } + } + writer.finish()?; + Ok(()) +} diff --git a/lib/rust/vdj_asm_asm/src/assembly_types.rs b/lib/rust/vdj_asm_asm/src/assembly_types.rs index 0534c7d..3413554 100644 --- a/lib/rust/vdj_asm_asm/src/assembly_types.rs +++ b/lib/rust/vdj_asm_asm/src/assembly_types.rs @@ -1,5 +1,4 @@ use anyhow::Result; -use barcode::Barcode; use cr_types::chemistry::ChemistryDefs; use cr_types::rna_read::RnaRead; use itertools::Itertools; @@ -71,6 +70,7 @@ pub struct BarcodeSupport { #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct AssemblyStageInputs { + pub sample_id: String, pub chemistry_defs: ChemistryDefs, pub bc_sorted_rna_reads: Vec>>>, pub vdj_reference_path: Option, @@ -80,6 +80,6 @@ pub struct AssemblyStageInputs { pub denovo: bool, pub inner_enrichment_primers: Option, pub total_read_pairs: i64, - pub corrected_bc_counts: JsonFile>, + pub corrected_bc_counts: JsonFile>, pub min_contig_length: Option, } diff --git a/lib/rust/vdj_asm_asm/src/filter_exact_clonotypes.rs b/lib/rust/vdj_asm_asm/src/filter_exact_clonotypes.rs new file mode 100644 index 0000000..78ce3af --- /dev/null +++ b/lib/rust/vdj_asm_asm/src/filter_exact_clonotypes.rs @@ -0,0 +1,89 @@ +//! FilterExactClonotypes stage code + +use anyhow::Result; +use martian::prelude::*; +use martian_derive::{make_mro, MartianStruct}; +use martian_filetypes::json_file::JsonFile; +use martian_filetypes::{LazyFileTypeIO, LazyWrite}; +use serde::{Deserialize, Serialize}; +use std::collections::HashSet; +use vdj_ann::annotate::ContigAnnotation; +use vdj_asm_utils::exact_clonotyping::ExactClonotype; +use vdj_filter_barcodes::filter_clonotype_level::{ + build_wlcontaminfo_per_exact_clonotype, whitelist_contamination_filter, +}; +use vdj_filter_barcodes::filter_log::{FilterLogEntry, FilterLogger, VdjFilterLogFormat}; + +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] +pub struct FilterExactClonotypesStageInputs { + pub exact_clonotypes: JsonFile>, + pub contig_annotations: JsonFile>, + pub filter_diagnostics: VdjFilterLogFormat, +} + +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] +pub struct FilterExactClonotypesStageOutputs { + pub contig_annotations: JsonFile>, + #[mro_retain] + pub filter_diagnostics: VdjFilterLogFormat, +} + +pub struct FilterExactClonotypes; + +#[make_mro(mem_gb = 4)] +impl MartianMain for FilterExactClonotypes { + type StageInputs = FilterExactClonotypesStageInputs; + type StageOutputs = FilterExactClonotypesStageOutputs; + fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { + // Set-up filter logging + let filter_diagnostics_file: VdjFilterLogFormat = rover.make_path("filter_diagnostics"); + let mut filter_logger = + extend_filter_log(args.filter_diagnostics, &filter_diagnostics_file); + + let exact_clonotypes: Vec = args.exact_clonotypes.read_all()?; + let contigs: Vec = args.contig_annotations.read_all()?; + + // Filter out gel bead whitelist contamination + let whitelist_contam_info = + build_wlcontaminfo_per_exact_clonotype(&contigs, exact_clonotypes); + let mut filtered_bcs = HashSet::new(); + for info in whitelist_contam_info { + let contam_bcs = whitelist_contamination_filter(&info, Some(&mut filter_logger)); + filtered_bcs.extend(contam_bcs); + } + + // Update cell calls + let contig_annotations: JsonFile> = + rover.make_path("contig_annotations"); + let mut writer = contig_annotations.lazy_writer()?; + for ann in contigs { + writer.write_item(&ContigAnnotation { + is_cell: if filtered_bcs.contains(&ann.barcode) { + false + } else { + ann.is_cell + }, + is_asm_cell: if filtered_bcs.contains(&ann.barcode) { + Some(false) + } else { + ann.is_asm_cell + }, + ..ann + })?; + } + + Ok(FilterExactClonotypesStageOutputs { + contig_annotations, + filter_diagnostics: filter_diagnostics_file, + }) + } +} + +fn extend_filter_log(in_fpath: VdjFilterLogFormat, out_fpath: &VdjFilterLogFormat) -> FilterLogger { + let in_filter_log: Vec = in_fpath.read_all().unwrap(); + let mut filter_logger = FilterLogger::new(out_fpath).unwrap(); + for entry in in_filter_log { + filter_logger.log(&entry); + } + filter_logger +} diff --git a/lib/rust/vdj_asm_asm/src/lib.rs b/lib/rust/vdj_asm_asm/src/lib.rs index d123468..e481e80 100644 --- a/lib/rust/vdj_asm_asm/src/lib.rs +++ b/lib/rust/vdj_asm_asm/src/lib.rs @@ -46,12 +46,15 @@ )] pub mod airrfilter; pub mod asm_call_cells; +pub mod asm_metrics; mod assembly; pub use assembly::{Assembly, BarcodeDataBriefFile}; mod adapter; pub mod assembly_types; mod contig_aligner; +pub mod filter_exact_clonotypes; pub mod handle_gex_cells; +pub mod make_exact_clonotypes; pub mod make_filter_switch; pub mod merge_per_sample_annotations; pub mod subset_assembly_outs; diff --git a/lib/rust/vdj_asm_asm/src/make_exact_clonotypes.rs b/lib/rust/vdj_asm_asm/src/make_exact_clonotypes.rs new file mode 100644 index 0000000..18a9e94 --- /dev/null +++ b/lib/rust/vdj_asm_asm/src/make_exact_clonotypes.rs @@ -0,0 +1,37 @@ +//! MakeExactClonotypes stage code + +use anyhow::Result; +use martian::prelude::*; +use martian_derive::{make_mro, MartianStruct}; +use martian_filetypes::json_file::JsonFile; +use martian_filetypes::FileTypeWrite; +use serde::{Deserialize, Serialize}; +use vdj_ann::annotate::ContigAnnotation; +use vdj_asm_utils::exact_clonotyping::{generate_exact_clonotypes, ExactClonotype}; + +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] +pub struct MakeExactClonotypesStageInputs { + pub contig_annotations: JsonFile>, +} + +#[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] +pub struct MakeExactClonotypesStageOutputs { + pub exact_clonotypes: JsonFile>, +} + +pub struct MakeExactClonotypes; + +#[make_mro(mem_gb = 4)] +impl MartianMain for MakeExactClonotypes { + type StageInputs = MakeExactClonotypesStageInputs; + type StageOutputs = MakeExactClonotypesStageOutputs; + fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { + let exact_clonotypes = generate_exact_clonotypes(args.contig_annotations.clone())?; + let exact_clonotypes_fn: JsonFile<_> = rover.make_path("exact_clonotypes"); + exact_clonotypes_fn.write(&exact_clonotypes)?; + + Ok(MakeExactClonotypesStageOutputs { + exact_clonotypes: exact_clonotypes_fn, + }) + } +} diff --git a/lib/rust/vdj_asm_asm/src/make_filter_switch.rs b/lib/rust/vdj_asm_asm/src/make_filter_switch.rs index fd4a593..9816e1f 100644 --- a/lib/rust/vdj_asm_asm/src/make_filter_switch.rs +++ b/lib/rust/vdj_asm_asm/src/make_filter_switch.rs @@ -2,7 +2,7 @@ use anyhow::Result; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use serde::{Deserialize, Serialize}; -use vdj_asm_utils::filter_log::FilterSwitch; +use vdj_filter_barcodes::filter_log::FilterSwitch; #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct StageInputs { @@ -41,6 +41,7 @@ impl MartianMain for MakeFilterSwitch { enclone_shared_contig: false, enclone_umi: false, enclone_multiplet: true, + enclone_cross: true, }, _ => FilterSwitch::default(), }; diff --git a/lib/rust/vdj_asm_asm/src/merge_per_sample_annotations.rs b/lib/rust/vdj_asm_asm/src/merge_per_sample_annotations.rs index 3debce4..d362ee5 100644 --- a/lib/rust/vdj_asm_asm/src/merge_per_sample_annotations.rs +++ b/lib/rust/vdj_asm_asm/src/merge_per_sample_annotations.rs @@ -1,35 +1,111 @@ //! MergePerSampleAnnotations stage code - use anyhow::Result; +use cr_h5::count_matrix::BarcodeWithGemGroup; +use cr_lib::read_level_multiplexing::map_multiplexing_seq_to_id; +use cr_types::chemistry::ChemistryDef; +use cr_types::{BarcodeMultiplexingType, ReadLevel}; +use hdf5::types::FixedAscii; +use itertools::Itertools; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::json_file::JsonFile; -use martian_filetypes::{LazyFileTypeIO, LazyWrite}; +use martian_filetypes::{FileTypeRead, FileTypeWrite, LazyFileTypeIO, LazyWrite}; +use metric::TxHashMap; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use vdj_ann::annotate::ContigAnnotation; - #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct MergePerSampleAnnotationsStageInputs { pub per_sample_annotations: HashMap>>, + pub asm_contig_annotations: JsonFile>, + pub multiplexing_method: Option, + pub gex_cells_per_tag: Option>>>, + pub vdj_chemistry_def: ChemistryDef, } #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct MergePerSampleAnnotationsStageOutputs { pub contig_annotations: JsonFile>, + pub vdj_cells_per_tag_json: Option>>, } pub struct MergePerSampleAnnotations; +pub fn get_vdj_cells_per_tag_cell_level_multiplexing( + gex_cells_per_tag: Option>>>, + cell_bcs: &HashSet, +) -> HashMap { + gex_cells_per_tag + .unwrap() + .read() + .unwrap() + .into_iter() + .map(|(tag_id, gex_cells_set)| { + ( + tag_id.to_string(), + gex_cells_set.intersection(cell_bcs).count(), + ) + }) + .collect() +} + +pub fn get_vdj_cells_per_tag_overhang_multiplexing( + vdj_chemistry_def: ChemistryDef, + cell_bcs: &HashSet, +) -> HashMap { + let overhang_barcodes = vdj_chemistry_def.overhang_read_barcode().unwrap(); + + let overhang_offset = overhang_barcodes.offset(); + let overhang_length = overhang_barcodes.length(); + let overhang_range = overhang_offset..(overhang_offset + overhang_length); + + // this contains a path to a text file with information about the overhang sequence to overhang ID map. + let whitelist_sources = overhang_barcodes.whitelist().as_source().unwrap(); + + let overhang_seq_to_id: TxHashMap<_, _> = whitelist_sources.as_translation_seq_to_id().unwrap(); + + // Do this initialization. that way even if no barcodes are assigned to a particular overhang, we will still populate it in the table. + let vdj_cells_per_tag_initial: HashMap = overhang_seq_to_id + .values() + .map(|v| (v.to_string().clone(), 0)) + .collect(); + + let vdj_cells_per_tag = cell_bcs + .iter() + .map(|barcode| { + map_multiplexing_seq_to_id( + &BarcodeWithGemGroup::from(FixedAscii::from_ascii(barcode.as_bytes()).unwrap()), + &overhang_seq_to_id, + &overhang_range, + ) + }) + .fold(vdj_cells_per_tag_initial, |mut acc, overhang_id| { + *acc.entry(overhang_id.to_string()).or_insert(0) += 1; + acc + }); + vdj_cells_per_tag +} + #[make_mro] impl MartianMain for MergePerSampleAnnotations { type StageInputs = MergePerSampleAnnotationsStageInputs; type StageOutputs = MergePerSampleAnnotationsStageOutputs; fn main(&self, args: Self::StageInputs, rover: MartianRover) -> Result { + // In case of CMO & HASHTAG multiplexing sample-level assignments can only be made for cell bcs + let only_cell_bcs_in_samples = matches!( + args.multiplexing_method, + Some(BarcodeMultiplexingType::CellLevel(_)) + ); + let contig_annotations: JsonFile> = rover.make_path("contig_annotations"); let mut ann_writer = contig_annotations.lazy_writer()?; - for (sample, annot) in args.per_sample_annotations { + let mut cell_bcs: HashSet = HashSet::new(); + for (sample, annot) in args + .per_sample_annotations + .into_iter() + .sorted_by_key(|(sample_id, _)| sample_id.clone()) + { let contig_reader = annot.lazy_reader()?; for ann in contig_reader { let mut ann: ContigAnnotation = ann?; @@ -37,10 +113,57 @@ impl MartianMain for MergePerSampleAnnotations { // ann.info = Default::default(); ann.sample = Some(sample.clone()); ann_writer.write_item(&ann)?; + if ann.is_cell { + cell_bcs.insert(ann.barcode); + } + } + } + + let vdj_cells_per_tag = if let Some(multiplexing_method) = args.multiplexing_method { + match multiplexing_method { + BarcodeMultiplexingType::CellLevel(_) => { + Some(get_vdj_cells_per_tag_cell_level_multiplexing( + args.gex_cells_per_tag, + &cell_bcs, + )) + } + BarcodeMultiplexingType::ReadLevel(ReadLevel::OH) => Some( + get_vdj_cells_per_tag_overhang_multiplexing(args.vdj_chemistry_def, &cell_bcs), + ), + BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL) => { + panic!("Unsupported vdj multiplexing method!") + } + } + } else { + None + }; + + let vdj_cells_per_tag_json: Option>> = + if let Some(vdj_cells_per_tag) = vdj_cells_per_tag { + Some( + rover + .make_path::>>("vdj_cells_per_tag") + .with_content(&vdj_cells_per_tag)?, + ) + } else { + None + }; + + // Add non-cell bcs + if only_cell_bcs_in_samples { + for ann in args.asm_contig_annotations.lazy_reader()? { + let mut ann: ContigAnnotation = ann?; + if !cell_bcs.contains(&ann.barcode) { + ann.sample = None; + ann_writer.write_item(&ann)?; + } } } ann_writer.finish()?; - Ok(MergePerSampleAnnotationsStageOutputs { contig_annotations }) + Ok(MergePerSampleAnnotationsStageOutputs { + contig_annotations, + vdj_cells_per_tag_json, + }) } } diff --git a/lib/rust/vdj_asm_asm/src/subset_assembly_outs.rs b/lib/rust/vdj_asm_asm/src/subset_assembly_outs.rs index 8fceb37..83a7a92 100644 --- a/lib/rust/vdj_asm_asm/src/subset_assembly_outs.rs +++ b/lib/rust/vdj_asm_asm/src/subset_assembly_outs.rs @@ -1,12 +1,12 @@ //! SubsetAssemblyOuts stage code -use crate::assembly_types::{AsmReadsPerBcFormat, BarcodeSupport, ContigSummaryRow, UmiSummaryRow}; +use crate::assembly::BarcodeDataFile; +use crate::assembly_types::{AsmReadsPerBcFormat, BarcodeSupport, UmiSummaryRow}; use crate::BarcodeDataBriefFile; use anyhow::Result; use barcode::whitelist::BarcodeId; use cr_types::chemistry::{ChemistryDefs, ChemistryDefsExt}; -use cr_types::{Fingerprint, FingerprintFile}; -use itertools::Itertools; +use cr_types::{BarcodeMultiplexingType, Fingerprint, FingerprintFile, ReadLevel}; use martian::prelude::*; use martian_derive::{make_mro, MartianStruct}; use martian_filetypes::json_file::{Json, JsonFile, JsonFormat}; @@ -16,38 +16,81 @@ use metric::{SimpleHistogram, TxHashSet}; use serde::{Deserialize, Serialize}; use std::collections::HashSet; use vdj_ann::annotate::ContigAnnotation; -use vdj_asm_utils::filter_barcodes::map_multiplexing_seq_to_id; +use vdj_filter_barcodes::filter_barcode_level::map_multiplexing_seq_to_id; #[derive(Debug, Clone, Serialize, Deserialize, MartianStruct)] pub struct SubsetAssemblyOutsStageInputs { pub per_sample: bool, - pub count_chemistry_defs: Option, + pub multiplexing_method: Option, + pub vdj_chemistry_def: ChemistryDefs, pub sample_fingerprint: Option, pub contig_annotations: Option>>, pub merged_annotations: Option>>, pub total_read_pairs: i64, pub corrected_barcode_counts: JsonFile>, pub assemblable_reads_per_bc: AsmReadsPerBcFormat, - pub contig_summary: TsvFile, pub umi_summary: TsvFile, pub barcode_support: CsvFile, pub barcode_brief: BarcodeDataBriefFile, + pub barcode_full: BarcodeDataFile, } #[derive(Debug, Serialize, Deserialize, MartianStruct)] pub struct SubsetAssemblyOutsStageOutputs { pub contig_annotations: JsonFile>, - pub total_read_pairs: i64, - pub corrected_barcode_counts: JsonFile>, + pub total_read_pairs: Option, + pub corrected_barcode_counts: Option>>, pub assemblable_reads_per_bc: AsmReadsPerBcFormat, - pub contig_summary: TsvFile, pub umi_summary: TsvFile, - pub barcode_support: CsvFile, + pub barcode_support: Option>, pub barcode_brief: BarcodeDataBriefFile, + pub barcode_full: BarcodeDataFile, } pub struct SubsetAssemblyOuts; +fn get_valid_barcodes_read_level_multiplexing( + vdj_chemistry_def: &ChemistryDefs, + fingerprints: &[Fingerprint], + contig_annotations: &JsonFile>, +) -> TxHashSet { + let overhang_read_component = vdj_chemistry_def.overhang_read_barcode().unwrap(); + let overhang_range = overhang_read_component.offset() + ..overhang_read_component.offset() + overhang_read_component.length(); + let overhang_seq_to_id = overhang_read_component.build_seq_to_id_map().unwrap(); + let valid_overhang_ids: HashSet = fingerprints + .iter() + .flat_map(Fingerprint::tag_names) + .map(|tag_name| BarcodeId::pack(tag_name)) + .collect(); + let mut valid_bcs = TxHashSet::default(); + let contig_reader = contig_annotations.lazy_reader().unwrap(); + for ann in contig_reader { + let ann: ContigAnnotation = ann.unwrap(); + let this_overhang = + map_multiplexing_seq_to_id(&ann.barcode, &overhang_seq_to_id, &overhang_range); + if valid_overhang_ids.contains(&this_overhang) { + valid_bcs.insert(ann.barcode.clone()); + } + } + valid_bcs +} + +fn get_valid_barcodes_cell_level_multiplexing( + contig_annotations: &JsonFile>, +) -> TxHashSet { + let mut valid_bcs = TxHashSet::default(); + let contig_reader = contig_annotations.lazy_reader().unwrap(); + for ann in contig_reader { + let ann: ContigAnnotation = ann.unwrap(); + // Was the barcode declared a cell by both the VDJ assembler and Gene Expression + if ann.is_asm_cell.map_or(false, |a| a) && ann.is_gex_cell.map_or(false, |g| g) { + valid_bcs.insert(ann.barcode.clone()); + } + } + valid_bcs +} + #[make_mro] impl MartianMain for SubsetAssemblyOuts { type StageInputs = SubsetAssemblyOutsStageInputs; @@ -60,70 +103,71 @@ impl MartianMain for SubsetAssemblyOuts { (Some(_), Some(_)) => unreachable!(), }; - // Set-up for filtering barcodes based on overhang - let maybe_overhang_read_component = args - .count_chemistry_defs - .iter() - .filter_map(ChemistryDefs::overhang_read_barcode) - .at_most_one() - .unwrap(); - - if !args.per_sample || maybe_overhang_read_component.is_none() { + if !args.per_sample || args.multiplexing_method.is_none() { return Ok(SubsetAssemblyOutsStageOutputs { contig_annotations: annot, - total_read_pairs: args.total_read_pairs, - corrected_barcode_counts: args.corrected_barcode_counts, + total_read_pairs: Some(args.total_read_pairs), + corrected_barcode_counts: Some(args.corrected_barcode_counts), assemblable_reads_per_bc: args.assemblable_reads_per_bc, - contig_summary: args.contig_summary, umi_summary: args.umi_summary, - barcode_support: args.barcode_support, + barcode_support: Some(args.barcode_support), barcode_brief: args.barcode_brief, + barcode_full: args.barcode_full, }); } - let overhang_read_component = maybe_overhang_read_component.unwrap(); + let (is_read_level_multiplexed, valid_bcs) = match args.multiplexing_method.unwrap() { + BarcodeMultiplexingType::ReadLevel(ReadLevel::OH) => ( + true, + get_valid_barcodes_read_level_multiplexing( + &args.vdj_chemistry_def, + &args.sample_fingerprint.unwrap().read()?, + &annot, + ), + ), + BarcodeMultiplexingType::CellLevel(_) => { + (false, get_valid_barcodes_cell_level_multiplexing(&annot)) + } + BarcodeMultiplexingType::ReadLevel(ReadLevel::RTL) => { + panic!("Unsupported multiplexing method!") + } + }; - let overhang_range = overhang_read_component.offset() - ..overhang_read_component.offset() + overhang_read_component.length(); - let overhang_seq_to_id = overhang_read_component.build_seq_to_id_map()?; - let valid_overhang_ids: HashSet = args - .sample_fingerprint - .unwrap() - .read()? - .iter() - .flat_map(Fingerprint::tag_names) - .map(|tag_name| BarcodeId::pack(tag_name)) - .collect(); + // subset contig annotaions + let contig_ann_json_file: JsonFormat> = + rover.make_path("contig_annotations.json"); + let mut contig_writer = contig_ann_json_file.lazy_writer()?; + let contig_reader = annot.lazy_reader()?; + for ann in contig_reader { + let ann: ContigAnnotation = ann?; + if valid_bcs.contains(&ann.barcode) { + contig_writer.write_item(&ann)?; + } + } + contig_writer.finish()?; // subset barcode data brief let mut total_read_pairs: i64 = 0; - let mut valid_bcs = TxHashSet::default(); let barcode_data_brief_file: BarcodeDataBriefFile = rover.make_path("barcode_data_brief"); let mut barcode_data_brief_writer = barcode_data_brief_file.lazy_writer()?; for brief in args.barcode_brief.lazy_reader()? { let brief = brief?; - let this_overhang = - map_multiplexing_seq_to_id(&brief.barcode, &overhang_seq_to_id, &overhang_range); - if valid_overhang_ids.contains(&this_overhang) { - valid_bcs.insert(brief.barcode.clone()); + if valid_bcs.contains(&brief.barcode) { total_read_pairs += brief.read_pairs as i64; barcode_data_brief_writer.write_item(&brief)?; } } barcode_data_brief_writer.finish()?; - // subset contig annotaions - let contig_ann_json_file: JsonFormat> = - rover.make_path("contig_annotations.json"); - let mut contig_writer = contig_ann_json_file.lazy_writer()?; - let contig_reader = annot.lazy_reader()?; - for ann in contig_reader { - let ann: ContigAnnotation = ann?; - if valid_bcs.contains(&ann.barcode) { - contig_writer.write_item(&ann)?; + // subset barcode data sum + let barcode_full_file: BarcodeDataFile = rover.make_path("barcode_data"); + let mut barcode_full_writer = barcode_full_file.lazy_writer()?; + for bc_data in args.barcode_full.lazy_reader()? { + let bc_data = bc_data?; + if valid_bcs.contains(&bc_data.barcode) { + barcode_full_writer.write_item(&bc_data)?; } } - contig_writer.finish()?; // subset assemblable_reads_per_bc let mut bc_read_counts = args.assemblable_reads_per_bc.read()?; @@ -135,21 +179,10 @@ impl MartianMain for SubsetAssemblyOuts { // subset corrected_barcode_counts let mut bc_counts_corrected = args.corrected_barcode_counts.read()?; bc_counts_corrected.retain(|k, _| valid_bcs.contains(k)); - let corrected_barcode_counts_file: JsonFile> = + let corrected_barcode_counts_file: JsonFile<_> = rover.make_path("corrected_barcode_counts"); corrected_barcode_counts_file.write(&bc_counts_corrected)?; - // subset contig_summary.tsv - let contig_summary_file: TsvFile = rover.make_path("contig_summary"); - let mut contig_summary_writer = contig_summary_file.lazy_writer()?; - for row in args.contig_summary.lazy_reader()? { - let row = row?; - if valid_bcs.contains(&row.barcode) { - contig_summary_writer.write_item(&row)?; - } - } - contig_summary_writer.finish()?; - // subset umi_summary.tsv let umi_summary_file: TsvFile = rover.make_path("umi_summary"); let mut umi_summary_writer = umi_summary_file.lazy_writer()?; @@ -174,13 +207,14 @@ impl MartianMain for SubsetAssemblyOuts { Ok(SubsetAssemblyOutsStageOutputs { contig_annotations: contig_ann_json_file, - total_read_pairs, - corrected_barcode_counts: corrected_barcode_counts_file, + total_read_pairs: is_read_level_multiplexed.then_some(total_read_pairs), + corrected_barcode_counts: is_read_level_multiplexed + .then_some(corrected_barcode_counts_file), assemblable_reads_per_bc: assemblable_reads_per_bc_file, - contig_summary: contig_summary_file, umi_summary: umi_summary_file, - barcode_support: barcode_support_file, + barcode_support: is_read_level_multiplexed.then_some(barcode_support_file), barcode_brief: barcode_data_brief_file, + barcode_full: barcode_full_file, }) } } diff --git a/lib/rust/vdj_asm_asm/src/write_ann_csv.rs b/lib/rust/vdj_asm_asm/src/write_ann_csv.rs index aeef3b1..4169bbb 100644 --- a/lib/rust/vdj_asm_asm/src/write_ann_csv.rs +++ b/lib/rust/vdj_asm_asm/src/write_ann_csv.rs @@ -14,8 +14,9 @@ use vdj_ann::annotate::ContigAnnotation; use vdj_types::VdjRegion; // One row in contig annotations csv file. -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct ContigAnnotationCsvRow { + pub sample: String, pub barcode: String, pub is_cell: bool, pub contig_id: String, @@ -52,6 +53,7 @@ pub struct ContigAnnotationCsvRow { impl From<&ContigAnnotation> for ContigAnnotationCsvRow { fn from(ann: &ContigAnnotation) -> Self { ContigAnnotationCsvRow { + sample: ann.sample.clone().unwrap_or_default(), barcode: ann.barcode.clone(), is_cell: ann.is_cell, contig_id: ann.contig_name.clone(), diff --git a/lib/rust/vdj_asm_asm/src/write_contig_outs.rs b/lib/rust/vdj_asm_asm/src/write_contig_outs.rs index 63f2a92..7ab3049 100644 --- a/lib/rust/vdj_asm_asm/src/write_contig_outs.rs +++ b/lib/rust/vdj_asm_asm/src/write_contig_outs.rs @@ -27,11 +27,12 @@ struct StageMetrics { vdj_filtered_bcs: i64, /// This is the customer facing metric "Mean Read Pairs per Cell", defined as: /// "Number of input read pairs divided by the estimated number of cells." - vdj_total_raw_read_pairs_per_filtered_bc: f64, + /// Is not computed at the sample-level for CellLevel multiplexing i.e. CMO/Hashtags. + vdj_total_raw_read_pairs_per_filtered_bc: Option, /// This is the customer facing metric Fraction Reads in Cells, defined as: /// "Number of read pairs with cell-associated barcodes divided by the number of /// read pairs with valid barcodes." - vdj_filtered_bcs_cum: PercentMetric, + vdj_filtered_bcs_cum: Option, /// The fraction of productive contigs that are in barcodes that were called a cell. /// Numerator: Number of productive high confidence contigs in cell barcodes /// Denominator: Number of productive contigs in all barcodes @@ -69,8 +70,8 @@ struct StageMetrics { #[derive(Clone, Deserialize, MartianStruct)] pub struct WriteContigOutsStageInputs { pub contig_annotations: JsonFile>, - pub total_read_pairs: i64, - pub corrected_bc_counts: JsonFile>, + pub total_read_pairs: Option, + pub corrected_bc_counts: Option>>, pub assemblable_reads_per_bc: AsmReadsPerBcFormat, } @@ -351,17 +352,21 @@ impl MartianMain for WriteContigOuts { // Compute the metrics here let metrics = StageMetrics { vdj_filtered_bcs: cell_barcodes.len() as i64, - vdj_total_raw_read_pairs_per_filtered_bc: if !cell_barcodes.is_empty() { - (args.total_read_pairs as f64) / (cell_barcodes.len() as f64) - } else { - 0.0f64 - }, - vdj_filtered_bcs_cum: { - let bc_read_counts = args.corrected_bc_counts.read()?; + vdj_total_raw_read_pairs_per_filtered_bc: args.total_read_pairs.map(|t| { + if cell_barcodes.is_empty() { + 0.0f64 + } else { + (t as f64) / cell_barcodes.len() as f64 + } + }), + vdj_filtered_bcs_cum: if let Some(corrected_bc_counts) = args.corrected_bc_counts { + let bc_read_counts = corrected_bc_counts.read()?; let reads_in_valid_barcodes: i64 = bc_read_counts.raw_counts().sum(); let reads_in_cell_barcodes = cell_barcodes.iter().map(|bc| bc_read_counts.get(bc)).sum(); - (reads_in_cell_barcodes, reads_in_valid_barcodes).into() + Some((reads_in_cell_barcodes, reads_in_valid_barcodes).into()) + } else { + None }, vdj_high_conf_prod_contig: (num_cell_productive_contigs, num_productive_contigs) .into(), diff --git a/lib/rust/vdj_asm_utils/Cargo.toml b/lib/rust/vdj_asm_utils/Cargo.toml index a1846f9..c0cf350 100644 --- a/lib/rust/vdj_asm_utils/Cargo.toml +++ b/lib/rust/vdj_asm_utils/Cargo.toml @@ -1,19 +1,6 @@ [dependencies] -arrayref = '0.3' -bio = '1' -debruijn = '0.3' -lazy_static = '1' -lz4 = '1' -num-traits = '0.2' -petgraph = '0.6' -rayon = '1' -superslice = '1' - -[dependencies.align_tools] -workspace = true - [dependencies.amino] -workspace = true +path = '../amino' [dependencies.anyhow] workspace = true @@ -21,31 +8,40 @@ workspace = true [dependencies.barcode] path = '../barcode' -[dependencies.cr_types] -path = '../cr_types' +[dependencies.bio] +workspace = true -[dependencies.equiv] +[dependencies.bio_edit] +path = '../bio_edit' + +[dependencies.debruijn] workspace = true +[dependencies.equiv] +path = '../equiv' + [dependencies.graph_simple] -workspace = true +path = '../graph_simple' [dependencies.hyperbase] -workspace = true +path = '../hyperbase' [dependencies.io_utils] -workspace = true +path = '../io_utils' [dependencies.itertools] workspace = true [dependencies.kmer_lookup] +path = '../kmer_lookup' + +[dependencies.lazy_static] workspace = true -[dependencies.martian] +[dependencies.lz4] workspace = true -[dependencies.martian-derive] +[dependencies.martian] workspace = true [dependencies.martian-filetypes] @@ -55,15 +51,14 @@ workspace = true path = '../metric' [dependencies.ordered-float] -features = ['serde'] -version = '3' - -[dependencies.perf_stats] workspace = true [dependencies.rand] workspace = true +[dependencies.rayon] +workspace = true + [dependencies.rust-htslib] workspace = true @@ -74,25 +69,25 @@ workspace = true workspace = true [dependencies.stats_utils] -workspace = true +path = '../stats_utils' [dependencies.string_utils] -workspace = true +path = '../string_utils' -[dependencies.tables] +[dependencies.superslice] workspace = true [dependencies.tenkit2] path = '../tenkit2' [dependencies.vdj_ann] -workspace = true +path = '../vdj_ann' [dependencies.vdj_types] -workspace = true +path = '../vdj_types' [dependencies.vector_utils] -workspace = true +path = '../vector_utils' [lib] test = false diff --git a/lib/rust/vdj_asm_utils/src/analyze_vs.rs b/lib/rust/vdj_asm_utils/src/analyze_vs.rs index 3a34388..53ab99a 100644 --- a/lib/rust/vdj_asm_utils/src/analyze_vs.rs +++ b/lib/rust/vdj_asm_utils/src/analyze_vs.rs @@ -7,12 +7,13 @@ // TODO: fix these. #![allow(clippy::needless_range_loop)] -use crate::barcode_data::{write_json_metric_f64, write_json_metric_ratio}; -use align_tools::{affine_align, summary_less}; +use bio_edit::alignment::Alignment; +use bio_edit::alignment::AlignmentOperation::{Del, Ins, Subst}; use debruijn::dna_string::DnaString; use debruijn::Mer; use io_utils::{fwriteln, open_for_read}; use itertools::Itertools; +use metric::{JsonReporter, PercentMetric}; use rayon::prelude::*; use serde_json::Value; use stats_utils::percent_ratio; @@ -21,10 +22,11 @@ use std::fmt::Write as _; use std::io::{BufRead, Write}; use std::path::Path; use string_utils::{abbrev_list, strme, TextUtils}; +use vdj_ann::align::affine_align; use vdj_ann::annotate::annotate_seq; use vdj_ann::refx::RefData; -use vdj_ann::transcript::is_valid; -use vector_utils::{bin_member, erase_if, next_diff1_6}; +use vdj_ann::transcript::is_productive_contig; +use vector_utils::{bin_member, erase_if, next_diff1_6, reverse_sort}; // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ // CODE FOR STREAMING A JSON VECTOR @@ -89,20 +91,19 @@ fn read_vector_entry_from_json(json: &mut R) -> Option> { // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ // ANALYZE V SEGMENTS // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ -#[allow(clippy::too_many_arguments)] +#[allow(clippy::too_many_arguments, unused)] pub fn analyze_vs( - o: Vec<&str>, // outs directories or lena ids - species: &str, // species (human or mouse or unknown) - refdata: &RefData, // reference data - use_knowns: bool, // use known alleles - from_scratch: bool, // compute annotations from scratch - parallel: bool, // parallelize - do_aff: bool, // show affine alignments of erroneous V segments (slow) - context: bool, // print context; also turns on json metrics - novels: bool, // print novel alleles - json: &mut Vec, // dump metrics here - log: &mut Vec, // dump logging here - is_gd: Option, // is gamma/delta mode + o: Vec<&str>, // outs directories or lena ids + species: &str, // species (human or mouse or unknown) + refdata: &RefData, // reference data + use_knowns: bool, // use known alleles + from_scratch: bool, // compute annotations from scratch + parallel: bool, // parallelize + do_aff: bool, // show affine alignments of erroneous V segments (slow) + context: bool, // print context; also turns on json metrics + novels: bool, // print novel alleles + json: &mut JsonReporter, // dump metrics here + log: &mut Vec, // dump logging here ) { let mut outs = Vec::::new(); let mut lenas = Vec::::new(); @@ -389,14 +390,12 @@ pub fn analyze_vs( } } } else { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(tig, refdata, &mut ann, true, false, true); - let mut log = Vec::::new(); - if is_valid(tig, refdata, &ann, false, &mut log, is_gd) { + let ann = annotate_seq(tig, refdata, true, false, true); + if is_productive_contig(tig, refdata, &ann).0 { for l in 0..ann.len() { - let t = ann[l].2 as usize; - if refdata.is_v(t) && ann[l].3 == 0 { - let l = ann[l].0 as usize; + let t = ann[l].ref_id as usize; + if refdata.is_v(t) && ann[l].ref_start == 0 { + let l = ann[l].tig_start as usize; let n = refdata.refs[t].len(); if l + n <= tig.len() { make_report(refdata, t, l, n, i, tig, do_aff, &tigsx, r); @@ -444,7 +443,7 @@ pub fn analyze_vs( let mut commons = Vec::<(String, String, String, DnaString)>::new(); let mut ntiglets_q60 = 0; while i < tiglets.len() { - let j = next_diff1_6(&tiglets, i as i32) as usize; + let j = next_diff1_6(&tiglets, i); let denom = totals[tiglets[i].4]; let mut count = 0; // number that are q60 for k in i..j { @@ -580,17 +579,68 @@ pub fn analyze_vs( fwriteln!(log, "\nMETRICS USED ABOVE"); fwriteln!(log, "frac_of_v_segments_having_an_error"); let metric = "frac_of_v_segments_having_an_error"; - write_json_metric_ratio(metric, tiglets.len() - common, total, json); + let metric_val = PercentMetric::from_parts( + (tiglets.len() - common).try_into().unwrap(), + total as i64, + ); + json.insert(metric, &metric_val); fwriteln!(log, "frac_of_q60_v_segments_having_an_error"); let metric = "frac_of_q60_v_segments_having_an_error"; - write_json_metric_ratio(metric, ntiglets_q60 - common_q60, total_q60, json); + let metric_val = PercentMetric::from_parts( + (ntiglets_q60 - common_q60).try_into().unwrap(), + total_q60 as i64, + ); + json.insert(metric, &metric_val); fwriteln!(log, "number_of_v_segments_having_an_error"); let metric = "number_of_v_segments_having_an_error"; - write_json_metric_f64(metric, (tiglets.len() - common) as f64, json); + json.insert(metric, tiglets.len() - common); fwriteln!(log, "number_of_q60_v_segments_having_an_error"); let metric = "number_of_q60_v_segments_having_an_error"; - write_json_metric_f64(metric, (ntiglets_q60 - common_q60) as f64, json); + json.insert(metric, ntiglets_q60 - common_q60); } fwriteln!(log, ""); }); } + +pub fn summary_less(a: &Alignment) -> String { + let ops = &a.operations; + let mut sub = 0; + let (mut del, mut ins) = (Vec::::new(), Vec::::new()); + let mut i = 0; + while i < ops.len() { + if ops[i] == Del || ops[i] == Ins { + let mut j = i + 1; + while j < ops.len() && ops[j] == ops[i] { + j += 1; + } + if ops[i] == Del { + del.push(j - i); + } else { + ins.push(j - i); + } + i = j - 1; + } else if ops[i] == Subst { + sub += 1; + } + i += 1; + } + reverse_sort(&mut del); + reverse_sort(&mut ins); + if sub == 0 && del.is_empty() && ins.is_empty() { + "0".to_string() + } else { + let mut s = if sub > 0 { + format!("{sub}") + } else { + String::new() + }; + s.reserve_exact(2 * (del.len() + ins.len())); + for d in del { + write!(s, "D{d}").unwrap(); + } + for i in ins { + write!(s, "I{i}").unwrap(); + } + s + } +} diff --git a/lib/rust/vdj_asm_utils/src/asm.rs b/lib/rust/vdj_asm_utils/src/asm.rs index f59fdf9..43dfa7c 100644 --- a/lib/rust/vdj_asm_utils/src/asm.rs +++ b/lib/rust/vdj_asm_utils/src/asm.rs @@ -23,14 +23,14 @@ pub fn write_sam_record_simple( let mut tigname = "*".to_string(); if x.tid() >= 0 { - tigname = tignames[x.tid() as usize].clone(); + tigname.clone_from(&tignames[x.tid() as usize]); } // Set mate reference sequence name field. let mut mtid = "*".to_string(); if x.tid() != x.mtid() { - mtid = tignames[x.mtid() as usize].clone(); + mtid.clone_from(&tignames[x.mtid() as usize]); } else if mate_mapped { mtid = "=".to_string(); } diff --git a/lib/rust/vdj_asm_utils/src/bam_utils.rs b/lib/rust/vdj_asm_utils/src/bam_utils.rs index c0912d3..62f8692 100644 --- a/lib/rust/vdj_asm_utils/src/bam_utils.rs +++ b/lib/rust/vdj_asm_utils/src/bam_utils.rs @@ -143,11 +143,11 @@ pub fn add_ref_to_bam_header(header: &mut bam::header::Header, seq_name: &str, s /// Convert an internal `Read` object into a BAM record. /// From the SAM spec: /// 1. For a unmapped paired-end or mate-pair read whose mate is mapped, the unmapped read should -/// have RNAME and POS identical to its mate. +/// have RNAME and POS identical to its mate. /// 2. If all segments in a template are unmapped, their RNAME should be set as ‘*’ and POS as 0. -/// ... +/// ... /// 4. Unmapped reads should be stored in the orientation in which they came off the sequencing machine -/// and have their reverse flag bit (0x10) correspondingly unset. +/// and have their reverse flag bit (0x10) correspondingly unset. pub fn read_to_bam_record_opts( read: &graph_read::Read, alignment: &Option, diff --git a/lib/rust/vdj_asm_utils/src/barcode_data.rs b/lib/rust/vdj_asm_utils/src/barcode_data.rs index a1117b8..8fb2fdd 100644 --- a/lib/rust/vdj_asm_utils/src/barcode_data.rs +++ b/lib/rust/vdj_asm_utils/src/barcode_data.rs @@ -4,27 +4,19 @@ // TODO: fix these. #![allow(clippy::needless_range_loop)] -use crate::analyze_vs::analyze_vs; use crate::constants::{CHAIN_TYPES, CHAIN_TYPESX, PRIMER_EXT_LEN}; -use crate::filter_barcodes::BarcodeCellInfo; -use crate::filter_log::{AsmCellFilter, FilterLogEntry, FilterLogger, FilterSwitch}; -use debruijn::dna_string::DnaString; use itertools::Itertools; -use num_traits::ToPrimitive; +use metric::{JsonReporter, PercentMetric, SimpleHistogram, TxHashMap}; use ordered_float::NotNan; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use stats_utils::{len_weighted_mean, mean, n50, n90}; -use std::cmp::{max, min}; +use std::cmp::max; use std::fs::File; use std::io::{BufWriter, Write}; use string_utils::strme; -use tables::print_tabular; -use tenkit2::pack_dna::{reverse_complement, unpack_bases_80}; +use tenkit2::pack_dna::reverse_complement; use vdj_ann::refx::RefData; -use vector_utils::{ - bin_member, bin_position, bin_position1_3, contains_at, erase_if, lower_bound, next_diff, - next_diff12_3, next_diff1_2, next_diff1_5, reverse_sort, unique_sort, upper_bound, -}; +use vector_utils::{contains_at, next_diff, unique_sort}; // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ // BARCODE DATA STRUCTURES @@ -37,6 +29,9 @@ pub struct BarcodeData { // number of reads in the barcode pub nreads: i32, + // Number of subsampled reads used for assembly in barcode + // if nreads < vdj_max_reads_per_barcode, nreads = nreads_used_for_assembly + pub nreads_used_for_assembly: i32, // number of reads hitting TRAV, TRBV, TRGV, and TRDV pub trav_reads: i32, @@ -86,7 +81,7 @@ pub struct BarcodeData { pub primer_sample_count: u16, pub inner_hit: Vec, // one entry for each inner primer pub inner_hit_good: Vec, - pub outer_hit: Vec, // one entry for each inner primer + pub outer_hit: Vec, // one entry for each outer primer pub outer_hit_good: Vec, // stats for tracking primer counts in good contigs @@ -101,6 +96,7 @@ impl BarcodeData { BarcodeData { barcode: String::new(), nreads: 0_i32, + nreads_used_for_assembly: 0_i32, trav_reads: 0_i32, trbv_reads: 0_i32, trgv_reads: 0_i32, @@ -128,6 +124,12 @@ impl BarcodeData { frac: 1.0_f64, } } + + /// Function returns 1 / subsample fraction for primer search. + /// Used to mutliply number of hits in sample to estimate the total number of hits. + fn primer_inv_subsample_frac(&self) -> f64 { + self.nreads as f64 / self.primer_sample_count as f64 + } } impl Default for BarcodeData { @@ -163,12 +165,19 @@ pub struct ContigChimeraData { pub umi_count: usize, // is this a productive contig - pub productive: bool, + pub is_cell_and_productive: bool, // the barcode pub barcode: String, } +impl ContigChimeraData { + pub fn update_productive(mut self, is_cell: bool) -> Self { + self.is_cell_and_productive = self.is_cell_and_productive && is_cell; + self + } +} + #[derive(PartialEq, PartialOrd, Clone, Serialize, Deserialize, Debug)] pub struct BarcodeDataBrief { // the barcode @@ -209,16 +218,24 @@ impl Default for BarcodeDataBrief { } } -#[derive(PartialEq, PartialOrd, Clone, Serialize, Deserialize)] +// The number of read pairs and Vdj chain-assignment of a single UMI +#[derive(Debug, Serialize, Deserialize, Hash, PartialEq, Clone, PartialOrd, Ord, Eq)] +pub struct VdjUmi { + chain_type: String, + npairs: usize, +} + +#[derive(Clone, Serialize, Deserialize, Debug)] pub struct BarcodeDataSum { - pub nreads: i64, // number of reads - pub nreads_umi_corrected: i64, // number of reads whose umi was corrected - pub ncontigs: i64, // number of contigs - pub xucount_sum: i64, // sum over xucounts - pub chain_sample: Vec, // chain sample + pub nreads: i64, // number of reads + pub nreads_used_for_assembly: i64, // number of reads used for assembly + pub nreads_umi_corrected: i64, // number of reads whose umi was corrected + pub ncontigs: i64, // number of contigs + pub xucount_sum: i64, // sum over xucounts + pub chain_sample: Vec, // chain sample pub adj_chain_sample: Vec, // adjusted chain_sample (summation done after scaling up based on frac) - pub umi_dist: Vec<(i8, i32, i32)>, // (chain-type,npairs,multiplicity) - pub cs_good: Vec, // for each constant region, count in good + pub umi_dist: SimpleHistogram, // (chain-type,npairs,multiplicity) + pub cs_good: SimpleHistogram, // for each constant region, count in good // contigs pub inner_hit_total: Vec>, pub inner_hit_good_total: Vec>, @@ -232,13 +249,14 @@ impl BarcodeDataSum { pub fn new() -> BarcodeDataSum { BarcodeDataSum { nreads: 0_i64, + nreads_used_for_assembly: 0_i64, nreads_umi_corrected: 0_i64, ncontigs: 0_i64, xucount_sum: 0_i64, chain_sample: vec![0_i64; 15], adj_chain_sample: vec![0_f64; 15], - umi_dist: Vec::<(i8, i32, i32)>::new(), - cs_good: Vec::::new(), + umi_dist: SimpleHistogram::::default(), + cs_good: SimpleHistogram::::default(), inner_hit_total: Vec::>::new(), inner_hit_good_total: Vec::>::new(), outer_hit_total: Vec::>::new(), @@ -247,41 +265,33 @@ impl BarcodeDataSum { outer_hit_good_contigs_total: Vec::::new(), } } - pub fn sum(d: &[BarcodeData], refdata: &RefData) -> BarcodeDataSum { + pub fn sum(barcode_data_list: &[BarcodeData], refdata: &RefData) -> BarcodeDataSum { BarcodeDataSum { - nreads: { - let mut s = 0_i64; - for x in d { - s += x.nreads as i64; - } - s - }, - nreads_umi_corrected: { - let mut s = 0_i64; - for x in d { - s += x.nreads_umi_corrected as i64; - } - s - }, - ncontigs: { - let mut s = 0_i64; - for x in d { - s += x.ncontigs as i64; - } - s - }, - xucount_sum: { - let mut s = 0_i64; - for x in d { - s += x.xucounts.iter().sum::() as i64; - } - s - }, + nreads: barcode_data_list + .iter() + .map(|bc_data| bc_data.nreads as i64) + .sum(), + nreads_used_for_assembly: barcode_data_list + .iter() + .map(|bc_data| bc_data.nreads_used_for_assembly as i64) + .sum(), + nreads_umi_corrected: barcode_data_list + .iter() + .map(|bc_data| bc_data.nreads_umi_corrected as i64) + .sum(), + ncontigs: barcode_data_list + .iter() + .map(|bc_data| bc_data.ncontigs as i64) + .sum(), + xucount_sum: barcode_data_list + .iter() + .map(|bc_data| bc_data.xucounts.iter().sum::() as i64) + .sum(), chain_sample: { let mut s = vec![0_i64; 15]; - for x in d { + for bc_data in barcode_data_list { for i in 0..15 { - s[i] += x.chain_sample[i] as i64; + s[i] += bc_data.chain_sample[i] as i64; } } s @@ -289,10 +299,10 @@ impl BarcodeDataSum { // When summing barcode objects, adjust each chain_sample value based on frac adj_chain_sample: { let mut s = vec![0_f64; 15]; - for x in d { + for bc_data in barcode_data_list { for i in 0..15 { - if x.frac != 0.0 { - s[i] += x.chain_sample[i] as f64 / x.frac; + if bc_data.frac != 0.0 { + s[i] += bc_data.chain_sample[i] as f64 / bc_data.frac; } else { s[i] += 0.0; } @@ -301,44 +311,44 @@ impl BarcodeDataSum { s }, umi_dist: { - let mut t = Vec::<(i32, i8)>::new(); - for x in d { - for i in 0..x.umi_info.len() { - t.push((x.umi_info[i].0, x.umi_info[i].1)); - } - } - t.sort_unstable(); - let mut s = Vec::<(i8, i32, i32)>::new(); - let mut i = 0; - while i < t.len() { - let j = next_diff(&t, i); - s.push((t[i].1, t[i].0, (j - i) as i32)); - i = j; - } - s - }, - cs_good: { - let mut s = vec![0; refdata.cs.len()]; - for x in d { - for y in &x.good_refseqs { - let p = bin_position(&refdata.cs, &(*y as usize)); - if p >= 0 { - s[p as usize] += 1; - } + let mut hist = SimpleHistogram::::default(); + for bc_data in barcode_data_list { + for (npairs, chain_type, _) in &bc_data.umi_info { + hist.observe(&VdjUmi { + chain_type: CHAIN_TYPES[*chain_type as usize].to_owned(), + npairs: npairs.to_owned() as usize, + }); } } - s + + hist }, + cs_good: SimpleHistogram::::from_iter_owned(barcode_data_list.iter().flat_map( + |bc_data| { + bc_data + .good_refseqs + .iter() + // filter out any non constant segment refdata indexes + .filter(|&&refseq_idx| { + refdata + .cs + .iter() + .any(|constant_idx| constant_idx == &(refseq_idx as usize)) + }) + // map refdata index to name + .map(|&refseq_idx| refdata.name[refseq_idx as usize].clone()) + }, + )), inner_hit_total: { // in single-end case, remember to divide by two later, and below - if d.is_empty() { + if barcode_data_list.is_empty() { Vec::>::new() } else { - let mut s = vec![0.0; d[0].inner_hit.len()]; - for x in d { - for i in 0..x.inner_hit.len() { - s[i] += x.inner_hit[i] as f64 * x.nreads as f64 - / x.primer_sample_count as f64; + let mut s = vec![0.0; barcode_data_list[0].inner_hit.len()]; + for bc_data in barcode_data_list { + for i in 0..bc_data.inner_hit.len() { + s[i] += + bc_data.inner_hit[i] as f64 * bc_data.primer_inv_subsample_frac(); } } let mut t = Vec::>::new(); @@ -349,32 +359,32 @@ impl BarcodeDataSum { } }, inner_hit_good_total: { - if d.is_empty() { + if barcode_data_list.is_empty() { Vec::>::new() } else { - let mut s = vec![0.0; d[0].inner_hit_good.len()]; - for x in d { - for i in 0..x.inner_hit_good.len() { - s[i] += x.inner_hit_good[i] as f64 * x.nreads as f64 - / x.primer_sample_count as f64; + let mut sum_vec = vec![0.0; barcode_data_list[0].inner_hit_good.len()]; + for bc_data in barcode_data_list { + for i in 0..bc_data.inner_hit_good.len() { + sum_vec[i] += bc_data.inner_hit_good[i] as f64 + * bc_data.primer_inv_subsample_frac(); } } let mut t = Vec::>::new(); - for i in 0..s.len() { - t.push(NotNan::new(s[i]).unwrap()); + for i in 0..sum_vec.len() { + t.push(NotNan::new(sum_vec[i]).unwrap()); } t } }, outer_hit_total: { - if d.is_empty() { + if barcode_data_list.is_empty() { Vec::>::new() } else { - let mut s = vec![0.0; d[0].outer_hit.len()]; - for x in d { - for i in 0..x.outer_hit.len() { - s[i] += x.outer_hit[i] as f64 * x.nreads as f64 - / x.primer_sample_count as f64; + let mut s = vec![0.0; barcode_data_list[0].outer_hit.len()]; + for bc_data in barcode_data_list { + for i in 0..bc_data.outer_hit.len() { + s[i] += + bc_data.outer_hit[i] as f64 * bc_data.primer_inv_subsample_frac(); } } let mut t = Vec::>::new(); @@ -385,14 +395,14 @@ impl BarcodeDataSum { } }, outer_hit_good_total: { - if d.is_empty() { + if barcode_data_list.is_empty() { Vec::>::new() } else { - let mut s = vec![0.0; d[0].outer_hit_good.len()]; - for x in d { - for i in 0..x.outer_hit_good.len() { - s[i] += x.outer_hit_good[i] as f64 * x.nreads as f64 - / x.primer_sample_count as f64; + let mut s = vec![0.0; barcode_data_list[0].outer_hit_good.len()]; + for bc_data in barcode_data_list { + for i in 0..bc_data.outer_hit_good.len() { + s[i] += bc_data.outer_hit_good[i] as f64 + * bc_data.primer_inv_subsample_frac(); } } let mut t = Vec::>::new(); @@ -403,26 +413,26 @@ impl BarcodeDataSum { } }, inner_hit_good_contigs_total: { - if d.is_empty() { + if barcode_data_list.is_empty() { Vec::::new() } else { - let mut s = vec![0; d[0].inner_hit_good_contigs.len()]; - for x in d { - for i in 0..x.inner_hit_good_contigs.len() { - s[i] += x.inner_hit_good_contigs[i] as usize; + let mut s = vec![0; barcode_data_list[0].inner_hit_good_contigs.len()]; + for bc_data in barcode_data_list { + for i in 0..bc_data.inner_hit_good_contigs.len() { + s[i] += bc_data.inner_hit_good_contigs[i] as usize; } } s } }, outer_hit_good_contigs_total: { - if d.is_empty() { + if barcode_data_list.is_empty() { Vec::::new() } else { - let mut s = vec![0; d[0].outer_hit_good_contigs.len()]; - for x in d { - for i in 0..x.outer_hit_good_contigs.len() { - s[i] += x.outer_hit_good_contigs[i] as usize; + let mut s = vec![0; barcode_data_list[0].outer_hit_good_contigs.len()]; + for bc_data in barcode_data_list { + for i in 0..bc_data.outer_hit_good_contigs.len() { + s[i] += bc_data.outer_hit_good_contigs[i] as usize; } } s @@ -430,175 +440,6 @@ impl BarcodeDataSum { }, } } - pub fn sumsum(d: &[BarcodeDataSum], refdata: &RefData) -> BarcodeDataSum { - BarcodeDataSum { - nreads: { - let mut s = 0_i64; - for x in d { - s += x.nreads; - } - s - }, - nreads_umi_corrected: { - let mut s = 0_i64; - for x in d { - s += x.nreads_umi_corrected; - } - s - }, - ncontigs: { - let mut s = 0_i64; - for x in d { - s += x.ncontigs; - } - s - }, - xucount_sum: { - let mut s = 0_i64; - for x in d { - s += x.xucount_sum; - } - s - }, - chain_sample: { - let mut s = vec![0_i64; 15]; - for x in d { - for i in 0..15 { - s[i] += x.chain_sample[i]; - } - } - s - }, - // When summing barcodesum objects, simply add adjusted chain samples - adj_chain_sample: { - let mut s = vec![0_f64; 15]; - for x in d { - for i in 0..15 { - s[i] += x.adj_chain_sample[i]; - } - } - s - }, - umi_dist: { - let mut t = Vec::<(i8, i32, i32)>::new(); - for x in d { - t.append(&mut x.umi_dist.clone()); - } - t.sort_unstable(); - let mut s = Vec::<(i8, i32, i32)>::new(); - let mut i = 0; - while i < t.len() { - let j = next_diff12_3(&t, i as i32) as usize; - let mut mult = 0; - for k in i..j { - mult += t[k].2; - } - s.push((t[i].0, t[i].1, mult)); - i = j; - } - s - }, - cs_good: { - let mut s = vec![0; refdata.cs.len()]; - for x in d { - for i in 0..s.len() { - s[i] += x.cs_good[i]; - } - } - s - }, - inner_hit_total: { - let mut s = Vec::>::new(); - for x in d { - if !x.inner_hit_total.is_empty() { - if s.is_empty() { - s = x.inner_hit_total.clone(); - } else { - for i in 0..x.inner_hit_total.len() { - s[i] += x.inner_hit_total[i]; - } - } - } - } - s - }, - inner_hit_good_total: { - let mut s = Vec::>::new(); - for x in d { - if !x.inner_hit_good_total.is_empty() { - if s.is_empty() { - s = x.inner_hit_good_total.clone(); - } else { - for i in 0..x.inner_hit_good_total.len() { - s[i] += x.inner_hit_good_total[i]; - } - } - } - } - s - }, - outer_hit_total: { - let mut s = Vec::>::new(); - for x in d { - if !x.outer_hit_total.is_empty() { - if s.is_empty() { - s = x.outer_hit_total.clone(); - } else { - for i in 0..x.outer_hit_total.len() { - s[i] += x.outer_hit_total[i]; - } - } - } - } - s - }, - outer_hit_good_total: { - let mut s = Vec::>::new(); - for x in d { - if !x.outer_hit_good_total.is_empty() { - if s.is_empty() { - s = x.outer_hit_good_total.clone(); - } else { - for i in 0..x.outer_hit_good_total.len() { - s[i] += x.outer_hit_good_total[i]; - } - } - } - } - s - }, - inner_hit_good_contigs_total: { - let mut s = Vec::::new(); - for x in d { - if !x.inner_hit_good_contigs_total.is_empty() { - if s.is_empty() { - s = x.inner_hit_good_contigs_total.clone(); - } else { - for i in 0..x.inner_hit_good_contigs_total.len() { - s[i] += x.inner_hit_good_contigs_total[i]; - } - } - } - } - s - }, - outer_hit_good_contigs_total: { - let mut s = Vec::::new(); - for x in d { - if !x.outer_hit_good_contigs_total.is_empty() { - if s.is_empty() { - s = x.outer_hit_good_contigs_total.clone(); - } else { - for i in 0..x.outer_hit_good_contigs_total.len() { - s[i] += x.outer_hit_good_contigs_total[i]; - } - } - } - } - s - }, - } - } } impl Default for BarcodeDataSum { @@ -611,10 +452,6 @@ impl Default for BarcodeDataSum { // COMPUTE METRICS YIELDING JSON STRING // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ -fn write_json_metric_str(metric_name: &str, value: &str, json: &mut Vec) { - fwriteln!(json, " \"{}\": \"{}\",", metric_name, value); -} - pub fn write_json_metric_f64(metric_name: &str, value: f64, json: &mut Vec) { if value.is_nan() { fwriteln!(json, " \"{}\": null,", metric_name); @@ -623,85 +460,52 @@ pub fn write_json_metric_f64(metric_name: &str, value: f64, json: &mut Vec) } } -pub fn write_json_metric_ratio(metric_name: &str, num: usize, den: usize, json: &mut Vec) { - let metric = if den != 0 { - num as f64 / den as f64 - } else { - 0.0 - }; - fwriteln!(json, " \"{}\": {},", metric_name, metric); -} - #[allow(clippy::too_many_arguments)] pub fn metrics_json( - dir: &str, - is_tcr: bool, - d: &[BarcodeDataSum], - json: &mut Vec, + x: &BarcodeDataSum, single_end: bool, refdata: &RefData, inner_primers: &[Vec], outer_primers: &[Vec], - npairs: usize, + npairs: Option, report: &mut BufWriter, - is_gd: Option, -) { - // Get number of reads. - - let mut nreads = npairs; - if !single_end { - nreads *= 2; - } - - // Sum. - - let x = BarcodeDataSum::sumsum(d, refdata); - - // Add opening bracket. - - json.append(&mut b"{\n".to_vec()); +) -> JsonReporter { + let mut json = JsonReporter::default(); // Analyze primer hits. - let mut log = Vec::::new(); analyze_primer_hits( - &x, + x, refdata, inner_primers, outer_primers, single_end, - json, + &mut json, &mut log, ); // Write metrics productive_contigs_with_x, where x is a constant region name. - - let mut cnames = Vec::::new(); - for i in 0..refdata.cs.len() { - let j = refdata.cs[i]; - cnames.push(refdata.name[j].clone()); - } - unique_sort(&mut cnames); - let mut cc = vec![0_i64; cnames.len()]; - for i in 0..x.cs_good.len() { - let j = refdata.cs[i]; - let p = bin_position(&cnames, &refdata.name[j]); - cc[p as usize] += x.cs_good[i] as i64; - } - for i in 0..cc.len() { - let metric_name = format!("productive_contigs_with_{}", cnames[i]); - fwriteln!(json, " \"{}\": {},", metric_name, cc[i]); + // do this for all ref constant segment names i.e add a "0" count metric for any not observed + for name in refdata + .cs + .iter() + .map(|&const_seg_idx| refdata.name[const_seg_idx].clone()) + .unique() + { + json.insert( + format!("productive_contigs_with_{}", &name), + x.cs_good.get(&name), + ); } // Compute "vdj_corrected_umi_frac", which is the fraction of reads whose UMI // was corrected. - write_json_metric_ratio( - "vdj_corrected_umi_frac", - x.nreads_umi_corrected as usize, - nreads, - json, - ); + let corrected_umi_frac = + PercentMetric::from_parts(x.nreads_umi_corrected, x.nreads_used_for_assembly) + .fraction() + .unwrap_or(0.0); + json.insert("vdj_corrected_umi_frac", corrected_umi_frac); // Generate {IGH,IGK,IGL,TRA,TRB,TRD,TRG,multi} // _vdj_recombinome_readpairs_per_umi_distribution metrics. Note that we put @@ -710,58 +514,32 @@ pub fn metrics_json( let mut chains = CHAIN_TYPES.to_vec(); chains.push("multi"); - let mut all = Vec::<(i32, i32)>::new(); - - let mut ud = Vec::<(i32, i32)>::new(); - for i in 0..x.umi_dist.len() { - if x.umi_dist[i].0 != 1 { - ud.push((x.umi_dist[i].1, x.umi_dist[i].2)); + let mut umi_dist = x.umi_dist.clone(); + for (vdj_umi, value) in x.umi_dist.distribution() { + if &vdj_umi.chain_type != "None" { + umi_dist.observe_by_owned( + VdjUmi { + chain_type: "multi".to_owned(), + npairs: vdj_umi.npairs, + }, + value.count(), + ); } } - ud.sort_unstable(); - let mut i = 0; - while i < ud.len() { - let j = next_diff1_2(&ud, i as i32) as usize; - let mut s = 0; - for k in i..j { - s += ud[k].1; - } - all.push((ud[i].0, s)); - i = j; - } - for c in 0..8 { - if c == 1 { + for chain in chains { + if chain == "None" { continue; } - fwriteln!( - json, - " \"{}_vdj_recombinome_readpairs_per_umi_distribution\": {{\n", - chains[c] - ); - for i in 0..x.umi_dist.len() { - if x.umi_dist[i].0 != c as i8 { - continue; - } - fwrite!(json, " \"{}\": {}", x.umi_dist[i].1, x.umi_dist[i].2); - if i < x.umi_dist.len() - 1 && x.umi_dist[i].0 == x.umi_dist[i + 1].0 { - fwrite!(json, ","); + + let metric_key = format!("{chain}_vdj_recombinome_readpairs_per_umi_distribution"); + let mut metric_val = TxHashMap::::default(); + for (vdj_umi, value) in umi_dist.distribution() { + if vdj_umi.chain_type == chain { + metric_val.insert(vdj_umi.npairs, value.count().try_into().unwrap()); } - fwriteln!(json, ""); - } - fwriteln!(json, "}},"); - } - fwriteln!( - json, - " \"multi_vdj_recombinome_readpairs_per_umi_distribution\": {{\n" - ); - for i in 0..all.len() { - fwrite!(json, " \"{}\": {}", all[i].0, all[i].1); - if i < all.len() - 1 { - fwrite!(json, ","); } - fwriteln!(json, ""); + json.insert(metric_key, serde_json::to_value(metric_val).unwrap()); } - fwriteln!(json, "}},"); // Generate {IGH,IGK,IGL,TRA,TRB,TRD,TRG,multi} // _vdj_recombinome_antisense_reads_frac metrics. @@ -769,20 +547,19 @@ pub fn metrics_json( let (mut chain_total_fw, mut chain_total_rc) = (0, 0); for i in 0..CHAIN_TYPESX.len() { let (fw, rc) = (x.chain_sample[i] as usize, x.chain_sample[i + 7] as usize); - write_json_metric_ratio( - &format!("{}_vdj_recombinome_antisense_reads_frac", CHAIN_TYPESX[i]), - rc, - fw + rc, - json, - ); + let metric_key = format!("{}_vdj_recombinome_antisense_reads_frac", CHAIN_TYPESX[i]); + let metric_val = PercentMetric::from_parts(rc as i64, (fw + rc).try_into().unwrap()); + json.insert(metric_key, metric_val.fraction()); chain_total_fw += fw; chain_total_rc += rc; } - write_json_metric_ratio( + let multi_recombinome_antisense_total = PercentMetric::from_parts( + chain_total_rc as i64, + (chain_total_fw + chain_total_rc).try_into().unwrap(), + ); + json.insert( "multi_vdj_recombinome_antisense_reads_frac", - chain_total_rc, - chain_total_fw + chain_total_rc, - json, + &multi_recombinome_antisense_total, ); // Generate {IGH,IGK,IGL,TRA,TRB,TRD,TRG,multi} @@ -791,565 +568,34 @@ pub fn metrics_json( // Using adjusted chain_sample to account for capping number of reads used in assembly let adj_chain_total = x.adj_chain_sample.iter().sum::(); for i in 0..CHAIN_TYPESX.len() { - write_json_metric_ratio( - &format!("{}_vdj_recombinome_mapped_reads_frac", CHAIN_TYPESX[i]), - (x.adj_chain_sample[i] + x.adj_chain_sample[i + 7]) as usize, - adj_chain_total as usize, - json, + let metric_key = format!("{}_vdj_recombinome_mapped_reads_frac", CHAIN_TYPESX[i]); + let metric_val = PercentMetric::from_parts( + (x.adj_chain_sample[i] + x.adj_chain_sample[i + 7]) as i64, + adj_chain_total as i64, ); + json.insert(metric_key, &metric_val); } - write_json_metric_ratio( + let recombinome_mapped_reads = PercentMetric::from_parts( + (adj_chain_total - x.adj_chain_sample[14]) as i64, + adj_chain_total as i64, + ); + json.insert( "multi_vdj_recombinome_mapped_reads_frac", - (adj_chain_total - x.adj_chain_sample[14]) as usize, - adj_chain_total as usize, - json, + &recombinome_mapped_reads, ); // Compute vdj_sequencing_efficiency. For this, define the number of // assemblable read pairs to be the total number of read pairs appearing in // xucounts. Then divide by the total number of read pairs. + let sequencing_efficiency = if let Some(npairs) = npairs { + PercentMetric::from_parts(x.xucount_sum, npairs).fraction() + } else { + None + }; + json.insert("vdj_sequencing_efficiency", sequencing_efficiency); - write_json_metric_ratio( - "vdj_sequencing_efficiency", - x.xucount_sum as usize, - npairs, - json, - ); - - // Add error rate metrics. - - if is_tcr { - let o = [dir].to_vec(); - analyze_vs( - o, "unknown", refdata, true, false, false, false, true, true, json, &mut log, is_gd, - ); - } fwrite!(report, "{}", strme(&log)); - - // Remove trailing comma. Add closing bracket. - - let n = json.len(); - json.truncate(n - 2); - json.extend(b"\n}\n"); -} - -// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ -// ANALYZE BRIEF BARCODE DATA -// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - -// Identify productive pairs that should be untrusted based on their relationship -// to large clones. - -pub fn analyze_barcode_data_brief( - d: &[BarcodeCellInfo], - FilterSwitch { - asm_shared_contig, .. - }: FilterSwitch, - kills: &mut Vec, - killsc: &mut Vec, - mut filter_logger: Option<&mut FilterLogger>, -) { - println!("\nUNTRUSTED CONTIGS"); - - chimeric_filters(d, kills, &mut filter_logger); - - if asm_shared_contig { - junction_filters(d, killsc, kills, &mut filter_logger); - common_clone_filters(d, killsc, kills, &mut filter_logger); - } - - unique_sort(kills); - unique_sort(killsc); - println!(); -} - -fn junction_filters( - d: &[BarcodeCellInfo], - killsc: &mut Vec, - kills: &mut Vec, - filter_logger: &mut Option<&mut FilterLogger>, -) { - // Kill contigs that appear to arise from some sort of leakage from plasma cells. We identify - // these by seeing UMI counts that are much smaller than a dominant UMI count, and for which - // the median UMI count is very small. One reason we think this filtering is correct is that - // we observed large clusters arising in a library, and completely absent from a parallel - // library made from the same cell lot. (And this happened multiple times.) Note that - // extreme differences in UMI count appear to be biologically possible (and we observe such), - // so that alone is not characteristic. Note that there is no mechanism here to address the - // case of fake plasma clonal expansions arising where *only* background is present. - // - // This is a messy problem as we have diverse and relatively limited data. - // - // Cases that are fixed now (all GEM-55): - // fake expansion good from same cell lot fake clone - // 124960_100_per 124952_100_per IGH:CAREYPTSYGSGTYYVSPAPFDSW;IGK:CQRYTMSPFISF - // 124552_100_per 124548_100_per IGH:CAKSGAGEIGEYYFGYW;IGL:CQVWDSTSDHRWVF - // 124553_100_per 124549_100_per. - // - // Cases that appear not to be fixable because UMI counts are too similar (all GEM-U, CR 3.0): - // fake expansion good from same cell lot fake clone - // 79209 79210 IGH:CAKHDYSNPQW;IGK:CFQGSHVPFTF - // 86356 86355 IGH:CVRVVEGTSAYDIW;IGL:CTSYTSSSTYVF - // 86228 86227. IGH:CARQSDTGYFEFW;IGL:CQVWDSSTDHPIF - // - // Other cases that might hypothetically be fixable: - // fake expansion good from same cell lot fake clone - // 74447 74446 - // 79211 79212 IGH:CARWGGSSNDYW;IGK:CQQHYSTPYTF - // - // Negative control (case where damage might be done by this algorithm): - // 77225. Compare replicate 77226; - // also matched PBMC 77223,77224 and matched splenocytes 77221,77222. - let mut all = Vec::<([u8; 20], u16, bool, usize, usize)>::new(); - for i in 0..d.len() { - for (j, jundata) in d[i].jundata.iter().enumerate() { - // (junction segment of contig, #umis, confident, index) - all.push((jundata.jxn_seq, jundata.umis, jundata.high_confidence, i, j)); - } - } - all.sort_unstable(); - let mut i = 0; - const MIN_RATIO_UMI: usize = 40; - const MAX_MEDIAN: u16 = 1; - const MIN_CLUSTER: usize = 10; - // was 20 in experiment - while i < all.len() { - let j = next_diff1_5(&all, i as i32) as usize; - - // Now i..j is a group of entries in all, each with the same junction segment. - - let median = i + (j - i) / 2; - if j - i >= MIN_CLUSTER && all[median].1 <= MAX_MEDIAN { - let mut alts = Vec::<[u8; 20]>::new(); - for k in i..j { - let u = all[k].3; - for l in 0..d[u].jundata.len() { - if d[u].jundata[l].jxn_seq != all[i].0 { - alts.push(d[u].jundata[l].jxn_seq); - } - } - } - alts.sort_unstable(); - let mut max_alt = 0; - let mut r = 0; - let mut alt_counts = Vec::::new(); - while r < alts.len() { - let s = next_diff(&alts, r); - max_alt = max(max_alt, s - r); - alt_counts.push(s - r); - r = s; - } - reverse_sort(&mut alt_counts); - //if - /* max_alt >= MIN_CLUSTER */ - //0 == 0 - { - for k in i..j { - if all[j - 1].1 as usize >= MIN_RATIO_UMI * max(1, all[k].1 as usize) { - let m = all[k].3; - let x = &d[m]; - for j in 0..x.jundata.len() { - if x.jundata[j].high_confidence { - println!( - "{}: contig {} = possible plasma cell leakage", - x.barcode, - j + 1 - ); - } - killsc.push(format!("{}_contig_{}", x.barcode, j + 1)); - } - println!("{} = possible plasma cell leakage", x.barcode); - println!("alt counts = {}", alt_counts.iter().format(",")); - kills.push(x.barcode.clone()); - if let Some(ref mut logger) = filter_logger { - logger.log(&FilterLogEntry::cell_calling( - x.barcode.clone(), - AsmCellFilter::NonDominantJunction { - contig: format!("{}_contig_{}", x.barcode, all[k].4 + 1), - junction_umis: all[k].1 as usize, - param_min_umi_ratio: MIN_RATIO_UMI, - dominant_contig: format!( - "{}_contig_{}", - d[all[j - 1].3].barcode, - all[j - 1].4 + 1 - ), - dominant_junction_umis: all[j - 1].1 as usize, - cluster_size: j - i, - param_min_cluster_size: MIN_CLUSTER, - cluster_median_junction_umis: all[median].1, - param_max_median_junction_umis: MAX_MEDIAN, - }, - )); - } - } - } - } - } - i = j; - } - // Address a different version of plasma cell leakage. In this case, we observe a junction - // segment having a very high UMI count in one cell, we observe a very low count in another - // cell, these two cells share only one chain (allowing for some mutation), and the "weak" - // cell has at least three chains. - const ALLOWED_DIFFS: i32 = 10; - let mut i = 0; - while i < all.len() { - let j = next_diff1_5(&all, i as i32) as usize; - for k1 in i..j { - let i1 = all[k1].3; - if all[k1].2 && all[k1].1 >= MIN_RATIO_UMI as u16 && d[i1].jundata.len() >= 2 { - 'couter: for k2 in i..j { - let i2 = all[k2].3; - if all[k2].2 && all[k2].1 == 1 && d[i2].jundata.len() >= 3 { - let mut commons = 0; - for c1 in 0..d[i1].jundata.len() { - for c2 in 0..d[i2].jundata.len() { - let y1 = &&d[i1].jundata[c1].jxn_seq; // first junction segment - let y2 = &d[i2].jundata[c2].jxn_seq; // second junction segment - if y1 == &y2 { - commons += 1; - } else { - let (mut u1, mut u2) = ([0_u8; 80], [0_u8; 80]); - unpack_bases_80(y1, &mut u1); - unpack_bases_80(y2, &mut u2); - // Should have an ndiffs trait and use it here on u1 and u2, - // same as for DnaStrings. Although, interestingly, the - // structures y1 and y2 are close to DnaStrings and could - // be compared more efficiently as we do for DnaStrings. - let mut dist = 0; - for l in 0..80 { - if u1[l] != u2[l] { - dist += 1; - } - } - if dist <= ALLOWED_DIFFS { - commons += 1; - } - } - if commons > 1 { - continue 'couter; - } - } - } - let x = &d[i2]; - println!("{} = possible type two plasma cell leakage", x.barcode); - kills.push(x.barcode.clone()); - if let Some(ref mut logger) = filter_logger { - logger.log(&FilterLogEntry::cell_calling( - x.barcode.clone(), - AsmCellFilter::WeakJunction { - contig: format!("{}_contig_{}", x.barcode, all[k2].4 + 1), - param_min_dominant_umis: MIN_RATIO_UMI, - dominant_contig: format!( - "{}_contig_{}", - d[all[k1].3].barcode, - all[k1].4 + 1 - ), - dominant_junction_umis: all[k1].1 as usize, - }, - )); - } - } - } - } - } - i = j; - } -} - -fn chimeric_filters( - d: &[BarcodeCellInfo], - kills: &mut Vec, - filter_logger: &mut Option<&mut FilterLogger>, -) { - // Look for chimeric contigs. For a given cdr3_nt, consider the V segments that appear in - // contigs. If one has collective support at least 100 times greater than another, then - // untrust the weaker contigs. - const CHIM_RATIO: usize = 100; - let mut all_chimdata = d - .iter() - .flat_map(|bc| bc.chimdata.clone()) - .collect::>(); - all_chimdata.sort(); - let mut i = 0; - while i < all_chimdata.len() { - let mut j = i + 1; - let j = loop { - if j == all_chimdata.len() || all_chimdata[j].cdr3 != all_chimdata[i].cdr3 { - break j; - } - j += 1; - }; - let mut vu = Vec::<(usize, usize)>::new(); - for k in i..j { - vu.push((all_chimdata[k].v_ref_id, all_chimdata[k].umi_count)); - } - let mut uv = Vec::<(usize, usize)>::new(); - let mut r = 0; - while r < vu.len() { - let s = next_diff1_2(&vu, r as i32) as usize; - let mut numi = 0; - for m in r..s { - numi += vu[m].1; - } - uv.push((numi, vu[r].0)); - r = s; - } - reverse_sort(&mut uv); - let mut bads = Vec::::new(); - for m in 1..uv.len() { - if uv[0].0 >= 1 && uv[0].0 >= CHIM_RATIO * uv[m].0 { - bads.push(uv[m].1); - } - } - bads.sort_unstable(); - - for k in i..j { - if all_chimdata[k].productive { - let t = all_chimdata[k].v_ref_id; - if bin_member(&bads, &t) { - kills.push(all_chimdata[k].barcode.clone()); - println!("{} = possible chimera", all_chimdata[k].barcode); - if let Some(ref mut logger) = filter_logger { - logger.log(&FilterLogEntry::cell_calling( - all_chimdata[k].barcode.clone(), - AsmCellFilter::ChimericContig { - cdr3_nt: DnaString::from_bytes(&all_chimdata[i].cdr3).to_string(), - param_chimera_ratio: CHIM_RATIO, - contig_v_region_id: t, - dominant_v_region_id: uv[0].1, - dominant_v_region_umis: uv[0].0, - }, - )); - } - } - } - } - i = j; - } -} - -fn common_clone_filters( - d: &[BarcodeCellInfo], - killsc: &mut Vec, - kills: &mut Vec, - filter_logger: &mut Option<&mut FilterLogger>, -) { - // Find two-chain productive pairs and their frequency. - let mut pairs = Vec::<([u8; 20], [u8; 20])>::new(); - for i in 0..d.len() { - if d[i].jundata.len() != 2 || !(d[i].paired && d[i].now_a_cell) { - continue; - } - if d[i].jundata[0].jxn_seq <= d[i].jundata[1].jxn_seq { - pairs.push((d[i].jundata[0].jxn_seq, d[i].jundata[1].jxn_seq)); - } else { - pairs.push((d[i].jundata[1].jxn_seq, d[i].jundata[0].jxn_seq)); - } - } - pairs.sort_unstable(); - let mut pairsu = Vec::<([u8; 20], [u8; 20])>::new(); - let mut pairsf = Vec::::new(); - let mut j = 0; - while j < pairs.len() { - let mut k = j + 1; - loop { - if k == pairs.len() || pairs[k] != pairs[j] { - break; - } - k += 1; - } - pairsu.push((pairs[j].0, pairs[j].1)); - pairsf.push((k - j) as i32); - j = k; - } - // Find transcripts that appear in these two-chain productive pairs, and the max - // frequency that was observed for each. Also track the partner. - let mut u = Vec::<([u8; 20], i32, [u8; 20])>::new(); - for i in 0..pairsu.len() { - u.push((pairsu[i].0, pairsf[i], pairsu[i].1)); - u.push((pairsu[i].1, pairsf[i], pairsu[i].0)); - } - u.sort_unstable(); - let mut to_delete = vec![false; u.len()]; - let mut i = 0; - while i < u.len() { - let mut j = i + 1; - while j < u.len() { - if u[j].0 != u[i].0 { - break; - } - j += 1; - } - for k in i..j - 1 { - to_delete[k] = true; - } - i = j; - } - erase_if(&mut u, &to_delete); - // Make list of the junction segments for the case where there are two or more - // confident contigs. - let mut bigs = Vec::>::new(); - for i in 0..d.len() { - let x = &d[i]; - let mut jundata = x.jundata.clone(); - let mut to_delete = vec![false; jundata.len()]; - for i in 0..jundata.len() { - if !jundata[i].high_confidence { - to_delete[i] = true; - } - } - erase_if(&mut jundata, &to_delete); - if jundata.len() >= 2 { - let mut big = Vec::<[u8; 20]>::new(); - for i in 0..jundata.len() { - big.push(jundata[i].jxn_seq); - } - big.sort_unstable(); - bigs.push(big); - } - } - bigs.sort(); - // Identify contigs that should now be labeled low confidence. - const MAX_KILL: i32 = 3; - const MIN_RATIO: i32 = 10; - const MIN_RATIO_BIG: i32 = 50; - const ALLOWED_DIFFS: i32 = 10; - for i in 0..d.len() { - // Remove the low-confidence contigs. Ignore after that if only one contig is left. - - let x = &d[i]; - let mut jundata = x.jundata.clone(); - let mut to_delete = vec![false; jundata.len()]; - for i in 0..jundata.len() { - if !jundata[i].high_confidence { - to_delete[i] = true; - } - } - erase_if(&mut jundata, &to_delete); - if jundata.len() <= 1 { - continue; - } - - // Anything seen rarely and involving a very common clone is deemed - // dubious, probably a doublet. - - if jundata.len() >= 2 { - let mut big = Vec::<[u8; 20]>::new(); - for i in 0..jundata.len() { - big.push(jundata[i].jxn_seq); - } - big.sort_unstable(); - let low = lower_bound(&bigs, &big); - let high = upper_bound(&bigs, &big); - let mut max_freq = 0_i32; - let mut best_l = -1_i32; - let mut best_j = -1_i32; - for j in 0..jundata.len() { - let l = bin_position1_3(&u, &jundata[j].jxn_seq); - if l >= 0 && u[l as usize].1 > max_freq { - max_freq = u[l as usize].1; - best_l = l; - best_j = j as i32; - } - } - let mult = (high - low) as i32; - if mult <= MAX_KILL && max_freq >= MIN_RATIO_BIG * mult { - // - // Try to avoid being tricked by somatic hypermutation. - - let mut protected = false; - if jundata.len() == 2 { - let p1 = &&jundata[(1 - best_j) as usize].jxn_seq; - let p2 = &u[best_l as usize].2; - let (mut u1, mut u2) = ([0_u8; 80], [0_u8; 80]); - unpack_bases_80(p1, &mut u1); - unpack_bases_80(p2, &mut u2); - let mut dist = 0; - for l in 0..80 { - if u1[l] != u2[l] { - dist += 1; - } - } - if dist <= ALLOWED_DIFFS { - protected = true; - } - } - if !protected { - for j in 0..x.jundata.len() { - if x.jundata[j].high_confidence { - println!("{}: contig {}", x.barcode, j + 1); - } - killsc.push(format!("{}_contig_{}", x.barcode, j + 1)); - } - kills.push(x.barcode.clone()); - println!("{}", x.barcode); - if let Some(ref mut logger) = *filter_logger { - logger.log(&FilterLogEntry::cell_calling( - x.barcode.clone(), - AsmCellFilter::CommonCloneShadow { - multiplicity: mult as usize, - max_multiplicity: max_freq as usize, - param_max_kill: MAX_KILL as usize, - param_min_ratio_big: MIN_RATIO_BIG as usize, - }, - )); - } - continue; - } - } - } - - // Now assume just two contigs. - - if jundata.len() != 2 { - continue; - } - let min_umis = min(jundata[0].umis, jundata[1].umis); - let p = if jundata[0].jxn_seq <= jundata[1].jxn_seq { - (jundata[0].jxn_seq, jundata[1].jxn_seq) - } else { - (jundata[1].jxn_seq, jundata[0].jxn_seq) - }; - let l = bin_position(&pairsu, &p); - let freq = if l >= 0 { pairsf[l as usize] } else { 0_i32 }; - if freq > MAX_KILL { - continue; - } - let (mut max_alt_freq, mut min_alt_freq) = (0_i32, 1000000000_i32); - for j in 0..2 { - let l = bin_position1_3(&u, &jundata[j].jxn_seq); - if l >= 0 { - max_alt_freq = max(max_alt_freq, u[l as usize].1); - min_alt_freq = min(min_alt_freq, u[l as usize].1); - } - } - - // The model here is that a single stray UMI from a common clone - // floats into a GEM. - - if max_alt_freq >= MIN_RATIO * max(1, freq) && min_umis == 1 { - for j in 0..x.jundata.len() { - if x.jundata[j].umis <= 1 && x.jundata[j].high_confidence { - println!("{}: contig {}", x.barcode, j + 1); - killsc.push(format!("{}_contig_{}", x.barcode, j + 1)); - } - } - kills.push(x.barcode.clone()); - if let Some(ref mut logger) = filter_logger { - logger.log(&FilterLogEntry::cell_calling( - x.barcode.clone(), - AsmCellFilter::CommonCloneShadowSingleUmi { - multiplicity: freq as usize, - max_multiplicity: max_alt_freq as usize, - param_max_kill: MAX_KILL as usize, - param_min_ratio_big: MIN_RATIO_BIG as usize, - }, - )); - } - println!("{}", x.barcode); - } - } + json } // ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ @@ -1464,7 +710,7 @@ pub fn analyze_barcode_data( // Analyze primer hits. - let mut json = Vec::::new(); + let mut json = JsonReporter::default(); let mut log = Vec::::new(); analyze_primer_hits( &dsum, @@ -1488,64 +734,70 @@ fn analyze_primer_hits( inner_primers: &[Vec], outer_primers: &[Vec], single_end: bool, - json: &mut Vec, + json: &mut JsonReporter, log: &mut Vec, ) { + let all_pairs = match single_end { + true => dsum.nreads as f64, + false => PercentMetric::from_parts(dsum.nreads, 2) + .fraction() + .unwrap_or(0.0), + }; + if all_pairs == 0.0 { + return; + } // Analyze primer hits. The math here is tricky because when we sample, we don't get a true // random sample, and so we have to normalize. // ◼ Ugly inner/outer code duplication. - // ◼ The naming here for good is very confusing. - let mut inner_hit_total = vec![0 as f64; inner_primers.len()]; - let mut inner_hit_good_total = vec![0 as f64; inner_primers.len()]; - let mut outer_hit_total = vec![0 as f64; outer_primers.len()]; - let mut outer_hit_good_total = vec![0 as f64; outer_primers.len()]; - let mut all_pairs = dsum.nreads as f64; - if !single_end { - all_pairs /= 2.0; - } - let inner_hit_good_contigs = &dsum.inner_hit_good_contigs_total; - let outer_hit_good_contigs = &dsum.outer_hit_good_contigs_total; - inner_hit_total.clear(); - for i in 0..dsum.inner_hit_total.len() { - inner_hit_total.push(dsum.inner_hit_total[i].to_f64().unwrap()); - } - inner_hit_good_total.clear(); - for i in 0..dsum.inner_hit_good_total.len() { - inner_hit_good_total.push(dsum.inner_hit_good_total[i].to_f64().unwrap()); - } - outer_hit_total.clear(); - for i in 0..dsum.outer_hit_total.len() { - outer_hit_total.push(dsum.outer_hit_total[i].to_f64().unwrap()); - } - outer_hit_good_total.clear(); - for i in 0..dsum.outer_hit_good_total.len() { - outer_hit_good_total.push(dsum.outer_hit_good_total[i].to_f64().unwrap()); - } + let mut inner_hit_total: Vec = dsum + .inner_hit_total + .iter() + .map(|n| n.into_inner()) + .collect(); + let mut inner_hit_good_total: Vec = dsum + .inner_hit_good_total + .iter() + .map(|n| n.into_inner()) + .collect(); + let mut outer_hit_total: Vec = dsum + .outer_hit_total + .iter() + .map(|n| n.into_inner()) + .collect(); + let mut outer_hit_good_total: Vec = dsum + .outer_hit_good_total + .iter() + .map(|n| n.into_inner()) + .collect(); + if !single_end { inner_hit_total.iter_mut().for_each(|x| *x /= 2.0); inner_hit_good_total.iter_mut().for_each(|x| *x /= 2.0); outer_hit_total.iter_mut().for_each(|x| *x /= 2.0); outer_hit_good_total.iter_mut().for_each(|x| *x /= 2.0); } + + let inner_offtarget_rate: Vec = inner_hit_good_total + .iter() + .zip(inner_hit_total.iter()) + .map(|(n, d)| if d > &0.0 { 1.0 - (n / d) } else { *d }) + .collect(); + let outer_offtarget_rate: Vec = outer_hit_good_total + .iter() + .zip(outer_hit_total.iter()) + .map(|(n, d)| if d > &0.0 { 1.0 - (n / d) } else { *d }) + .collect(); + let primed_pairs = inner_hit_total.iter().sum::() + outer_hit_total.iter().sum::(); - for i in 0..inner_hit_total.len() { - if inner_hit_total[i] > 0.0 { - inner_hit_good_total[i] /= inner_hit_total[i]; - inner_hit_good_total[i] = 1.0 - inner_hit_good_total[i]; - } - inner_hit_total[i] /= all_pairs; - } - for i in 0..outer_hit_total.len() { - if outer_hit_total[i] > 0.0 { - outer_hit_good_total[i] /= outer_hit_total[i]; - outer_hit_good_total[i] = 1.0 - outer_hit_good_total[i]; - } - outer_hit_total[i] /= all_pairs; - } - let total_primed = inner_hit_total.iter().sum::() + outer_hit_total.iter().sum::(); - inner_hit_total.iter_mut().for_each(|x| *x /= total_primed); - outer_hit_total.iter_mut().for_each(|x| *x /= total_primed); + let inner_hit_primer_frac: Vec = + inner_hit_total.iter().map(|i| i / primed_pairs).collect(); + let outer_hit_primer_frac: Vec = + outer_hit_total.iter().map(|i| i / primed_pairs).collect(); + + let inner_hit_good_contigs = &dsum.inner_hit_good_contigs_total; + let outer_hit_good_contigs = &dsum.outer_hit_good_contigs_total; + let mut locs_all = Vec::>::new(); for i in 0..inner_primers.len() { let mut p = inner_primers[i].clone(); @@ -1564,13 +816,18 @@ fn analyze_primer_hits( } locs_all.push(locs); } - let mut total_off = 0.0; - for i in 0..inner_primers.len() { - total_off += inner_hit_total[i] * inner_hit_good_total[i]; - } - for i in 0..outer_primers.len() { - total_off += outer_hit_total[i] * outer_hit_good_total[i]; - } + let total_offtarget_frac = inner_hit_primer_frac + .iter() + .zip(inner_offtarget_rate.iter()) + .map(|(t, o)| t * o) + .sum::() + + outer_hit_primer_frac + .iter() + .zip(outer_offtarget_rate.iter()) + .map(|(t, o)| t * o) + .sum::(); + let total_primer_frac: f64 = primed_pairs / all_pairs; + fwriteln!( log, "\n▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓" @@ -1581,25 +838,20 @@ fn analyze_primer_hits( "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n" ); fwriteln!(log, "OVERALL PRIMER STATS"); - write_json_metric_f64( - "frac_of_read_pairs_containing_a_primer", - primed_pairs / all_pairs, - json, - ); + json.insert("frac_of_read_pairs_containing_a_primer", total_primer_frac); fwriteln!( log, "fraction of read pairs containing primer = {:.1}%", - 100.0 * primed_pairs / all_pairs + 100.0 * total_primer_frac, ); - write_json_metric_f64( + json.insert( "frac_of_priming_events_that_are_off_target", - total_off, - json, + total_offtarget_frac, ); fwriteln!( log, "fraction of priming events that are off target = {:.1}%", - 100.0 * total_off + 100.0 * total_offtarget_frac, ); let mut rows = Vec::>::new(); fwriteln!( @@ -1644,32 +896,32 @@ fn analyze_primer_hits( row.push(format!("{}", i + 1)); row.push(format!("{}", inner_primers[i].len())); let metric = format!("inner_primer_{}", i + 1); - write_json_metric_str(&metric, strme(&inner_primers[i]), json); + json.insert(metric, strme(&inner_primers[i])); let locs = format!("{}", locs_all[i].iter().format("+")); row.push(locs.clone()); let metric = format!("binding_sites_of_inner_primer_{}", i + 1); - write_json_metric_str(&metric, &locs, json); + json.insert(metric, locs); row.push(format!("{}", inner_hit_good_contigs[i])); let metric = format!("productive_contigs_containing_inner_primer_{}", i + 1); - write_json_metric_f64(&metric, inner_hit_good_contigs[i] as f64, json); - row.push(format!("{:.1}%", 100.0 * inner_hit_total[i])); + json.insert(metric, inner_hit_good_contigs[i]); + row.push(format!("{:.1}%", 100.0 * inner_hit_primer_frac[i])); let metric = format!("frac_of_priming_events_from_inner_primer_{}", i + 1); - write_json_metric_f64(&metric, inner_hit_total[i], json); - row.push(format!("{:.1}%", 100.0 * inner_hit_good_total[i])); + json.insert(metric, inner_hit_primer_frac[i]); + row.push(format!("{:.1}%", 100.0 * inner_offtarget_rate[i])); let metric = format!( "frac_of_priming_events_from_inner_primer_{}_that_are_off_target", i + 1 ); - write_json_metric_f64(&metric, inner_hit_good_total[i], json); + json.insert(metric, inner_offtarget_rate[i]); row.push(format!( "{:.1}%", - 100.0 * inner_hit_total[i] * inner_hit_good_total[i] + 100.0 * inner_hit_primer_frac[i] * inner_offtarget_rate[i] )); let metric = format!( "frac_of_priming_events_that_inner_primer_{}_makes_off_target", i + 1 ); - write_json_metric_f64(&metric, inner_hit_total[i] * inner_hit_good_total[i], json); + json.insert(metric, inner_hit_primer_frac[i] * inner_offtarget_rate[i]); rows.push(row); } print_tabular(log, &rows, 2, Some(b"lrlrrrr".to_vec())); @@ -1715,32 +967,32 @@ fn analyze_primer_hits( row.push(format!("{}", i + 1)); row.push(format!("{}", outer_primers[i].len())); let metric = format!("outer_primer_{}", i + 1); - write_json_metric_str(&metric, strme(&outer_primers[i]), json); + json.insert(metric, strme(&outer_primers[i])); let locs = format!("{}", locs_all[i].iter().format("+")); row.push(locs.clone()); let metric = format!("binding_sites_of_outer_primer_{}", i + 1); - write_json_metric_str(&metric, &locs, json); + json.insert(metric, locs); row.push(format!("{}", outer_hit_good_contigs[i])); let metric = format!("productive_contigs_containing_outer_primer_{}", i + 1); - write_json_metric_f64(&metric, outer_hit_good_contigs[i] as f64, json); - row.push(format!("{:.1}%", 100.0 * outer_hit_total[i])); + json.insert(metric, outer_hit_good_contigs[i]); + row.push(format!("{:.1}%", 100.0 * outer_hit_primer_frac[i])); let metric = format!("frac_of_priming_events_from_outer_primer_{}", i + 1); - write_json_metric_f64(&metric, outer_hit_total[i], json); - row.push(format!("{:.1}%", 100.0 * outer_hit_good_total[i])); + json.insert(metric, outer_hit_primer_frac[i]); + row.push(format!("{:.1}%", 100.0 * outer_offtarget_rate[i])); let metric = format!( "frac_of_priming_events_from_outer_primer_{}_that_are_off_target", i + 1 ); - write_json_metric_f64(&metric, outer_hit_good_total[i], json); + json.insert(metric, outer_offtarget_rate[i]); row.push(format!( "{:.1}%", - 100.0 * outer_hit_total[i] * outer_hit_good_total[i] + 100.0 * outer_hit_primer_frac[i] * outer_offtarget_rate[i] )); let metric = format!( "frac_of_priming_events_that_outer_primer_{}_makes_off_target", i + 1 ); - write_json_metric_f64(&metric, outer_hit_total[i] * outer_hit_good_total[i], json); + json.insert(metric, outer_hit_primer_frac[i] * outer_offtarget_rate[i]); rows.push(row); } print_tabular(log, &rows, 2, Some(b"lrlrrrr".to_vec())); @@ -1768,3 +1020,43 @@ fn analyze_primer_hits( "[and matching outer primer stats for each inner primer stat]" ); } + +/// Print out a matrix, with left-justified entries, and given separation between +/// columns. (Justification may be changed by supplying an optional argument +/// consisting of a string of l's and r's.) +pub fn print_tabular( + log: &mut Vec, + rows: &[Vec], + sep: usize, + justify: Option>, +) { + let just = justify.unwrap_or_default(); + let nrows = rows.len(); + let mut ncols = 0; + for row in &rows[0..nrows] { + ncols = max(ncols, row.len()); + } + let mut maxcol = vec![0; ncols]; + for row in rows { + for (j, item) in row.iter().enumerate() { + maxcol[j] = max(maxcol[j], item.chars().count()); + } + } + for row in rows { + for (j, x) in row.iter().enumerate() { + if j < just.len() && just[j] == b'r' { + log.append(&mut vec![b' '; maxcol[j] - x.chars().count()]); + log.append(&mut x.as_bytes().to_vec()); + if j < row.len() - 1 { + log.append(&mut vec![b' '; sep]); + } + } else { + log.append(&mut x.as_bytes().to_vec()); + if j < row.len() - 1 { + log.append(&mut vec![b' '; maxcol[j] - x.chars().count() + sep]); + } + } + } + log.push(b'\n'); + } +} diff --git a/lib/rust/vdj_asm_utils/src/contigs.rs b/lib/rust/vdj_asm_utils/src/contigs.rs index 4dadcbd..44a1f7f 100644 --- a/lib/rust/vdj_asm_utils/src/contigs.rs +++ b/lib/rust/vdj_asm_utils/src/contigs.rs @@ -8,7 +8,6 @@ use self::equiv::EquivRel; use self::graph_simple::GraphSimple; use self::hyperbase::Hyper; use self::kmer_lookup::make_kmer_lookup_20_single; -use self::perf_stats::{elapsed, peak_mem_usage_gb}; use crate::barcode_data::BarcodeData; use crate::constants::UmiType; use crate::heuristics::Heuristics; @@ -23,16 +22,15 @@ use itertools::Itertools; use std::cmp::{max, min}; use std::collections::{HashMap, HashSet}; use std::io::Write; -use std::time::Instant; use string_utils::stringme; -use vdj_ann::annotate::{annotate_seq, get_cdr3}; +use vdj_ann::annotate::{annotate_seq, get_cdr3, Annotation}; use vdj_ann::refx::RefData; -use vdj_ann::transcript::{is_valid, junction_seq, junction_supp, junction_supp_core}; +use vdj_ann::transcript::{is_productive_contig, junction_seq, junction_supp, junction_supp_core}; use vector_utils::{ bin_member, bin_position, contains, erase_if, lower_bound1_3, next_diff, next_diff1_2, next_diff1_3, next_diff1_6, reverse_sort, sort_sync2, unique_sort, upper_bound1_3, VecUtils, }; -use {equiv, graph_simple, hyperbase, kmer_lookup, perf_stats}; +use {equiv, graph_simple, hyperbase, kmer_lookup}; // Given a vector x of length N > n, return n randomly selected elements, and sort the resulting // vector. This is deterministic and will not change when crates are updated. @@ -98,7 +96,6 @@ pub fn make_contigs( let gd_mode = is_gd.unwrap_or(false); // Unpack refdata. - let t = Instant::now(); let refs_full = &refdata_full.refs; let rheaders_full = &refdata_full.rheaders; let rheaders = &refdata.rheaders; @@ -342,15 +339,7 @@ pub fn make_contigs( let min_contig_length: usize = min_contig_length.unwrap_or(300); let mut strong = Vec::<(i32, Vec)>::new(); - if log_opts.clock || log_opts.mem { - fwriteln!( - log, - "used {:.1} seconds before making strong paths, \ - peak mem = {:.2} GB", - elapsed(&t), - peak_mem_usage_gb() - ); - } + uber_strong_paths(x, umi_id, &mut strong); let mut alt_strong = Vec::>::new(); alt_strong_paths(x, umi_id, &mut alt_strong); @@ -398,15 +387,7 @@ pub fn make_contigs( fwriteln!(log, "strong: {}", strong[i].1.iter().format(",")); } } - if log_opts.clock || log_opts.mem { - fwriteln!( - log, - "used {:.1} seconds after making strong paths, \ - peak mem = {:.2} GB", - elapsed(&t), - peak_mem_usage_gb() - ); - } + con.clear(); con2.clear(); let mut conp = Vec::>::new(); @@ -424,8 +405,7 @@ pub fn make_contigs( } } if !ok { - let mut cdr3 = Vec::<(usize, Vec, usize, usize)>::new(); - get_cdr3(&c.slice(0, c.len()), &mut cdr3); + let cdr3 = get_cdr3(&c.slice(0, c.len())); if !cdr3.is_empty() { ok = true; } @@ -451,10 +431,10 @@ pub fn make_contigs( conp.clear(); let mut i = 0; while i < cc.len() { - let j = next_diff1_2(&cc, i as i32); + let j = next_diff1_2(&cc, i); con.push(cc[i].0.clone()); conp.push(cc[i].1.clone()); - i = j as usize; + i = j; } // Trim stuff before a UTR. Also trim stuff after constant regions, which @@ -463,17 +443,16 @@ pub fn make_contigs( if !heur.free { for j in 0..con.len() { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(&con[j], refdata, &mut ann, true, false, false); + let ann = annotate_seq(&con[j], refdata, true, false, false); if !ann.is_empty() { let (mut start, mut stop) = (0, con[j].len()); let l = ann.len() - 1; - let (t1, t2) = (ann[0].2 as usize, ann[l].2 as usize); + let (t1, t2) = (ann[0].ref_id as usize, ann[l].ref_id as usize); if refdata.segtype[t1] == "U" { - start = ann[0].0 as usize; + start = ann[0].tig_start as usize; } if refdata.segtype[t2] == "C" { - stop = ann[l].0 as usize + ann[l].1 as usize; + stop = ann[l].tig_start as usize + ann[l].match_len as usize; } if start > 0 || stop < con[j].len() { con[j] = con[j].slice(start, stop).to_owned(); @@ -518,25 +497,15 @@ pub fn make_contigs( } } } - if log_opts.clock || log_opts.mem { - fwriteln!( - log, - "used {:.1} seconds after trimming, \ - peak mem = {:.2} GB", - elapsed(&t), - peak_mem_usage_gb() - ); - } // Delete contigs having only C annotations. Also test for V annotation. if !heur.free { let mut to_delete = vec![false; con.len()]; for i in 0..con.len() { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(&con[i], refdata, &mut ann, true, false, false); + let ann = annotate_seq(&con[i], refdata, true, false, false); let mut c_only = true; for a in ann { - let t = a.2 as usize; + let t = a.ref_id as usize; if !refdata.is_c(t) { c_only = false; } @@ -692,15 +661,6 @@ pub fn make_contigs( } } } - if log_opts.clock || log_opts.mem { - fwriteln!( - log, - "used {:.1} seconds after indel fixing, \ - peak mem = {:.2} GB", - elapsed(&t), - peak_mem_usage_gb() - ); - } // Filter out contigs that are now too short. @@ -712,32 +672,21 @@ pub fn make_contigs( } erase_if(con, &to_delete); erase_if(&mut conp, &to_delete); - if log_opts.clock || log_opts.mem { - fwriteln!( - log, - "used {:.1} seconds after deleting shorts, \ - peak mem = {:.2} GB", - elapsed(&t), - peak_mem_usage_gb() - ); - } // Move invalid contigs to the reject pile. let mut to_delete: Vec = vec![false; con.len()]; - let mut ann_all = Vec::>::new(); + let mut ann_all = Vec::>::new(); for i in 0..con.len() { let mut good = true; if !heur.free { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(&con[i], refdata, &mut ann, true, false, true); - if !is_valid(&con[i], refdata, &ann, false, log, is_gd) { + let ann = annotate_seq(&con[i], refdata, true, false, true); + if !is_productive_contig(&con[i], refdata, &ann).0 { good = false; } ann_all.push(ann); } else { - let mut cdr3 = Vec::<(usize, Vec, usize, usize)>::new(); - get_cdr3(&con[i].slice(0, con[i].len()), &mut cdr3); + let cdr3 = get_cdr3(&con[i].slice(0, con[i].len())); if cdr3.is_empty() { good = false; } @@ -770,15 +719,6 @@ pub fn make_contigs( // // ◼ There is another assignment of UMIs below, independent of this. - if log_opts.clock || log_opts.mem { - fwriteln!( - log, - "used {:.1} seconds before computing umis, \ - peak mem = {:.2} GB", - elapsed(&t), - peak_mem_usage_gb() - ); - } let mut conps = conp.clone(); for i in 0..conps.len() { unique_sort(&mut conps[i]); @@ -801,20 +741,11 @@ pub fn make_contigs( i = k; } } - if log_opts.clock || log_opts.mem { - fwriteln!( - log, - "used {:.1} seconds after making umi_contig, \ - peak mem = {:.2} GB", - elapsed(&t), - peak_mem_usage_gb() - ); - } umi_mcount_contig.sort_unstable(); let mut umis = vec![0; con.len()]; let mut i = 0; while i < umi_mcount_contig.len() { - let j = next_diff1_3(&umi_mcount_contig, i as i32) as usize; + let j = next_diff1_3(&umi_mcount_contig, i); for k in i..j { if umi_mcount_contig[k].1 > umi_mcount_contig[i].1 { break; @@ -823,15 +754,6 @@ pub fn make_contigs( } i = j; } - if log_opts.clock || log_opts.mem { - fwriteln!( - log, - "used {:.1} seconds after computing umis, \ - peak mem = {:.2} GB", - elapsed(&t), - peak_mem_usage_gb() - ); - } /* // Print: @@ -847,11 +769,11 @@ pub fn make_contigs( if !heur.free { for u in 0..con.len() { for m in 0..ann_all[u].len() { - let t = ann_all[u][m].2 as usize; + let t = ann_all[u][m].ref_id as usize; const EXCLUDE: usize = 15; let r = &refdata.refs[t]; - let start = ann_all[u][m].0 as usize; - if refdata.is_v(t) && ann_all[u][m].3 == 0 && r.len() >= EXCLUDE { + let start = ann_all[u][m].tig_start as usize; + if refdata.is_v(t) && ann_all[u][m].ref_start == 0 && r.len() >= EXCLUDE { let mut mis = 0; for z in 0..r.len() - EXCLUDE { if start + z >= con[u].len() || con[u].get(start + z) != r.get(z) { @@ -871,13 +793,15 @@ pub fn make_contigs( for j in 0..con.len() { let mut jseq = DnaString::new(); if !heur.free { - junction_seq(&con[j], refdata, &ann_all[j], &mut jseq, is_gd); + junction_seq(&con[j], refdata, &ann_all[j], &mut jseq); } else { - let mut cdr3 = Vec::<(usize, Vec, usize, usize)>::new(); - get_cdr3(&con[j].slice(0, con[j].len()), &mut cdr3); + let cdr3 = get_cdr3(&con[j].slice(0, con[j].len())); if cdr3.solo() { jseq = con[j] - .slice(cdr3[0].0, cdr3[0].0 + 3 * cdr3[0].1.len()) + .slice( + cdr3[0].start_position_on_contig, + cdr3[0].start_position_on_contig + 3 * cdr3[0].aa_seq.len(), + ) .to_owned(); } } @@ -888,35 +812,33 @@ pub fn make_contigs( // by <= 2 mismatches. const MAX_JUNCTION_MISMATCHES: usize = 2; - let mut eq: EquivRel = EquivRel::new(jseqs.len() as i32); + let mut eq: EquivRel = EquivRel::new(jseqs.len() as u32); for i1 in 0..jseqs.len() { for i2 in i1 + 1..jseqs.len() { - if eq.class_id(i1 as i32) != eq.class_id(i2 as i32) - && jseqs[i1].0.len() == jseqs[i2].0.len() - { + if eq.set_id(i1) != eq.set_id(i2) && jseqs[i1].0.len() == jseqs[i2].0.len() { let diffs = ndiffs(&jseqs[i1].0, &jseqs[i2].0); if diffs <= MAX_JUNCTION_MISMATCHES { - eq.join(i1 as i32, i2 as i32); + eq.join(i1, i2); } } } } - // Rework jseqs, replacing junction sequence by its class id. + // Rework jseqs, replacing junction sequence by its set id. - let mut jseqs2 = Vec::<(i32, bool, usize, i32, usize, usize)>::new(); + let mut jseqs2 = Vec::<(usize, bool, usize, i32, usize, usize)>::new(); for i in 0..jseqs.len() { let mut have_c = false; if !heur.free { for j in 0..ann_all[i].len() { - let t = ann_all[i][j].2 as usize; + let t = ann_all[i][j].ref_id as usize; if refdata.is_c(t) { have_c = true; } } } jseqs2.push(( - eq.class_id(i as i32), + eq.set_id(i), !have_c, jseqs[i].1, jseqs[i].2, @@ -936,14 +858,12 @@ pub fn make_contigs( // // ◼ In the denovo case, it seems like we should be using the cdr3 calculation // ◼ that uses annotation. - let mut reps = Vec::::new(); - eq.orbit_reps(&mut reps); let mut conx = Vec::::new(); let mut conpx = Vec::>::new(); - let mut ann_allx = Vec::>::new(); + let mut ann_allx = Vec::>::new(); let mut i = 0; while i < jseqs2.len() { - let j = next_diff1_6(&jseqs2, i as i32) as usize; + let j = next_diff1_6(&jseqs2, i); if jseqs2[i].5 > 0 { conx.push(con[jseqs2[i].4].clone()); conpx.push(conp[jseqs2[i].4].clone()); @@ -975,19 +895,28 @@ pub fn make_contigs( let mut all = Vec::<(i32, i32, usize)>::new(); for j in 0..con.len() { let mut jseq_long = DnaString::new(); - let mut cdr3 = Vec::<(usize, Vec, usize, usize)>::new(); - get_cdr3(&con[j].slice(0, con[j].len()), &mut cdr3); + let cdr3 = get_cdr3(&con[j].slice(0, con[j].len())); if cdr3.solo() { let jseq = con[j] - .slice(cdr3[0].0, cdr3[0].0 + 3 * cdr3[0].1.len()) + .slice( + cdr3[0].start_position_on_contig, + cdr3[0].start_position_on_contig + 3 * cdr3[0].aa_seq.len(), + ) .to_owned(); if jseq.len() > 100 { jseq_long = jseq.clone(); } else { let ext = 100 - jseq.len(); - let start = if ext <= cdr3[0].0 { cdr3[0].0 - ext } else { 0 }; + let start = if ext <= cdr3[0].start_position_on_contig { + cdr3[0].start_position_on_contig - ext + } else { + 0 + }; jseq_long = con[j] - .slice(start, cdr3[0].0 + 3 * cdr3[0].1.len()) + .slice( + start, + cdr3[0].start_position_on_contig + 3 * cdr3[0].aa_seq.len(), + ) .to_owned(); } } @@ -1034,21 +963,19 @@ pub fn make_contigs( refdata, &ann_all[j], &mut jsupp_this, - is_gd, ); jsupp.push(jsupp_this); let mut jseq = DnaString::new(); - junction_seq(&con[j], refdata, &ann_all[j], &mut jseq, is_gd); - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(&con[j], refdata, &mut ann, true, false, false); + junction_seq(&con[j], refdata, &ann_all[j], &mut jseq); + let ann = annotate_seq(&con[j], refdata, true, false, false); let mut this_is_tra = false; for a in ann { // This definition of is_tra makes absolutely no sense, since // IG heavy chains have a D segment. But it may be harmless. // Heavy chains do seem to have less UMI support than light chains. - if rheaders[a.2 as usize].contains("TRAJ") - || (rheaders[a.2 as usize].contains("TRGJ") && gd_mode) - || rheaders[a.2 as usize].contains("IGHJ") + if rheaders[a.ref_id as usize].contains("TRAJ") + || (rheaders[a.ref_id as usize].contains("TRGJ") && gd_mode) + || rheaders[a.ref_id as usize].contains("IGHJ") { this_is_tra = true; } @@ -1140,9 +1067,9 @@ pub fn make_contigs( } let mut i = 0; while i < zkmers_plus.len() { - let j = next_diff1_3(&zkmers_plus, i as i32); - for k1 in i..j as usize { - for k2 in k1 + 1..j as usize { + let j = next_diff1_3(&zkmers_plus, i); + for k1 in i..j { + for k2 in k1 + 1..j { let (t1, t2) = (zkmers_plus[k1].1, zkmers_plus[k2].1); if t1 != t2 { share[t1 as usize][t2 as usize] += 1; @@ -1150,7 +1077,7 @@ pub fn make_contigs( } } } - i = j as usize; + i = j; } const MIN_COV: f64 = 0.75; for t1 in 0..con2.len() { @@ -1173,11 +1100,10 @@ pub fn make_contigs( let mut ann_kmers2 = vec![0; con2.len()]; let mut ann2s = Vec::>::new(); for i in 0..con2.len() { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(&con2[i], refdata, &mut ann, false, false, false); + let ann = annotate_seq(&con2[i], refdata, false, false, false); let mut ann2 = vec![false; con2[i].len() - x.h.k as usize + 1]; for j in 0..ann.len() { - let (start, len) = (ann[j].0 as usize, ann[j].1 as usize); + let (start, len) = (ann[j].tig_start as usize, ann[j].match_len as usize); if start + len >= x.h.k as usize { let stop = start + len - x.h.k as usize + 1; for l in start..stop { @@ -1202,7 +1128,7 @@ pub fn make_contigs( let mut share = vec![vec![0_i32; con12.len()]; con12.len()]; let mut i = 0; while i < wkmers_plus.len() { - let j = next_diff1_3(&wkmers_plus, i as i32) as usize; + let j = next_diff1_3(&wkmers_plus, i); for k1 in i..j { for k2 in k1 + 1..j { let t1 = wkmers_plus[k1].1; @@ -1421,21 +1347,20 @@ pub fn make_contigs( conx[t].slice(0, 10).to_string(), ); contig_count += 1; - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(&conx[t], refdata, &mut ann, true, false, true); + let ann = annotate_seq(&conx[t], refdata, true, false, true); let mut vstart = None; let mut jstop = None; for i in 0..ann.len() { - let u = ann[i].2; + let u = ann[i].ref_id; if refdata.is_v(u as usize) { - vstart = Some(ann[i].0); + vstart = Some(ann[i].tig_start); break; } } for i in (0..ann.len()).rev() { - let u = ann[i].2; + let u = ann[i].ref_id; if refdata.is_j(u as usize) { - jstop = Some(ann[i].0 + ann[i].1); + jstop = Some(ann[i].tig_start + ann[i].match_len); break; } } diff --git a/lib/rust/vdj_asm_utils/src/exact_clonotyping.rs b/lib/rust/vdj_asm_utils/src/exact_clonotyping.rs new file mode 100644 index 0000000..e66212b --- /dev/null +++ b/lib/rust/vdj_asm_utils/src/exact_clonotyping.rs @@ -0,0 +1,144 @@ +use anyhow::{anyhow, Result}; +use barcode::Barcode; +use itertools::Itertools; +use martian_filetypes::json_file::JsonFile; +use martian_filetypes::LazyFileTypeIO; +use serde::{Deserialize, Serialize}; +use std::cmp::Reverse; +use std::collections::{HashMap, HashSet}; +use std::str::FromStr; +use vdj_ann::annotate::ContigAnnotation; +use vdj_types::{VdjChain, VdjRegion}; + +/// Represent an exact clonotype. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ExactClonotype { + pub id: String, + pub identity: Vec, + pub barcodes: Vec, +} + +#[derive(Hash, PartialEq, Eq, Debug)] +pub struct BarcodeContigUMI { + pub barcode: Barcode, + pub umi: usize, +} + +/// Contig-level information for exact-clonotype grouping. +#[derive(Clone, Eq, PartialEq, Debug, Ord, PartialOrd, Serialize, Deserialize, Hash)] +pub struct ProductiveContig { + pub chain: VdjChain, + pub cdr3_nt: String, + pub vdj_nt: String, + pub c_ref_name: Option, + pub jc_delta: Option, +} + +// TODO: lift these up to be inherent methods of ContigAnnotation. +pub trait XtraContigAnnotationMethods { + fn get_jc_delta(&self) -> Option; + fn get_vdj_seq(&self) -> Option; +} + +impl XtraContigAnnotationMethods for ContigAnnotation { + fn get_vdj_seq(&self) -> Option { + if let (Some(v_gene), Some(j_gene)) = + (self.get_region(VdjRegion::V), self.get_region(VdjRegion::J)) + { + Some(self.sequence[v_gene.contig_match_start..j_gene.contig_match_end].to_string()) + } else { + None + } + } + + /// Returns an i32 since J-region annotation end can overlap with C-region + fn get_jc_delta(&self) -> Option { + if let (Some(c_region), Some(j_region)) = + (self.get_region(VdjRegion::C), self.get_region(VdjRegion::J)) + { + Some(c_region.contig_match_start as i32 - j_region.contig_match_end as i32) + } else { + None + } + } +} + +impl ProductiveContig { + pub fn new(ann: &ContigAnnotation) -> Result { + Ok(ProductiveContig { + chain: ann + .chain_type() + .ok_or_else(|| anyhow!("required chain_type not found"))?, + cdr3_nt: ann + .cdr3_seq + .as_ref() + .ok_or_else(|| anyhow!("required cdr3_nt not found"))? + .to_string(), + vdj_nt: ann + .get_vdj_seq() + .ok_or_else(|| anyhow!("required vdj_nt not found"))?, + c_ref_name: ann.get_gene_name(VdjRegion::C).cloned(), + jc_delta: ann.get_jc_delta(), + }) + } +} + +pub fn generate_exact_clonotypes( + all_contigs_json: JsonFile>, +) -> Result> { + let mut prod_contigs_per_bc = HashMap::>::new(); + for ann in all_contigs_json.lazy_reader()? { + let ann: ContigAnnotation = ann?; + if ann.is_cell && ann.is_productive() { + prod_contigs_per_bc + .entry(ann.barcode.clone()) + .or_default() + .push(ProductiveContig::new(&ann)?); + } + } + let mut exact_clonotypes_map: HashMap, Vec> = Default::default(); + for (bc, mut contigs) in prod_contigs_per_bc { + contigs.sort(); // sort contigs within each barcode + exact_clonotypes_map.entry(contigs).or_default().push(bc); + } + // sort the barcodes associated with each exact clonotype + exact_clonotypes_map.values_mut().for_each(|bcs| bcs.sort()); + + let exact_clonotypes_vec = exact_clonotypes_map + .into_iter() + .sorted_by(|(c0, _), (c1, _)| c0.len().cmp(&c1.len()).then_with(|| c0.cmp(c1))) + .enumerate() + .map(|(i, (contigs, bcs))| ExactClonotype { + id: format!("exact_clonotype_{i}"), + barcodes: bcs, + identity: contigs, + }) + .collect::>(); + Ok(exact_clonotypes_vec) +} + +pub fn generate_exact_contigs( + all_contigs_json: &JsonFile>, + cell_bcs: HashSet, +) -> Result>> { + let mut bcs_per_prodcontig = HashMap::>::new(); + for ann in all_contigs_json.lazy_reader()? { + let ann: ContigAnnotation = ann?; + if ann.is_productive() && cell_bcs.contains(&ann.barcode) { + bcs_per_prodcontig + .entry(ProductiveContig::new(&ann)?) + .or_default() + .push(BarcodeContigUMI { + barcode: Barcode::from_str(&ann.barcode)?, + umi: ann.umi_count, + }); + } + } + + // sort the barcodes associated with each exact contig in descending order of umi counts + bcs_per_prodcontig + .values_mut() + .for_each(|bcs| bcs.sort_by_key(|a| Reverse(a.umi))); + + Ok(bcs_per_prodcontig) +} diff --git a/lib/rust/vdj_asm_utils/src/fastq.rs b/lib/rust/vdj_asm_utils/src/fastq.rs index 3af2c5a..155134c 100644 --- a/lib/rust/vdj_asm_utils/src/fastq.rs +++ b/lib/rust/vdj_asm_utils/src/fastq.rs @@ -1,4 +1,3 @@ -use crate::constants::ReadType; use std::collections::HashMap; pub struct CellrangerFastqHeader { @@ -33,22 +32,23 @@ impl CellrangerFastqHeader { } } -#[derive(Clone, Debug)] -pub struct Record { - pub id: ReadType, - pub seq: Vec, - pub quals: Vec, -} - #[cfg(test)] mod tests { use super::*; - use crate::constants::{UmiType, PROCESSED_UMI_TAG, QUAL_OFFSET, RAW_UMI_TAG}; + use crate::constants::{ReadType, UmiType, PROCESSED_UMI_TAG, QUAL_OFFSET, RAW_UMI_TAG}; use crate::utils; use io_utils::open_maybe_compressed; use std::io::{BufRead, BufReader, Lines, Read}; use std::path::Path; + #[derive(Clone, Debug)] + pub struct Record { + pub id: ReadType, + pub seq: Vec, + #[allow(dead_code)] + pub quals: Vec, + } + fn extract_head(header: &str) -> String { // Remove the @ at the beginning and then take stuff before whitespace let no_at = (header.split_at(1).1).split_whitespace().next().unwrap(); diff --git a/lib/rust/vdj_asm_utils/src/graph_read.rs b/lib/rust/vdj_asm_utils/src/graph_read.rs index 6066b70..60e6155 100644 --- a/lib/rust/vdj_asm_utils/src/graph_read.rs +++ b/lib/rust/vdj_asm_utils/src/graph_read.rs @@ -3,7 +3,6 @@ use crate::{bam_utils, sw, utils}; use debruijn::dna_string::DnaString; use rust_htslib::bam; use serde::{Deserialize, Serialize}; -use std; /// A macro creating methods for flag access. /// Copied from rust_htslib. @@ -18,7 +17,7 @@ macro_rules! flag { } pub fn $unset(&mut self) { - self.flags &= std::u16::MAX - $bit; + self.flags &= u16::MAX - $bit; } }; } diff --git a/lib/rust/vdj_asm_utils/src/hops.rs b/lib/rust/vdj_asm_utils/src/hops.rs index 15744a3..ec5dc2e 100644 --- a/lib/rust/vdj_asm_utils/src/hops.rs +++ b/lib/rust/vdj_asm_utils/src/hops.rs @@ -27,7 +27,7 @@ use io_utils::{fwriteln, open_for_write_new}; use itertools::Itertools; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use std::io::Write; use string_utils::strme; use tenkit2::pack_dna::{unpack_bases_10, unpack_bases_16}; diff --git a/lib/rust/vdj_asm_utils/src/lib.rs b/lib/rust/vdj_asm_utils/src/lib.rs index 1ebd519..e06b5e7 100644 --- a/lib/rust/vdj_asm_utils/src/lib.rs +++ b/lib/rust/vdj_asm_utils/src/lib.rs @@ -46,9 +46,6 @@ while_true )] -#[macro_use] -extern crate arrayref; - #[macro_use] extern crate io_utils; @@ -63,16 +60,14 @@ pub mod bam_utils; pub mod barcode_data; pub mod constants; mod contigs; +pub mod exact_clonotyping; mod fastq; -pub mod filter_barcodes; -pub mod filter_log; pub mod graph_read; pub mod heuristics; pub mod hops; pub mod log_opts; mod metrics; pub mod primers; -mod print_hyper; pub mod process; mod ref_free; pub mod sw; diff --git a/lib/rust/vdj_asm_utils/src/log_opts.rs b/lib/rust/vdj_asm_utils/src/log_opts.rs index 8c23a3c..dc2f8cd 100644 --- a/lib/rust/vdj_asm_utils/src/log_opts.rs +++ b/lib/rust/vdj_asm_utils/src/log_opts.rs @@ -1,91 +1,20 @@ -use perf_stats::{elapsed, mem_usage_gb, peak_mem_usage_gb}; -use std::io::Write; -use std::time::Instant; - // Logging options. +#[derive(Default)] pub struct LogOpts { - pub print_seq: bool, // print dna sequence of contig - pub print_qual: bool, // print qual scores of contig pub print_umi: bool, // print umis pub show_supp: bool, // show read support for each graph edge pub print_seq_edges: bool, // print sequence for each graph edge pub nreject: bool, // don't show rejected contigs pub ngood: bool, // don't show good contigs - pub ngraph: bool, // don't show graph pub umi_seq: bool, // print reads for each umi pub survive: bool, // log details about surviving umis pub vis: bool, // show visual align of V+J ref to contig - pub clock: bool, // print some timing info - pub mem: bool, // print some mem usage info - pub npipeline: bool, // don't show pipeline logging pub json: bool, // print json annotations for each contig pub strong_edges: bool, // print edges in strong paths - pub keep_all: bool, // keep all logs even if graph empty pub nucounts: bool, // don't print ucounts pub trace_seq: String, // trace the given DNA sequence through the graph pub trace_umis: bool, // trace all UMIs through the graph pub print_strong: bool, // print strong paths pub paths: bool, // print paths for contigs } - -impl LogOpts { - pub fn new() -> LogOpts { - LogOpts { - print_seq: false, - print_qual: false, - print_umi: false, - show_supp: false, - print_seq_edges: false, - nreject: false, - ngood: false, - ngraph: true, - umi_seq: false, - survive: false, - vis: false, - clock: false, - mem: false, - npipeline: false, - json: false, - strong_edges: false, - keep_all: false, - nucounts: false, - trace_seq: String::new(), - trace_umis: false, - print_strong: false, - paths: false, - } - } - - pub fn report_perf_stats(&self, log: &mut Vec, t: &Instant, msg: &str) { - if self.clock || self.mem { - fwriteln!( - log, - "used {:.1} seconds {}, \ - mem = {:.2} GB, peak = {:.2} GB", - elapsed(t), - msg, - mem_usage_gb(), - peak_mem_usage_gb() - ); - } - } - - pub fn report_perf_stats_now(&self, t: &Instant, msg: &str) { - if self.clock { - println!( - "used {:.1} seconds {}, mem = {:.2} GB, peak = {:.2} GB", - elapsed(t), - msg, - mem_usage_gb(), - peak_mem_usage_gb() - ); - } - } -} - -impl Default for LogOpts { - fn default() -> Self { - Self::new() - } -} diff --git a/lib/rust/vdj_asm_utils/src/primers.rs b/lib/rust/vdj_asm_utils/src/primers.rs index 4347679..1430298 100644 --- a/lib/rust/vdj_asm_utils/src/primers.rs +++ b/lib/rust/vdj_asm_utils/src/primers.rs @@ -124,18 +124,24 @@ pub fn outer_primers(species: &str, class: &str) -> Vec> { // the reverse complement of the given primer. You can call this on the inner or // outer enrichment primers. The 40-mers are represented as Vecs. -pub fn get_primer_exts(primers: &[Vec], refdata: &RefData) -> Vec>> { - let mut exts = Vec::>>::with_capacity(primers.len()); - for p in primers { - let mut p = p.clone(); - reverse_complement(&mut p); +pub fn get_primer_exts(list_of_primers: &[Vec], refdata: &RefData) -> Vec>> { + let mut exts = Vec::>>::with_capacity(list_of_primers.len()); + for primer in list_of_primers { + let mut primer = primer.clone(); + reverse_complement(&mut primer); let mut x = Vec::>::new(); - for j in 0..refdata.refs.len() { - if refdata.is_c(j) { - let c = refdata.refs[j].to_ascii_vec(); - for l in 0..c.len() { - if contains_at(&c, &p, l) && l + p.len() >= PRIMER_EXT_LEN { - x.push(c[l + p.len() - PRIMER_EXT_LEN..l + p.len()].to_vec()); + for ref_idx in 0..refdata.refs.len() { + if refdata.is_c(ref_idx) { + let constant_region = refdata.refs[ref_idx].to_ascii_vec(); + for pos in 0..constant_region.len() { + if contains_at(&constant_region, &primer, pos) + && pos + primer.len() >= PRIMER_EXT_LEN + { + x.push( + constant_region + [pos + primer.len() - PRIMER_EXT_LEN..pos + primer.len()] + .to_vec(), + ); } } } diff --git a/lib/rust/vdj_asm_utils/src/print_hyper.rs b/lib/rust/vdj_asm_utils/src/print_hyper.rs deleted file mode 100644 index 4a0df49..0000000 --- a/lib/rust/vdj_asm_utils/src/print_hyper.rs +++ /dev/null @@ -1,231 +0,0 @@ -// Print a hyper with annotations. - -#![allow(clippy::many_single_char_names)] - -use debruijn::dna_string::DnaString; -use debruijn::kmer::Kmer20; -use debruijn::{Mer, Vmer}; -use graph_simple::GraphSimple; -use hyperbase::Hyper; -use kmer_lookup::make_kmer_lookup_20_single; -use petgraph::prelude::*; -use std::io::prelude::*; -use vdj_ann::annotate::{annotate_seq, print_annotations}; -use vdj_ann::refx::RefData; -use vector_utils::{lower_bound1_3, unique_sort, upper_bound1_3}; - -// ============================================================================= -// Print the graph, component by component, with reference annotations. -// Elide printing of rc components: if a component is not annotated and its -// rc is, don't print it; if neither a component nor its rc is annotated, only -// print one of them. This uses components_e_pos_sorted, which may turn out -// to be too slow. Optionally show read support for each edge (which produces -// voluminous output and is highly inefficient). -// ============================================================================= - -#[allow(clippy::too_many_arguments)] -pub fn print_with_annotations( - free: bool, - this: &Hyper, - reads: &[DnaString], - umi_id: &[i32], - refdata: &RefData, - show_supp: bool, - print_seq_edges: bool, - log: &mut Vec, -) { - // Find components and index them. - - let mut comp = Vec::>::new(); - this.h.g.components_e_pos_sorted(&mut comp); - let mut to_comp: Vec = vec![-1; this.h.g.edge_count()]; - for c in 0..comp.len() { - for j in 0..comp[c].len() { - to_comp[comp[c][j] as usize] = c as i32; - } - } - - // Determine which components have annotations. - - let mut is_ann: Vec = vec![false; comp.len()]; - if !free { - for j in 0..comp.len() { - for i in 0..comp[j].len() { - let e = comp[j][i]; - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(this.h.g.edge_obj(e), refdata, &mut ann, true, false, true); - if !ann.is_empty() { - is_ann[j] = true; - } - } - } - } - - // Make lookup table for edges if showing support. - - let mut kmers_plus = Vec::<(Kmer20, i32, i32)>::new(); - if show_supp { - let mut edges = Vec::::new(); - for e in 0..this.h.g.edge_count() { - edges.push(this.h.g.edge_obj(e as u32).clone()); - } - make_kmer_lookup_20_single(&edges, &mut kmers_plus); - } - - // Print. - - let mut ccount = 0; - for j in 0..comp.len() { - // Elide rc components. - - let j_rc = to_comp[this.inv[comp[j][0] as usize] as usize] as usize; - if !is_ann[j] && is_ann[j_rc] { - continue; - } - if !is_ann[j] && !is_ann[j_rc] && j_rc < j { - continue; - } - - // Now actually print. - - ccount += 1; - fwriteln!(log, "\nCOMPONENT {}", ccount); - for i in 0..comp[j].len() { - let e = comp[j][i]; - let v = this.h.g.to_left(e); - let w = this.h.g.to_right(e); - let b: DnaString = this.h.g[EdgeIndex::::new(e as usize)].clone(); - let re = this.inv[e as usize]; - let mut u = Vec::::new(); - for pass in 0..2 { - let mut f = e; - if pass == 1 { - f = re; - } - if !this.ids[f as usize].is_empty() { - u.push(umi_id[this.ids[f as usize][0] as usize]); - } - for j in 1..this.ids[f as usize].len() { - if umi_id[this.ids[f as usize][j] as usize] - != umi_id[this.ids[f as usize][j - 1] as usize] - { - u.push(umi_id[this.ids[f as usize][j] as usize]); - } - } - } - unique_sort(&mut u); - fwriteln!( - log, - "\n{} ==(e={},len={},s={},u={})==> {}", - v, - e, - b.len() - this.h.k as usize + 1, - this.supp(e as usize), - u.len(), - w - ); - // writeln!( log, "" ); // should only do if there are annotations - if print_seq_edges { - fwriteln!(log, "{}", this.h.g.edge_obj(e).to_string()); - } - if !free { - let verbose = false; - print_annotations(this.h.g.edge_obj(e), refdata, log, false, true, verbose); - } - - // Print edge support. Only shows fw support, and only shows - // perfect match intervals, of length >= 20. - // ◼ There are multiple places in the code where we find maximal - // ◼ perfect match intervals. Should make into a function. - - if show_supp { - let mut matches = Vec::<(usize, usize, u32, i32)>::new(); - let k = this.h.k as usize; - let r = &this.h.g.edge_obj(e); - for j in 0..this.ids[e as usize].len() { - let id = this.ids[e as usize][j]; - let b = &reads[id as usize]; - for l in 0..b.len() - k + 1 { - let x: Kmer20 = b.get_kmer(l); - let low = lower_bound1_3(&kmers_plus, &x); - let high = upper_bound1_3(&kmers_plus, &x); - for m in low..high { - let t = kmers_plus[m as usize].1 as usize; - if t != e as usize { - continue; - } - let p = kmers_plus[m as usize].2 as usize; - if l > 0 && p > 0 && b.get(l - 1) == r.get(p - 1) { - continue; - } - let mut len = k; - while l + len < b.len() && p + len < r.len() { - if b.get(l + len) != r.get(p + len) { - break; - } - len += 1; - } - // off is inferred read start on edge - let off = p as i32 - l as i32; - matches.push((p, len, id, off)); - } - } - } - matches.sort_unstable(); - if !matches.is_empty() { - fwriteln!(log, ""); - } - let mut i = 0; - while i < matches.len() { - let mut j = i + 1; - while j < matches.len() { - if matches[j].0 != matches[i].0 { - break; - } - if matches[j].1 != matches[i].1 { - break; - } - if matches[j].3 != matches[i].3 { - break; - } - if umi_id[matches[j].2 as usize] != umi_id[matches[i].2 as usize] { - break; - } - j += 1; - } - let p = matches[i].0; - let len = matches[i].1; - let id = matches[i].2; - let u = umi_id[id as usize]; - let off = matches[i].3; - if j - i == 1 { - fwriteln!( - log, - "{}-{}, off = {}, u = {}, id = {}", - p, - p + len, - off, - u, - id - ); - } else { - let mut ids = Vec::::new(); - for m in &matches[i..j] { - ids.push(m.2); - } - fwriteln!( - log, - "{}-{}, off = {}, u = {}, id = {:?}", - p, - p + len, - off, - u, - ids - ); - } - i = j; - } - } - } - } -} diff --git a/lib/rust/vdj_asm_utils/src/process.rs b/lib/rust/vdj_asm_utils/src/process.rs index 3f6b9a7..e585c4f 100644 --- a/lib/rust/vdj_asm_utils/src/process.rs +++ b/lib/rust/vdj_asm_utils/src/process.rs @@ -8,10 +8,10 @@ use crate::contigs::make_contigs; use crate::heuristics::Heuristics; use crate::hops::FlowcellContam; use crate::log_opts::LogOpts; -use crate::print_hyper::print_with_annotations; use crate::ref_free::{simplify_without_ref, uber_strong_paths, umis2}; -use align_tools::{affine_align, complexity}; use amino::{have_start, have_stop}; +use bio_edit::alignment::Alignment; +use bio_edit::alignment::AlignmentOperation::{Del, Ins, Subst}; use debruijn::dna_string::DnaString; use debruijn::kmer::{Kmer12, Kmer20}; use debruijn::{Kmer, Mer, Vmer}; @@ -20,23 +20,22 @@ use hyperbase::Hyper; use itertools::{izip, Itertools}; use kmer_lookup::{make_kmer_lookup_20_single, match_12}; use stats_utils::percent_ratio; -use std::cmp::{max, min}; +use std::cmp::max; use std::collections::HashMap; use std::io::prelude::*; use std::iter::zip; use std::mem::swap; -use std::time::Instant; use string_utils::{abbrev_list, stringme, TextUtils}; use superslice::Ext; -use tenkit2::io::print_compressed; use tenkit2::pack_dna::{pack_bases_16x, reverse_complement, unpack_bases_10}; +use vdj_ann::align::affine_align; use vdj_ann::annotate::{ annotate_seq, annotate_seq_core, chain_type, get_cdr3, get_cdr3_using_ann, print_annotations, print_cdr3, print_cdr3_using_ann, print_some_annotations, print_start_codon_positions, - ContigAnnotation, JunctionSupport, + Annotation, ContigAnnotation, JunctionSupport, }; use vdj_ann::refx::RefData; -use vdj_ann::transcript::is_valid; +use vdj_ann::transcript::ContigStatus; use vector_utils::{ bin_member, intersection, lower_bound1_3, meet_size, next_diff, position, unique_sort, upper_bound1_3, @@ -75,43 +74,11 @@ fn pop_bubbles_using_reference(x: &mut Hyper, umi_id: &[i32], refdata: &RefData) unique_sort(&mut u1); unique_sort(&mut u2); let (nu1, nu2) = (u1.len(), u2.len()); - let mut ann1 = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq( - x.h.g.edge_obj(e1 as u32), - refdata, - &mut ann1, - false, - false, - false, - ); - let mut ann2 = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq( - x.h.g.edge_obj(e2 as u32), - refdata, - &mut ann2, - false, - false, - false, - ); + let ann1 = annotate_seq(x.h.g.edge_obj(e1 as u32), refdata, false, false, false); + let ann2 = annotate_seq(x.h.g.edge_obj(e2 as u32), refdata, false, false, false); let (re1, re2) = (x.inv[e1], x.inv[e2]); - let mut ann1rc = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq( - x.h.g.edge_obj(re1), - refdata, - &mut ann1rc, - false, - false, - false, - ); - let mut ann2rc = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq( - x.h.g.edge_obj(re2), - refdata, - &mut ann2rc, - false, - false, - false, - ); + let ann1rc = annotate_seq(x.h.g.edge_obj(re1), refdata, false, false, false); + let ann2rc = annotate_seq(x.h.g.edge_obj(re2), refdata, false, false, false); let a1 = ann1.len() + ann1rc.len() > 0; let a2 = ann2.len() + ann2rc.len() > 0; let k1 = x.h.kmers(e1 as u32) as i32; @@ -336,7 +303,7 @@ fn print_contig_info( good: bool, id: usize, tig: &DnaString, - ann: &[(i32, i32, i32, i32, i32)], + ann: &[Annotation], jsupp: &(i32, i32), validated_umis: &[String], non_validated_umis: &[String], @@ -358,12 +325,6 @@ fn print_contig_info( let rheaders = &refdata.rheaders; let rkmers_plus = &refdata.rkmers_plus; fwriteln!(log, "\nTIG {}[bases={}]", id + 1, tig.len()); - if log_opts.print_seq { - fwriteln!(log, "{}", tig.to_string()); - } - if log_opts.print_qual { - print_compressed(log, tigq); - } let verbose = false; if good { print_some_annotations(refdata, ann, log, verbose); @@ -380,14 +341,13 @@ fn print_contig_info( // Print CDR3 locations. - let mut cdr3 = Vec::<(usize, Vec, usize, usize)>::new(); - if !free { + let cdr3 = if !free { print_cdr3_using_ann(tig, refdata, ann, log); - get_cdr3_using_ann(tig, refdata, ann, &mut cdr3); + get_cdr3_using_ann(tig, refdata, ann) } else { print_cdr3(&tig.slice(0, tig.len()), log); - get_cdr3(&tig.slice(0, tig.len()), &mut cdr3); - } + get_cdr3(&tig.slice(0, tig.len())) + }; if good && cdr3.is_empty() { fwriteln!(log, "warning: contig labeled good but has no cdr3"); } @@ -412,7 +372,7 @@ fn print_contig_info( let (mut vs, mut js) = (Vec::::new(), Vec::::new()); for i in ann { - let t = i.2 as usize; + let t = i.ref_id as usize; let h = &rheaders[t]; if h.contains("UTR") { continue; @@ -448,36 +408,39 @@ fn print_contig_info( let mut split_v = false; for i in 0..ann.len() { if i + 1 < ann.len() - && rheaders[ann[i].2 as usize].contains("V-REGION") - && ann[i].2 == ann[i + 1].2 + && rheaders[ann[i].ref_id as usize].contains("V-REGION") + && ann[i].ref_id == ann[i + 1].ref_id { - if ann[i].0 + ann[i].1 == ann[i + 1].0 - && ann[i].3 + ann[i].1 < ann[i + 1].3 - && ann[i + 1].3 - ann[i].1 - ann[i].3 <= 27 - && (ann[i + 1].3 - ann[i].1 - ann[i].3) % 3 == 0 + if ann[i].tig_start + ann[i].match_len == ann[i + 1].tig_start + && ann[i].ref_start + ann[i].match_len < ann[i + 1].ref_start + && ann[i + 1].ref_start - ann[i].match_len - ann[i].ref_start <= 27 + && (ann[i + 1].ref_start - ann[i].match_len - ann[i].ref_start) % 3 == 0 { split_v = true; fwriteln!( log, "see deletion of {} bases at pos {} on {}", - ann[i + 1].3 - ann[i].1 - ann[i].3, - ann[i].1 + ann[i].3, - rheaders[ann[i].2 as usize] + ann[i + 1].ref_start - ann[i].match_len - ann[i].ref_start, + ann[i].match_len + ann[i].ref_start, + rheaders[ann[i].ref_id as usize] ); } - if ann[i].3 + ann[i].1 == ann[i + 1].3 - && ann[i].1 + ann[i].0 < ann[i + 1].0 - && ann[i + 1].0 - ann[i].0 - ann[i].1 <= 27 - && (ann[i + 1].0 - ann[i].0 - ann[i].1) % 3 == 0 + if ann[i].ref_start + ann[i].match_len == ann[i + 1].ref_start + && ann[i].match_len + ann[i].tig_start < ann[i + 1].tig_start + && ann[i + 1].tig_start - ann[i].tig_start - ann[i].match_len <= 27 + && (ann[i + 1].tig_start - ann[i].tig_start - ann[i].match_len) % 3 == 0 { split_v = true; fwriteln!( log, "see insertion of {} at pos {} on {}", - tig.slice((ann[i].0 + ann[i].1) as usize, ann[i + 1].0 as usize) - .to_string(), - ann[i + 1].3, - rheaders[ann[i].2 as usize] + tig.slice( + (ann[i].tig_start + ann[i].match_len) as usize, + ann[i + 1].tig_start as usize + ) + .to_string(), + ann[i + 1].ref_start, + rheaders[ann[i].ref_id as usize] ); } } @@ -489,18 +452,18 @@ fn print_contig_info( let mut split_u = false; for i in 0..ann.len() { if i + 1 < ann.len() - && rheaders[ann[i].2 as usize].contains("UTR") - && ann[i].2 == ann[i + 1].2 + && rheaders[ann[i].ref_id as usize].contains("UTR") + && ann[i].ref_id == ann[i + 1].ref_id { - if ann[i].0 + ann[i].1 == ann[i + 1].0 - && ann[i].3 + ann[i].1 < ann[i + 1].3 - && ann[i + 1].3 - ann[i].1 - ann[i].3 == 1 + if ann[i].tig_start + ann[i].match_len == ann[i + 1].tig_start + && ann[i].ref_start + ann[i].match_len < ann[i + 1].ref_start + && ann[i + 1].ref_start - ann[i].match_len - ann[i].ref_start == 1 { split_u = true; } - if ann[i].3 + ann[i].1 == ann[i + 1].3 - && ann[i].1 + ann[i].0 < ann[i + 1].0 - && ann[i + 1].0 - ann[i].0 - ann[i].1 == 1 + if ann[i].ref_start + ann[i].match_len == ann[i + 1].ref_start + && ann[i].match_len + ann[i].tig_start < ann[i + 1].tig_start + && ann[i + 1].tig_start - ann[i].tig_start - ann[i].match_len == 1 { split_u = true; } @@ -514,7 +477,7 @@ fn print_contig_info( let mut j = Vec::::new(); let mut c = Vec::::new(); for i in ann { - let t = i.2 as usize; + let t = i.ref_id as usize; let name = rheaders[t].after("|").between("|", "|"); if rheaders[t].contains("UTR") { u.push(name.to_string()); @@ -593,6 +556,7 @@ fn print_contig_info( Some(invalidated_umis.to_vec()), is_cell, good, + ContigStatus::default(), junction_support, ); json.print(log); @@ -651,8 +615,6 @@ pub fn process_barcode( let gd_mode = is_gd.unwrap_or(false); // Unpack refdata. - let t = Instant::now(); - log_opts.report_perf_stats(log, &t, "upon entering process_barcode"); let rheaders = &refdata.rheaders; let rheaders_full = &refdata_full.rheaders; @@ -741,7 +703,7 @@ pub fn process_barcode( if s.len() >= n { for p in (0..s.len() - n + 1).rev() { if s[p..p + n] == rc_inner_primers_bytes[j][0..n] { - s = s[0..p + n].to_owned(); + s.truncate(p + n); trimmed = true; break 'outer; } @@ -753,7 +715,8 @@ pub fn process_barcode( let b = DnaString::from_acgt_bytes(&s); let s = b.rc().to_string(); reads[i] = DnaString::from_dna_string(&s); - quals[i] = quals[i][trim..quals[i].len()].to_owned(); + quals[i].drain(..trim); + quals[i].shrink_to_fit(); } } } @@ -786,29 +749,31 @@ pub fn process_barcode( } barcode_data.primer_sample_count += 1; - let s = read.to_ascii_vec(); + let read_ascii = read.to_ascii_vec(); let mut trimmed = false; - 'outerx: for j in 0..inner_primers.len() { - let n = inner_primers[j].len(); - if s.len() >= n { - let p = s.len() - n; - if s[p..p + n] == rc_inner_primers_bytes[j][0..n] { + 'outerx: for inner_primer_idx in 0..inner_primers.len() { + let primer_len = inner_primers[inner_primer_idx].len(); + if read_ascii.len() >= primer_len { + // check if revcomp primer matches end of read + let primer_read_pos = read_ascii.len() - primer_len; + if read_ascii[primer_read_pos..read_ascii.len()] + == rc_inner_primers_bytes[inner_primer_idx] + { trimmed = true; - barcode_data.inner_hit[j] += 1; - if p + n >= PRIMER_EXT_LEN { - let mut min_mis = 1000000; - for l in 0..inner_primer_exts[j].len() { - let x = &inner_primer_exts[j][l]; - let mut mis = 0; - for m in 0..PRIMER_EXT_LEN { - if s[p + n - m - 1] != x[PRIMER_EXT_LEN - m - 1] { - mis += 1; - } - } - min_mis = min(min_mis, mis); - } - if min_mis <= MAX_MIS { - barcode_data.inner_hit_good[j] += 1; + barcode_data.inner_hit[inner_primer_idx] += 1; + if primer_read_pos + primer_len >= PRIMER_EXT_LEN { + let min_missmatches = inner_primer_exts[inner_primer_idx] + .iter() + .map(|c_region_ext| { + read_ascii[read_ascii.len() - PRIMER_EXT_LEN..read_ascii.len()] + .iter() + .zip(c_region_ext.iter()) + .map(|(nt_read, nt_ext)| if nt_read != nt_ext { 1 } else { 0 }) + .sum::() + }) + .min(); + if min_missmatches <= Some(MAX_MIS) { + barcode_data.inner_hit_good[inner_primer_idx] += 1; } } break 'outerx; @@ -816,26 +781,36 @@ pub fn process_barcode( } } if !trimmed { - 'outerx2: for j in 0..outer_primers.len() { - let n = outer_primers[j].len(); - if s.len() >= n { - let p = s.len() - n; - if s[p..p + n] == rc_outer_primers_bytes[j][0..n] { - barcode_data.outer_hit[j] += 1; - if p + n >= PRIMER_EXT_LEN { - let mut min_mis = 1000000; - for l in 0..outer_primer_exts[j].len() { - let x = &outer_primer_exts[j][l]; - let mut mis = 0; - for m in 0..PRIMER_EXT_LEN { - if s[p + n - m - 1] != x[PRIMER_EXT_LEN - m - 1] { - mis += 1; - } - } - min_mis = min(min_mis, mis); - } - if min_mis <= MAX_MIS { - barcode_data.outer_hit_good[j] += 1; + 'outerx2: for outer_primer_idx in 0..outer_primers.len() { + let primer_len = outer_primers[outer_primer_idx].len(); + if read_ascii.len() >= primer_len { + // check if revcomp primer matches end of read + let primer_read_pos = read_ascii.len() - primer_len; + if read_ascii[primer_read_pos..read_ascii.len()] + == rc_outer_primers_bytes[outer_primer_idx] + { + barcode_data.outer_hit[outer_primer_idx] += 1; + if primer_read_pos + primer_len >= PRIMER_EXT_LEN { + let min_missmatches = outer_primer_exts[outer_primer_idx] + .iter() + .map(|c_region_ext| { + read_ascii[read_ascii.len() - PRIMER_EXT_LEN..read_ascii.len()] + .iter() + .zip(c_region_ext.iter()) + .map( + |(nt_read, nt_ext)| { + if nt_read != nt_ext { + 1 + } else { + 0 + } + }, + ) + .sum::() + }) + .min(); + if min_missmatches <= Some(MAX_MIS) { + barcode_data.outer_hit_good[outer_primer_idx] += 1; } } break 'outerx2; @@ -858,16 +833,13 @@ pub fn process_barcode( // Build the graph. - log_opts.report_perf_stats(log, &t, "before building graph"); let mut x: Hyper = Hyper::new(); x.build_from_reads(20, reads); let edges_initial = x.h.g.edge_count(); - log_opts.report_perf_stats(log, &t, "after building graph"); // Simplify the graph without using the reference. - let _t = Instant::now(); - simplify_without_ref(&mut x, umi_id, log, log_opts); + simplify_without_ref(&mut x, umi_id); // Simplify the graph using the reference. First we pop bubbles, then we // kill certain branches that arise from alternate splicing e.g. hopping from @@ -876,15 +848,14 @@ pub fn process_barcode( if !heur.free { let mut dels = Vec::::new(); pop_bubbles_using_reference(&mut x, umi_id, refdata); - let mut ann = vec![Vec::<(i32, i32, i32, i32, i32)>::new(); x.h.g.edge_count()]; - for (e, anne) in ann.iter_mut().enumerate() { - annotate_seq(x.h.g.edge_obj(e as u32), refdata, anne, false, false, false); - } + let ann: Vec<_> = (0..x.h.g.edge_count()) + .map(|e| annotate_seq(x.h.g.edge_obj(e as u32), refdata, false, false, false)) + .collect(); for (e1, (anne1, xids1)) in zip(&ann, &x.ids).take(x.h.g.edge_count()).enumerate() { if anne1.is_empty() { continue; } - let t1 = anne1[anne1.len() - 1].2 as usize; + let t1 = anne1[anne1.len() - 1].ref_id as usize; if !rheaders[t1].contains("V-REGION") { continue; } @@ -904,7 +875,7 @@ pub fn process_barcode( if anne2.is_empty() { continue; } - let t2 = anne2[0].2 as usize; + let t2 = anne2[0].ref_id as usize; if !rheaders[t2].contains("V-REGION") { continue; } @@ -933,7 +904,7 @@ pub fn process_barcode( } x.kill_edges(&dels); } - log_opts.report_perf_stats(log, &t, "after simplifying graph"); + fwriteln!( log, "graph has {} edges initially, {} edges after simplification", @@ -1064,22 +1035,14 @@ pub fn process_barcode( let mut tr = vec![Vec::::default(); 8]; if !heur.free { for e in 0..x.h.g.edge_count() { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq( - x.h.g.edge_obj(e as u32), - refdata, - &mut ann, - false, - false, - false, - ); + let ann = annotate_seq(x.h.g.edge_obj(e as u32), refdata, false, false, false); // [ av, bv, // gv, dv, // aj, bj, // gj, dj ] let mut is_tr = [false; 8]; for i in 0..ann.len() { - let h = &rheaders[ann[i].2 as usize]; + let h = &rheaders[ann[i].ref_id as usize]; if h.contains("TRAV") { is_tr[0] = true; } @@ -1257,10 +1220,10 @@ pub fn process_barcode( let c = x.cat(p); let mut anns = 0; if !heur.free { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(&c, refdata, &mut ann, false, false, false); - for i in &ann { - let h = &refdata.rheaders[i.2 as usize]; + let ann = annotate_seq(&c, refdata, false, false, false); + anns += ann.len(); + for i in ann { + let h = &refdata.rheaders[i.ref_id as usize]; // ◼: Should just look for V region, and below too. if h.contains("TRAV") || h.contains("TRBV") @@ -1271,12 +1234,12 @@ pub fn process_barcode( have_v = true; } } - anns += ann.len(); + let crc = c.rc(); - annotate_seq(&crc, refdata, &mut ann, false, false, false); + let ann = annotate_seq(&crc, refdata, false, false, false); anns += ann.len(); for i in ann { - let h = &rheaders[i.2 as usize]; + let h = &rheaders[i.ref_id as usize]; if h.contains("TRAV") || h.contains("TRBV") || h.contains("IGHV") @@ -1398,19 +1361,18 @@ pub fn process_barcode( if !refdata.refs.is_empty() { let chain_types_list = CHAIN_TYPES.to_vec(); - let mut ann_memory = HashMap::, Vec<(i32, i32, i32, i32, i32)>>::new(); + let mut ann_memory = HashMap::, Vec>::new(); for j in &strong { let p = &j.1; // Can't use entry.or_insert_with here because we don't want to // clone p unnecessarily. if !ann_memory.contains_key(p) { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); let c = x.cat(p); - annotate_seq(&c, refdata_full, &mut ann, false, false, false); + let ann = annotate_seq(&c, refdata_full, false, false, false); ann_memory.insert(p.clone(), ann); }; for i in &ann_memory[p] { - let h = &rheaders_full[i.2 as usize]; + let h = &rheaders_full[i.ref_id as usize]; let mut chain_types = Vec::::with_capacity(7); if h.contains("TRAV") || h.contains("TRAJ") { chain_types.push(position(&chain_types_list, &"TRA") as i8); @@ -1465,26 +1427,14 @@ pub fn process_barcode( // Print final graph. - log_opts.report_perf_stats(log, &t, "after printing final graph"); - if !log_opts.ngraph { - fwriteln!(log, "\nFINAL GRAPH\n"); - fwriteln!( - log, - "edges = {}, checksum = {}", - x.h.g.edge_count(), - x.checksum() - ); - print_with_annotations( - heur.free, - &x, - reads, - umi_id, - refdata, - log_opts.show_supp, - log_opts.print_seq_edges, - log, - ); - } + fwriteln!(log, "\nFINAL GRAPH\n"); + fwriteln!( + log, + "edges = {}, checksum = {}", + x.h.g.edge_count(), + x.checksum() + ); + fwriteln!( log, "\n==========================================================\ @@ -1496,7 +1446,7 @@ pub fn process_barcode( let mut con = Vec::::new(); // good contigs let mut con2 = Vec::::new(); // reject contigs - log_opts.report_perf_stats(log, &t, "before making contigs"); + let mut jsupp = Vec::<(i32, i32)>::new(); // (umis, reads) supporting junction seqs of good contigs make_contigs( @@ -1526,7 +1476,7 @@ pub fn process_barcode( log, log_opts, ); - log_opts.report_perf_stats(log, &t, "after making contigs"); + conx.extend(con.iter().cloned()); conx.extend(con2.iter().cloned()); productive.extend(vec![true; con.len()]); // good contigs == productive contigs (non-denovo mode) @@ -1539,7 +1489,9 @@ pub fn process_barcode( })); junction_support.extend(vec![None; con2.len()]); barcode_data_brief.ncontigs = conx.len(); - barcode_data_brief.xucounts = barcode_data.xucounts.clone(); + barcode_data_brief + .xucounts + .clone_from(&barcode_data.xucounts); barcode_data_brief.total_ucounts = barcode_data.total_ucounts; // Compute primer hits to good contigs. @@ -1572,18 +1524,20 @@ pub fn process_barcode( } // Report good contigs. - let mut ann_all = Vec::>::new(); - for b in &con { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - if refdata.refs.is_empty() { - ann_all.push(ann.clone()); - } else { + let ann_all: Vec<_> = con + .iter() + .map(|b| { + if refdata.refs.is_empty() { + return Vec::new(); + } // ◼ There must be a duplicate computation in make_contigs. - annotate_seq_core(b, refdata, &mut ann, true, false, true, log, false); - ann_all.push(ann.clone()); - barcode_data.good_refseqs.extend(ann.iter().map(|a| a.2)); - } - } + let ann = annotate_seq_core(b, refdata, true, false, true, log, false); + barcode_data + .good_refseqs + .extend(ann.iter().map(|a| a.ref_id)); + ann + }) + .collect(); if !con.is_empty() && !log_opts.ngood { fwriteln!(log, "\nGOOD CONTIGS"); for j in 0..con.len() { @@ -1634,8 +1588,7 @@ pub fn process_barcode( for j in 0..con2.len() { let tigname = format!("{}_{}", barcode_data.barcode, con.len() + j + 1); let js = (0, 0); - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq_core(&con2[j], refdata, &mut ann, true, false, true, log, false); + let ann = annotate_seq_core(&con2[j], refdata, true, false, true, log, false); print_contig_info( &tigname, label, @@ -1664,18 +1617,14 @@ pub fn process_barcode( // Check for long unannotated regions and note special case. if !heur.free { - let mut ann = Vec::<(i32, i32, i32, i32, i32)>::new(); - annotate_seq(&con2[j], refdata, &mut ann, true, false, true); - // assert!(is_gd.unwrap_or(false)); -> is_gd == true - is_valid(&con2[j], refdata, &ann, true, log, is_gd); - annotate_seq(&con2[j], refdatax, &mut ann, true, false, true); - if !ann.is_empty() && ann[0].0 >= 200 { + let ann = annotate_seq(&con2[j], refdatax, true, false, true); + if !ann.is_empty() && ann[0].tig_start >= 200 { fwriteln!(log, "note long unannotated region"); } if ann.len() == 1 { - let t = ann[0].2; + let t = ann[0].ref_id; if refdatax.rheaders[t as usize].contains("segment preceding TRBD1 exon 1") { - let start = (ann[0].0 + ann[0].1) as usize; + let start = (ann[0].tig_start + ann[0].match_len) as usize; let n = 20; if start + n <= con2[j].len() { let s = con2[j].slice(start, start + n).to_string(); @@ -1688,6 +1637,27 @@ pub fn process_barcode( } // Finish up logging. +} - log_opts.report_perf_stats(log, &t, "after reporting rejects"); +// Define the complexity of an alignment to be its number of mismatches plus +// its number of indel operations, where an indel is a deletion or insertion of +// an arbitrary number of bases. Ignores clips. + +pub fn complexity(a: &Alignment) -> usize { + let ops = &a.operations; + let (mut comp, mut i) = (0, 0); + while i < ops.len() { + if ops[i] == Del || ops[i] == Ins { + let mut j = i + 1; + while j < ops.len() && ops[j] == ops[i] { + j += 1; + } + comp += 1; + i = j - 1; + } else if ops[i] == Subst { + comp += 1; + } + i += 1; + } + comp } diff --git a/lib/rust/vdj_asm_utils/src/ref_free.rs b/lib/rust/vdj_asm_utils/src/ref_free.rs index acf2a53..d767daa 100644 --- a/lib/rust/vdj_asm_utils/src/ref_free.rs +++ b/lib/rust/vdj_asm_utils/src/ref_free.rs @@ -3,15 +3,11 @@ #![allow(clippy::many_single_char_names)] -use crate::log_opts::LogOpts; use graph_simple::GraphSimple; use hyperbase::Hyper; -use perf_stats::elapsed; use std::cmp::max; -use std::io::prelude::*; use std::iter::zip; use std::mem::swap; -use std::time::Instant; use vector_utils::{ bin_member, bin_position1_2, count_instances, erase_if, make_freq, next_diff, next_diff1_2, next_diff1_3, reverse_sort, unique_sort, @@ -605,13 +601,13 @@ pub fn branch_clean(x: &mut Hyper, umi_id: &[i32]) { if j == yy.len() { break; } - let k = next_diff1_3(&yy, j as i32); - for l in j + 1..k as usize { + let k = next_diff1_3(&yy, j); + for l in j + 1..k { if yy[j].1 >= 10 * max(1, yy[l].1) { z.push((yy[l].2, yy[l].0)); } } - j = k as usize; + j = k; } z.sort_unstable(); // z = { (branchid, u ) } to kill let mut j = 0; @@ -619,13 +615,13 @@ pub fn branch_clean(x: &mut Hyper, umi_id: &[i32]) { if j == z.len() { break; } - let k = next_diff1_2(&z, j as i32); - let us = z[j..k as usize].iter().map(|(_, l)| *l).collect::>(); + let k = next_diff1_2(&z, j); + let us = z[j..k].iter().map(|(_, l)| *l).collect::>(); let b = z[j].0; let e = x.h.g.e_from(v, b as usize); dels[e].append(&mut us.clone()); dels[x.inv[e] as usize].append(&mut us.clone()); - j = k as usize; + j = k; } } for e in 0..x.h.g.edge_count() { @@ -1084,8 +1080,7 @@ pub fn path_clean(x: &mut Hyper, umi_id: &[i32]) { // dozen or so samples, and relative to the metrics we used to evaluate them, this // was the best choice amongst those tested. -pub fn simplify_without_ref(x: &mut Hyper, umi_id: &[i32], log: &mut Vec, log_opts: &LogOpts) { - let t = Instant::now(); +pub fn simplify_without_ref(x: &mut Hyper, umi_id: &[i32]) { let verbose = false; if verbose { printme!(x.h.g.edge_count(), x.checksum()); @@ -1094,13 +1089,6 @@ pub fn simplify_without_ref(x: &mut Hyper, umi_id: &[i32], log: &mut Vec, lo power_clean(x, umi_id); comp_clean(x, umi_id); - if log_opts.clock { - fwriteln!( - log, - "in simp, {:.1} seconds used after comp_clean", - elapsed(&t) - ); - } if verbose { println!("\ncalling simple_simp.1"); @@ -1149,13 +1137,6 @@ pub fn simplify_without_ref(x: &mut Hyper, umi_id: &[i32], log: &mut Vec, lo printme!(x.h.g.edge_count(), x.checksum()); } solo_clean(x, umi_id); - if log_opts.clock { - fwriteln!( - log, - "in simp, {:.1} seconds used after solo_clean", - elapsed(&t) - ); - } simple_simp(x, umi_id, 5, 50); simple_simp(x, umi_id, 3, 8); @@ -1200,13 +1181,6 @@ pub fn simplify_without_ref(x: &mut Hyper, umi_id: &[i32], log: &mut Vec, lo simple_simp(x, umi_id, 2, 8); simple_simp_type(x, umi_id); - if log_opts.clock { - fwriteln!( - log, - "in simp, {:.1} seconds used after simple_simp_type", - elapsed(&t) - ); - } if verbose { println!("\ncalling path_clean"); @@ -1215,13 +1189,6 @@ pub fn simplify_without_ref(x: &mut Hyper, umi_id: &[i32], log: &mut Vec, lo printme!(x.h.g.edge_count(), x.checksum()); } path_clean(x, umi_id); - if log_opts.clock { - fwriteln!( - log, - "in simp, {:.1} seconds used after path_clean", - elapsed(&t) - ); - } if verbose { println!("\ncalling pop_bubbles"); diff --git a/lib/rust/vdj_asm_utils/src/sw.rs b/lib/rust/vdj_asm_utils/src/sw.rs index e6b5588..823b87d 100644 --- a/lib/rust/vdj_asm_utils/src/sw.rs +++ b/lib/rust/vdj_asm_utils/src/sw.rs @@ -2,7 +2,7 @@ use crate::constants::UmiType; use bio; use bio::alignment::{Alignment, AlignmentOperation}; use itertools::Itertools; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use std::cmp; pub type Scoring = bio::alignment::pairwise::Scoring; diff --git a/lib/rust/vdj_filter_barcodes/Cargo.toml b/lib/rust/vdj_filter_barcodes/Cargo.toml new file mode 100644 index 0000000..e5cb381 --- /dev/null +++ b/lib/rust/vdj_filter_barcodes/Cargo.toml @@ -0,0 +1,76 @@ +[dependencies] +arrayref = '0.3' + +[dependencies.anyhow] +workspace = true + +[dependencies.barcode] +path = '../barcode' + +[dependencies.bio] +workspace = true + +[dependencies.cr_types] +path = '../cr_types' + +[dependencies.debruijn] +workspace = true + +[dependencies.enclone_ranger] +path = '../enclone_ranger' + +[dependencies.fastq_set] +workspace = true + +[dependencies.itertools] +workspace = true + +[dependencies.martian] +workspace = true + +[dependencies.martian-derive] +workspace = true + +[dependencies.martian-filetypes] +workspace = true + +[dependencies.metric] +path = '../metric' + +[dependencies.serde] +workspace = true + +[dependencies.strum] +workspace = true + +[dependencies.strum_macros] +workspace = true + +[dependencies.tenkit2] +path = '../tenkit2' + +[dependencies.vdj_ann] +path = '../vdj_ann' + +[dependencies.vdj_asm_utils] +path = '../vdj_asm_utils' + +[dependencies.vdj_types] +path = '../vdj_types' + +[dependencies.vector_utils] +path = '../vector_utils' + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'vdj_filter_barcodes' +publish = false +version = '0.1.0' + +[package.metadata] +[package.metadata.cargo-machete] +ignored = ['martian'] diff --git a/lib/rust/vdj_asm_utils/src/filter_barcodes.rs b/lib/rust/vdj_filter_barcodes/src/filter_barcode_level.rs similarity index 65% rename from lib/rust/vdj_asm_utils/src/filter_barcodes.rs rename to lib/rust/vdj_filter_barcodes/src/filter_barcode_level.rs index 396397a..ce41d21 100644 --- a/lib/rust/vdj_asm_utils/src/filter_barcodes.rs +++ b/lib/rust/vdj_filter_barcodes/src/filter_barcode_level.rs @@ -1,18 +1,137 @@ -use crate::barcode_data::{BarcodeDataBrief, ContigChimeraData, ContigJunctionData}; use crate::filter_log::{AsmCellFilter, FilterLogEntry, FilterLogger, LowConfidenceReason}; use anyhow::Result; use barcode::whitelist::BarcodeId; use barcode::BcSegSeq; +use bio::alignment::distance::simd::hamming; use cr_types::chemistry::BarcodeReadComponent; use debruijn::dna_string::DnaString; use metric::TxHashMap; +use serde::Serialize; use std::cmp::{max, min}; use std::collections::HashSet; use std::ops::Range; use tenkit2::pack_dna::pack_bases_80; use vdj_ann::annotate::ContigAnnotation; +use vdj_asm_utils::barcode_data::{BarcodeDataBrief, ContigChimeraData, ContigJunctionData}; use vdj_types::{VdjChain, VdjRegion}; +const MIN_PREFIX_MATCH: usize = 25; + +pub fn count_prefix_matches_allowing_mismatches( + seq1: impl Iterator, + seq2: impl Iterator, + allowed_mismatches: usize, +) -> usize { + let mut mismatch_count = 0; + let mut score = 0; + + for (a, b) in seq1.zip(seq2) { + if a != b { + mismatch_count += 1; + if mismatch_count > allowed_mismatches { + break; + } + } + score += 1; + } + + score +} + +pub fn compute_prefix_matches(ann_i: &ContigAnnotation, ann_j: &ContigAnnotation) -> usize { + const ALLOWED_MISMATCHES: usize = 1; + + match ( + ann_i.get_region(VdjRegion::V), + ann_j.get_region(VdjRegion::V), + ) { + // Check if both the contigs contain the starting reference base of the V region. + // is the V region fully assembled? + (Some(region_i), Some(region_j)) + if region_i.annotation_match_start == 0 && region_j.annotation_match_start == 0 => + { + let min_v_start = region_i.contig_match_start.min(region_j.contig_match_start); + // Define the start position to include the common stretch of 5P UTR + let ann_i_start = region_i.contig_match_start - min_v_start; + let ann_j_start = region_j.contig_match_start - min_v_start; + + count_prefix_matches_allowing_mismatches( + ann_i.sequence.chars().skip(ann_i_start), + ann_j.sequence.chars().skip(ann_j_start), + ALLOWED_MISMATCHES, + ) + } + _ => { + let seq_i = &ann_i.sequence; + let seq_j = &ann_j.sequence; + + (0..seq_i.len()) + .map(|i| { + count_prefix_matches_allowing_mismatches( + seq_i.chars().skip(i), + seq_j.chars(), + ALLOWED_MISMATCHES, + ) + }) + .chain((0..seq_j.len()).map(|j| { + count_prefix_matches_allowing_mismatches( + seq_i.chars(), + seq_j.chars().skip(j), + ALLOWED_MISMATCHES, + ) + })) + .max() + .unwrap_or_default() + } + } +} + +pub fn barcode_has_chimeric_contig( + all_annotations: &[ContigAnnotation], + barcode: String, + mut filter_logger: Option<&mut FilterLogger>, +) -> bool { + let mut has_chimeric_contigs = false; + // for each barcode, go through the list of contigs associated with that barcode. + // Look for contigs whose CDR3 sequences are different, i.e. more than 1 hamming distance apart. + // If those contigs have the same prefix, then these are likely chimeric contigs formed by insert priming. + // Note that these could also be cell multiplets if multiple cells have the same V region and different CDR3. + + // only include annotations with a defined CDR3 + let annotations: Vec<&ContigAnnotation> = all_annotations + .iter() + .filter(|&ann| ann.cdr3_seq.is_some()) + .collect(); + + for (i, ann_i) in annotations.iter().enumerate() { + let cdr3_i = ann_i.cdr3_seq.as_ref().unwrap(); + let contig_i_name = &ann_i.contig_name; + for ann_j in annotations.iter().skip(i + 1) { + let cdr3_j = ann_j.cdr3_seq.as_ref().unwrap(); + let contig_j_name = &ann_j.contig_name; + if (cdr3_i.len() == cdr3_j.len()) && (hamming(cdr3_i.as_bytes(), cdr3_j.as_bytes()) < 2) + { + continue; + } + let common_prefix_length = compute_prefix_matches(ann_i, ann_j); + if common_prefix_length >= MIN_PREFIX_MATCH { + has_chimeric_contigs = true; + if let Some(ref mut logger) = filter_logger { + logger.log(&FilterLogEntry::cell_calling( + barcode.clone(), + AsmCellFilter::InsertPriming { + common_prefix_length, + contig1_name: contig_i_name.to_string(), + contig2_name: contig_j_name.to_string(), + }, + )); + } + } + } + } + has_chimeric_contigs +} + pub fn confidence_filter( filter_params: &BarcodeFilteringParams, n50_n50_rpu: i32, @@ -195,14 +314,14 @@ pub fn overhang_demux_filter( map_multiplexing_seq_to_id(&bc.barcode, &overhang_seq_to_id, &overhang_range); if !valid_overhang_ids.contains(&multiplexing_id) { bc.now_a_cell = false; - } - if let Some(ref mut logger) = filter_logger { - logger.log(&FilterLogEntry::cell_calling( - bc.barcode.clone(), - AsmCellFilter::DifferentOverhang { - overhang_id: multiplexing_id.as_str().to_owned(), - }, - )); + if let Some(ref mut logger) = filter_logger { + logger.log(&FilterLogEntry::cell_calling( + bc.barcode.clone(), + AsmCellFilter::DifferentOverhang { + overhang_id: multiplexing_id.as_str().to_owned(), + }, + )); + } } } } @@ -233,7 +352,7 @@ impl Contigs { .to_bytes(), v_ref_id: v as usize, umi_count: contig.umi_count, - productive: contig.productive.unwrap() && is_cell, + is_cell_and_productive: contig.productive.unwrap() && is_cell, }); } } @@ -455,3 +574,80 @@ impl BarcodeFilteringParams { }) } } + +#[cfg(test)] +mod tests { + use super::*; + use itertools::Itertools; + use martian_filetypes::json_file::JsonFile; + use martian_filetypes::FileTypeRead; //, LazyFileTypeIO}; + //use std::collections::HashMap; + #[test] + fn test_barcode_has_chimeric_contig() { + // contig_annotations_test defines 6 barcodes. + // Barcode 1 has two identical contigs --> Not a chimera + // Barcode 2 has two contigs with identical V regions and different CDR3 --> chimera + // Barcode 3 has two contigs, the V regions are identical with one mismatch, different CDR3s --> chimera + // Barcode 4 has two contigs, the V regions are identical with two mismatches, different CDR3s --> Not a chimera + // Barcode 5 has two contigs, the V regions have one mismatch, one of the CDR3 sequences is Null -> Not a chimera + // Barcode 6 has two contigs, identical V regions but the second contig is missing the first 20 bases, + // different CDR3s --> chimera + let contig_annotations_json = JsonFile::from("test/contig_annotations_test.json"); + let annotations: Vec = contig_annotations_json.read().unwrap(); + let grouped_annotations = annotations + .into_iter() + .into_group_map_by(|ann| ann.barcode.clone()); + let results_is_cell = [true, false, false, true, true, false]; + for (c, bc) in [ + "Barcode 1", + "Barcode 2", + "Barcode 3", + "Barcode 4", + "Barcode 5", + "Barcode 6", + ] + .into_iter() + .enumerate() + { + let has_chimeric_contig = + barcode_has_chimeric_contig(&grouped_annotations[bc], bc.to_string(), None); + assert!(has_chimeric_contig != results_is_cell[c]); + } + } + #[test] + fn test_count_prefix_matches_allowing_mismatches() { + // AGACTTCAGCTATG sequence 1 + // || |||||||| + // AGTCTTCAGCTGAT sequence 2 + // max matching prefix allowing 1 mismatch should be 11 + let mut res = count_prefix_matches_allowing_mismatches( + "AGACTTCAGCTATG".chars(), + "AGTCTTCAGCTGAT".chars(), + 1, + ); + assert!(res == 11); + // max matching prefix allowing 3 mismatches should be 13 + res = count_prefix_matches_allowing_mismatches( + "AGACTTCAGCTATG".chars(), + "AGTCTTCAGCTGAT".chars(), + 3, + ); + assert!(res == 13); + } + #[test] + fn test_compute_prefix_matches() { + let contig_annotations = JsonFile::from("test/contig_annotations_test.json"); + let annotations: Vec = contig_annotations.read().unwrap(); + let ann_i = annotations[0].clone(); + let mut res = compute_prefix_matches(&ann_i, &ann_i); + assert!( + res == ann_i.sequence.len(), + "Comparing the same sequence. Prefix match length should equal sequence length" + ); + let mut ann_j = ann_i.clone(); + let pos = 5; + ann_j.sequence.insert_str(pos, "XXX"); + res = compute_prefix_matches(&ann_i, &ann_j); + assert!(res == (pos + 1)); // allowing for one mismatch + } +} diff --git a/lib/rust/vdj_filter_barcodes/src/filter_clonotype_level.rs b/lib/rust/vdj_filter_barcodes/src/filter_clonotype_level.rs new file mode 100644 index 0000000..6262750 --- /dev/null +++ b/lib/rust/vdj_filter_barcodes/src/filter_clonotype_level.rs @@ -0,0 +1,119 @@ +use crate::filter_log::{AsmCellFilter, FilterLogEntry, FilterLogger}; +use serde::Serialize; +use std::collections::HashMap; +use strum::IntoEnumIterator; +use strum_macros::{Display, EnumIter}; +use vdj_ann::annotate::ContigAnnotation; +use vdj_asm_utils::exact_clonotyping::ExactClonotype; + +#[derive(Debug)] +pub struct WhitelistContamInfo { + pub barcode: String, + pub umis: usize, +} + +#[derive(Serialize, EnumIter, Display)] +#[serde(rename_all = "snake_case")] +pub enum GelBeadBarcodeHalf { + #[strum(to_string = "part_a")] + PartA, + #[strum(to_string = "part_b")] + PartB, +} + +impl WhitelistContamInfo { + fn part(&self, which_part: &GelBeadBarcodeHalf) -> &str { + // TODO (CELLRANGER-8643) exclude OH sequence from partA/B definition + match which_part { + GelBeadBarcodeHalf::PartA => &self.barcode[0..8], + GelBeadBarcodeHalf::PartB => &self.barcode[8..16], + } + } +} + +/// Construct a nested vector where each inner vector corresponds to an exact clonotype and contains +/// `WhitelistContamInfo` for each barcode. The `WhitelistContamInfo` includes the barcode and +/// total UMI counts associated with with productive contigs for that barcode. +pub fn build_wlcontaminfo_per_exact_clonotype( + contigs: &[ContigAnnotation], + clonotypes: Vec, +) -> Vec> { + let contig_umis_per_bc = contigs + .iter() + .filter(|c| c.is_cell && c.is_productive()) + .fold(HashMap::new(), |mut acc, contig| { + *acc.entry(&contig.barcode).or_insert(0) += contig.umi_count; + acc + }); + + clonotypes + .into_iter() + .map(|c| { + c.barcodes + .iter() + .map(|bc| WhitelistContamInfo { + barcode: bc.to_string(), + umis: *contig_umis_per_bc.get(bc).unwrap_or(&0), + }) + .collect() + }) + .collect() +} + +pub fn whitelist_contamination_filter( + barcodes: &Vec, + mut filter_logger: Option<&mut FilterLogger>, +) -> Vec { + const GB_UMI_MULT: usize = 10; + const GB_MIN_FRAC: f64 = 0.2; + + struct WLContaminants { + barcode: String, + max_group_umis: usize, + umis: usize, + } + + fn is_contam(group: &[&WhitelistContamInfo], exact_clonotype_size: f64) -> Vec { + let max_umis = group.iter().map(|i| i.umis).max().unwrap(); + let contam_bcs: Vec = group + .iter() + .filter(|info| max_umis >= GB_UMI_MULT * info.umis) + .map(|info| WLContaminants { + barcode: info.barcode.clone(), + max_group_umis: max_umis, + umis: info.umis, + }) + .collect(); + // TODO(CELLRANGER-8639): Re-evaluate the GB_MIN_FRAC threshold + if contam_bcs.len() as f64 / exact_clonotype_size >= GB_MIN_FRAC { + return contam_bcs; + } + Vec::new() + } + let exact_clonotype_size = barcodes.len() as f64; + let mut filtered_bcs: Vec = Vec::new(); + for bc_part in GelBeadBarcodeHalf::iter() { + let mut same_part: HashMap<&str, Vec<&WhitelistContamInfo>> = HashMap::new(); + for bc in barcodes { + same_part.entry(bc.part(&bc_part)).or_default().push(bc); + } + let contam: Vec = same_part + .iter() + .flat_map(|(_, v)| is_contam(v, exact_clonotype_size)) + .collect(); + for c in contam { + filtered_bcs.push(c.barcode.clone()); + if let Some(ref mut logger) = filter_logger { + logger.log(&FilterLogEntry::cell_calling( + c.barcode.clone(), + AsmCellFilter::GelBeadContamination { + shared_sequence: bc_part.to_string(), + max_group_umis: c.max_group_umis, + umis: c.umis, + }, + )); + } + } + } + filtered_bcs +} diff --git a/lib/rust/vdj_filter_barcodes/src/filter_library_level.rs b/lib/rust/vdj_filter_barcodes/src/filter_library_level.rs new file mode 100644 index 0000000..e0e9064 --- /dev/null +++ b/lib/rust/vdj_filter_barcodes/src/filter_library_level.rs @@ -0,0 +1,782 @@ +// TODO: fix these. +#![allow(clippy::needless_range_loop)] + +use crate::filter_barcode_level::BarcodeCellInfo; +use crate::filter_log::{ + AsmCellFilter, FilterLogEntry, FilterLogger, FilterSwitch, IndelErrorMode, +}; +use barcode::{Barcode, BcSeq}; +use debruijn::dna_string::DnaString; +use fastq_set::sseq::{HammingIterOpt, InsertionIterOpt}; +use itertools::Itertools; +use std::cmp::{max, min}; +use std::collections::{HashMap, HashSet}; +use tenkit2::pack_dna::unpack_bases_80; +use vdj_asm_utils::barcode_data::ContigChimeraData; +use vdj_asm_utils::exact_clonotyping::{BarcodeContigUMI, ProductiveContig}; +use vector_utils::{ + bin_member, bin_position, bin_position1_3, erase_if, lower_bound, next_diff, next_diff1_2, + next_diff1_5, reverse_sort, unique_sort, upper_bound, +}; + +pub fn whitelist_indel_filter( + exact_contigs: HashMap>, + mut filter_logger: Option<&mut FilterLogger>, +) -> Vec { + const GB_UMI_MULT: usize = 10; + + struct Indels { + insertions: Vec, + insertions_1hd: Vec, + deletions: Vec, + deletions_1hd: Vec, + } + + impl Indels { + fn generate(source_bc: &BcSeq) -> Self { + let insertions: Vec = source_bc + .one_insertion_iter(InsertionIterOpt::ExcludeNBase) + .map(|bc| BcSeq::from_bytes(&bc.as_bytes()[..bc.len() - 1])) + .collect(); + let insertions_1hd: Vec = source_bc + .one_insertion_iter(InsertionIterOpt::ExcludeNBase) + .flat_map(|i| i.one_hamming_iter(HammingIterOpt::SkipNBase)) + .map(|bc| BcSeq::from_bytes(&bc.as_bytes()[..bc.len() - 1])) + .collect(); + let deletions: Vec = source_bc + .one_deletion_iter() + .map(|bc| BcSeq::from_bytes(bc.as_bytes())) + .collect(); + let deletions_1hd: Vec = source_bc + .one_deletion_iter() + .flat_map(|i| i.one_hamming_iter(HammingIterOpt::SkipNBase)) + .map(|bc| BcSeq::from_bytes(bc.as_bytes())) + .collect(); + Indels { + insertions, + insertions_1hd, + deletions, + deletions_1hd, + } + } + } + + fn find_source_bcs(exact_contig: &[BarcodeContigUMI]) -> Vec<&BarcodeContigUMI> { + let mut source_bcs: Vec<&BarcodeContigUMI> = vec![]; + for this_bc in exact_contig { + if exact_contig + .iter() + .any(|bc| this_bc.umi >= bc.umi * GB_UMI_MULT) + { + source_bcs.push(this_bc.to_owned()); + } + } + source_bcs + } + + struct GBIndels { + sink_barcode: Barcode, + sink_umis: usize, + source_barcode: Barcode, + source_umis: usize, + error_mode: IndelErrorMode, + } + + fn find_matching_prefix(fulllen_bcs: &HashSet<&[u8]>, prefix: &[u8]) -> Option { + fulllen_bcs + .iter() + .find(|bc| &bc[..15] == prefix) + .map(|bc| Barcode::with_seq(1, BcSeq::from_bytes(bc), true)) + } + + fn is_contam(exact_contig: &[BarcodeContigUMI]) -> Vec { + let mut gb_indels: Vec = Vec::new(); + let mut contam_bcs: HashSet = HashSet::new(); + for source in find_source_bcs(exact_contig) { + if contam_bcs.contains(&source.barcode) { + continue; + } + let indels = Indels::generate(source.barcode.content.sequence()); + let sink_umi_map: HashMap = exact_contig + .iter() + .filter(|bc| !contam_bcs.contains(&bc.barcode)) + .filter(|bc| source.umi >= bc.umi * GB_UMI_MULT) + .map(|bc| (bc.barcode, bc.umi)) + .collect(); + let mut sink_fulllen: HashSet<&[u8]> = sink_umi_map + .keys() + .map(barcode::Barcode::sequence_bytes) + .collect(); + let mut sink_truncated: HashSet<&[u8]> = sink_umi_map + .keys() + .map(|bc| &bc.sequence_bytes()[..bc.sequence_bytes().len() - 1]) + .collect(); + + let mut check = |variants: &[BcSeq], error_mode: &IndelErrorMode| { + for var in variants { + if let Some(sink_bc) = match error_mode { + IndelErrorMode::Insertion | IndelErrorMode::InsertionWithCorrection => { + if sink_fulllen.contains(var.as_bytes()) { + let sink_bc = Barcode::with_seq(1, *var, true); + sink_fulllen.remove(var.as_bytes()); + sink_truncated.remove(&var.as_bytes()[..var.len() - 1]); + Some(sink_bc) + } else { + None + } + } + IndelErrorMode::Deletion | IndelErrorMode::DeletionWithCorrection => { + if sink_truncated.contains(var.as_bytes()) { + let sink_bc = + find_matching_prefix(&sink_fulllen, var.as_bytes()).unwrap(); + sink_truncated.remove(var.as_bytes()); + sink_fulllen.remove(sink_bc.sequence_bytes()); + Some(sink_bc) + } else { + None + } + } + } { + contam_bcs.insert(sink_bc); + gb_indels.push(GBIndels { + sink_barcode: sink_bc, + sink_umis: sink_umi_map[&sink_bc], + source_barcode: source.barcode, + source_umis: source.umi, + error_mode: *error_mode, + }); + } + } + }; + + check(&indels.insertions, &IndelErrorMode::Insertion); + check( + &indels.insertions_1hd, + &IndelErrorMode::InsertionWithCorrection, + ); + check(&indels.deletions, &IndelErrorMode::Deletion); + check( + &indels.deletions_1hd, + &IndelErrorMode::DeletionWithCorrection, + ); + } + gb_indels + } + + exact_contigs + .into_iter() + .filter(|(_, bcs)| bcs.len() > 1) + .filter(|(_, bcs)| { + let max_umis = bcs.first().unwrap().umi; + bcs.iter().any(|bc| max_umis >= GB_UMI_MULT * bc.umi) + }) + .flat_map(|(_, bcs)| is_contam(&bcs)) + .map(|indel| { + if let Some(ref mut logger) = filter_logger { + logger.log(&FilterLogEntry::cell_calling( + indel.sink_barcode.to_string(), + AsmCellFilter::GelBeadIndel { + source_sequence: indel.source_barcode.to_string(), + error_mode: indel.error_mode, + sink_contig_umis: indel.sink_umis, + source_contig_umis: indel.source_umis, + }, + )); + } + indel.sink_barcode.to_string() + }) + .collect() +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// ANALYZE BRIEF BARCODE DATA +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Identify productive pairs that should be untrusted based on their relationship +// to large clones. + +pub fn analyze_barcode_data_brief( + d: &[BarcodeCellInfo], + FilterSwitch { + asm_shared_contig, .. + }: FilterSwitch, + kills: &mut Vec, + killsc: &mut Vec, + mut filter_logger: Option<&mut FilterLogger>, +) { + println!("\nUNTRUSTED CONTIGS"); + + chimeric_filters(d, kills, &mut filter_logger); + + if asm_shared_contig { + junction_filters(d, killsc, kills, &mut filter_logger); + common_clone_filters(d, killsc, kills, &mut filter_logger); + } + + unique_sort(kills); + unique_sort(killsc); + println!(); +} + +fn junction_filters( + d: &[BarcodeCellInfo], + killsc: &mut Vec, + kills: &mut Vec, + filter_logger: &mut Option<&mut FilterLogger>, +) { + // Kill contigs that appear to arise from some sort of leakage from plasma cells. We identify + // these by seeing UMI counts that are much smaller than a dominant UMI count, and for which + // the median UMI count is very small. One reason we think this filtering is correct is that + // we observed large clusters arising in a library, and completely absent from a parallel + // library made from the same cell lot. (And this happened multiple times.) Note that + // extreme differences in UMI count appear to be biologically possible (and we observe such), + // so that alone is not characteristic. Note that there is no mechanism here to address the + // case of fake plasma clonal expansions arising where *only* background is present. + // + // This is a messy problem as we have diverse and relatively limited data. + // + // Cases that are fixed now (all GEM-55): + // fake expansion good from same cell lot fake clone + // 124960_100_per 124952_100_per IGH:CAREYPTSYGSGTYYVSPAPFDSW;IGK:CQRYTMSPFISF + // 124552_100_per 124548_100_per IGH:CAKSGAGEIGEYYFGYW;IGL:CQVWDSTSDHRWVF + // 124553_100_per 124549_100_per. + // + // Cases that appear not to be fixable because UMI counts are too similar (all GEM-U, CR 3.0): + // fake expansion good from same cell lot fake clone + // 79209 79210 IGH:CAKHDYSNPQW;IGK:CFQGSHVPFTF + // 86356 86355 IGH:CVRVVEGTSAYDIW;IGL:CTSYTSSSTYVF + // 86228 86227. IGH:CARQSDTGYFEFW;IGL:CQVWDSSTDHPIF + // + // Other cases that might hypothetically be fixable: + // fake expansion good from same cell lot fake clone + // 74447 74446 + // 79211 79212 IGH:CARWGGSSNDYW;IGK:CQQHYSTPYTF + // + // Negative control (case where damage might be done by this algorithm): + // 77225. Compare replicate 77226; + // also matched PBMC 77223,77224 and matched splenocytes 77221,77222. + let mut all = Vec::<([u8; 20], u16, bool, usize, usize)>::new(); + for i in 0..d.len() { + for (j, jundata) in d[i].jundata.iter().enumerate() { + // (junction segment of contig, #umis, confident, index) + all.push((jundata.jxn_seq, jundata.umis, jundata.high_confidence, i, j)); + } + } + all.sort_unstable(); + let mut i = 0; + const MIN_RATIO_UMI: usize = 40; + const MAX_MEDIAN: u16 = 1; + const MIN_CLUSTER: usize = 10; + // was 20 in experiment + while i < all.len() { + let j = next_diff1_5(&all, i); + + // Now i..j is a group of entries in all, each with the same junction segment. + + let median = i + (j - i) / 2; + if j - i >= MIN_CLUSTER && all[median].1 <= MAX_MEDIAN { + let mut alts = Vec::<[u8; 20]>::new(); + for k in i..j { + let u = all[k].3; + for l in 0..d[u].jundata.len() { + if d[u].jundata[l].jxn_seq != all[i].0 { + alts.push(d[u].jundata[l].jxn_seq); + } + } + } + alts.sort_unstable(); + let mut max_alt = 0; + let mut r = 0; + let mut alt_counts = Vec::::new(); + while r < alts.len() { + let s = next_diff(&alts, r); + max_alt = max(max_alt, s - r); + alt_counts.push(s - r); + r = s; + } + reverse_sort(&mut alt_counts); + //if + /* max_alt >= MIN_CLUSTER */ + //0 == 0 + { + for k in i..j { + if all[j - 1].1 as usize >= MIN_RATIO_UMI * max(1, all[k].1 as usize) { + let m = all[k].3; + let x = &d[m]; + for j in 0..x.jundata.len() { + if x.jundata[j].high_confidence { + println!( + "{}: contig {} = possible plasma cell leakage", + x.barcode, + j + 1 + ); + } + killsc.push(format!("{}_contig_{}", x.barcode, j + 1)); + } + println!("{} = possible plasma cell leakage", x.barcode); + println!("alt counts = {}", alt_counts.iter().format(",")); + kills.push(x.barcode.clone()); + if let Some(ref mut logger) = filter_logger { + logger.log(&FilterLogEntry::cell_calling( + x.barcode.clone(), + AsmCellFilter::NonDominantJunction { + contig: format!("{}_contig_{}", x.barcode, all[k].4 + 1), + junction_umis: all[k].1 as usize, + param_min_umi_ratio: MIN_RATIO_UMI, + dominant_contig: format!( + "{}_contig_{}", + d[all[j - 1].3].barcode, + all[j - 1].4 + 1 + ), + dominant_junction_umis: all[j - 1].1 as usize, + cluster_size: j - i, + param_min_cluster_size: MIN_CLUSTER, + cluster_median_junction_umis: all[median].1, + param_max_median_junction_umis: MAX_MEDIAN, + }, + )); + } + } + } + } + } + i = j; + } + // Address a different version of plasma cell leakage. In this case, we observe a junction + // segment having a very high UMI count in one cell, we observe a very low count in another + // cell, these two cells share only one chain (allowing for some mutation), and the "weak" + // cell has at least three chains. + const ALLOWED_DIFFS: i32 = 10; + let mut i = 0; + while i < all.len() { + let j = next_diff1_5(&all, i); + for k1 in i..j { + let i1 = all[k1].3; + if all[k1].2 && all[k1].1 >= MIN_RATIO_UMI as u16 && d[i1].jundata.len() >= 2 { + 'couter: for k2 in i..j { + let i2 = all[k2].3; + if all[k2].2 && all[k2].1 == 1 && d[i2].jundata.len() >= 3 { + let mut commons = 0; + for c1 in 0..d[i1].jundata.len() { + for c2 in 0..d[i2].jundata.len() { + let y1 = &&d[i1].jundata[c1].jxn_seq; // first junction segment + let y2 = &d[i2].jundata[c2].jxn_seq; // second junction segment + if y1 == &y2 { + commons += 1; + } else { + let (mut u1, mut u2) = ([0_u8; 80], [0_u8; 80]); + unpack_bases_80(y1, &mut u1); + unpack_bases_80(y2, &mut u2); + // Should have an ndiffs trait and use it here on u1 and u2, + // same as for DnaStrings. Although, interestingly, the + // structures y1 and y2 are close to DnaStrings and could + // be compared more efficiently as we do for DnaStrings. + let mut dist = 0; + for l in 0..80 { + if u1[l] != u2[l] { + dist += 1; + } + } + if dist <= ALLOWED_DIFFS { + commons += 1; + } + } + if commons > 1 { + continue 'couter; + } + } + } + let x = &d[i2]; + println!("{} = possible type two plasma cell leakage", x.barcode); + kills.push(x.barcode.clone()); + if let Some(ref mut logger) = filter_logger { + logger.log(&FilterLogEntry::cell_calling( + x.barcode.clone(), + AsmCellFilter::WeakJunction { + contig: format!("{}_contig_{}", x.barcode, all[k2].4 + 1), + param_min_dominant_umis: MIN_RATIO_UMI, + dominant_contig: format!( + "{}_contig_{}", + d[all[k1].3].barcode, + all[k1].4 + 1 + ), + dominant_junction_umis: all[k1].1 as usize, + }, + )); + } + } + } + } + } + i = j; + } +} + +fn chimeric_filters( + d: &[BarcodeCellInfo], + kills: &mut Vec, + filter_logger: &mut Option<&mut FilterLogger>, +) { + // Look for chimeric contigs. For a given cdr3_nt, consider the V segments that appear in + // contigs. If one has collective support at least 100 times greater than another, then + // untrust the weaker contigs. + const CHIM_RATIO: usize = 100; + let mut all_chimdata = d + .iter() + .flat_map(|bc| bc.chimdata.clone()) + .collect::>(); + all_chimdata.sort(); + let mut i = 0; + while i < all_chimdata.len() { + let mut j = i + 1; + let j = loop { + if j == all_chimdata.len() || all_chimdata[j].cdr3 != all_chimdata[i].cdr3 { + break j; + } + j += 1; + }; + let mut vu = Vec::<(usize, usize)>::new(); + for k in i..j { + vu.push((all_chimdata[k].v_ref_id, all_chimdata[k].umi_count)); + } + let mut uv = Vec::<(usize, usize)>::new(); + let mut r = 0; + while r < vu.len() { + let s = next_diff1_2(&vu, r); + let mut numi = 0; + for m in r..s { + numi += vu[m].1; + } + uv.push((numi, vu[r].0)); + r = s; + } + reverse_sort(&mut uv); + let mut bads = Vec::::new(); + for m in 1..uv.len() { + if uv[0].0 >= 1 && uv[0].0 >= CHIM_RATIO * uv[m].0 { + bads.push(uv[m].1); + } + } + bads.sort_unstable(); + + for k in i..j { + if all_chimdata[k].is_cell_and_productive { + let t = all_chimdata[k].v_ref_id; + if bin_member(&bads, &t) { + kills.push(all_chimdata[k].barcode.clone()); + println!("{} = possible chimera", all_chimdata[k].barcode); + if let Some(ref mut logger) = filter_logger { + logger.log(&FilterLogEntry::cell_calling( + all_chimdata[k].barcode.clone(), + AsmCellFilter::ChimericContig { + cdr3_nt: DnaString::from_bytes(&all_chimdata[i].cdr3).to_string(), + param_chimera_ratio: CHIM_RATIO, + contig_v_region_id: t, + dominant_v_region_id: uv[0].1, + dominant_v_region_umis: uv[0].0, + }, + )); + } + } + } + } + i = j; + } +} + +fn common_clone_filters( + d: &[BarcodeCellInfo], + killsc: &mut Vec, + kills: &mut Vec, + filter_logger: &mut Option<&mut FilterLogger>, +) { + // Find two-chain productive pairs and their frequency. + let mut pairs = Vec::<([u8; 20], [u8; 20])>::new(); + for i in 0..d.len() { + if d[i].jundata.len() != 2 || !(d[i].paired && d[i].now_a_cell) { + continue; + } + if d[i].jundata[0].jxn_seq <= d[i].jundata[1].jxn_seq { + pairs.push((d[i].jundata[0].jxn_seq, d[i].jundata[1].jxn_seq)); + } else { + pairs.push((d[i].jundata[1].jxn_seq, d[i].jundata[0].jxn_seq)); + } + } + pairs.sort_unstable(); + let mut pairsu = Vec::<([u8; 20], [u8; 20])>::new(); + let mut pairsf = Vec::::new(); + let mut j = 0; + while j < pairs.len() { + let mut k = j + 1; + loop { + if k == pairs.len() || pairs[k] != pairs[j] { + break; + } + k += 1; + } + pairsu.push((pairs[j].0, pairs[j].1)); + pairsf.push((k - j) as i32); + j = k; + } + // Find transcripts that appear in these two-chain productive pairs, and the max + // frequency that was observed for each. Also track the partner. + let mut u = Vec::<([u8; 20], i32, [u8; 20])>::new(); + for i in 0..pairsu.len() { + u.push((pairsu[i].0, pairsf[i], pairsu[i].1)); + u.push((pairsu[i].1, pairsf[i], pairsu[i].0)); + } + u.sort_unstable(); + let mut to_delete = vec![false; u.len()]; + let mut i = 0; + while i < u.len() { + let mut j = i + 1; + while j < u.len() { + if u[j].0 != u[i].0 { + break; + } + j += 1; + } + for k in i..j - 1 { + to_delete[k] = true; + } + i = j; + } + erase_if(&mut u, &to_delete); + // Make list of the junction segments for the case where there are two or more + // confident contigs. + let mut bigs = Vec::>::new(); + for i in 0..d.len() { + let x = &d[i]; + let mut jundata = x.jundata.clone(); + let mut to_delete = vec![false; jundata.len()]; + for i in 0..jundata.len() { + if !jundata[i].high_confidence { + to_delete[i] = true; + } + } + erase_if(&mut jundata, &to_delete); + if jundata.len() >= 2 { + let mut big = Vec::<[u8; 20]>::new(); + for i in 0..jundata.len() { + big.push(jundata[i].jxn_seq); + } + big.sort_unstable(); + bigs.push(big); + } + } + bigs.sort(); + // Identify contigs that should now be labeled low confidence. + const MAX_KILL: i32 = 3; + const MIN_RATIO: i32 = 10; + const MIN_RATIO_BIG: i32 = 50; + const ALLOWED_DIFFS: i32 = 10; + for i in 0..d.len() { + // Remove the low-confidence contigs. Ignore after that if only one contig is left. + + let x = &d[i]; + let mut jundata = x.jundata.clone(); + let mut to_delete = vec![false; jundata.len()]; + for i in 0..jundata.len() { + if !jundata[i].high_confidence { + to_delete[i] = true; + } + } + erase_if(&mut jundata, &to_delete); + if jundata.len() <= 1 { + continue; + } + + // Anything seen rarely and involving a very common clone is deemed + // dubious, probably a doublet. + + if jundata.len() >= 2 { + let mut big = Vec::<[u8; 20]>::new(); + for i in 0..jundata.len() { + big.push(jundata[i].jxn_seq); + } + big.sort_unstable(); + let low = lower_bound(&bigs, &big); + let high = upper_bound(&bigs, &big); + let mut max_freq = 0_i32; + let mut best_l = -1_i32; + let mut best_j = -1_i32; + for j in 0..jundata.len() { + let l = bin_position1_3(&u, &jundata[j].jxn_seq); + if l >= 0 && u[l as usize].1 > max_freq { + max_freq = u[l as usize].1; + best_l = l; + best_j = j as i32; + } + } + let mult = (high - low) as i32; + if mult <= MAX_KILL && max_freq >= MIN_RATIO_BIG * mult { + // + // Try to avoid being tricked by somatic hypermutation. + + let mut protected = false; + if jundata.len() == 2 { + let p1 = &&jundata[(1 - best_j) as usize].jxn_seq; + let p2 = &u[best_l as usize].2; + let (mut u1, mut u2) = ([0_u8; 80], [0_u8; 80]); + unpack_bases_80(p1, &mut u1); + unpack_bases_80(p2, &mut u2); + let mut dist = 0; + for l in 0..80 { + if u1[l] != u2[l] { + dist += 1; + } + } + if dist <= ALLOWED_DIFFS { + protected = true; + } + } + if !protected { + for j in 0..x.jundata.len() { + if x.jundata[j].high_confidence { + println!("{}: contig {}", x.barcode, j + 1); + } + killsc.push(format!("{}_contig_{}", x.barcode, j + 1)); + } + kills.push(x.barcode.clone()); + println!("{}", x.barcode); + if let Some(ref mut logger) = *filter_logger { + logger.log(&FilterLogEntry::cell_calling( + x.barcode.clone(), + AsmCellFilter::CommonCloneShadow { + multiplicity: mult as usize, + max_multiplicity: max_freq as usize, + param_max_kill: MAX_KILL as usize, + param_min_ratio_big: MIN_RATIO_BIG as usize, + }, + )); + } + continue; + } + } + } + + // Now assume just two contigs. + + if jundata.len() != 2 { + continue; + } + let min_umis = min(jundata[0].umis, jundata[1].umis); + let p = if jundata[0].jxn_seq <= jundata[1].jxn_seq { + (jundata[0].jxn_seq, jundata[1].jxn_seq) + } else { + (jundata[1].jxn_seq, jundata[0].jxn_seq) + }; + let l = bin_position(&pairsu, &p); + let freq = if l >= 0 { pairsf[l as usize] } else { 0_i32 }; + if freq > MAX_KILL { + continue; + } + let (mut max_alt_freq, mut min_alt_freq) = (0_i32, 1000000000_i32); + for j in 0..2 { + let l = bin_position1_3(&u, &jundata[j].jxn_seq); + if l >= 0 { + max_alt_freq = max(max_alt_freq, u[l as usize].1); + min_alt_freq = min(min_alt_freq, u[l as usize].1); + } + } + + // The model here is that a single stray UMI from a common clone + // floats into a GEM. + + if max_alt_freq >= MIN_RATIO * max(1, freq) && min_umis == 1 { + for j in 0..x.jundata.len() { + if x.jundata[j].umis <= 1 && x.jundata[j].high_confidence { + println!("{}: contig {}", x.barcode, j + 1); + killsc.push(format!("{}_contig_{}", x.barcode, j + 1)); + } + } + kills.push(x.barcode.clone()); + if let Some(ref mut logger) = filter_logger { + logger.log(&FilterLogEntry::cell_calling( + x.barcode.clone(), + AsmCellFilter::CommonCloneShadowSingleUmi { + multiplicity: freq as usize, + max_multiplicity: max_alt_freq as usize, + param_max_kill: MAX_KILL as usize, + param_min_ratio_big: MIN_RATIO_BIG as usize, + }, + )); + } + println!("{}", x.barcode); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::str::FromStr; + use vdj_asm_utils::exact_clonotyping::ProductiveContig; + use vdj_types::VdjChain; + + fn generate_data( + source_bc: &str, + sink_bc: &str, + source_umi: Option, + sink_umi: Option, + ) -> HashMap> { + let prod_contig = ProductiveContig { + chain: VdjChain::IGH, + cdr3_nt: String::from("ATGC"), + vdj_nt: String::from("ATGCATGC"), + c_ref_name: Some("IGHA1".to_owned()), + jc_delta: Some(0), + }; + let this_test = vec![ + BarcodeContigUMI { + barcode: Barcode::from_str(source_bc).unwrap(), + umi: source_umi.unwrap_or(100), + }, + BarcodeContigUMI { + barcode: Barcode::from_str(sink_bc).unwrap(), + umi: sink_umi.unwrap_or(10), + }, + ]; + HashMap::from([(prod_contig, this_test)]) + } + + #[test] + fn test_1bp_insertion() { + // AAACCATTCACTCATC 16-bp sink sequence + // |||||||||||||| | + // AAACCATTCACTCA-C 15-bp source sequence + let exact_contigs = generate_data("AAACCATTCACTCACT-1", "AAACCATTCACTCATC-1", None, None); + let filtered_bcs = whitelist_indel_filter(exact_contigs, None); + assert_eq!(filtered_bcs, vec![String::from("AAACCATTCACTCATC-1")]); + } + + #[test] + fn test_1bp_insertion_with_correction() { + // AAACCATTCACTCTCG 16-bp sink sequence + // |||||||||||||.| + // AAACCATTCACTCAC- 15-bp source sequence + let exact_contigs = generate_data("AAACCATTCACTCACT-1", "AAACCATTCACTCTCG-1", None, None); + let filtered_bcs = whitelist_indel_filter(exact_contigs, None); + assert_eq!(filtered_bcs, vec![String::from("AAACCATTCACTCTCG-1")]); + } + + #[test] + fn test_1bp_deletion() { + // CCTACATTC-ATAAGT 15-bp sink sequence + // ||||||||| |||||| + // CCTACATTCCATAAGT 16-bp source sequence + let exact_contigs = generate_data("CCTACATTCCATAAGT-1", "CCTACATTCATAAGTC-1", None, None); + let filtered_bcs = whitelist_indel_filter(exact_contigs, None); + assert_eq!(filtered_bcs, vec![String::from("CCTACATTCATAAGTC-1")]); + } + + #[test] + fn test_1bp_deletion_with_correction() { + // CC-ACATTTCATAAGT 15-bp sink sequence + // || |||||.||||||| + // CCTACATTCCATAAGT 16-bp source sequence + let exact_contigs = generate_data("CCTACATTCCATAAGT-1", "CCACATTTCATAAGTC-1", None, None); + let filtered_bcs = whitelist_indel_filter(exact_contigs, None); + assert_eq!(filtered_bcs, vec![String::from("CCACATTTCATAAGTC-1")]); + } +} diff --git a/lib/rust/vdj_asm_utils/src/filter_log.rs b/lib/rust/vdj_filter_barcodes/src/filter_log.rs similarity index 79% rename from lib/rust/vdj_asm_utils/src/filter_log.rs rename to lib/rust/vdj_filter_barcodes/src/filter_log.rs index fe67dee..71b5c1e 100644 --- a/lib/rust/vdj_asm_utils/src/filter_log.rs +++ b/lib/rust/vdj_filter_barcodes/src/filter_log.rs @@ -1,9 +1,10 @@ use anyhow::Result; +use enclone_ranger::main_enclone::CellrangerFilterOpt; use martian_derive::MartianStruct; use martian_filetypes::json_file::JsonFile; use martian_filetypes::lz4_file::Lz4; use martian_filetypes::{LazyFileTypeIO, LazyWrite}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Serialize, Deserialize, Debug, MartianStruct)] pub struct FilterSwitch { @@ -12,14 +13,13 @@ pub struct FilterSwitch { pub asm_shared_contig: bool, /// Turn on/off enclone filters that makes use of shared contigs across clonotypes to detect /// potential artifacts - /// - Sets NGRAPH_FILTER pub enclone_shared_contig: bool, /// Filters that remove putative doublets - /// - Sets NWEAK_CHAINS, NFOURSIE_KILL, NDOUBLET, NSIG pub enclone_multiplet: bool, /// Turn on/off UMI thresholds in enclone - /// - Sets NUMI, NUMI_RATIO pub enclone_umi: bool, + /// Turn on/off enclone filters that detect fake clonotype expansions + pub enclone_cross: bool, } impl Default for FilterSwitch { @@ -29,16 +29,43 @@ impl Default for FilterSwitch { enclone_shared_contig: true, enclone_umi: true, enclone_multiplet: true, + enclone_cross: true, } } } +impl FilterSwitch { + pub fn update_enclone_args(self, opt: &mut CellrangerFilterOpt) { + if !self.enclone_shared_contig { + opt.graph = false; + } + + if !self.enclone_umi { + opt.umi_count = false; + opt.umi_ratio = false; + } + + if !self.enclone_multiplet { + opt.weak_chains = false; + opt.weak_foursies = false; + opt.doublet = false; + opt.signature = false; + } + + if !self.enclone_cross { + opt.cross_dataset = false; + } + } +} + +pub type VdjFilterLogFormat = Lz4>>; + pub struct FilterLogger { - writer: >> as LazyFileTypeIO>::LazyWriter, + writer: >::LazyWriter, } impl FilterLogger { - pub fn new(file: &Lz4>>) -> Result { + pub fn new(file: &VdjFilterLogFormat) -> Result { Ok(FilterLogger { writer: file.lazy_writer()?, }) @@ -64,6 +91,15 @@ impl FilterLogEntry { } } +#[derive(Serialize, Deserialize, Clone, Copy)] +#[serde(rename_all = "snake_case")] +pub enum IndelErrorMode { + Deletion, + DeletionWithCorrection, + Insertion, + InsertionWithCorrection, +} + #[derive(Serialize, Deserialize)] #[serde(tag = "reason", content = "details")] #[serde(rename_all = "snake_case")] @@ -84,7 +120,7 @@ pub enum LowConfidenceReason { n50_n50_rpu: usize, num_umis_min_3_reads: usize, }, - /// Junction segment is defined as 100 bases ending where the right end of a J region aligns to the contig + /// Junction segment is defined as 80 bases ending where the right end of a J region aligns to the contig /// /// - `min_junction_support_umis`: Minimum UMI support across the junction /// - `max_junction_support_umis`: Maximum UMI support across the junction @@ -246,9 +282,35 @@ pub enum AsmCellFilter { param_min_ratio_big: usize, }, + /// Filter cell barcodes produced by contaminating indels that generate valid whitelist sequences. + /// Identify barcode pairs that share a productive contig where the putative contaminating (sink) barcode + /// has 10-fold lower UMI counts than source barcode. If the sink barcode sequence can be derived from + /// the source barcode with a 1-bp insertion/deletion (with correction) then label it as a contaminant. + GelBeadIndel { + source_sequence: String, + error_mode: IndelErrorMode, + sink_contig_umis: usize, + source_contig_umis: usize, + }, + + /// Filter out putative gel bead contamination. Barcodes within an exact subclonotype + /// that share the same first or last half, but have 10-fold lower UMI count than the highest + /// barcode in that group. Within each group of shared part-A/B the number of such barcodes + /// needs to be at least 20% of the clonotype size to be labeled as a whitelist contaminant. + GelBeadContamination { + shared_sequence: String, + max_group_umis: usize, + umis: usize, + }, + /// The barcode is not called as a cell because its overhang does not match /// the overhang ids specified for this sample. Only applies to multiplexed VDJ. DifferentOverhang { overhang_id: String }, + InsertPriming { + common_prefix_length: usize, + contig1_name: String, + contig2_name: String, + }, } impl AsmCellFilter { @@ -265,7 +327,10 @@ impl AsmCellFilter { AsmCellFilter::ChimericContig { .. } => "CHIMERIC", AsmCellFilter::CommonCloneShadow { .. } => "COMMON_CLONE", AsmCellFilter::CommonCloneShadowSingleUmi { .. } => "COMMON_CLONE", + AsmCellFilter::GelBeadIndel { .. } => "GB_INDEL", + AsmCellFilter::GelBeadContamination { .. } => "GB_CONTAMINATION", AsmCellFilter::DifferentOverhang { .. } => "DIFFERENT_OVERHANG", + AsmCellFilter::InsertPriming { .. } => "INSERT_PRIMING", } } } diff --git a/lib/rust/vdj_filter_barcodes/src/lib.rs b/lib/rust/vdj_filter_barcodes/src/lib.rs new file mode 100644 index 0000000..8228619 --- /dev/null +++ b/lib/rust/vdj_filter_barcodes/src/lib.rs @@ -0,0 +1,55 @@ +// Warning groups (as of rust 1.55) +#![deny( + future_incompatible, + nonstandard_style, + rust_2018_compatibility, + rust_2021_compatibility, + rust_2018_idioms, + unused +)] +// Other warnings (as of rust 1.55) +#![deny( + asm_sub_register, + bad_asm_style, + bindings_with_variant_name, + clashing_extern_declarations, + confusable_idents, + const_item_mutation, + deprecated, + deref_nullptr, + drop_bounds, + dyn_drop, + elided_lifetimes_in_paths, + exported_private_dependencies, + function_item_references, + improper_ctypes, + improper_ctypes_definitions, + incomplete_features, + inline_no_sanitize, + invalid_value, + irrefutable_let_patterns, + large_assignments, + mixed_script_confusables, + non_shorthand_field_patterns, + no_mangle_generic_items, + overlapping_range_endpoints, + renamed_and_removed_lints, + stable_features, + temporary_cstring_as_ptr, + trivial_bounds, + type_alias_bounds, + uncommon_codepoints, + unconditional_recursion, + unknown_lints, + unnameable_test_items, + unused_comparisons, + while_true +)] + +#[macro_use] +extern crate arrayref; + +pub mod filter_barcode_level; +pub mod filter_clonotype_level; +pub mod filter_library_level; +pub mod filter_log; diff --git a/lib/rust/vdj_proto/Cargo.toml b/lib/rust/vdj_proto/Cargo.toml index a0bdb8b..5db279a 100644 --- a/lib/rust/vdj_proto/Cargo.toml +++ b/lib/rust/vdj_proto/Cargo.toml @@ -1,24 +1,31 @@ [dependencies] -byteorder = '1' -prost = '0.11' -prost-build = '0.11' -sha2 = '0.10' - [dependencies.anyhow] workspace = true -[dependencies.enclone_proto] +[dependencies.byteorder] workspace = true +[dependencies.enclone_proto] +path = '../enclone_proto' + [dependencies.itertools] workspace = true +[dependencies.prost] +workspace = true + +[dependencies.prost-build] +workspace = true + [dependencies.serde_json] workspace = true -[dependencies.vdj_ann] +[dependencies.sha2] workspace = true +[dependencies.vdj_ann] +path = '../vdj_ann' + [dependencies.vdj_asm_utils] default-features = false path = '../vdj_asm_utils' @@ -27,7 +34,7 @@ path = '../vdj_asm_utils' path = '../vdj_reference' [dependencies.vdj_types] -workspace = true +path = '../vdj_types' [lib] test = false diff --git a/lib/rust/vdj_proto/src/adapters.rs b/lib/rust/vdj_proto/src/adapters.rs index ca9c9f7..eeb6b7c 100644 --- a/lib/rust/vdj_proto/src/adapters.rs +++ b/lib/rust/vdj_proto/src/adapters.rs @@ -68,11 +68,11 @@ impl From for vdj_types::VdjRegion { impl From for vdj_ann::annotate::AnnotationFeature { fn from(src: crate::types::AnnotationFeature) -> Self { vdj_ann::annotate::AnnotationFeature { - chain: crate::types::VdjChain::from_i32(src.chain).unwrap().into(), + chain: crate::types::VdjChain::try_from(src.chain).unwrap().into(), display_name: src.display_name, feature_id: src.feature_id as usize, gene_name: src.gene_name, - region_type: crate::types::VdjRegion::from_i32(src.region_type) + region_type: crate::types::VdjRegion::try_from(src.region_type) .unwrap() .into(), } @@ -187,6 +187,34 @@ impl From for vdj_asm_utils::barcode_data::BarcodeDat } } +impl From for vdj_ann::transcript::ContigStatus { + fn from(src: crate::types::ContigStatus) -> Self { + vdj_ann::transcript::ContigStatus { + full_length: src.full_length, + has_v_start: src.has_v_start, + in_frame: src.in_frame, + no_premature_stop: src.no_premature_stop, + has_cdr3: src.has_cdr3, + has_expected_size: src.has_expected_size, + correct_ann_order: src.correct_ann_order, + } + } +} + +impl From for crate::types::ContigStatus { + fn from(src: vdj_ann::transcript::ContigStatus) -> Self { + crate::types::ContigStatus { + full_length: src.full_length, + has_v_start: src.has_v_start, + in_frame: src.in_frame, + no_premature_stop: src.no_premature_stop, + has_cdr3: src.has_cdr3, + has_expected_size: src.has_expected_size, + correct_ann_order: src.correct_ann_order, + } + } +} + fn option_usize_to_i32(src: Option) -> i32 { src.map_or(-1i32, |x| x as i32) } @@ -236,6 +264,7 @@ impl From for crate::types::ContigAnnotatio high_confidence: src.high_confidence, is_cell: src.is_cell, productive: src.productive.unwrap_or(false), + productive_criteria: src.productive_criteria.map(Into::into), filtered: src.filtered, frame: option_usize_to_i32(src.frame), asm_data: src.is_asm_cell.map(|c| AsmData { is_asm_cell: c }), @@ -286,6 +315,7 @@ impl From for vdj_ann::annotate::ContigAnnotatio is_asm_cell: src.asm_data.map(|a| a.is_asm_cell), is_gex_cell: src.gex_data.map(|g| g.is_gex_cell), productive: Some(src.productive), + productive_criteria: src.productive_criteria.map(Into::into), filtered: src.filtered, frame: i32_to_option_usize(src.frame), full_length: Some(src.full_length), @@ -393,7 +423,7 @@ impl From for crate::types::Receptor { impl VdjMetadata { pub fn vdj_receptor(&self) -> vdj_reference::VdjReceptor { - crate::types::Receptor::from_i32(self.receptor) + crate::types::Receptor::try_from(self.receptor) .unwrap() .into() } diff --git a/lib/rust/vdj_proto/src/io.rs b/lib/rust/vdj_proto/src/io.rs index 11f6cbe..e2e3fa7 100644 --- a/lib/rust/vdj_proto/src/io.rs +++ b/lib/rust/vdj_proto/src/io.rs @@ -41,7 +41,7 @@ use std::fs::File; use std::io::{BufReader, BufWriter, Seek}; use std::path::Path; -pub const PROTOBUF_VERSION: &str = "1.0.0"; +pub const PROTOBUF_VERSION: &str = "1.1.0"; /// Helper struct for writing vdj contig proto file. /// @@ -218,17 +218,20 @@ impl VdjProtoReader { })) } - pub fn read_barcode_data(file_name: &Path) -> Result> { + pub fn read_barcode_data( + file_name: &Path, + ) -> Result>>> { if Self::read_metadata(file_name)?.protobuf_version.is_empty() { Ok(None) } else { - let reader = VdjProtoReader::new(file_name)?; - for message in reader { - if let MessageContent::BarcodeData(m) = message?.content() { - return Ok(Some(m)); - } - } - Ok(None) + let iterator = VdjProtoReader::new(file_name)?.filter_map(|message| match message { + Ok(m) => match m.content() { + MessageContent::BarcodeData(bc) => Some(Ok(bc)), + _ => None, + }, + Err(e) => Some(Err(e)), + }); + Ok(Some(iterator)) } } } @@ -279,6 +282,7 @@ mod tests { any::(), any::(), PROTOBUF_VERSION, + 0..2i32, ) .prop_map( |( @@ -291,6 +295,7 @@ mod tests { sample_desc, multi_config_sha, protobuf_version, + multiplexing_method, )| VdjMetadata { reference_fasta_hash, pipeline_version, @@ -301,6 +306,7 @@ mod tests { sample_desc, multi_config_sha, protobuf_version, + multiplexing_method, }, ) .boxed() @@ -362,6 +368,7 @@ mod tests { multi_config_sha: "e96907faf862b9269bdd4649597778d2c44954dfa877095ceb934b8ce043bbca" .into(), protobuf_version: String::new(), + multiplexing_method: 0, }; let reference = VdjReferenceRaw { @@ -403,6 +410,7 @@ mod tests { let file = Path::new("test/cellranger7-1_contig_info.pb"); let metadata = VdjProtoReader::read_metadata(file)?; assert!(metadata.protobuf_version.is_empty()); + assert!(metadata.multiplexing_method == 0); let barcode_data = VdjProtoReader::read_barcode_data(file)?; assert!(barcode_data.is_none()); diff --git a/lib/rust/vdj_proto/src/types.rs b/lib/rust/vdj_proto/src/types.rs index 4281351..9cf2b2b 100644 --- a/lib/rust/vdj_proto/src/types.rs +++ b/lib/rust/vdj_proto/src/types.rs @@ -1,4 +1,4 @@ -#[allow(clippy::derive_partial_eq_without_eq)] +// This file is @generated by prost-build. #[derive(Clone, PartialEq, ::prost::Message)] pub struct AnnotationFeature { /// chain type of the reference record, e.g. TRA @@ -17,7 +17,6 @@ pub struct AnnotationFeature { #[prost(enumeration = "VdjRegion", tag = "5")] pub region_type: i32, } -#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AnnotationUnit { /// start on contig @@ -45,27 +44,23 @@ pub struct AnnotationUnit { #[prost(message, optional, tag = "8")] pub feature: ::core::option::Option, } -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct GexData { #[prost(bool, tag = "1")] pub is_gex_cell: bool, } -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct AsmData { #[prost(bool, tag = "1")] pub is_asm_cell: bool, } -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct JunctionSupport { #[prost(int32, tag = "1")] pub reads: i32, #[prost(int32, tag = "2")] pub umis: i32, } -#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Region { #[prost(int32, tag = "1")] @@ -77,7 +72,23 @@ pub struct Region { #[prost(string, tag = "4")] pub aa_seq: ::prost::alloc::string::String, } -#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] +pub struct ContigStatus { + #[prost(bool, optional, tag = "1")] + pub full_length: ::core::option::Option, + #[prost(bool, optional, tag = "2")] + pub has_v_start: ::core::option::Option, + #[prost(bool, optional, tag = "3")] + pub in_frame: ::core::option::Option, + #[prost(bool, optional, tag = "4")] + pub no_premature_stop: ::core::option::Option, + #[prost(bool, optional, tag = "5")] + pub has_cdr3: ::core::option::Option, + #[prost(bool, optional, tag = "6")] + pub has_expected_size: ::core::option::Option, + #[prost(bool, optional, tag = "7")] + pub correct_ann_order: ::core::option::Option, +} #[derive(Clone, PartialEq, ::prost::Message)] pub struct ContigAnnotation { /// the barcode @@ -167,8 +178,9 @@ pub struct ContigAnnotation { /// "" indicates None #[prost(string, tag = "34")] pub sample: ::prost::alloc::string::String, + #[prost(message, optional, tag = "35")] + pub productive_criteria: ::core::option::Option, } -#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct VdjReferenceRaw { /// regions.fa as a string @@ -178,7 +190,6 @@ pub struct VdjReferenceRaw { #[prost(string, tag = "2")] pub ref_json: ::prost::alloc::string::String, } -#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct VdjMetadata { #[prost(string, tag = "1")] @@ -199,14 +210,14 @@ pub struct VdjMetadata { pub multi_config_sha: ::prost::alloc::string::String, #[prost(string, tag = "9")] pub protobuf_version: ::prost::alloc::string::String, + #[prost(enumeration = "MultiplexingMethod", tag = "10")] + pub multiplexing_method: i32, } -#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MetricsSummary { #[prost(string, tag = "1")] pub raw_json: ::prost::alloc::string::String, } -#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BarcodeData { #[prost(string, tag = "1")] @@ -228,7 +239,6 @@ pub struct BarcodeData { pub frac_reads_used: f64, } /// This is the message written out in the proto file -#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct VdjProtoMessage { #[prost(oneof = "vdj_proto_message::MessageContent", tags = "1, 2, 3, 4, 5")] @@ -237,7 +247,6 @@ pub struct VdjProtoMessage { /// Nested message and enum types in `VdjProtoMessage`. pub mod vdj_proto_message { #[allow(clippy::large_enum_variant)] - #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum MessageContent { #[prost(message, tag = "1")] @@ -274,11 +283,11 @@ impl VdjRegion { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - VdjRegion::U => "U", - VdjRegion::V => "V", - VdjRegion::D => "D", - VdjRegion::J => "J", - VdjRegion::C => "C", + Self::U => "U", + Self::V => "V", + Self::D => "D", + Self::J => "J", + Self::C => "C", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -311,13 +320,13 @@ impl VdjChain { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - VdjChain::Igh => "IGH", - VdjChain::Igk => "IGK", - VdjChain::Igl => "IGL", - VdjChain::Tra => "TRA", - VdjChain::Trb => "TRB", - VdjChain::Trd => "TRD", - VdjChain::Trg => "TRG", + Self::Igh => "IGH", + Self::Igk => "IGK", + Self::Igl => "IGL", + Self::Tra => "TRA", + Self::Trb => "TRB", + Self::Trd => "TRD", + Self::Trg => "TRG", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -348,9 +357,9 @@ impl Receptor { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Receptor::Tcr => "TCR", - Receptor::Ig => "IG", - Receptor::Tcrgd => "TCRGD", + Self::Tcr => "TCR", + Self::Ig => "IG", + Self::Tcrgd => "TCRGD", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -363,3 +372,32 @@ impl Receptor { } } } +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum MultiplexingMethod { + None = 0, + Ocm = 1, + Hashtag = 2, +} +impl MultiplexingMethod { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::None => "None", + Self::Ocm => "OCM", + Self::Hashtag => "Hashtag", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "None" => Some(Self::None), + "OCM" => Some(Self::Ocm), + "Hashtag" => Some(Self::Hashtag), + _ => None, + } + } +} diff --git a/lib/rust/vdj_reference/Cargo.toml b/lib/rust/vdj_reference/Cargo.toml index 9d0620c..d11f528 100644 --- a/lib/rust/vdj_reference/Cargo.toml +++ b/lib/rust/vdj_reference/Cargo.toml @@ -1,13 +1,16 @@ [dependencies] -bio = '1' -fxhash = '0.2' - [dependencies.anyhow] workspace = true +[dependencies.bio] +workspace = true + [dependencies.byteseq] path = '../byteseq' +[dependencies.fxhash] +workspace = true + [dependencies.itertools] workspace = true @@ -30,7 +33,7 @@ workspace = true workspace = true [dependencies.vdj_types] -workspace = true +path = '../vdj_types' [lib] test = false diff --git a/lib/rust/vdj_types/Cargo.toml b/lib/rust/vdj_types/Cargo.toml new file mode 100644 index 0000000..890dd4f --- /dev/null +++ b/lib/rust/vdj_types/Cargo.toml @@ -0,0 +1,13 @@ +[dependencies] +[dependencies.serde] +workspace = true + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'vdj_types' +publish = false +version = '0.1.0' diff --git a/lib/rust/vdj_types/src/lib.rs b/lib/rust/vdj_types/src/lib.rs new file mode 100644 index 0000000..a1fb1d4 --- /dev/null +++ b/lib/rust/vdj_types/src/lib.rs @@ -0,0 +1,278 @@ +// Copyright (c) 2021 10x Genomics, Inc. All rights reserved. + +use serde::{Deserialize, Serialize}; +use std::convert::TryFrom; +use std::fmt; +use std::str::FromStr; + +// From https://danielkeep.github.io/tlborm/book/blk-counting.html +macro_rules! replace_expr { + ($_t:tt $sub:expr) => { + $sub + }; +} + +macro_rules! count_tts { + ($($tts:tt)*) => {0usize $(+ replace_expr!($tts 1usize))*}; +} + +macro_rules! make_enum { + ( + name: $name:ident, + variants:[$( ($field:ident, $lit: literal) ,)*], + const_var_name: $const_var_name:ident, + ) => { + pub const $const_var_name: [&str; count_tts!($($field)*)] = [ + $($lit,)* + ]; + + #[derive( + Debug, + Copy, + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Serialize, + Deserialize, + Hash, + )] + pub enum $name { + $( + #[serde(rename = $lit)] + $field, + )* + } + + impl $name { + pub fn all() -> [Self; count_tts!($($field)*)] { + [ + $($name::$field,)* + ] + } + } + + impl std::fmt::Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", match self { + $( + $name::$field => $lit, + )* + }) + } + } + + impl From<$name> for &'static str { + fn from(src: $name) -> &'static str { + match src { + $( + $name::$field => $lit, + )* + } + } + } + + impl std::str::FromStr for $name { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + $( + $lit => Ok($name::$field), + )* + unknown => Err( + format!("Unknown variant '{}' for {}. Supported variants are: [{}]", unknown, stringify!($name), $const_var_name.join(", ")) + ) + } + } + } + }; +} + +// FIXME: collapse with similar types in Cellranger once codebases are merged. +#[derive(Debug, PartialEq, Default, Clone, Copy)] +pub enum VdjReceptor { + #[default] + TR, + TRGD, + IG, +} + +make_enum! { + name: VdjChain, + variants: [ + (IGH, "IGH"), + (IGK, "IGK"), + (IGL, "IGL"), + (TRA, "TRA"), + (TRB, "TRB"), + (TRD, "TRD"), + (TRG, "TRG"), + ], + const_var_name: VDJ_CHAINS, +} + +/// A contig could contain different regions that belong to different +/// chains. For e.g TRD V-region with TRB J-region +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Hash)] +#[serde(into = "String", try_from = "&str")] +pub enum VdjContigChain { + Single(VdjChain), + Multi, // Could store a bitvec here listing the chains +} + +impl fmt::Display for VdjContigChain { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}", + match self { + VdjContigChain::Single(chain) => chain.to_string(), + VdjContigChain::Multi => "Multi".to_string(), + } + ) + } +} + +impl From for String { + fn from(contig_chain: VdjContigChain) -> String { + contig_chain.to_string() + } +} + +impl FromStr for VdjContigChain { + type Err = String; + fn from_str(s: &str) -> Result { + match s { + "Multi" => Ok(VdjContigChain::Multi), + single => Ok(VdjContigChain::Single(single.parse()?)), + } + } +} +impl TryFrom<&str> for VdjContigChain { + type Error = String; + fn try_from(s: &str) -> Result { + s.parse() + } +} + +make_enum! { + name: VdjRegion, + variants: [ + (UTR, "5'UTR"), // 5′ untranslated region (5′ UTR) + (V, "L-REGION+V-REGION"), // Variable region + (D, "D-REGION"), // Diversity region + (J, "J-REGION"), // Joining region + (C, "C-REGION"), // Constant region + ], + const_var_name: VDJ_REGIONS, +} + +#[cfg(test)] +mod tests { + use super::*; + use std::str::FromStr; + + #[test] + fn test_vdj_region_invalid_from_str() { + assert_eq!( + VdjRegion::from_str("V-REGION").unwrap_err(), + "Unknown variant 'V-REGION' for VdjRegion. Supported variants are: [5'UTR, L-REGION+V-REGION, D-REGION, J-REGION, C-REGION]" + ); + } + + #[test] + fn test_vdj_chain_invalid_from_str() { + assert_eq!( + VdjChain::from_str("").unwrap_err(), + "Unknown variant '' for VdjChain. Supported variants are: [IGH, IGK, IGL, TRA, TRB, TRD, TRG]" + ); + } + + #[test] + fn test_vdj_region_from_str() { + assert_eq!(VdjRegion::from_str("5'UTR"), Ok(VdjRegion::UTR)); + assert_eq!(VdjRegion::from_str("L-REGION+V-REGION"), Ok(VdjRegion::V)); + assert_eq!(VdjRegion::from_str("D-REGION"), Ok(VdjRegion::D)); + assert_eq!(VdjRegion::from_str("J-REGION"), Ok(VdjRegion::J)); + assert_eq!(VdjRegion::from_str("C-REGION"), Ok(VdjRegion::C)); + + assert_eq!( + serde_json::from_str::("\"5'UTR\"").unwrap(), + VdjRegion::UTR + ); + assert_eq!( + serde_json::from_str::("\"L-REGION+V-REGION\"").unwrap(), + VdjRegion::V + ); + assert_eq!( + serde_json::from_str::("\"D-REGION\"").unwrap(), + VdjRegion::D + ); + assert_eq!( + serde_json::from_str::("\"J-REGION\"").unwrap(), + VdjRegion::J + ); + assert_eq!( + serde_json::from_str::("\"C-REGION\"").unwrap(), + VdjRegion::C + ); + + assert_eq!(serde_json::to_string(&VdjRegion::UTR).unwrap(), "\"5'UTR\""); + assert_eq!( + serde_json::to_string(&VdjRegion::V).unwrap(), + "\"L-REGION+V-REGION\"" + ); + assert_eq!( + serde_json::to_string(&VdjRegion::D).unwrap(), + "\"D-REGION\"" + ); + assert_eq!( + serde_json::to_string(&VdjRegion::J).unwrap(), + "\"J-REGION\"" + ); + assert_eq!( + serde_json::to_string(&VdjRegion::C).unwrap(), + "\"C-REGION\"" + ); + } + + #[test] + fn test_vdj_chain_from_str() { + assert_eq!(VdjChain::from_str("IGH"), Ok(VdjChain::IGH)); + assert_eq!(VdjChain::from_str("IGK"), Ok(VdjChain::IGK)); + assert_eq!(VdjChain::from_str("IGL"), Ok(VdjChain::IGL)); + assert_eq!(VdjChain::from_str("TRA"), Ok(VdjChain::TRA)); + assert_eq!(VdjChain::from_str("TRB"), Ok(VdjChain::TRB)); + assert_eq!(VdjChain::from_str("TRD"), Ok(VdjChain::TRD)); + assert_eq!(VdjChain::from_str("TRG"), Ok(VdjChain::TRG)); + } + + #[test] + fn test_vdj_contig_chain() { + for chain in VdjChain::all() { + let contig_chain = VdjContigChain::Single(chain); + assert_eq!(contig_chain.to_string(), chain.to_string()); + let chain_str = serde_json::to_string(&chain).unwrap(); + assert_eq!(serde_json::to_string(&contig_chain).unwrap(), chain_str,); + assert_eq!( + serde_json::from_str::(&chain_str).unwrap(), + contig_chain, + ); + assert_eq!( + chain.to_string().parse::().unwrap(), + contig_chain + ); + } + assert_eq!(VdjContigChain::Multi.to_string(), "Multi"); + assert_eq!( + "Multi".parse::().unwrap(), + VdjContigChain::Multi + ); + assert_eq!( + serde_json::to_string(&VdjContigChain::Multi).unwrap(), + "\"Multi\"" + ); + } +} diff --git a/lib/rust/vector_utils/Cargo.toml b/lib/rust/vector_utils/Cargo.toml new file mode 100644 index 0000000..9afdf5a --- /dev/null +++ b/lib/rust/vector_utils/Cargo.toml @@ -0,0 +1,16 @@ +[dependencies] +[dependencies.permutation] +workspace = true + +[dependencies.superslice] +workspace = true + +[lib] +test = false + +[package] +authors = ['10x Genomics'] +edition = '2021' +name = 'vector_utils' +publish = false +version = '0.1.0' diff --git a/lib/rust/vector_utils/src/lib.rs b/lib/rust/vector_utils/src/lib.rs new file mode 100644 index 0000000..8979ce6 --- /dev/null +++ b/lib/rust/vector_utils/src/lib.rs @@ -0,0 +1,361 @@ +// Copyright (c) 2018 10X Genomics, Inc. All rights reserved. + +// This file contains miscellaneous vector utilities. + +use std::borrow::Borrow; +use superslice::Ext; + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// SORT A VECTOR +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Reverse sort a vector. + +pub fn reverse_sort(x: &mut [T]) { + x.sort_by(|a, b| b.cmp(a)); +} + +// Unique sort a vector. + +pub fn unique_sort(x: &mut Vec) { + x.sort(); + x.dedup(); +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// DOES VECTOR CONTAIN ANOTHER VECTOR +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Test to see if a vector contains another vector at a given position. + +pub fn contains_at(s: &[T], t: &[T], p: usize) -> bool { + if p + t.len() > s.len() { + return false; + } + for i in 0..t.len() { + if s[p + i] != t[i] { + return false; + } + } + true +} + +// Determine if vector x contains vector y. + +pub fn contains(x: &[T], y: &[T]) -> bool { + if y.len() > x.len() { + return false; + } + for i in 0..=x.len() - y.len() { + let mut matches = true; + for j in 0..y.len() { + if x[i + j] != y[j] { + matches = false; + break; + } + } + if matches { + return true; + } + } + false +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// UNSIGNED VECTOR SIZE AND SOME SPECIAL SIZES +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub trait VecUtils<'a> { + fn ilen(&self) -> isize; + + fn solo(&self) -> bool; + + fn duo(&self) -> bool; +} + +impl<'a, T> VecUtils<'a> for [T] { + fn ilen(&self) -> isize { + self.len() as isize + } + + fn solo(&self) -> bool { + self.len() == 1 + } + + fn duo(&self) -> bool { + self.len() == 2 + } +} + +/// Erase elements in a vector that are flagged by another vector. Both vectors +/// should have the same length. +pub fn erase_if(x: &mut Vec, to_delete: &[bool]) { + // Adding this line means that enclone starts failing, and I don't want to + // run down those errors. Sigh. COME ON PEOPLE, ADD ASSERTIONS. + // assert_eq!(x.len(), to_delete.len()); + erase_if_iter(x, to_delete.iter().copied()); +} + +/// Erase elements in a vector that are flagged by an iterator of booleans. +/// The iterator should have the same length as the vector. +pub fn erase_if_iter(x: &mut Vec, to_delete: impl IntoIterator) { + let mut count = 0; + for (j, delete) in to_delete.into_iter().take(x.len()).enumerate() { + if !delete { + if j != count { + x.swap(j, count); + } + count += 1; + } + } + x.truncate(count); +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// INTERSECTION FUNCTIONS +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Determine if two sorted vectors have an element in common. + +pub fn meet(x: &[T], y: &[T]) -> bool { + let mut i = 0; + let mut j = 0; + while i < x.len() && j < y.len() { + if x[i] < y[j] { + i += 1; + } else if y[j] < x[i] { + j += 1; + } else { + return true; + } + } + false +} + +// Find the intersection size of two sorted vectors. If an element occurs +// repeatedly, say n1 times in one vector and n2 times in the other vector, then +// that contributes min(n1,n2) to the total. + +pub fn meet_size(x: &[T], y: &[T]) -> usize { + let mut i = 0; + let mut j = 0; + let mut count = 0; + while i < x.len() && j < y.len() { + if x[i] < y[j] { + i += 1; + } else if y[j] < x[i] { + j += 1; + } else { + count += 1; + i += 1; + j += 1; + } + } + count +} + +// Compute the intersection of two sorted vectors. + +pub fn intersection(x: &[T], y: &[T], z: &mut Vec) { + z.clear(); + let (mut ix, mut iy) = (0, 0); + while ix < x.len() && iy < y.len() { + if x[ix] < y[iy] { + ix += 1; + } else if y[iy] < x[ix] { + iy += 1; + } else { + z.push(x[ix].clone()); + ix += 1; + iy += 1; + } + } +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// FREQUENCY FUNCTIONS +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Count elements in a sorted vector by type. The output consists of a reverse +// sorted vector of pairs (m,v) where m is the multiplicity of an element v. + +pub fn make_freq(x: &[T], freq: &mut Vec<(u32, T)>) { + freq.clear(); + let mut j = 0; + loop { + if j == x.len() { + break; + } + let mut k = j + 1; + loop { + if k == x.len() || x[k] != x[j] { + break; + } + k += 1; + } + let t = x[j].clone(); + freq.push(((k - j) as u32, t)); + j = k; + } + freq.sort_by(|a, b| b.cmp(a)); // freq.reverse_sort(); +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// MEMBERSHIP +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +// Like binary_search, but allows searching by a different type from what's in +// the slice, e.g. searching a &[String] for a &str. +fn borrowed_binary_search(x: &[impl Borrow], d: &T) -> Result { + x.binary_search_by(|p| p.borrow().cmp(d)) +} + +// Test to see if a sorted vector contains a given element. + +pub fn bin_member(x: &[impl Borrow], d: &T) -> bool { + borrowed_binary_search(x, d).is_ok() +} + +// Return the position of an element in an unsorted vector. +// Returns -1 if not present. + +pub fn position(x: &[impl Borrow], d: &T) -> i32 { + for (i, y) in x.iter().enumerate() { + if y.borrow() == d { + return i as i32; + } + } + -1_i32 +} + +// Return the position of an element in a sorted vector, or using just the first +// position. Returns -1 if not present. + +pub fn bin_position(x: &[impl Borrow], d: &T) -> i32 { + match borrowed_binary_search(x, d) { + Ok(p) => p as i32, + Err(_e) => -1, + } +} + +pub fn bin_position1_2(x: &[(impl Borrow, T)], d: &S) -> i32 { + match x.binary_search_by_key(&d, |(a, _b)| a.borrow()) { + Ok(p) => p as i32, + Err(_e) => -1, + } +} + +pub fn bin_position1_3( + x: &[(impl Borrow, T, U)], + d: &S, +) -> i32 { + match x.binary_search_by_key(&d, |(a, _b, _c)| a.borrow()) { + Ok(p) => p as i32, + Err(_e) => -1, + } +} + +// Find lower/upper bounds. + +fn lower_bound_usize(x: &[impl Borrow], d: &T) -> usize { + x.lower_bound_by(|y| y.borrow().cmp(d)) +} + +pub fn lower_bound(x: &[impl Borrow], d: &T) -> i64 { + lower_bound_usize(x, d) as i64 +} + +fn upper_bound_usize(x: &[impl Borrow], d: &T) -> usize { + x.upper_bound_by(|y| y.borrow().cmp(d)) +} + +pub fn upper_bound(x: &[impl Borrow], d: &T) -> i64 { + upper_bound_usize(x, d) as i64 +} + +pub fn lower_bound1_2(x: &[(impl Borrow, T)], d: &S) -> i64 { + x.lower_bound_by_key(&d, |(a, _b)| a.borrow()) as i64 +} + +pub fn upper_bound1_2(x: &[(impl Borrow, T)], d: &S) -> i64 { + x.upper_bound_by_key(&d, |(a, _b)| a.borrow()) as i64 +} + +pub fn lower_bound1_3(x: &[(impl Borrow, T, U)], d: &S) -> i64 { + x.lower_bound_by_key(&d, |(a, _b, _c)| a.borrow()) as i64 +} + +pub fn upper_bound1_3(x: &[(impl Borrow, T, U)], d: &S) -> i64 { + x.upper_bound_by_key(&d, |(a, _b, _c)| a.borrow()) as i64 +} + +// Compute the number of instances of a given element in a sorted vector. + +pub fn count_instances(x: &[impl Borrow], d: &T) -> i32 { + (upper_bound_usize(x, d) - lower_bound_usize(x, d)) as i32 +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// NEXT DIFFERENCE +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +/// Find first element that's different in a sorted vector, or different in +/// first position. +pub fn next_diff_any(x: &[T], i: usize, eq: impl Fn(&T, &T) -> bool) -> usize { + let mut j = i + 1; + loop { + if j == x.len() || !eq(&x[j], &x[i]) { + return j; + } + j += 1; + } +} + +pub fn next_diff(x: &[T], i: usize) -> usize { + next_diff_any(x, i, |a, b| a == b) +} + +pub fn next_diff1_2(x: &[(T, U)], i: usize) -> usize { + next_diff_any(x, i, |a, b| a.0 == b.0) +} + +pub fn next_diff1_3(x: &[(T, U, V)], i: usize) -> usize { + next_diff_any(x, i, |a, b| a.0 == b.0) +} + +pub fn next_diff12_3(x: &[(T, U, V)], i: usize) -> usize { + next_diff_any(x, i, |a, b| a.0 == b.0 && a.1 == b.1) +} + +pub fn next_diff12_4(x: &[(T, U, V, W)], i: usize) -> usize { + next_diff_any(x, i, |a, b| a.0 == b.0 && a.1 == b.1) +} + +#[allow(clippy::type_complexity)] +pub fn next_diff12_8( + x: &[(S, T, U, V, W, X, Y, Z)], + i: usize, +) -> usize { + next_diff_any(x, i, |a, b| a.0 == b.0 && a.1 == b.1) +} + +pub fn next_diff1_5(x: &[(T, U, V, W, X)], i: usize) -> usize { + next_diff_any(x, i, |a, b| a.0 == b.0) +} + +pub fn next_diff1_6( + x: &[(T, U, V, W, X, Y)], + i: usize, +) -> usize { + next_diff_any(x, i, |a, b| a.0 == b.0) +} + +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +// SORT SYNC VECTORS +// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ + +pub fn sort_sync2(t: &mut Vec, s1: &mut Vec) { + let permutation = permutation::sort(&t[..]); + *t = permutation.apply_slice(&t[..]); + *s1 = permutation.apply_slice(&s1[..]); +} diff --git a/lib/rust/websummary_derive/Cargo.toml b/lib/rust/websummary_derive/Cargo.toml index 2f47028..1b6c87e 100644 --- a/lib/rust/websummary_derive/Cargo.toml +++ b/lib/rust/websummary_derive/Cargo.toml @@ -1,23 +1,28 @@ [dependencies] -heck = '0.4' -proc-macro2 = '1' -quote = '1' - [dependencies.anyhow] workspace = true [dependencies.cr_types] path = '../cr_types' +[dependencies.heck] +workspace = true + [dependencies.itertools] workspace = true +[dependencies.proc-macro2] +workspace = true + +[dependencies.quote] +workspace = true + [dependencies.serde] workspace = true [dependencies.syn] features = ['full'] -version = '2' +workspace = true [dependencies.toml] workspace = true diff --git a/lib/rust/websummary_derive/src/lib.rs b/lib/rust/websummary_derive/src/lib.rs index b89ac12..b51a64e 100644 --- a/lib/rust/websummary_derive/src/lib.rs +++ b/lib/rust/websummary_derive/src/lib.rs @@ -1,19 +1,45 @@ -use cr_types::websummary::{AlertConditions, MetricConfig}; +use cr_types::websummary::{AlertConfig, MetricConfig}; +use cr_types::LibraryType; use heck::ToUpperCamelCase; -use itertools::Itertools; use proc_macro::TokenStream; -use quote::{format_ident, quote}; +use quote::{format_ident, quote, ToTokens}; use serde::Deserialize; -use std::collections::{BTreeMap, HashSet}; -use std::iter::zip; +use std::collections::BTreeMap; use std::path::PathBuf; use syn::{parse_macro_input, Fields, ItemStruct, LitStr}; +#[allow(unused)] +#[derive(Default, Debug, Deserialize)] +struct Conditions { + library_types: Vec, + is_cmo_multiplexed: Option, + /// Covers both RTL and OCM multiplexing. + is_read_multiplexed: Option, + is_rtl: Option, + has_gdna: Option, +} + +#[allow(unused)] #[derive(Deserialize, Debug)] struct CardWithTableToml { title: String, - help: Option, + tier: String, + #[serde(default)] + conditions: Conditions, entries: Vec, + /// Tables may specify a column in the + /// table that can be used to group the metrics from the individual rows + /// together. This is a stopgap solution until we refactor tables to not be + /// table-structured. + /// + /// The value associated with the key column will be extracted and added to + /// every metric in the row when we output flattened JSON metrics. + /// + /// This mechanism is also used to populate the first two columns in the + /// metrics CSV output, so most tables should specify this key even if + /// they are only going to have one row in the websummary. + #[serde(default)] + group_by_key: Option, #[serde(flatten)] entry_info: BTreeMap, } @@ -33,32 +59,35 @@ impl CardWithTableToml { "Duplicate entries listed under table '{}'", &self.title ); + if let Some(group_by_key) = &self.group_by_key { + assert!( + self.entries.contains(group_by_key), + "group_by_key {group_by_key} is not present among the entries for table '{}'", + self.title + ); + } + + for config in self.entry_info.values() { + config.validate().unwrap(); + } } } -fn check_exclusive_conditions(conditions: &[&AlertConditions]) -> bool { - if conditions.len() < 2 { - return true; - } - let first = conditions[0].vec(); - let mut seen_ids = HashSet::with_capacity(conditions.len()); - for cond in conditions { - let cond_vec = cond.vec(); - let mut this_id = Vec::new(); - for (left, right) in zip(&first, cond_vec) { - // Both should be None or Some - match (left, right) { - (Some(_), Some(r)) => this_id.push(r), - (None, None) => {} - _ => return false, - } - } - if seen_ids.contains(&this_id) { - return false; +struct AlertConfigSlice<'a>(&'a [AlertConfig]); + +impl<'a> ToTokens for AlertConfigSlice<'a> { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let mut quoted = quote![]; + for cfg in self.0 { + quoted = quote! [ + #quoted + #cfg, + ]; } - seen_ids.insert(this_id); + tokens.extend(quote![ + &[#quoted] + ]); } - true } #[proc_macro] @@ -96,14 +125,27 @@ pub fn make_tables(item: TokenStream) -> TokenStream { let mut headers = Vec::new(); let mut help_data = Vec::new(); ]; - if let Some(ref h) = v.help { - metric_headers_and_help = quote![ - #metric_headers_and_help - help_data.push(::cr_websummary::TermDesc::with_one_desc("", #h.to_string())); - ]; - } let mut row_struct_field_from_metrics = quote![]; let mut row_struct_to_json_summary_items = quote![]; + let (grouping_key, metric_csv_grouping_header) = if let Some(group_by_key) = v.group_by_key + { + let grouping_entry = &v.entry_info[&group_by_key]; + let metric_csv_grouping_header = grouping_entry.header.as_str(); + let grouping_header_optional = grouping_entry.optional; + let group_by_key = format_ident!("{group_by_key}"); + let grouping_key = quote![Some(serde_json::json!(&self.#group_by_key))]; + ( + grouping_key, + quote![Some( + ::cr_websummary::GroupingHeader{ + header: #metric_csv_grouping_header.to_string(), + optional: #grouping_header_optional, + }) + ], + ) + } else { + (quote![None], quote![None]) + }; for e in &v.entries { let name = format_ident!("{}", e); let info = &v.entry_info[e]; @@ -123,13 +165,15 @@ pub fn make_tables(item: TokenStream) -> TokenStream { ]; row_struct_to_json_summary_items = quote![ #row_struct_to_json_summary_items - ::cr_websummary::multi::websummary::JsonMetricSummary { - key: stringify!(#name).to_string(), - value: serde_json::json!(&self.#name), - category: String::new(), - library_type: String::new(), - config: #info, - }, + ::cr_websummary::multi::websummary::JsonMetricSummary::new( + stringify!(#name).to_string(), + self.#name.as_ref(), + String::new(), + String::new(), + #info, + #grouping_key, + ctx, + ), ]; table_rows = if info.optional { quote![ @@ -175,129 +219,23 @@ pub fn make_tables(item: TokenStream) -> TokenStream { } } - let metric_alerts: Vec<(_, _, Vec<_>)> = v - .entries - .iter() - .flat_map(|e| -> Vec<_> { - v.entry_info[e] - .alerts - .iter() - .sorted_by_key(|a| a.rank) - .group_by(|a| a.rank) - .into_iter() - .map(|(_rank, group)| (e, v.entry_info[e].optional, group.collect())) - .collect() - }) - .collect(); - let mut alert_quote = quote![ use ::cr_websummary::MakePretty; let mut alert_specs = Vec::new(); ]; - for (name, _, alerts) in metric_alerts { + for name in &v.entries { + let alerts = AlertConfigSlice(v.entry_info[name].alerts.as_slice()); let name_ident = format_ident!("{}", name); - let conditions: Vec<_> = alerts.iter().map(|a| &a.conditions).collect(); - assert!( - check_exclusive_conditions(&conditions), - "The conditions for alerts with rank {} for the metric {} are not exclusive:\n {:#?}.\ - \n If these alerts are independent, specify a different rank for the alerts. \ - Otherwise specify mutually exclusive conditions for each alert.", - alerts[0].rank, - name, - conditions - ); - - let alert_val = quote![ - let #name_ident = self.#name_ident.map(|m| (m.as_f64(), m.make_pretty())); + alert_quote = quote![ + #alert_quote + alert_specs.extend(::cr_websummary::multi::websummary::JsonMetricSummary::construct_alerts( + #name, + self.#name_ident.as_ref(), + #alerts, + ctx, + )); ]; - - for alert in alerts { - let error_title = alert.error_title(name); - let warn_title = alert.warn_title(name); - let detail = &alert.detail; - let symbol = alert.symbol(name); - let mut alert_specs = quote![ - let mut has_error = false; - ]; - if let Some(error_threshold) = alert.error_threshold { - alert_specs = quote![ - #alert_specs - if val #symbol #error_threshold { - alert_specs.push(::cr_websummary::alert::AlertSpec { - level: ::cr_websummary::alert::AlertLevel::Error, - title: #error_title.to_string(), - formatted_value: formatted_value.clone(), - message: #detail.to_string() - }); - has_error = true; - } - ]; - } - if let Some(warn_threshold) = alert.warn_threshold { - alert_specs = quote![ - #alert_specs - if !has_error && (val #symbol #warn_threshold) { - alert_specs.push(::cr_websummary::alert::AlertSpec { - level: ::cr_websummary::alert::AlertLevel::Warn, - title: #warn_title.to_string(), - formatted_value, - message: #detail.to_string() - }); - } - ]; - } - let AlertConditions { - is_hybrid_capture, - is_lt_chemistry, - is_arc_chemistry, - include_introns, - is_rtl, - } = alert.conditions; - let mut conditions_quote = quote![ - let mut conditions_are_met = true; - ]; - if let Some(is_hybrid_capture) = is_hybrid_capture { - conditions_quote = quote![ - #conditions_quote - conditions_are_met = conditions_are_met && ctx.is_hybrid_capture == #is_hybrid_capture; - ]; - } - if let Some(include_introns) = include_introns { - conditions_quote = quote![ - #conditions_quote - conditions_are_met = conditions_are_met && ctx.include_introns == #include_introns; - ]; - } - if let Some(lt_chemistry) = is_lt_chemistry { - conditions_quote = quote![ - #conditions_quote - conditions_are_met = conditions_are_met && ctx.is_lt_chemistry == #lt_chemistry; - ]; - } - if let Some(arc_chemistry) = is_arc_chemistry { - conditions_quote = quote![ - #conditions_quote - conditions_are_met = conditions_are_met && ctx.is_arc_chemistry == #arc_chemistry; - ]; - } - if let Some(rtl) = is_rtl { - conditions_quote = quote![ - #conditions_quote - conditions_are_met = conditions_are_met && ctx.is_rtl == #rtl; - ]; - } - alert_quote = quote![ - #alert_quote - #alert_val - if let Some((val, formatted_value)) = #name_ident { - #conditions_quote - if conditions_are_met { - #alert_specs - } - } - ]; - } } q = quote![ @@ -307,18 +245,10 @@ pub fn make_tables(item: TokenStream) -> TokenStream { pub struct #table_struct_name(pub Vec<#row_struct_name>); impl #table_struct_name { - /// Create a table with a single row from the json - /// - /// NOTE: Clones the val - pub fn from_json_value(val: &::serde_json::value::Value) -> Self { - #table_struct_name(vec![::serde_json::from_value(val.clone()).unwrap()]) - } - /// Create a table with a single row from a metric hashmap pub fn from_metrics(val: &::std::collections::HashMap<::std::string::String, ::serde_json::value::Value, S>) -> Result { Ok(#table_struct_name(vec![#row_struct_name::from_metrics(val)?])) } - } #[automatically_derived] @@ -330,8 +260,8 @@ pub fn make_tables(item: TokenStream) -> TokenStream { #[automatically_derived] impl ::cr_websummary::multi::websummary::ToJsonSummary for #table_struct_name { - fn to_json_summary(&self) -> Vec<::cr_websummary::multi::websummary::JsonMetricSummary> { - self.0.iter().map(::cr_websummary::multi::websummary::ToJsonSummary::to_json_summary).flatten().collect() + fn to_json_summary(&self, ctx: &::cr_websummary::alert::AlertContext) -> Vec<::cr_websummary::multi::websummary::JsonMetricSummary> { + self.0.iter().map(|item| item.to_json_summary(ctx)).flatten().collect() } } @@ -342,6 +272,7 @@ pub fn make_tables(item: TokenStream) -> TokenStream { let table = ::cr_websummary::GenericTable { header: Some(headers), rows: src.0.into_iter().map(|row| row.into()).collect(), + grouping_header: #metric_csv_grouping_header, }; let help = ::cr_websummary::TitleWithTermDesc { title: #title.to_string(), @@ -372,7 +303,7 @@ pub fn make_tables(item: TokenStream) -> TokenStream { #[automatically_derived] impl ::cr_websummary::multi::websummary::ToJsonSummary for #row_struct_name { - fn to_json_summary(&self) -> Vec<::cr_websummary::multi::websummary::JsonMetricSummary> { + fn to_json_summary(&self, ctx: &::cr_websummary::alert::AlertContext) -> Vec<::cr_websummary::multi::websummary::JsonMetricSummary> { vec![ #row_struct_to_json_summary_items ] @@ -501,7 +432,7 @@ pub fn derive_to_csv_rows(item: TokenStream) -> TokenStream { quote! [ #[automatically_derived] impl ToCsvRows for #ident { - fn to_csv_rows(self) -> Vec> { + fn to_csv_rows(&self) -> Vec> { #append_rows; csv_rows } @@ -517,7 +448,8 @@ pub fn derive_to_json_summary(item: TokenStream) -> TokenStream { let item_struct = parse_macro_input!(item as ItemStruct); let ident = item_struct.ident; - let mut append_rows = quote![let mut vals: Vec = vec![];]; + let mut append_rows = + quote![let mut vals: Vec<::cr_websummary::multi::websummary::JsonMetricSummary> = vec![];]; for field_name in item_struct .fields @@ -528,13 +460,13 @@ pub fn derive_to_json_summary(item: TokenStream) -> TokenStream { #append_rows vals.append(&mut self .#field_name - .to_json_summary()); + .to_json_summary(ctx)); ]; } quote! [ #[automatically_derived] impl ToJsonSummary for #ident { - fn to_json_summary(&self) -> Vec { + fn to_json_summary(&self, ctx: &AlertContext) -> Vec<::cr_websummary::multi::websummary::JsonMetricSummary> { #append_rows; vals } @@ -542,111 +474,3 @@ pub fn derive_to_json_summary(item: TokenStream) -> TokenStream { ] .into() } - -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn test_check_exclusive_contexts() { - assert!(check_exclusive_conditions(&[])); - assert!(check_exclusive_conditions(&[&AlertConditions { - is_hybrid_capture: None, - is_lt_chemistry: None, - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - }])); - assert!(check_exclusive_conditions(&[&AlertConditions { - is_hybrid_capture: Some(true), - is_lt_chemistry: None, - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - }])); - - assert!(!check_exclusive_conditions(&[ - &AlertConditions { - is_hybrid_capture: None, - is_lt_chemistry: None, - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - }, - &AlertConditions { - is_hybrid_capture: None, - is_lt_chemistry: None, - is_arc_chemistry: None, - include_introns: None, - is_rtl: None - } - ])); - - assert!(check_exclusive_conditions(&[ - &AlertConditions { - is_hybrid_capture: Some(true), - is_lt_chemistry: None, - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - }, - &AlertConditions { - is_hybrid_capture: Some(false), - is_lt_chemistry: None, - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - } - ])); - - assert!(!check_exclusive_conditions(&[ - &AlertConditions { - is_hybrid_capture: None, - is_lt_chemistry: None, - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - }, - &AlertConditions { - is_hybrid_capture: Some(false), - is_lt_chemistry: None, - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - } - ])); - - assert!(check_exclusive_conditions(&[ - &AlertConditions { - is_hybrid_capture: None, - is_lt_chemistry: Some(true), - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - }, - &AlertConditions { - is_hybrid_capture: None, - is_lt_chemistry: Some(false), - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - } - ])); - - assert!(!check_exclusive_conditions(&[ - &AlertConditions { - is_hybrid_capture: None, - is_lt_chemistry: Some(true), - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - }, - &AlertConditions { - is_hybrid_capture: None, - is_lt_chemistry: Some(true), - is_arc_chemistry: None, - is_rtl: None, - include_introns: None - } - ])); - } -} diff --git a/mro/rna/_analyzer_struct.mro b/mro/rna/_analyzer_struct.mro index ac6324b..5c9526b 100644 --- a/mro/rna/_analyzer_struct.mro +++ b/mro/rna/_analyzer_struct.mro @@ -50,6 +50,7 @@ struct AnalyzerInputs( string umap_metric, int force_cells, bool skip_multigenome_analysis, + bool enable_tsne, ) struct AnalyzerOutputs( @@ -57,4 +58,5 @@ struct AnalyzerOutputs( path analysis_csv, h5 cloupe_matrix_h5, json summary, + bool skip_tsne, ) diff --git a/mro/rna/_antibody_analyzer.mro b/mro/rna/_antibody_analyzer.mro index d3c9080..929a6fb 100644 --- a/mro/rna/_antibody_analyzer.mro +++ b/mro/rna/_antibody_analyzer.mro @@ -10,13 +10,15 @@ filetype h5; filetype json; pipeline _ANTIBODY_ANALYZER( - in h5 filtered_feature_counts_matrix, - in csv aggregate_barcodes, - in bool is_antibody, - in bool is_spatial, - out path antibody_analysis, - out json antibody_histograms_json, - out json antibody_treemap_json, + in h5 filtered_feature_counts_matrix, + in csv aggregate_barcodes, + in bool is_antibody, + in bool is_spatial, + in json multi_graph, + in string sample_id, + out path antibody_analysis, + out json antibody_histograms_json, + out json antibody_treemap_json, ) { # Currently makes histograms @@ -24,6 +26,8 @@ pipeline _ANTIBODY_ANALYZER( filtered_feature_counts_matrix = self.filtered_feature_counts_matrix, is_antibody = self.is_antibody, is_spatial = self.is_spatial, + multi_graph = self.multi_graph, + sample_id = self.sample_id, ) # Currently copies this file diff --git a/mro/rna/_assign_tags.mro b/mro/rna/_assign_tags.mro index d04276d..e712413 100644 --- a/mro/rna/_assign_tags.mro +++ b/mro/rna/_assign_tags.mro @@ -22,7 +22,6 @@ pipeline _ASSIGN_TAGS( in int gem_well, in float min_assignment_confidence, in string throughput, - in string library_type, in json inferred_throughputs, out AssignTagsOuts assign_tags_outs, ) @@ -32,12 +31,13 @@ pipeline _ASSIGN_TAGS( ) call CALL_TAGS_MARGINAL( - filtered_barcodes = self.filtered_barcodes, + filtered_barcodes = self.filtered_barcodes, filtered_feature_counts_matrix = self.filtered_feature_counts_matrix, - throughput = self.throughput, - library_type = self.library_type, + throughput = self.throughput, + multiplexing_method = MULTIPLEXING_METHOD.multiplexing_method, + library_type = null, ) using ( - disabled = MULTIPLEXING_METHOD.multiplexing_is_not_cmo, + disabled = MULTIPLEXING_METHOD.multiplexing_is_not_cmo_or_hashtag, ) call CALL_TAGS_JIBES( @@ -48,9 +48,10 @@ pipeline _ASSIGN_TAGS( marginal_tag_frequencies = CALL_TAGS_MARGINAL.marginal_tag_frequencies, throughput = self.throughput, min_assignment_confidence = self.min_assignment_confidence, - library_type = self.library_type, + multiplexing_method = MULTIPLEXING_METHOD.multiplexing_method, + library_type = null, ) using ( - disabled = MULTIPLEXING_METHOD.multiplexing_is_not_cmo, + disabled = MULTIPLEXING_METHOD.multiplexing_is_not_cmo_or_hashtag, ) call CALL_TAGS_RTL( @@ -63,8 +64,9 @@ pipeline _ASSIGN_TAGS( ) call CALL_TAGS_OH( - chemistry_defs = self.chemistry_defs, - raw_feature_bc_matrix = self.raw_feature_bc_matrix, + chemistry_defs = self.chemistry_defs, + raw_feature_bc_matrix = self.raw_feature_bc_matrix, + filtered_feature_bc_matrix = self.filtered_feature_counts_matrix, ) using ( disabled = MULTIPLEXING_METHOD.multiplexing_is_not_oh, ) @@ -89,6 +91,9 @@ pipeline _ASSIGN_TAGS( multi_graph = self.multi_graph, sample_cell_barcodes = DETERMINE_SAMPLE_ASSIGNMENTS.sample_cell_barcodes, non_singlet_barcodes = DETERMINE_SAMPLE_ASSIGNMENTS.non_singlet_barcodes, + multiplexing_method = MULTIPLEXING_METHOD.multiplexing_method, + ) using ( + disabled = MULTIPLEXING_METHOD.multiplexing_is_not_cmo_or_hashtag, ) call MERGE_METRICS( @@ -112,7 +117,7 @@ pipeline _ASSIGN_TAGS( jibes_parameters: CALL_TAGS_JIBES.jibes_parameters, jibes_summary_data: CALL_TAGS_JIBES.jibes_summary_data, marginal_tag_frequencies: CALL_TAGS_MARGINAL.marginal_tag_frequencies, - multiplexing_is_not_cmo: MULTIPLEXING_METHOD.multiplexing_is_not_cmo, + multiplexing_method: MULTIPLEXING_METHOD.multiplexing_method, non_singlet_barcodes: DETERMINE_SAMPLE_ASSIGNMENTS.non_singlet_barcodes, output_per_sample_raw_matrix: MULTIPLEXING_METHOD.output_per_sample_raw_matrix, sample_assignment_metrics: DETERMINE_SAMPLE_ASSIGNMENTS.sample_summaries, diff --git a/mro/rna/_assign_tags_stages.mro b/mro/rna/_assign_tags_stages.mro index 97f5789..c7c4ff1 100644 --- a/mro/rna/_assign_tags_stages.mro +++ b/mro/rna/_assign_tags_stages.mro @@ -34,17 +34,18 @@ struct AssignTagsOuts( pickle tag_assigner_pickle "tag_assigner_pickle" "tag_assigner_pickle.pickle", map sample_assignment_metrics "Per-sample sample assignment summary metrics" "sample_assignment_metrics.json", json gem_well_inferred_throughputs "Gem well inferred throughput" "gem_well_inferred_throughputs.json", - bool multiplexing_is_not_cmo, + string multiplexing_method, bool output_per_sample_raw_matrix, ) stage MULTIPLEXING_METHOD( - in json multi_graph, - out bool multiplexing_is_not_rtl, - out bool multiplexing_is_not_cmo, - out bool multiplexing_is_not_oh, - out bool output_per_sample_raw_matrix, - src py "../rna/stages/multi/multiplexing_method", + in json multi_graph, + out bool multiplexing_is_not_rtl, + out bool multiplexing_is_not_cmo_or_hashtag, + out bool multiplexing_is_not_oh, + out bool output_per_sample_raw_matrix, + out string multiplexing_method, + src py "../rna/stages/multi/multiplexing_method", ) using ( mem_gb = 1, threads = 1, @@ -55,6 +56,7 @@ stage CALL_TAGS_MARGINAL( in csv filtered_barcodes, in h5 filtered_feature_counts_matrix, in string throughput, + in string multiplexing_method, in string library_type, out csv marginal_tag_calls_per_cell, out csv marginal_tag_frequencies, @@ -71,6 +73,7 @@ stage CALL_TAGS_JIBES( in h5 molecule_info, in string throughput, in string library_type, + in string multiplexing_method, in float min_assignment_confidence, out json jibes_parameters, out csv jibes_model_summary, @@ -111,13 +114,14 @@ stage DETERMINE_SAMPLE_ASSIGNMENTS( ) stage COMPUTE_EXTRA_MULTIPLEXING_METRICS( - in h5 molecule_info, - in h5 filtered_feature_counts_matrix, - in json multi_graph, - in json sample_cell_barcodes, - in json non_singlet_barcodes, - out json summary, - src py "stages/multi/compute_extra_multiplexing_metrics", + in h5 molecule_info, + in h5 filtered_feature_counts_matrix, + in json multi_graph, + in json sample_cell_barcodes, + in json non_singlet_barcodes, + in string multiplexing_method, + out json summary, + src py "stages/multi/compute_extra_multiplexing_metrics", ) split ( ) using ( volatile = strict, diff --git a/mro/rna/_basic_sc_rna_counter.mro b/mro/rna/_basic_sc_rna_counter.mro index 2723c82..6d7ed07 100644 --- a/mro/rna/_basic_sc_rna_counter.mro +++ b/mro/rna/_basic_sc_rna_counter.mro @@ -18,7 +18,6 @@ pipeline _BASIC_SC_RNA_COUNTER( in map[] chunks, in path reference_path, in CellCalling cell_calling_config, - in string[] libraries_to_translate, in float subsample_rate, in int initial_reads, in int r1_length, @@ -46,7 +45,7 @@ pipeline _BASIC_SC_RNA_COUNTER( in float min_assignment_confidence, in string slide_serial_capture_area, in FeatureConfig feature_config, - in h5 v1_filtered_fbm, + in V1PatternFixArgs v1_pattern_fix, out csv filtered_barcodes, out csv aggregate_barcodes, out csv nonambient_cell_calls, @@ -92,6 +91,7 @@ pipeline _BASIC_SC_RNA_COUNTER( out csf[] counts_bc_order, out bool no_star_alignments, out bi.bincode barcode_index, + out parquet[] per_read_gap_align, ) { call _SLFE_MATRIX_COMPUTER as _MATRIX_COMPUTER( @@ -102,7 +102,6 @@ pipeline _BASIC_SC_RNA_COUNTER( is_pd = self.is_pd, chunks = self.chunks, reference_path = self.reference_path, - libraries_to_translate = self.libraries_to_translate, subsample_rate = self.subsample_rate, initial_reads = self.initial_reads, r1_length = self.r1_length, @@ -120,7 +119,7 @@ pipeline _BASIC_SC_RNA_COUNTER( aligner = self.aligner, disable_target_umi_filter = self.disable_target_umi_filter, feature_config = self.feature_config, - v1_filtered_fbm = self.v1_filtered_fbm, + v1_pattern_fix = self.v1_pattern_fix, ) call FILTER_BARCODES( @@ -139,8 +138,8 @@ pipeline _BASIC_SC_RNA_COUNTER( ) call CHECK_CORRECTION_FACTOR( - v1_filtered_fbm = self.v1_filtered_fbm, - filtered_fbm = FILTER_BARCODES.filtered_matrices_h5, + v1_pattern_fix = self.v1_pattern_fix, + filtered_fbm = FILTER_BARCODES.filtered_matrices_h5, ) call DISABLE_STAGES( @@ -218,8 +217,6 @@ pipeline _BASIC_SC_RNA_COUNTER( min_assignment_confidence = self.min_assignment_confidence, throughput = INFER_GEM_WELL_THROUGHPUT.throughput, inferred_throughputs = INFER_GEM_WELL_THROUGHPUT.inferred_throughputs, - # default=null is multiplexing, but this enables others e.g. antigen capture - library_type = null, ) using ( disabled = DISABLE_STAGES.disable_assign_tags, ) @@ -227,8 +224,6 @@ pipeline _BASIC_SC_RNA_COUNTER( # stages/pipelines below here are for multiplexing sliced outputs # sample_barcodes is passed on by the _CELLS_REPORTER # and was either calculated from tags or is equal to self.force_sample_barcodes - # in multi-gem world a couple of these things (BAM writing, metrics) should be completely migrated to MERGE_GEM_WELLS_AND_SLICE_CELLS - # but without multi-gem there isn't explicitly a need to run that stage and it does unnecessary things like running Aggr. call DEMUX_PROBE_BC_MATRIX( probe_barcode_counts = _MATRIX_COMPUTER.probe_barcode_counts, @@ -267,6 +262,7 @@ pipeline _BASIC_SC_RNA_COUNTER( call COLLATE_METRICS as MULTI_COLLATE_PER_SAMPLE_METRICS( per_barcode_metrics = _MATRIX_COMPUTER.per_barcode_metrics_shard, reference_path = self.reference_path, + target_set = self.target_set, feature_reference = _MATRIX_COMPUTER.slfe_feature_reference, filtered_barcodes = FILTER_BARCODES.filtered_barcodes, aggregate_barcodes = FILTER_BARCODES.aggregate_barcodes, @@ -353,5 +349,6 @@ pipeline _BASIC_SC_RNA_COUNTER( counts_bc_order = _MATRIX_COMPUTER.counts_bc_order, no_star_alignments = _MATRIX_COMPUTER.no_star_alignments, barcode_index = _MATRIX_COMPUTER.barcode_index, + per_read_gap_align = _MATRIX_COMPUTER.per_read_gap_align, ) } diff --git a/mro/rna/_basic_sc_rna_counter_stages.mro b/mro/rna/_basic_sc_rna_counter_stages.mro index c59f6d3..7e68433 100644 --- a/mro/rna/_basic_sc_rna_counter_stages.mro +++ b/mro/rna/_basic_sc_rna_counter_stages.mro @@ -2,6 +2,7 @@ # Copyright (c) 2019 10X Genomics, Inc. All rights reserved. # @include "_cr_lib_stages.mro" +@include "_v1_pattern_fix.mro" filetype bam; filetype bam.bai; @@ -139,28 +140,28 @@ stage SUBSAMPLE_READS( ) stage COMPUTE_CORRECTION_FACTOR( - in h5 v1_filtered_fbm, - in json barcodes_under_tissue, - out float correction_factor, - out json affected_barcodes, - out bool disable_downsampling, - src py "stages/spatial/compute_correction_factor", + in V1PatternFixArgs v1_pattern_fix, + in json barcodes_under_tissue, + out float correction_factor, + out json affected_barcodes, + out bool disable_downsampling, + src py "stages/spatial/compute_correction_factor", ) using ( volatile = strict, ) stage DISABLE_CORRECTION_FACTOR( - in h5 v1_filtered_fbm, - out bool disable_correction_factor, - src py "stages/spatial/disable_correction_factor", + in V1PatternFixArgs v1_pattern_fix, + out bool disable_correction_factor, + src py "stages/spatial/disable_correction_factor", ) using ( volatile = strict, ) stage CHECK_CORRECTION_FACTOR( - in h5 v1_filtered_fbm, - in h5 filtered_fbm, - src py "stages/spatial/check_correction_factor", + in V1PatternFixArgs v1_pattern_fix, + in h5 filtered_fbm, + src py "stages/spatial/check_correction_factor", ) using ( volatile = strict, ) diff --git a/mro/rna/_cell_annotation_common_stages.mro b/mro/rna/_cell_annotation_common_stages.mro new file mode 100644 index 0000000..1efea32 --- /dev/null +++ b/mro/rna/_cell_annotation_common_stages.mro @@ -0,0 +1,49 @@ +filetype csv; +filetype h5; +filetype json.gz; +filetype json; +filetype cloupe; + +struct CellTypeResults( + csv cell_types, + json.gz results, + json metadata, + float frac_returned_bcs, + string model_used, + bool skip_downstream, +) + +stage CELL_ANNOTATION_PREFLIGHT( + in bool is_cr_annotate, + in bool is_multi, + in string tenx_cloud_token_path, + in string cell_annotation_model, + in path reference_path, + in string cas_track_name, + in bool skip_cell_annotation, + in h5 cr_annotate_filtered_matrix, + in cloupe cr_annotate_sample_cloupe, + src py "stages/cas_cell_typing/cell_annotation_preflight", +) using ( + mem_gb = 8, + volatile = strict, +) + +stage CALL_CLOUD_CELL_TYPES( + in string sample_id, + in string sample_desc, + in h5 filtered_matrix, + in string cell_annotation_model, + in file tenx_cloud_token_path, + in string pipestance_type, + in bool override_num_bc_limit, + in cloupe sample_cloupe, + out CellTypeResults cell_type_results, + out bool cas_success, + out bool disable_cas_ws, + out bool disable_summarize, + out json summary, + src py "stages/cas_cell_typing/call_cloud_cell_types", +) split ( +) using ( +) diff --git a/mro/rna/_common_stages.mro b/mro/rna/_common_stages.mro index 1f350c0..e42c18e 100644 --- a/mro/rna/_common_stages.mro +++ b/mro/rna/_common_stages.mro @@ -44,6 +44,7 @@ stage CELLRANGER_PREFLIGHT( in bool full_check, in string chemistry, in map[] sample_def, + in csv target_set, in path reference_path, in csv feature_reference, in CellCallingParam recovered_cells, @@ -82,6 +83,7 @@ stage DISABLE_SECONDARY_ANALYSIS( in bool is_spatial, in h5 filtered_matrices_h5, in bool no_secondary_analysis, + in bool is_visium_hd_main_run "Boolean indicating if this is being called from a main (not-binning) Visium HD run", out bool no_secondary_analysis, src py "stages/common/disable_secondary_analysis", ) using ( @@ -89,13 +91,15 @@ stage DISABLE_SECONDARY_ANALYSIS( ) stage PARSE_TARGET_FEATURES( - in map[] sample_def, + in string target_set_name, + in csv target_set, in path reference_path, in json gene_index, in bool filter_probes, in bool no_target_umi_filter, in bool no_bam, in bool is_pd, + in bool is_antibody_only, out fa bait_fasta, out csv target_panel, out csv probe_set, @@ -109,6 +113,5 @@ stage PARSE_TARGET_FEATURES( out tps.json target_panel_summary, src py "stages/common/parse_target_features", ) using ( - mem_gb = 4, - volatile = strict, + mem_gb = 4, ) diff --git a/mro/rna/_cr_aggr_stages.mro b/mro/rna/_cr_aggr_stages.mro index b37fb30..2970a48 100644 --- a/mro/rna/_cr_aggr_stages.mro +++ b/mro/rna/_cr_aggr_stages.mro @@ -9,6 +9,7 @@ filetype em.json; filetype fa; filetype fasta; filetype h5; +filetype html; filetype json; filetype pb; filetype tsv; @@ -40,6 +41,8 @@ struct VdjAggrResults( csv consensus_annotations_csv, json web_summary_data, vloupe vloupe, + html filter_summary, + pb enclone_output, ) stage MERGE_MOLECULES( @@ -80,19 +83,6 @@ stage SETUP_VDJ_AGGR( out map enclone_gem_well_info, ) -stage RUN_ENCLONE_AGGR( - in json[] contig_ann_json_files, - in csv enclone_input_csv, - in em.json enclone_gem_well_meta, - in path vdj_reference_path, - out pb enclone_output, - out fa donor_ref_fa, - src comp "cr_aggr martian run_enclone_aggr", -) using ( - mem_gb = 9, - threads = 4, -) - stage PARSE_AGGR_CSV( in path pipestance_root, in csv aggregation_csv, @@ -115,6 +105,7 @@ stage WRITE_CONTIG_PROTO( in string sample_desc, in string multi_config_sha, in bdf.bincode barcode_brief, + in string multiplexing_method, out pb vdj_contig_info, src comp "cr_aggr martian write_contig_proto", ) @@ -132,6 +123,8 @@ stage MATCH_VDJ_AGGR_OUTS( in AntigenAggrResults[] antigen_analysis, in json[] antigen_aggr_web_summary_data_in, in tsv[] airr_rearrangements, + in html[] filter_summaries, + in pb[] enclone_outputs, out VdjAggrResults vdj_t_results, out VdjAggrResults vdj_t_gd_results, out VdjAggrResults vdj_b_results, diff --git a/mro/rna/_cr_ana_stages.mro b/mro/rna/_cr_ana_stages.mro index 6c6c41c..af16931 100644 --- a/mro/rna/_cr_ana_stages.mro +++ b/mro/rna/_cr_ana_stages.mro @@ -23,10 +23,11 @@ stage RUN_DIFFERENTIAL_EXPRESSION_NG( in map[] cluster_keys, out bincode.lz4 diffexp, ) using ( + mem_gb = 2, volatile = strict, ) -stage RUN_GRAPH_CLUSTERING_NG( +stage RUN_GRAPH_CLUSTERING( in h5 matrix_h5, in h5 pca_h5, in int num_neighbors, @@ -84,7 +85,7 @@ stage RUN_PCA2( volatile = strict, ) -stage RUN_TSNE_NG( +stage RUN_TSNE( in h5 matrix_h5, in h5 pca_h5, in int random_seed, @@ -97,7 +98,7 @@ stage RUN_TSNE_NG( in float theta, out h5 tsne_h5, out path tsne_csv, - src comp "cr_ana martian tsne_stage", + src comp "cr_ana martian run_tsne", ) split ( in int tsne_dims, in string feature_type, diff --git a/mro/rna/_cr_lib_stages.mro b/mro/rna/_cr_lib_stages.mro index 96ea05f..03350ba 100644 --- a/mro/rna/_cr_lib_stages.mro +++ b/mro/rna/_cr_lib_stages.mro @@ -26,9 +26,11 @@ filetype fbc.bincode; filetype fprint.json; filetype frf.bincode; filetype h5; +filetype html; filetype json; filetype msh.bincode; filetype msm.bincode; +filetype parquet; filetype rpc; filetype shard; filetype smf.json; @@ -46,6 +48,7 @@ struct ReadShards( struct WhitelistSpec( string name, + bool translation, file translation_whitelist_path, string slide, string part, @@ -68,8 +71,8 @@ struct UmiWhitelistSpec( struct UmiReadComponent( string read_type, int offset, - int length, - int min_length, + int length "The length of the UMI. At most this number of bases will be extracted for use as a UMI.", + int min_length "If a shorter UMI can be used, add it here. None indicates that the full", UmiWhitelistSpec whitelist, ) @@ -126,6 +129,7 @@ struct FeatureConfig( string beam_mode, SpecificityControls specificity_controls, map functional_map, + string[] hashtag_ids, ) struct GemWellFiles( @@ -177,6 +181,8 @@ struct BarcodeAssignments( struct CountInputs( map[] sample_def, + csv target_set, + string target_set_name, map chemistry_specs, ChemistryDef custom_chemistry_def, path reference_path, @@ -208,7 +214,10 @@ struct CountInputs( float min_assignment_confidence, int min_crispr_umi_threshold, csv[] annotations, - string cas_model, + string cell_annotation_model, + bool skip_cell_annotation, + string tenx_cloud_token_path, + bool enable_tsne, ) struct VdjInputs( @@ -231,8 +240,10 @@ struct VdjInputs( struct BasicPipelineConfig( bool disable_count, bool disable_vdj, - bool disable_multi, - bool disable_multi_count, + bool disable_multi "boolean to disable stages that are only needed in the multi pipeline", + bool disable_multi_count "boolean to disable stages that are only needed when count libraries are", + bool disable_rtl "boolean to disable stages that are only needed when probes are present", + bool disable_annotate "boolean to disable annotate stages", ) struct BeamAnalyzerOutputs( @@ -263,7 +274,6 @@ struct GexMatrices( struct VdjDemuxSampleInfo( string sample_id, - int sample_number, GexMatrices gex_matrices, fprint.json fingerprint, ) @@ -322,6 +332,7 @@ stage ALIGN_AND_COUNT( out path bam_header, out csv barcode_summary, out AnnotationFiles annotation_files, + out parquet[] per_read_gap_align, out bmsf[] per_barcode_metrics, out json summary, out bool no_star_alignments, @@ -347,9 +358,9 @@ stage BARCODE_CORRECTION( in bsc.bincode barcode_segment_counts, in bcc.bincode barcode_counts, in bcm.bincode valid_read_metrics, - in string[] libraries_to_translate, in cmf.bincode correction_map, in int min_reads_to_report_bc, + in json barcodes_under_tissue, out shard[] valid_corrected, out shard[] invalid, out json summary, @@ -357,24 +368,28 @@ stage BARCODE_CORRECTION( out tbcc.bincode total_barcode_counts, src comp "cr_lib martian barcode_correction", ) split ( - in map range, + in int index, + in int count, out shard valid_shard, out shard invalid_shard, out bcm.bincode chunk_summary, ) using ( - mem_gb = 4, volatile = strict, ) stage BUILD_PER_SAMPLE_VDJ_WS_CONTENTS( - in json lib_level_metrics, - in map per_sample_metrics, in string receptor, in string physical_library_id, + in string multiplexing_method, + in json lib_level_metrics, + in map per_sample_metrics, in VdjGenInputs vdj_gen_inputs, in smf.json sequencing_metrics, - in map vdj_ws_json, + in json lib_level_vdj_ws_json, + in map per_sample_vdj_ws_json, in map filter_metrics, + in json multi_graph, + in json vdj_cells_per_tag_json, out map vdj_ws_contents, src comp "cr_lib martian build_per_sample_vdj_ws_contents", ) split ( @@ -387,6 +402,7 @@ stage BUILD_PER_SAMPLE_VDJ_WS_CONTENTS( stage CALL_TAGS_OH( in map chemistry_defs, in h5 raw_feature_bc_matrix, + in h5 filtered_feature_bc_matrix, out json barcodes_per_tag, out json summary, src comp "cr_lib martian call_tags_oh", @@ -413,7 +429,6 @@ stage CHECK_BARCODES_COMPATIBILITY( in map chemistry_defs, in map[] sample_def, in bool check_library_compatibility, - out string[] libraries_to_translate, src comp "cr_lib martian check_barcodes_compatibility", ) using ( mem_gb = 2, @@ -440,6 +455,7 @@ stage CHECK_SINGLE_BEAM_MODE( stage COLLATE_METRICS( in bmsf[] per_barcode_metrics, in path reference_path, + in csv target_set, in frf.bincode feature_reference, in csv filtered_barcodes, in csv aggregate_barcodes, @@ -559,6 +575,12 @@ stage DETECT_VDJ_RECEPTOR( volatile = strict, ) +stage EXPECT_SINGLE_BARCODE_WHITELIST( + in string[] barcode_whitelists, + out string barcode_whitelist, + src comp "cr_lib martian expect_single_barcode_whitelist", +) + stage EXTRACT_SINGLE_CHEMISTRY( in map chemistry_defs, in string library_to_extract, @@ -568,6 +590,29 @@ stage EXTRACT_SINGLE_CHEMISTRY( volatile = strict, ) +stage GENERATE_CAS_WEBSUMMARY( + in string sample_id, + in string sample_desc, + in float cas_frac_returned_bcs, + in json metadata, + in string cell_annotation_model, + in json cell_type_bar_chart, + in json spatial_cell_types_chart, + in json cell_type_interactive_bar_chart, + in json cell_types_box_plot, + in json cell_types_umap_plot, + in json diffexp, + in bool cas_success, + in bool disable_differential_expression, + in string alert_string, + in bool disable_cas_ws, + in string pipestance_type, + out html summary, + out json cell_annotation_metrics, + out string cell_annotation_cloupe_name, + src comp "cr_lib martian generate_cas_websummary", +) + stage GET_CHEMISTRY_DEF( in string chemistry_name, in ChemistryDef custom_chemistry_def, @@ -579,7 +624,6 @@ stage GET_CHEMISTRY_DEF( stage GET_GDNA_METRICS( in h5 molecule_info, - in path reference_path, in csv probe_set, out json summary, out json gdna_plot_sufficient_stats, @@ -620,7 +664,6 @@ stage MAKE_SHARD( in csv target_features, in csv target_set, in string target_set_name, - in string[] libraries_to_translate, in FeatureConfig feature_config, out shard[] valid, out shard[] invalid, @@ -643,6 +686,7 @@ stage MAKE_SHARD( out msm.bincode chunk_summary, out msh.bincode chunk_hist, ) using ( + mem_gb = 2, volatile = strict, ) @@ -676,7 +720,7 @@ stage MULTI_SETUP_CHUNKS( in map chemistry_defs, in string default_library_type, out map[] chunks, - out string barcode_whitelist, + out string[] barcode_whitelists, out string visium_hd_slide_name, src comp "cr_lib martian multi_setup_chunks", ) @@ -696,6 +740,7 @@ stage PARSE_MULTI_CONFIG( out csv config_file, out FeatureConfig feature_config, out csv feature_ref, + out csv target_set, out json cell_barcodes, out json sample_barcodes, out json non_singlet_barcodes, @@ -707,6 +752,7 @@ stage PARSE_MULTI_CONFIG( volatile = strict, ) retain ( feature_ref, + target_set, cell_barcodes, sample_barcodes, non_singlet_barcodes, @@ -770,6 +816,8 @@ stage SETUP_VDJ_ANALYSIS( out bool disable_cell_calling, out bool disable_clonotyping, out bool disable_beam, + out bool disable_asm_metrics, + out string multiplexing_method, out string beam_mode, out h5 filtered_matrix_h5, out h5 raw_matrix_h5, @@ -784,6 +832,7 @@ stage SETUP_VDJ_DEMUX( out bool is_not_multi, out bool has_antigen, out map per_sample_info, + out string multiplexing_method, src comp "cr_lib martian setup_vdj_demux", ) @@ -799,10 +848,11 @@ stage SUBSAMPLE_BARCODES( stage WRITE_BARCODE_INDEX( in bcc.bincode barcode_counts, in json barcodes_under_tissue, + in json barcode_correction_summary, out bi.bincode barcode_index, src comp "cr_lib martian write_barcode_index", +) split ( ) using ( - mem_gb = 6, volatile = strict, ) @@ -810,10 +860,11 @@ stage WRITE_BARCODE_SUMMARY( in bmsf[] per_barcode_metrics, in frf.bincode feature_reference, in bi.bincode barcode_index, + in json barcode_correction_summary, out h5 barcode_summary, src comp "cr_lib martian write_barcode_summary", +) split ( ) using ( - mem_gb = 7, volatile = strict, ) @@ -833,10 +884,11 @@ stage WRITE_H5_MATRIX( in map chemistry_defs, in string sample_id, in bi.bincode barcode_index, + in json barcode_correction_summary, out h5 matrix, src comp "cr_lib martian write_h5_matrix", +) split ( ) using ( - mem_gb = 7, volatile = strict, ) @@ -844,10 +896,11 @@ stage WRITE_MATRIX_MARKET( in csf[] counts, in frf.bincode feature_reference, in bi.bincode barcode_index, + in json barcode_correction_summary, out path feature_bc_matrix, src comp "cr_lib martian write_matrix_market", +) split ( ) using ( - mem_gb = 7, volatile = strict, ) @@ -890,8 +943,9 @@ stage WRITE_MULTI_WEB_SUMMARY_JSON( in svg multi_graph_svg, in CommonInputs common_inputs, in CountInputs count_inputs, + in VdjGenInputs vdj_gen_inputs, in json tag_contaminant_info, - in map sample_tsne_plots, + in map sample_projection_plots, in map sample_barcode_rank_plots, in map sample_treemap_plots, in json barcode_rank_plots, @@ -899,28 +953,31 @@ stage WRITE_MULTI_WEB_SUMMARY_JSON( in json antibody_histograms, in map sample_antibody_histograms, in json antigen_histograms, - in csv targeted_per_feature_metrics, - in json cmo_tsne_plot, + in json cmo_projection_plot, in map vdj_t_contents, in map vdj_t_gd_contents, in map vdj_b_contents, in string target_set_name, in map antigen_vdj_metrics, in map antigen_specificity, + in map cell_annotation_barcharts, + in map cell_annotation_box_plots, + in map cell_annotation_umap_plots, + in map cell_annotation_diffexp_tables, + in map cell_annotation_metrics_jsons, + in map cell_annotation_viable_but_not_requested, in FeatureConfig feature_config, in map chemistry_defs, in json detected_probe_barcode_pairing, in bool no_preflight, out map web_summary_json, out map metrics_summary_csv, - out map metrics_summary_json, src comp "cr_lib martian write_multi_web_summary_json", ) using ( mem_gb = 5, volatile = strict, ) retain ( web_summary_json, - metrics_summary_json, ) stage WRITE_POS_BAM( diff --git a/mro/rna/_cr_vdj_stages.mro b/mro/rna/_cr_vdj_stages.mro index d78a709..95a9eae 100644 --- a/mro/rna/_cr_vdj_stages.mro +++ b/mro/rna/_cr_vdj_stages.mro @@ -6,12 +6,14 @@ filetype arp.bincode; filetype bam; filetype bam.bai; +filetype bd.bincode; filetype bdf.bincode; filetype bed; filetype bin; filetype bincode; filetype bincode.lz4; filetype csv; +filetype em.json; filetype fa; filetype fasta; filetype fasta.fai; @@ -21,6 +23,7 @@ filetype h5; filetype html; filetype json; filetype json.lz4; +filetype parquet; filetype pb; filetype tsv; filetype txt; @@ -35,14 +38,22 @@ struct VdjRefFolder( ) struct FilterSwitch( - bool asm_shared_contig, - bool enclone_shared_contig, - bool enclone_multiplet, - bool enclone_umi, + bool asm_shared_contig "Turn on/off filters in the assembler that makes use of shared contigs to detect potential artifacts", + bool enclone_shared_contig "Turn on/off enclone filters that makes use of shared contigs across clonotypes to detect", + bool enclone_multiplet "Filters that remove putative doublets", + bool enclone_umi "Turn on/off UMI thresholds in enclone", + bool enclone_cross "Turn on/off enclone filters that detect fake clonotype expansions", +) + +struct ContigAnnotationSource( + json merged_liblevel, + json post_cell_filtering, + json post_clonotyping, ) struct WhitelistSpec( string name, + bool translation, file translation_whitelist_path, string slide, string part, @@ -65,8 +76,8 @@ struct UmiWhitelistSpec( struct UmiReadComponent( string read_type, int offset, - int length, - int min_length, + int length "The length of the UMI. At most this number of bases will be extracted for use as a UMI.", + int min_length "If a shorter UMI can be used, add it here. None indicates that the full", UmiWhitelistSpec whitelist, ) @@ -89,6 +100,11 @@ struct ChemistryDef( map barcode_extraction, ) +struct VdjPrimers( + int[][] inner_primers, + int[][] outer_primers, +) + stage COPY_VDJ_REFERENCE( in path vdj_reference_path, out VdjRefFolder vdj_reference, @@ -104,6 +120,7 @@ stage SUMMARIZE_VDJ_FILTERS( in h5 raw_matrix_h5, out html filter_summary, out json metrics_summary, + out parquet per_bc_filters, src comp "cr_vdj martian summarize_vdj_filters", ) using ( mem_gb = 5, @@ -131,10 +148,11 @@ stage RUN_ENCLONE( ) using ( mem_gb = 5, threads = -4, + vmem_gb = 12, ) stage WRITE_CLONOTYPE_OUTS( - in int sample_number, + in string sample_id, in string receptor, in pb enclone_output, out csv clonotypes_csv, @@ -144,25 +162,24 @@ stage WRITE_CLONOTYPE_OUTS( ) stage FILL_CLONOTYPE_INFO( - in int sample_number, - in json contig_annotations, - in pb enclone_output, - out json all_contig_annotations_json, - src comp "cr_vdj martian fill_clonotype_info", + in string sample_id, + in json contig_annotations, + in pb enclone_output, + out json all_contig_annotations_json, + src comp "cr_vdj martian fill_clonotype_info", ) using ( mem_gb = 2, ) stage HANDLE_NO_CLONOTYPING( - in json asm_contig_json, - in json clonotype_contig_json, - in bool disable_clonotyping, - out json final_contig_annotations, - src comp "cr_vdj martian handle_no_clonotyping", + in ContigAnnotationSource contigs, + in bool disable_clonotyping, + out json final_contig_annotations, + src comp "cr_vdj martian handle_no_clonotyping", ) stage WRITE_CONCAT_REF_OUTS( - in int sample_number, + in string sample_id, in pb enclone_output, in json all_contig_annotations_json, out bam concat_ref_bam, @@ -171,12 +188,12 @@ stage WRITE_CONCAT_REF_OUTS( out fasta.fai concat_ref_fasta_fai, src comp "cr_vdj martian write_concat_ref_outs", ) using ( - mem_gb = 5, + mem_gb = 12, threads = 4, ) stage WRITE_CONSENSUS_BAM( - in int sample_number, + in string sample_id, in pb enclone_output, in json all_contig_annotations_json, out bam consensus_bam, @@ -188,7 +205,7 @@ stage WRITE_CONSENSUS_BAM( ) stage WRITE_CONSENSUS_TXT( - in int sample_number, + in string sample_id, in pb enclone_output, out fasta consensus_fasta, out fasta.fai consensus_fasta_fai, @@ -199,7 +216,24 @@ stage WRITE_CONSENSUS_TXT( threads = 1, ) +stage RUN_ENCLONE_AGGR( + in json[] contig_ann_json_files, + in csv enclone_input_csv, + in em.json enclone_gem_well_meta, + in path vdj_reference_path, + in FilterSwitch filter_switch, + in bool mix_donors, + out pb enclone_output, + out fa donor_ref_fa, + out json barcode_fate, + src comp "cr_vdj martian run_enclone_aggr", +) using ( + mem_gb = 16, + threads = 4, +) + stage ASSEMBLE_VDJ( + in string sample_id, in map chemistry_defs, in bincode.lz4[] bc_sorted_rna_reads, in path vdj_reference_path, @@ -215,23 +249,21 @@ stage ASSEMBLE_VDJ( out bam.bai contig_bam_bai, out tsv summary_tsv, out tsv umi_summary_tsv, - out json metrics_summary_json, out json contig_annotations, out bdf.bincode barcode_brief, + out bd.bincode barcode_full, out csv barcode_support, out json[] barcodes_in_chunks, out arp.bincode assemblable_reads_per_bc, out txt align_info, out fastq unmapped_sample_fastq, - out txt report, src comp "cr_vdj martian assembly", ) split ( in bincode.lz4 chunk_rna_reads, - in bool perf_track, in int chunk_id, + in VdjPrimers primers, out json barcodes_in_chunk, - out bin barcode_data, - out bin barcode_data_sum, + out bd.bincode barcode_data, out bin barcode_data_brief, out bincode outs_builder, ) @@ -240,7 +272,7 @@ stage ASM_CALL_CELLS( in string receptor, in bool denovo, in path vdj_reference_path, - in map count_chemistry_defs, + in map vdj_chemistry_def, in json contig_annotations, in bdf.bincode barcode_brief, in int n50_n50_rpu, @@ -255,6 +287,27 @@ stage ASM_CALL_CELLS( filter_diagnostics, ) +stage MAKE_EXACT_CLONOTYPES( + in json contig_annotations, + out json exact_clonotypes, + src comp "cr_vdj martian make_exact_clonotypes", +) using ( + mem_gb = 4, +) + +stage FILTER_EXACT_CLONOTYPES( + in json exact_clonotypes, + in json contig_annotations, + in json.lz4 filter_diagnostics, + out json contig_annotations, + out json.lz4 filter_diagnostics, + src comp "cr_vdj martian filter_exact_clonotypes", +) using ( + mem_gb = 4, +) retain ( + filter_diagnostics, +) + stage CREATE_AIRR_TSV( in json contig_annotations, in fasta concat_ref_fasta, @@ -306,9 +359,14 @@ stage MAKE_FILTER_SWITCH( ) stage MERGE_PER_SAMPLE_ANNOTATIONS( - in map per_sample_annotations, - out json contig_annotations, - src comp "cr_vdj martian merge_per_sample_annotations", + in map per_sample_annotations, + in json asm_contig_annotations, + in string multiplexing_method, + in json gex_cells_per_tag, + in ChemistryDef vdj_chemistry_def, + out json contig_annotations, + out json vdj_cells_per_tag_json, + src comp "cr_vdj martian merge_per_sample_annotations", ) stage WRITE_ANN_CSV( @@ -320,24 +378,39 @@ stage WRITE_ANN_CSV( stage SUBSET_ASSEMBLY_OUTS( in bool per_sample, - in map count_chemistry_defs, + in string multiplexing_method, + in map vdj_chemistry_def, in fprint.json sample_fingerprint, in json contig_annotations, in json merged_annotations, in int total_read_pairs, in json corrected_barcode_counts, in arp.bincode assemblable_reads_per_bc, - in tsv contig_summary, in tsv umi_summary, in csv barcode_support, in bdf.bincode barcode_brief, + in bd.bincode barcode_full, out json contig_annotations, out int total_read_pairs, out json corrected_barcode_counts, out arp.bincode assemblable_reads_per_bc, - out tsv contig_summary, out tsv umi_summary, out csv barcode_support, out bdf.bincode barcode_brief, + out bd.bincode barcode_full, src comp "cr_vdj martian subset_assembly_outs", ) + +stage ASM_METRICS( + in ChemistryDef chemistry_def, + in path vdj_reference_path, + in string receptor, + in path inner_enrichment_primers, + in int total_read_pairs, + in bd.bincode barcode_full, + out json metrics_summary_json, + out txt report, + src comp "cr_vdj martian asm_metrics", +) using ( + mem_gb = 8, +) diff --git a/mro/rna/_run_kmeans.mro b/mro/rna/_run_kmeans.mro index 76b569b..c8aae03 100644 --- a/mro/rna/_run_kmeans.mro +++ b/mro/rna/_run_kmeans.mro @@ -13,6 +13,8 @@ stage RUN_KMEANS( ) split ( in int n_clusters, in string library, + in int which_pca, ) using ( + mem_gb = 3, volatile = strict, ) diff --git a/mro/rna/_sc_antibody_analyzer_stages.mro b/mro/rna/_sc_antibody_analyzer_stages.mro index 51f5500..25101bc 100644 --- a/mro/rna/_sc_antibody_analyzer_stages.mro +++ b/mro/rna/_sc_antibody_analyzer_stages.mro @@ -8,12 +8,14 @@ filetype h5; filetype json; stage CALL_ANTIBODIES( - in h5 filtered_feature_counts_matrix, - in bool is_antibody, - in bool is_spatial, - out json antibody_histograms_json, - out json antibody_treemap_json, - src py "stages/feature/call_antibodies", + in h5 filtered_feature_counts_matrix, + in bool is_antibody, + in bool is_spatial, + in json multi_graph, + in string sample_id, + out json antibody_histograms_json, + out json antibody_treemap_json, + src py "stages/feature/call_antibodies", ) split ( ) using ( volatile = strict, diff --git a/mro/rna/_sc_multi_defs.mro b/mro/rna/_sc_multi_defs.mro index f796b8b..56fde69 100644 --- a/mro/rna/_sc_multi_defs.mro +++ b/mro/rna/_sc_multi_defs.mro @@ -2,7 +2,7 @@ # Copyright (c) 2022 10X Genomics, Inc. All rights reserved. # -@include "sc_rna_aggregator.mro" +@include "cell_annotation_service.mro" @include "sc_rna_analyzer.mro" @include "_analyzer_struct.mro" @include "_antibody_analyzer.mro" @@ -13,7 +13,6 @@ @include "_cr_lib_stages.mro" @include "_cr_vdj_stages.mro" @include "_crispr_analyzer.mro" -@include "_sc_rna_aggregator_stages.mro" @include "_sc_rna_counter_stages.mro" @include "_sc_vdj_assembler_stages.mro" @include "_sc_vdj_clonotype_assigner.mro" @@ -59,6 +58,8 @@ struct VdjInputsCS( struct CountInputsCS( map[] sample_def, + csv target_set, + string target_set_name, path reference_path, json gene_index, bool no_bam, @@ -83,6 +84,10 @@ struct CountInputsCS( int global_minimum_umis, int max_mito_percent, int min_crispr_umi_threshold, + string tenx_cloud_token_path, + bool enable_tsne, + string cell_annotation_model, + bool skip_cell_annotation, ) struct GemWellInputs( @@ -162,6 +167,7 @@ struct MultiCountOutputsCS( bam unassigned_alignments "Alignments from unassigned barcodes" "unassigned_alignments.bam", bam.bai unassigned_alignments_bai_index "BAI Index for alignments from unassigned barcodes" "unassigned_alignments.bam.bai", bam.csi unassigned_alignments_csi_index "CSI Index for alignments from unassigned barcodes" "unassigned_alignments.bam.csi", + csv aggregate_barcodes "Antibody and Antigen aggregate barcodes", ) struct MultiplexingAnalysisCS( @@ -203,23 +209,24 @@ struct SampleVdjOutputsCS( ) struct SampleCountOutputsCS( - path analysis "Secondary analysis output CSV", - cloupe sample_cloupe "Loupe Browser File", - path crispr_analysis "CRISPR analysis outputs", - csv aggregate_barcodes "Sample Antibody and Antigen aggregate barcodes", - csv feature_reference_csv "Feature reference" "feature_reference.csv", - csv sample_filtered_barcodes_csv "Sample barcodes" "sample_filtered_barcodes.csv", - path sample_filtered_feature_bc_matrix_mex "Sample filtered feature-barcode matrices MEX" "sample_filtered_feature_bc_matrix", - h5 sample_filtered_feature_bc_matrix "Sample filtered feature-barcode matrices H5" "sample_filtered_feature_bc_matrix.h5", - path sample_raw_feature_bc_matrix_mex "Sample raw feature-barcode matrices MEX" "sample_raw_feature_bc_matrix", - h5 sample_raw_feature_bc_matrix "Sample raw feature-barcode matrices H5" "sample_raw_feature_bc_matrix.h5", - h5 sample_raw_probe_bc_matrix "Sample raw probe-barcode matrix H5" "sample_raw_probe_bc_matrix.h5", - bam sample_alignments "BAM alignments for reads assigned to this sample" "sample_alignments.bam", - bam.bai sample_alignments_index_bai "BAM BAI index for reads assigned to this sample" "sample_alignments.bam.bai", - bam.csi sample_alignments_index_csi "BAM CSI index for reads assigned to this sample" "sample_alignments.bam.csi", - h5 sample_molecule_info "Per-molecule read information for reads assigned to this sample", - csv target_panel "Target Panel File", - csv probe_set "Probe Set File", + path analysis "Secondary analysis output CSV", + cloupe sample_cloupe "Loupe Browser File", + path crispr_analysis "CRISPR analysis outputs", + csv aggregate_barcodes "Sample Antibody and Antigen aggregate barcodes", + csv feature_reference_csv "Feature reference" "feature_reference.csv", + csv sample_filtered_barcodes_csv "Sample barcodes" "sample_filtered_barcodes.csv", + path sample_filtered_feature_bc_matrix_mex "Sample filtered feature-barcode matrices MEX" "sample_filtered_feature_bc_matrix", + h5 sample_filtered_feature_bc_matrix "Sample filtered feature-barcode matrices H5" "sample_filtered_feature_bc_matrix.h5", + path sample_raw_feature_bc_matrix_mex "Sample raw feature-barcode matrices MEX" "sample_raw_feature_bc_matrix", + h5 sample_raw_feature_bc_matrix "Sample raw feature-barcode matrices H5" "sample_raw_feature_bc_matrix.h5", + h5 sample_raw_probe_bc_matrix "Sample raw probe-barcode matrix H5" "sample_raw_probe_bc_matrix.h5", + bam sample_alignments "BAM alignments for reads assigned to this sample" "sample_alignments.bam", + bam.bai sample_alignments_index_bai "BAM BAI index for reads assigned to this sample" "sample_alignments.bam.bai", + bam.csi sample_alignments_index_csi "BAM CSI index for reads assigned to this sample" "sample_alignments.bam.csi", + h5 sample_molecule_info "Per-molecule read information for reads assigned to this sample", + csv target_panel "Target Panel File", + csv probe_set "Probe Set File", + CellTypes cell_types "Outputs of cell annotation cell typing", ) struct SampleBeamOutputsCS( @@ -289,6 +296,8 @@ struct VdjChemistryInputs( # In Count, the basic rna counter is run for each gem well struct CounterInputs( map[] sample_def, + csv target_set, + string target_set_name, path reference_path, json gene_index, csv feature_reference, @@ -350,9 +359,10 @@ struct VdjReport( json productive_cell_barcodes, html filter_summary, json filter_metrics, - tsv contig_summary, + parquet per_bc_filters, tsv umi_summary, bdf.bincode barcode_brief, + txt report, ) ############################################################################### @@ -375,6 +385,7 @@ struct VdjAssemblerAnalyzerInputs( json asm_contig_annotations, arp.bincode assemblable_reads_per_bc, bdf.bincode barcode_brief, + bd.bincode barcode_full, csv barcode_support, json corrected_barcode_counts, int n50_n50_rpu, @@ -502,6 +513,7 @@ pipeline VDJ_CHEMISTRY_DETECTOR( in bool check_library_compatibility, in FeatureConfig feature_config, in string[] vdj_allowed_chems, + in csv multi_config, out ChemistryDef chemistry_def, out string receptor, out string chain_type, @@ -517,7 +529,7 @@ pipeline VDJ_CHEMISTRY_DETECTOR( reference_path = null, allowed_chems = self.vdj_allowed_chems, feature_reference = null, - multi_config = null, + multi_config = self.multi_config, is_pd = self.is_pd, feature_config = self.feature_config, chemistry_specs = COPY_CHEMISTRY_SPEC.chemistry_specs, @@ -559,23 +571,21 @@ pipeline VDJ_CHEMISTRY_DETECTOR( # Detect chemistry and check barcodes compatibility for multiple gem wells, gene expression and vdj pipeline MULTI_CHEMISTRY_DETECTOR( - in CountChemistryInputs count_inputs, - in VdjChemistryInputs[] vdj_inputs, - in VdjGenInputs vdj_gen_inputs, - in BasicPipelineConfig basic_config, - in string[] count_allowed_chems, - in csv multi_config, - in bool is_multi, - in bool is_pd, - in FeatureConfig feature_config, - in string[] vdj_allowed_chems, - out string[] libraries_to_translate, - out bool is_antibody_only, - out string beam_mode, - out map[] sample_defs_count, - out DETECT_CHEMISTRY detect_count_chem, - out VDJ_CHEMISTRY_DETECTOR[] detect_vdj_chem, - out CHECK_BARCODES_COMPATIBILITY check_barcodes_compatibility, + in CountChemistryInputs count_inputs, + in VdjChemistryInputs[] vdj_inputs, + in VdjGenInputs vdj_gen_inputs, + in BasicPipelineConfig basic_config, + in string[] count_allowed_chems, + in csv multi_config, + in bool is_multi, + in bool is_pd, + in FeatureConfig feature_config, + in string[] vdj_allowed_chems, + out bool is_antibody_only, + out string beam_mode, + out map[] sample_defs_count, + out DETECT_CHEMISTRY detect_count_chem, + out VDJ_CHEMISTRY_DETECTOR[] detect_vdj_chem, ) { call DETECT_CHEMISTRY as DETECT_COUNT_CHEMISTRY( @@ -600,6 +610,7 @@ pipeline MULTI_CHEMISTRY_DETECTOR( is_pd = self.is_pd, feature_config = self.feature_config, vdj_allowed_chems = self.vdj_allowed_chems, + multi_config = self.multi_config, ) using ( disabled = self.basic_config.disable_vdj, ) @@ -619,13 +630,11 @@ pipeline MULTI_CHEMISTRY_DETECTOR( ) return ( - libraries_to_translate = CHECK_BARCODES_COMPATIBILITY.libraries_to_translate, - is_antibody_only = DETECT_COUNT_CHEMISTRY.is_antibody_only, - beam_mode = CHECK_SINGLE_BEAM_MODE.beam_mode, - sample_defs_count = self.count_inputs.sample_def, - detect_count_chem = DETECT_COUNT_CHEMISTRY, - detect_vdj_chem = VDJ_CHEMISTRY_DETECTOR, - check_barcodes_compatibility = CHECK_BARCODES_COMPATIBILITY, + is_antibody_only = DETECT_COUNT_CHEMISTRY.is_antibody_only, + beam_mode = CHECK_SINGLE_BEAM_MODE.beam_mode, + sample_defs_count = self.count_inputs.sample_def, + detect_count_chem = DETECT_COUNT_CHEMISTRY, + detect_vdj_chem = VDJ_CHEMISTRY_DETECTOR, ) } @@ -638,7 +647,6 @@ pipeline COUNT_GEM_WELL_PROCESSOR( in string multi_config_sha, in CounterInputs inputs, in DETECT_CHEMISTRY chem, - in string[] libraries_to_translate, in bool is_pd, in bool disable_multi, in json multi_graph, @@ -649,8 +657,9 @@ pipeline COUNT_GEM_WELL_PROCESSOR( ) { call PARSE_TARGET_FEATURES( - is_pd = self.is_pd, - * = self.inputs, + is_pd = self.is_pd, + is_antibody_only = self.chem.is_antibody_only, + * = self.inputs, ) call MULTI_SETUP_CHUNKS( @@ -669,7 +678,6 @@ pipeline COUNT_GEM_WELL_PROCESSOR( is_pd = self.is_pd, chemistry_defs = self.chem.chemistry_defs, is_antibody_only = self.chem.is_antibody_only, - libraries_to_translate = self.libraries_to_translate, chunks = MULTI_SETUP_CHUNKS.chunks, target_panel_summary = PARSE_TARGET_FEATURES.target_panel_summary, disable_target_umi_filter = PARSE_TARGET_FEATURES.disable_target_umi_filter, @@ -700,7 +708,7 @@ pipeline COUNT_GEM_WELL_PROCESSOR( min_assignment_confidence = self.inputs.min_assignment_confidence, slide_serial_capture_area = null, feature_config = self.feature_config, - v1_filtered_fbm = null, + v1_pattern_fix = null, is_visium_hd = false, ) @@ -755,32 +763,34 @@ pipeline BEAM_ANALYZER( } pipeline VDJ_CALL_CELLS( - in string receptor, - in bool is_antibody_only, - in bool is_non_targeted_gex, - in bool denovo, - in map count_chemistry_defs, - in FilterSwitch filter_switch, - in path vdj_reference_path, - in int n50_n50_rpu, - in json contig_annotations, - in bdf.bincode barcode_brief, - in fprint.json sample_fingerprint, - in csv filtered_barcodes, - out json contig_annotations, - out json.lz4 asm_filter_diagnostics, + in string receptor, + in bool is_antibody_only, + in bool is_non_targeted_gex, + in bool denovo, + in ChemistryDef vdj_chemistry_def, + in FilterSwitch filter_switch, + in path vdj_reference_path, + in int n50_n50_rpu, + in json contig_annotations, + in bdf.bincode barcode_brief, + in fprint.json sample_fingerprint, + in csv filtered_barcodes, + out json contig_annotations, + out json.lz4 asm_filter_diagnostics, ) { call ASM_CALL_CELLS( - receptor = self.receptor, - denovo = self.denovo, - vdj_reference_path = self.vdj_reference_path, - count_chemistry_defs = self.count_chemistry_defs, - contig_annotations = self.contig_annotations, - barcode_brief = self.barcode_brief, - n50_n50_rpu = self.n50_n50_rpu, - filter_switch = self.filter_switch, - sample_fingerprint = self.sample_fingerprint, + receptor = self.receptor, + denovo = self.denovo, + vdj_reference_path = self.vdj_reference_path, + vdj_chemistry_def = { + "VDJ": self.vdj_chemistry_def, + }, + contig_annotations = self.contig_annotations, + barcode_brief = self.barcode_brief, + n50_n50_rpu = self.n50_n50_rpu, + filter_switch = self.filter_switch, + sample_fingerprint = self.sample_fingerprint, ) call HANDLE_GEX_CELLS( @@ -800,11 +810,11 @@ pipeline VDJ_ANALYZER( in VdjAnalysisConfig vdj_config, in CommonInputs common_input, in string receptor, + in path inner_primers, in path vdj_reference_path, in csv feature_reference, in FeatureConfig feature_config, in ChemistryDef vdj_chemistry_def, - in map count_chemistry_defs, in VdjAssemblerAnalyzerInputs assembler_outs, in json merged_annotations, in VdjDemuxSampleInfo demux_sample_info, @@ -826,41 +836,69 @@ pipeline VDJ_ANALYZER( ) call VDJ_CALL_CELLS( - receptor = SETUP_VDJ_ANALYSIS.receptor, - is_antibody_only = self.is_antibody_only, - is_non_targeted_gex = self.is_non_targeted_gex, - denovo = self.vdj_config.denovo, - count_chemistry_defs = self.count_chemistry_defs, - filter_switch = self.filter_switch, - vdj_reference_path = self.vdj_reference_path, - n50_n50_rpu = self.assembler_outs.n50_n50_rpu, - contig_annotations = self.assembler_outs.asm_contig_annotations, - barcode_brief = self.assembler_outs.barcode_brief, - sample_fingerprint = self.demux_sample_info.fingerprint, - filtered_barcodes = SETUP_VDJ_ANALYSIS.filtered_barcodes, + receptor = SETUP_VDJ_ANALYSIS.receptor, + is_antibody_only = self.is_antibody_only, + is_non_targeted_gex = self.is_non_targeted_gex, + denovo = self.vdj_config.denovo, + vdj_chemistry_def = self.vdj_chemistry_def, + filter_switch = self.filter_switch, + vdj_reference_path = self.vdj_reference_path, + n50_n50_rpu = self.assembler_outs.n50_n50_rpu, + contig_annotations = self.assembler_outs.asm_contig_annotations, + barcode_brief = self.assembler_outs.barcode_brief, + sample_fingerprint = self.demux_sample_info.fingerprint, + filtered_barcodes = SETUP_VDJ_ANALYSIS.filtered_barcodes, ) using ( disabled = SETUP_VDJ_ANALYSIS.disable_cell_calling, ) call SUBSET_ASSEMBLY_OUTS( per_sample = self.vdj_config.per_sample, - count_chemistry_defs = self.count_chemistry_defs, + multiplexing_method = SETUP_VDJ_ANALYSIS.multiplexing_method, + vdj_chemistry_def = { + "VDJ": self.vdj_chemistry_def, + }, sample_fingerprint = self.demux_sample_info.fingerprint, contig_annotations = VDJ_CALL_CELLS.contig_annotations, merged_annotations = self.merged_annotations, total_read_pairs = self.assembler_outs.total_read_pairs, corrected_barcode_counts = self.assembler_outs.corrected_barcode_counts, assemblable_reads_per_bc = self.assembler_outs.assemblable_reads_per_bc, - contig_summary = self.assembler_outs.summary_tsv, umi_summary = self.assembler_outs.umi_summary_tsv, barcode_support = self.assembler_outs.barcode_support, barcode_brief = self.assembler_outs.barcode_brief, + barcode_full = self.assembler_outs.barcode_full, + ) + + call ASM_METRICS( + chemistry_def = self.vdj_chemistry_def, + vdj_reference_path = self.vdj_reference_path, + receptor = self.receptor, + inner_enrichment_primers = self.inner_primers, + total_read_pairs = SUBSET_ASSEMBLY_OUTS.total_read_pairs, + barcode_full = SUBSET_ASSEMBLY_OUTS.barcode_full, + ) using ( + disabled = SETUP_VDJ_ANALYSIS.disable_asm_metrics, + ) + + call MAKE_EXACT_CLONOTYPES( + contig_annotations = SUBSET_ASSEMBLY_OUTS.contig_annotations, + ) using ( + disabled = SETUP_VDJ_ANALYSIS.disable_cell_calling, + ) + + call FILTER_EXACT_CLONOTYPES( + exact_clonotypes = MAKE_EXACT_CLONOTYPES.exact_clonotypes, + contig_annotations = SUBSET_ASSEMBLY_OUTS.contig_annotations, + filter_diagnostics = VDJ_CALL_CELLS.asm_filter_diagnostics, + ) using ( + disabled = SETUP_VDJ_ANALYSIS.disable_cell_calling, ) call CLONOTYPE_ASSIGNER( - sample_number = self.demux_sample_info.sample_number, + sample_id = self.demux_sample_info.sample_id, vdj_reference_path = self.vdj_reference_path, - contig_annotations = SUBSET_ASSEMBLY_OUTS.contig_annotations, + contig_annotations = FILTER_EXACT_CLONOTYPES.contig_annotations, receptor = SETUP_VDJ_ANALYSIS.receptor, filter_switch = self.filter_switch, ) using ( @@ -868,9 +906,12 @@ pipeline VDJ_ANALYZER( ) call HANDLE_NO_CLONOTYPING( - asm_contig_json = SUBSET_ASSEMBLY_OUTS.contig_annotations, - clonotype_contig_json = CLONOTYPE_ASSIGNER.contig_annotations_json, - disable_clonotyping = SETUP_VDJ_ANALYSIS.disable_clonotyping, + contigs = { + merged_liblevel: self.merged_annotations, + post_cell_filtering: FILTER_EXACT_CLONOTYPES.contig_annotations, + post_clonotyping: CLONOTYPE_ASSIGNER.contig_annotations_json, + }, + disable_clonotyping = SETUP_VDJ_ANALYSIS.disable_clonotyping, ) call WRITE_ANN_CSV( @@ -881,7 +922,7 @@ pipeline VDJ_ANALYZER( sample_id = self.common_input.sample_id, sample_description = self.common_input.sample_desc, all_contig_annotations = HANDLE_NO_CLONOTYPING.final_contig_annotations, - asm_filter_diagnostics = VDJ_CALL_CELLS.asm_filter_diagnostics, + asm_filter_diagnostics = FILTER_EXACT_CLONOTYPES.filter_diagnostics, enclone_barcode_fate = CLONOTYPE_ASSIGNER.enclone_barcode_fate, raw_matrix_h5 = SETUP_VDJ_ANALYSIS.raw_matrix_h5, ) using ( @@ -901,7 +942,6 @@ pipeline VDJ_ANALYZER( contigs = WRITE_CONTIG_OUTS.contig_fasta, annotations = HANDLE_NO_CLONOTYPING.final_contig_annotations, filter_summary = null, - contig_summary = SUBSET_ASSEMBLY_OUTS.contig_summary, umi_summary = SUBSET_ASSEMBLY_OUTS.umi_summary, prefix = "", ) using ( @@ -926,6 +966,7 @@ pipeline VDJ_ANALYZER( barcode_support = SUBSET_ASSEMBLY_OUTS.barcode_support, summaries = [ self.assembler_outs.summary, + ASM_METRICS.metrics_summary_json, REPORT_CONTIGS.summary, CLONOTYPE_ASSIGNER.summary, WRITE_CONTIG_OUTS.summary, @@ -936,6 +977,7 @@ pipeline VDJ_ANALYZER( cell_barcodes = WRITE_CONTIG_OUTS.cell_barcodes, clonotype_summary = CLONOTYPE_ASSIGNER.clonotypes_csv, receptor = SETUP_VDJ_ANALYSIS.receptor, + n50_n50_rpu = self.assembler_outs.n50_n50_rpu, ) call WRITE_CONTIG_PROTO( @@ -949,6 +991,7 @@ pipeline VDJ_ANALYZER( sample_desc = self.common_input.sample_desc, multi_config_sha = self.common_input.multi_config_sha, barcode_brief = SUBSET_ASSEMBLY_OUTS.barcode_brief, + multiplexing_method = SETUP_VDJ_ANALYSIS.multiplexing_method, ) using ( disabled = self.vdj_config.has_no_vdj_ref, ) @@ -995,15 +1038,16 @@ pipeline VDJ_ANALYZER( contig_fasta: WRITE_CONTIG_OUTS.contig_fasta, contig_fasta_fai: WRITE_CONTIG_OUTS.contig_fasta_fai, contig_fastq: WRITE_CONTIG_OUTS.contig_fastq, - contig_summary: SUBSET_ASSEMBLY_OUTS.contig_summary, filter_metrics: SUMMARIZE_VDJ_FILTERS.metrics_summary, filter_summary: SUMMARIZE_VDJ_FILTERS.filter_summary, filtered_contig_fasta: WRITE_CONTIG_OUTS.filtered_contig_fasta, filtered_contig_fastq: WRITE_CONTIG_OUTS.filtered_contig_fastq, metrics_summary_csv: SUMMARIZE_VDJ_REPORTS.metrics_summary_csv, metrics_summary_json: SUMMARIZE_VDJ_REPORTS.metrics_summary_json, + per_bc_filters: SUMMARIZE_VDJ_FILTERS.per_bc_filters, productive_barcodes: WRITE_CONTIG_OUTS.prod_barcodes, productive_cell_barcodes: WRITE_CONTIG_OUTS.paired_cell_barcodes, + report: ASM_METRICS.report, umi_summary: SUBSET_ASSEMBLY_OUTS.umi_summary, vdj_contig_info: WRITE_CONTIG_PROTO.vdj_contig_info, vloupe: VLOUPE_PREPROCESS.output_for_vloupe, @@ -1016,7 +1060,6 @@ pipeline VDJ_ANALYZER( pipeline VDJ_GEM_WELL_PROCESSOR( in CommonInputs common_input, in ChemistryDef vdj_chemistry_def, - in map count_chemistry_defs, in string receptor, in VdjAssemblerInputs inputs, in VdjGenInputs gen_inputs, @@ -1030,6 +1073,7 @@ pipeline VDJ_GEM_WELL_PROCESSOR( in csv feature_reference, in FeatureConfig feature_config, in FilterSwitch filter_switch, + in json gex_cells_per_tag, out ChemistryDef chemistry_def, out MULTI_SETUP_CHUNKS setup_chunks_outs, out SC_VDJ_CONTIG_ASSEMBLER assembler_outs, @@ -1050,6 +1094,7 @@ pipeline VDJ_GEM_WELL_PROCESSOR( ) call SC_VDJ_CONTIG_ASSEMBLER( + sample_id = self.common_input.sample_id, chemistry_defs = { "VDJ": self.vdj_chemistry_def, }, @@ -1079,8 +1124,8 @@ pipeline VDJ_GEM_WELL_PROCESSOR( }, common_input = self.common_input, vdj_chemistry_def = self.vdj_chemistry_def, - count_chemistry_defs = self.count_chemistry_defs, receptor = self.receptor, + inner_primers = self.inputs.inner_enrichment_primers, vdj_reference_path = self.gen_inputs.vdj_reference_path, feature_reference = self.feature_reference, feature_config = self.feature_config, @@ -1088,6 +1133,7 @@ pipeline VDJ_GEM_WELL_PROCESSOR( asm_contig_annotations: SC_VDJ_CONTIG_ASSEMBLER.asm_contig_annotations, assemblable_reads_per_bc: SC_VDJ_CONTIG_ASSEMBLER.assemblable_reads_per_bc, barcode_brief: SC_VDJ_CONTIG_ASSEMBLER.barcode_brief, + barcode_full: SC_VDJ_CONTIG_ASSEMBLER.barcode_full, barcode_support: SC_VDJ_CONTIG_ASSEMBLER.barcode_support, corrected_barcode_counts: SC_VDJ_CONTIG_ASSEMBLER.corrected_barcode_counts, n50_n50_rpu: SC_VDJ_CONTIG_ASSEMBLER.n50_n50_rpu, @@ -1109,6 +1155,10 @@ pipeline VDJ_GEM_WELL_PROCESSOR( call MERGE_PER_SAMPLE_ANNOTATIONS( per_sample_annotations = PER_SAMPLE_VDJ_ANALYZER.clonotype.all_contig_annotations_json, + asm_contig_annotations = SC_VDJ_CONTIG_ASSEMBLER.asm_contig_annotations, + multiplexing_method = SETUP_VDJ_DEMUX.multiplexing_method, + gex_cells_per_tag = self.gex_cells_per_tag, + vdj_chemistry_def = self.vdj_chemistry_def, ) using ( disabled = SETUP_VDJ_DEMUX.is_not_multi, ) @@ -1125,14 +1175,15 @@ pipeline VDJ_GEM_WELL_PROCESSOR( common_input = self.common_input, vdj_chemistry_def = self.vdj_chemistry_def, receptor = self.receptor, + inner_primers = self.inputs.inner_enrichment_primers, vdj_reference_path = self.gen_inputs.vdj_reference_path, feature_reference = self.feature_reference, feature_config = self.feature_config, - count_chemistry_defs = self.count_chemistry_defs, assembler_outs = { asm_contig_annotations: SC_VDJ_CONTIG_ASSEMBLER.asm_contig_annotations, assemblable_reads_per_bc: SC_VDJ_CONTIG_ASSEMBLER.assemblable_reads_per_bc, barcode_brief: SC_VDJ_CONTIG_ASSEMBLER.barcode_brief, + barcode_full: SC_VDJ_CONTIG_ASSEMBLER.barcode_full, barcode_support: SC_VDJ_CONTIG_ASSEMBLER.barcode_support, corrected_barcode_counts: SC_VDJ_CONTIG_ASSEMBLER.corrected_barcode_counts, n50_n50_rpu: SC_VDJ_CONTIG_ASSEMBLER.n50_n50_rpu, @@ -1151,14 +1202,18 @@ pipeline VDJ_GEM_WELL_PROCESSOR( ) call BUILD_PER_SAMPLE_VDJ_WS_CONTENTS( - lib_level_metrics = LIB_VDJ_ANALYZER.report.metrics_summary_json, - per_sample_metrics = PER_SAMPLE_VDJ_ANALYZER.report.metrics_summary_json, - receptor = self.receptor, - physical_library_id = self.inputs.physical_library_id, - vdj_gen_inputs = self.gen_inputs, - sequencing_metrics = SC_VDJ_CONTIG_ASSEMBLER.sequencing_metrics, - vdj_ws_json = PER_SAMPLE_VDJ_ANALYZER.report.web_summary_data, - filter_metrics = PER_SAMPLE_VDJ_ANALYZER.report.filter_metrics, + lib_level_metrics = LIB_VDJ_ANALYZER.report.metrics_summary_json, + per_sample_metrics = PER_SAMPLE_VDJ_ANALYZER.report.metrics_summary_json, + receptor = self.receptor, + physical_library_id = self.inputs.physical_library_id, + multiplexing_method = SETUP_VDJ_DEMUX.multiplexing_method, + vdj_gen_inputs = self.gen_inputs, + sequencing_metrics = SC_VDJ_CONTIG_ASSEMBLER.sequencing_metrics, + lib_level_vdj_ws_json = LIB_VDJ_ANALYZER.report.web_summary_data, + per_sample_vdj_ws_json = PER_SAMPLE_VDJ_ANALYZER.report.web_summary_data, + filter_metrics = PER_SAMPLE_VDJ_ANALYZER.report.filter_metrics, + multi_graph = self.multi_graph, + vdj_cells_per_tag_json = MERGE_PER_SAMPLE_ANNOTATIONS.vdj_cells_per_tag_json, ) using ( disabled = SETUP_VDJ_DEMUX.is_not_multi, ) @@ -1236,6 +1291,8 @@ pipeline FORCE_SAMPLE_DEF_GEM_WELL( reference_path: self.count_inputs.reference_path, sample_def: _FORCE_SAMPLE_DEF_GEM_WELL.sample_def, subsample_rate: self.count_inputs.subsample_rate, + target_set: self.count_inputs.target_set, + target_set_name: self.count_inputs.target_set_name, targeting_method: self.count_inputs.targeting_method, trim_polya_min_score: self.count_inputs.trim_polya_min_score, trim_tso_min_score: self.count_inputs.trim_tso_min_score, @@ -1252,7 +1309,6 @@ pipeline MULTI_GEM_WELL_PROCESSOR( in bool is_pd, in CounterInputs count_inputs, in DETECT_CHEMISTRY count_chem, - in string[] libraries_to_translate, in json multi_graph, in VdjAssemblerInputs vdj_t_inputs, in ChemistryDef vdj_t_chem_def, @@ -1273,16 +1329,15 @@ pipeline MULTI_GEM_WELL_PROCESSOR( ) { call COUNT_GEM_WELL_PROCESSOR( - gem_group = self.gem_group, - sample_id = self.common_input.sample_id, - multi_config_sha = self.common_input.multi_config_sha, - inputs = self.count_inputs, - chem = self.count_chem, - libraries_to_translate = self.libraries_to_translate, - is_pd = self.is_pd, - disable_multi = self.config.disable_multi, - multi_graph = self.multi_graph, - feature_config = self.feature_config, + gem_group = self.gem_group, + sample_id = self.common_input.sample_id, + multi_config_sha = self.common_input.multi_config_sha, + inputs = self.count_inputs, + chem = self.count_chem, + is_pd = self.is_pd, + disable_multi = self.config.disable_multi, + multi_graph = self.multi_graph, + feature_config = self.feature_config, ) using ( disabled = self.config.disable_count, ) @@ -1296,7 +1351,6 @@ pipeline MULTI_GEM_WELL_PROCESSOR( call VDJ_GEM_WELL_PROCESSOR as VDJ_T_GEM_WELL_PROCESSOR( common_input = self.common_input, - count_chemistry_defs = self.count_chem.chemistry_defs, vdj_chemistry_def = self.vdj_t_chem_def, receptor = self.vdj_t_receptor, inputs = self.vdj_t_inputs, @@ -1315,13 +1369,13 @@ pipeline MULTI_GEM_WELL_PROCESSOR( feature_config = self.feature_config, filter_switch = MAKE_VDJ_FILTER_SWITCH.filter_switch, has_no_vdj_ref = self.config.has_no_vdj_ref, + gex_cells_per_tag = COUNT_GEM_WELL_PROCESSOR.basic_counter_outs.assign_tags.cells_per_tag, ) using ( disabled = self.config.disable_vdj_t, ) call VDJ_GEM_WELL_PROCESSOR as VDJ_T_GD_GEM_WELL_PROCESSOR( common_input = self.common_input, - count_chemistry_defs = self.count_chem.chemistry_defs, vdj_chemistry_def = self.vdj_t_gd_chem_def, receptor = self.vdj_t_gd_receptor, inputs = self.vdj_t_gd_inputs, @@ -1340,13 +1394,13 @@ pipeline MULTI_GEM_WELL_PROCESSOR( feature_config = self.feature_config, filter_switch = MAKE_VDJ_FILTER_SWITCH.filter_switch, has_no_vdj_ref = self.config.has_no_vdj_ref, + gex_cells_per_tag = COUNT_GEM_WELL_PROCESSOR.basic_counter_outs.assign_tags.cells_per_tag, ) using ( disabled = self.config.disable_vdj_t_gd, ) call VDJ_GEM_WELL_PROCESSOR as VDJ_B_GEM_WELL_PROCESSOR( common_input = self.common_input, - count_chemistry_defs = self.count_chem.chemistry_defs, vdj_chemistry_def = self.vdj_b_chem_def, receptor = self.vdj_b_receptor, inputs = self.vdj_b_inputs, @@ -1365,6 +1419,7 @@ pipeline MULTI_GEM_WELL_PROCESSOR( feature_config = self.feature_config, filter_switch = MAKE_VDJ_FILTER_SWITCH.filter_switch, has_no_vdj_ref = self.config.has_no_vdj_ref, + gex_cells_per_tag = COUNT_GEM_WELL_PROCESSOR.basic_counter_outs.assign_tags.cells_per_tag, ) using ( disabled = self.config.disable_vdj_b, ) @@ -1394,11 +1449,14 @@ pipeline COUNT_ANALYZER( in bool disable_antigen, in bool is_pd, in bool disable_targeted, + in bool enable_tsne, in csv filtered_barcodes, in csv aggregate_barcodes, in csv feature_reference, + in json multi_graph, in json counter_metrics_json, in PARSE_TARGET_FEATURES parse_target_features, + in string sample_id, out AnalyzerOutputs common_analyzer, out _CRISPR_ANALYZER crispr_analyzer, out _ANTIBODY_ANALYZER antibody_analyzer, @@ -1408,6 +1466,7 @@ pipeline COUNT_ANALYZER( { call DISABLE_SECONDARY_ANALYSIS( is_spatial = false, + is_visium_hd_main_run = false, filtered_matrices_h5 = self.filtered_matrices_h5, no_secondary_analysis = self.no_secondary_analysis, ) @@ -1423,6 +1482,7 @@ pipeline COUNT_ANALYZER( cbc_realign_panorama: null, cbc_sigma: null, chemistry_batch_correction: false, + enable_tsne: self.enable_tsne, exclude_genes: null, filtered_matrices_h5: self.filtered_matrices_h5, # NOTE: this is null because the cells are already forced in FILTER_BARCODES @@ -1476,7 +1536,6 @@ pipeline COUNT_ANALYZER( filtered_gene_bc_matrices = self.filtered_matrices_h5, filtered_barcodes = self.filtered_barcodes, basic_counter_summary = self.counter_metrics_json, - reference_path = self.count_inputs.reference_path, probe_set = self.parse_target_features.probe_set, target_panel_summary = self.parse_target_features.target_panel_summary, is_spatial = false, @@ -1496,6 +1555,8 @@ pipeline COUNT_ANALYZER( aggregate_barcodes = self.aggregate_barcodes, is_antibody = true, is_spatial = false, + multi_graph = self.multi_graph, + sample_id = self.sample_id, ) using ( disabled = self.disable_antibody, ) @@ -1505,6 +1566,8 @@ pipeline COUNT_ANALYZER( aggregate_barcodes = self.aggregate_barcodes, is_antibody = false, is_spatial = false, + multi_graph = self.multi_graph, + sample_id = self.sample_id, ) using ( disabled = self.disable_antigen, ) @@ -1564,6 +1627,9 @@ pipeline MULTI_REPORTER( in h5 barcode_summary, in csv filtered_barcodes, in AssignTagsOuts assign_tags_outs, + in json cloupe_cas_types, + in json cas_metrics, + in string cell_annotation_cloupe_name, in bool disable_library_cloupe, in map sample_cloupe, out SUMMARIZE_REPORTS count_summary, @@ -1572,7 +1638,7 @@ pipeline MULTI_REPORTER( out json antigen_histograms, out json barcode_rank_plots, out json jibes_biplot_histogram, - out json cmo_tsne_plot, + out json cmo_projection_plot, ) { call SUMMARIZE_REPORTS( @@ -1583,6 +1649,7 @@ pipeline MULTI_REPORTER( self.crispr_analyzer.crispr_analysis_metrics, self.targeted_analyzer.targeted_analysis_metrics, self.assign_tags_outs.gem_well_inferred_throughputs, + self.cas_metrics, ], sample_id = self.sample_id, sample_desc = self.sample_desc, @@ -1636,8 +1703,14 @@ pipeline MULTI_REPORTER( disabled = self.disable_library_cloupe, ) + call APPEND_CELL_TYPES_CLOUPE( + sample_cloupe = CLOUPE_PREPROCESS.output_for_cloupe, + cloupe_cas_types = self.cloupe_cas_types, + cas_track_name = self.cell_annotation_cloupe_name, + ) + call CHOOSE_CLOUPE( - library_cloupe = CLOUPE_PREPROCESS.output_for_cloupe, + library_cloupe = APPEND_CELL_TYPES_CLOUPE.cell_annotation_sample_cloupe, sample_cloupe = self.sample_cloupe, ) using ( disabled = self.config.disable_count, @@ -1645,18 +1718,18 @@ pipeline MULTI_REPORTER( call GENERATE_LIBRARY_PLOTS( # The stage needs to be disabled for vdj only multi - disable_count = self.config.disable_count, + disable_count = self.config.disable_count, # pared-down data needed for barcode rank plot - barcode_summary_h5 = self.barcode_summary, - filtered_barcodes = self.filtered_barcodes, - reference_path = self.reference_path, - # for jibes biplot/cmo tsne - tag_assigner_pickle = self.assign_tags_outs.tag_assigner_pickle, - cells_per_tag = self.assign_tags_outs.cells_per_tag, - non_singlet_barcodes = self.assign_tags_outs.non_singlet_barcodes, - force_sample_barcodes = self.assign_tags_outs.force_sample_barcodes, - analysis = self.count_analyzer.analysis, - multiplexing_is_not_cmo = self.assign_tags_outs.multiplexing_is_not_cmo, + barcode_summary_h5 = self.barcode_summary, + filtered_barcodes = self.filtered_barcodes, + reference_path = self.reference_path, + # for jibes biplot/cmo UMAP + tag_assigner_pickle = self.assign_tags_outs.tag_assigner_pickle, + cells_per_tag = self.assign_tags_outs.cells_per_tag, + non_singlet_barcodes = self.assign_tags_outs.non_singlet_barcodes, + force_sample_barcodes = self.assign_tags_outs.force_sample_barcodes, + analysis = self.count_analyzer.analysis, + multiplexing_method = self.assign_tags_outs.multiplexing_method, ) using ( disabled = self.config.disable_multi_count, ) @@ -1668,7 +1741,7 @@ pipeline MULTI_REPORTER( antigen_histograms = self.antigen_analyzer.antibody_histograms_json, barcode_rank_plots = GENERATE_LIBRARY_PLOTS.library_to_barcode_rank, jibes_biplot_histogram = GENERATE_LIBRARY_PLOTS.jibes_biplot_histogram, - cmo_tsne_plot = GENERATE_LIBRARY_PLOTS.cmo_tsne_plot, + cmo_projection_plot = GENERATE_LIBRARY_PLOTS.cmo_projection_plot, ) } @@ -1680,15 +1753,15 @@ stage GENERATE_LIBRARY_PLOTS( in path reference_path, # for jibes biplot in pickle tag_assigner_pickle, - # for cmo TSNE plot + # for cmo UMAP plot in path analysis, in json cells_per_tag, in json non_singlet_barcodes, in BarcodeAssignments force_sample_barcodes, - in bool multiplexing_is_not_cmo, + in string multiplexing_method, out json library_to_barcode_rank, out json jibes_biplot_histogram, - out json cmo_tsne_plot, + out json cmo_projection_plot, src py "stages/multi/generate_library_plots", ) using ( mem_gb = 8, @@ -1700,8 +1773,7 @@ stage GENERATE_SAMPLE_PLOTS( in h5 raw_matrices_h5, in path analysis, in h5 barcode_summary, - in path reference_path, - out json sample_tsne_plots, + out json sample_projection_plots, out json sample_library_to_barcode_rank, out json sample_treemap_plots, src py "stages/multi/generate_sample_plots", @@ -1710,6 +1782,20 @@ stage GENERATE_SAMPLE_PLOTS( volatile = strict, ) +stage DISABLE_MULTI_CORE_STAGES( + in bool is_pd, + in bool disable_gex, + in bool disable_multi_count, + in bool disable_count, + in bool no_secondary_analysis, + in bool skip_cell_annotation, + out bool disable_sample_cas_celltyping, + out bool disable_library_cas_celltyping, + src py "stages/multi/disable_multi_core_stages", +) using ( + volatile = strict, +) + pipeline SAMPLE_REPORTER( in SampleSlfeOuts sample_outs, in string sample_id, @@ -1720,15 +1806,17 @@ pipeline SAMPLE_REPORTER( in _CRISPR_ANALYZER crispr_analyzer, in _TARGETED_ANALYZER targeted_analyzer, in path reference_path, + in json cloupe_cas_types, in h5 barcode_summary, in CellCalling cell_calling_config, in json sample_assignment_metrics, in tps.json target_panel_summary, in json cells_per_sample, + in string cell_annotation_cloupe_name, in json cells_per_tag, out json metrics_summary, out cloupe cloupe, - out json sample_tsne_plots, + out json sample_projection_plots, out json sample_library_to_barcode_rank, out json sample_treemap_plots, ) @@ -1755,7 +1843,6 @@ pipeline SAMPLE_REPORTER( raw_matrices_h5 = self.sample_outs.raw_matrix_h5, analysis = self.count_analyzer.analysis, barcode_summary = self.barcode_summary, - reference_path = self.reference_path, ) call CLOUPE_PREPROCESS( @@ -1790,199 +1877,21 @@ pipeline SAMPLE_REPORTER( disabled = self.config.disable_count, ) - return ( - metrics_summary = _SAMPLE_CELLS_REPORTER.summary, - cloupe = CLOUPE_PREPROCESS.output_for_cloupe, - sample_tsne_plots = GENERATE_SAMPLE_PLOTS.sample_tsne_plots, - sample_library_to_barcode_rank = GENERATE_SAMPLE_PLOTS.sample_library_to_barcode_rank, - sample_treemap_plots = GENERATE_SAMPLE_PLOTS.sample_treemap_plots, + call APPEND_CELL_TYPES_CLOUPE( + sample_cloupe = CLOUPE_PREPROCESS.output_for_cloupe, + cloupe_cas_types = self.cloupe_cas_types, + cas_track_name = self.cell_annotation_cloupe_name, ) -} - -stage MAKE_MULTI_GEM_RNA_AGGR_SAMPLE_DEFS( - in int[] gem_groups, - in h5[] molecule_info, - out map[] sample_defs, - out csv aggr_csv, - src py "stages/multi/make_multi_gem_rna_aggr_sample_defs", -) using ( - volatile = strict, -) -# this is a temp hack to work around the fact that SC_RNA_AGGREGATOR doesn't depend -# on the molecule infos, but rather a CSV specifying them. -pipeline DEPEND_ON_MOLECULE_INFO_H5S( - in h5 _aggred_matrix, - in h5[] _dependent_h5s, - out h5 _aggred_matrix, - out h5[] _dependent_h5s, -) -{ return ( - _aggred_matrix = self._aggred_matrix, - _dependent_h5s = self._dependent_h5s, - ) -} - -# outputs of this pipeline are designed to match the outputs of _basic_sc_rna_counter as closely as possible, -# excluding the outputs that are only necessary for merging. -pipeline MERGE_GEM_WELLS_AND_SLICE_CELLS( - in int[] gem_groups, - in CountInputs count_input, - in COUNT_GEM_WELL_PROCESSOR[] gem_well_processor_count, - in bool is_pd, - out csv filtered_barcodes, - out csv barcode_correction_csv, - out SampleBamFile possorted_genome_bam, - out SampleBamFile[] multi_pos_sorted_bam, - out json summary, - out h5 molecule_info, - out h5 raw_gene_bc_matrices_h5, - out h5 filtered_gene_bc_matrices_h5, - out path filtered_gene_bc_matrices_mex, - out int[] gem_groups, - out AnnotationFiles annotation_files, -) -{ - # gem_well_processor outputs has all the input fields of WRITE_POS_BAM, with the proper names - # this stage takes those and merges them - call MERGE_GEM_WELL_FILES( - unmerged_gem_well_files = self.gem_well_processor_count.basic_counter_outs, - ) - - # create monolithic multi-GEM BAM file - call WRITE_POS_BAM( - alignments = MERGE_GEM_WELL_FILES.merged_gem_well_files.alignments, - read_chunks = MERGE_GEM_WELL_FILES.merged_gem_well_files.read_chunks, - bam_header = MERGE_GEM_WELL_FILES.merged_gem_well_files.bam_header, - target_set_name = MERGE_GEM_WELL_FILES.merged_gem_well_files.target_set_name, - sample_barcodes = self.count_input.force_sample_barcodes.sample_barcodes, - slide_serial_capture_area = null, - ) - - # create multi-GEM filtered barcodes CSV and barcode correction CSV - call MERGE_GEM_WELL_CSVS( - filtered_barcodes = self.gem_well_processor_count.basic_counter_outs.filtered_barcodes, - barcode_correction_csv = self.gem_well_processor_count.basic_counter_outs.barcode_correction_csv, - ) - - call COLLATE_METRICS( - per_barcode_metrics = MERGE_GEM_WELL_FILES.merged_gem_well_files.per_barcode_metrics_shard, - reference_path = self.count_input.reference_path, - feature_reference = MERGE_GEM_WELL_FILES.merged_gem_well_files.slfe_feature_reference, - filtered_barcodes = MERGE_GEM_WELL_CSVS.filtered_barcodes, - aggregate_barcodes = null, - sample_barcodes = null, - ) - - call MAKE_MULTI_GEM_RNA_AGGR_SAMPLE_DEFS( - gem_groups = self.gem_groups, - molecule_info = self.gem_well_processor_count.basic_counter_outs.molecule_info, - ) - - call SC_RNA_AGGREGATOR( - # self.count_input.sample_id, - sample_id = "sample", - # self.count_input.sample_id, - sample_desc = "sample", - sample_defs = MAKE_MULTI_GEM_RNA_AGGR_SAMPLE_DEFS.sample_defs, - normalization_mode = "mapped", - no_secondary_analysis = self.count_input.no_secondary_analysis, - min_crispr_umi_threshold = null, - num_analysis_bcs = null, - num_pca_bcs = null, - num_pca_genes = null, - num_principal_comps = null, - cbc_knn = null, - cbc_alpha = null, - cbc_sigma = null, - cbc_realign_panorama = null, - max_clusters = null, - graphclust_neighbors = null, - neighbor_a = null, - neighbor_b = null, - tsne_perplexity = null, - tsne_input_pcs = null, - tsne_theta = null, - random_seed = null, - tsne_max_dims = null, - tsne_max_iter = null, - tsne_stop_lying_iter = null, - tsne_mom_switch_iter = null, - product_type = "sc", - is_pd = self.is_pd, - ) - - call DEPEND_ON_MOLECULE_INFO_H5S( - _aggred_matrix = SC_RNA_AGGREGATOR.raw_gene_bc_matrices_h5, - _dependent_h5s = self.gem_well_processor_count.basic_counter_outs.molecule_info, - ) - - call CLOUPE_PREPROCESS( - pipestance_type = "SC_RNA_AGGREGATOR_CS", - # self.count_input.sample_id, - sample_id = "sample", - # self.count_input.sample_id, - sample_desc = "sample", - analysis = SC_RNA_AGGREGATOR.analysis, - filtered_gene_bc_matrices_h5 = SC_RNA_AGGREGATOR.filtered_gene_bc_matrices_h5, - metrics_json = SC_RNA_AGGREGATOR.summary, - aggregation_csv = MAKE_MULTI_GEM_RNA_AGGR_SAMPLE_DEFS.aggr_csv, - gem_group_index_json = SC_RNA_AGGREGATOR.gem_group_index_json, - image_page_names = null, - tissue_image_paths = null, - dark_images = null, - tissue_positions = null, - fiducial_positions_list = null, - dzi_info = null, - dzi_tiles_paths = null, - scale_factors_json = null, - no_secondary_analysis = self.count_input.no_secondary_analysis, - barcode_whitelist = null, - hd_slide_name = null, - loupe_map = null, - product_type = "sc", - cells_per_sample = null, - cells_per_tag = null, - cells_per_protospacer = null, - spatial_enrichment = null, - spatial_deconvolution_path = null, - disable_cloupe = null, - ) - - # certain metrics, such as those from make_shard and barcode correction, - # are not easily merged over GEM wells and are therefore excluded. - # those metrics could be added here and merged into the output metrics - # call MERGE_METRICS( - # summaries = [ - # MAKE_SHARD.summary, # TODO - # BARCODE_CORRECTION.summary, # TODO - # _SLFE_PARTIAL_FIRST_PASS.umi_filtering_summary, # TODO - # COLLATE_METRICS.summary, - # ], - # ) - - return ( - filtered_barcodes = MERGE_GEM_WELL_CSVS.filtered_barcodes, - barcode_correction_csv = MERGE_GEM_WELL_CSVS.barcode_correction_csv, - possorted_genome_bam = WRITE_POS_BAM.pos_sorted_bam, - # SUMMARIZE_BASIC_REPORTS.summary, # no report - summary = COLLATE_METRICS.summary, - molecule_info = SC_RNA_AGGREGATOR.molecule_info, - raw_gene_bc_matrices_h5 = SC_RNA_AGGREGATOR.raw_gene_bc_matrices_h5, - filtered_gene_bc_matrices_h5 = SC_RNA_AGGREGATOR.filtered_gene_bc_matrices_h5, - filtered_gene_bc_matrices_mex = SC_RNA_AGGREGATOR.filtered_gene_bc_matrices_mex, - gem_groups = self.gem_groups, - annotation_files = MERGE_GEM_WELL_FILES.merged_gem_well_files.annotation_files, - # sliced outputs - multi_pos_sorted_bam = WRITE_POS_BAM.multi_pos_sorted_bam, + metrics_summary = _SAMPLE_CELLS_REPORTER.summary, + cloupe = APPEND_CELL_TYPES_CLOUPE.cell_annotation_sample_cloupe, + sample_projection_plots = GENERATE_SAMPLE_PLOTS.sample_projection_plots, + sample_library_to_barcode_rank = GENERATE_SAMPLE_PLOTS.sample_library_to_barcode_rank, + sample_treemap_plots = GENERATE_SAMPLE_PLOTS.sample_treemap_plots, ) } -# should we add the rest of the return values of _basic_sc_rna_counter here, -# for consistency, even if they are not needed? -# Or create some sort of struct that represents the shared outputs of _basic_sc_rna_counter and this stage? - stage STRUCTIFY_PER_SAMPLE_OUTS( in SampleBamFile[] sample_bams, in SampleMetrics[] sample_metrics, @@ -2007,7 +1916,7 @@ stage SANITIZE_MAP_CALLS( in map in_rna_analysis, in map in_cloupe_file, in map in_metrics_summary, - in map in_sample_tsne_plots, + in map in_sample_projection_plots, in map in_sample_barcode_rank_plots, in map in_sample_treemap_plots, in map in_vdj_t_analyzer, @@ -2017,7 +1926,7 @@ stage SANITIZE_MAP_CALLS( out map rna_analysis, out map cloupe_file, out map metrics_summary, - out map sample_tsne_plots, + out map sample_projection_plots, out map sample_barcode_rank_plots, out map sample_treemap_plots, out map vdj_t_analyzer, @@ -2026,6 +1935,8 @@ stage SANITIZE_MAP_CALLS( src py "stages/multi/sanitize_map_calls", ) using ( volatile = false, +) retain ( + metrics_summary, ) stage BUILD_SAMPLE_OUTS( @@ -2040,6 +1951,7 @@ stage BUILD_SAMPLE_OUTS( in VdjOutputsCS vdj_t_gd_outs, in bool output_per_sample_raw_matrix, in BeamAnalyzerOutputs beam_analyzer, + in CellTypes cell_types, out SampleOutputsCS sample_outs, src py "stages/multi/build_sample_outs", ) diff --git a/mro/rna/_sc_rna_aggregator_stages.mro b/mro/rna/_sc_rna_aggregator_stages.mro index d289cb3..be733df 100644 --- a/mro/rna/_sc_rna_aggregator_stages.mro +++ b/mro/rna/_sc_rna_aggregator_stages.mro @@ -146,6 +146,7 @@ stage SUMMARIZE_AGGREGATED_REPORTS( in json antibody_treemap, in json crispr_analysis_metrics, in string product_type, + in bool skip_tsne, out json summary, out html web_summary, out json web_summary_data, diff --git a/mro/rna/_sc_rna_analyzer_stages.mro b/mro/rna/_sc_rna_analyzer_stages.mro index e2855da..9334e10 100644 --- a/mro/rna/_sc_rna_analyzer_stages.mro +++ b/mro/rna/_sc_rna_analyzer_stages.mro @@ -90,6 +90,7 @@ stage PREPROCESS_MATRIX( in bool disable_run_pca, in bool disable_correct_chemistry_batch, in bool skip_multigenome_analysis, + in bool enable_tsne, out bool skip_antibody_analysis, out bool skip_antigen_analysis, out h5 cloupe_matrix_h5, @@ -135,44 +136,6 @@ stage RUN_PCA( volatile = strict, ) -stage RUN_GRAPH_CLUSTERING( - in h5 matrix_h5, - in h5 pca_h5, - in int num_neighbors "Use this many neighbors", - in float neighbor_a "Use larger of (a+b*log10(n_cells) neighbors or num_neighbors", - in float neighbor_b "Use larger of (a+b*log10(n_cells) neighbors or num_neighbors", - in int num_bcs "Use this many cell-barcodes in clustering", - in int input_pcs "Use top N PCs", - in int balltree_leaf_size, - in string similarity_type "Type of similarity to use (nn or snn)", - in int random_seed "Seed for random number generator", - out h5 chunked_neighbors, - out h5 clusters_h5, - out path clusters_csv, - src py "stages/analyzer/run_graph_clustering", -) split ( - in pickle neighbor_index, - in h5 submatrix, - in int row_start, - in int total_rows, - in int k_nearest, - in h5 use_bcs, -) using ( - volatile = strict, -) - -stage MERGE_CLUSTERS( - in h5 matrix_h5, - in h5 pca_h5, - in h5 clusters_h5, - out h5 clusters_h5, - out path clusters_csv, - src py "stages/analyzer/merge_clusters", -) split ( -) using ( - volatile = strict, -) - stage COMBINE_CLUSTERING( in h5 kmeans_h5, in path kmeans_csv, @@ -202,28 +165,6 @@ stage RUN_DIFFERENTIAL_EXPRESSION( volatile = strict, ) -stage RUN_TSNE( - in h5 matrix_h5, - in h5 pca_h5, - in int random_seed, - in int perplexity, - in int input_pcs, - in int max_dims, - in int max_iter, - in int stop_lying_iter, - in int mom_switch_iter, - in float theta, - in bool is_antibody_only, - out h5 tsne_h5, - out path tsne_csv, - src py "stages/analyzer/run_tsne", -) split ( - in int tsne_dims, - in string feature_type, -) using ( - volatile = strict, -) - stage SUMMARIZE_ANALYSIS( in h5 matrix_h5, in h5 pca_h5, diff --git a/mro/rna/_sc_rna_counter_stages.mro b/mro/rna/_sc_rna_counter_stages.mro index 68e2c6b..4f264a7 100644 --- a/mro/rna/_sc_rna_counter_stages.mro +++ b/mro/rna/_sc_rna_counter_stages.mro @@ -11,9 +11,11 @@ filetype html; filetype tps.json; stage GET_AGGREGATE_BARCODES_OUT( - in path antibody_analysis, - out csv aggregate_barcodes, - src py "stages/counter/get_aggregate_barcodes_out", + in path antibody_analysis, + in bool is_multi, + in string multiplexing_method, + out csv aggregate_barcodes, + src py "stages/counter/get_aggregate_barcodes_out", ) stage SUMMARIZE_REPORTS( @@ -41,8 +43,8 @@ stage SUMMARIZE_REPORTS( out csv feature_reference, out json ws_data, src py "stages/counter/summarize_reports", +) split ( ) using ( - mem_gb = 16, volatile = strict, ) retain ( metrics_summary_json, diff --git a/mro/rna/_sc_vdj_assembler_stages.mro b/mro/rna/_sc_vdj_assembler_stages.mro index 088c761..5de503d 100644 --- a/mro/rna/_sc_vdj_assembler_stages.mro +++ b/mro/rna/_sc_vdj_assembler_stages.mro @@ -38,7 +38,6 @@ stage REPORT_CONTIGS( in fasta contigs, in json annotations, in csv filter_summary, - in tsv contig_summary, in tsv umi_summary, in string prefix, out json summary, @@ -56,6 +55,7 @@ stage SUMMARIZE_VDJ_REPORTS( in csv clonotype_summary, in csv barcode_support, in string receptor, + in int n50_n50_rpu, out string receptor, out json metrics_summary_json, out csv metrics_summary_csv, diff --git a/mro/rna/_sc_vdj_clonotype_assigner.mro b/mro/rna/_sc_vdj_clonotype_assigner.mro index 8c9ea43..fb16b7c 100644 --- a/mro/rna/_sc_vdj_clonotype_assigner.mro +++ b/mro/rna/_sc_vdj_clonotype_assigner.mro @@ -5,7 +5,7 @@ pipeline CLONOTYPE_ASSIGNER( in json contig_annotations, in string receptor, in FilterSwitch filter_switch, - in int sample_number, + in string sample_id, out json contig_annotations_json, out csv clonotypes_csv, out fasta consensus_fasta, @@ -33,25 +33,25 @@ pipeline CLONOTYPE_ASSIGNER( ) call FILL_CLONOTYPE_INFO( - sample_number = self.sample_number, + sample_id = self.sample_id, contig_annotations = self.contig_annotations, enclone_output = RUN_ENCLONE.enclone_output, ) call WRITE_CONCAT_REF_OUTS( - sample_number = self.sample_number, + sample_id = self.sample_id, all_contig_annotations_json = FILL_CLONOTYPE_INFO.all_contig_annotations_json, enclone_output = RUN_ENCLONE.enclone_output, ) call WRITE_CONSENSUS_BAM( - sample_number = self.sample_number, + sample_id = self.sample_id, all_contig_annotations_json = FILL_CLONOTYPE_INFO.all_contig_annotations_json, enclone_output = RUN_ENCLONE.enclone_output, ) call WRITE_CONSENSUS_TXT( - sample_number = self.sample_number, + sample_id = self.sample_id, enclone_output = RUN_ENCLONE.enclone_output, ) @@ -62,7 +62,7 @@ pipeline CLONOTYPE_ASSIGNER( ) call WRITE_CLONOTYPE_OUTS( - sample_number = self.sample_number, + sample_id = self.sample_id, enclone_output = RUN_ENCLONE.enclone_output, receptor = self.receptor, ) diff --git a/mro/rna/_sc_vdj_contig_assembler.mro b/mro/rna/_sc_vdj_contig_assembler.mro index da9e6fa..4e3efa2 100644 --- a/mro/rna/_sc_vdj_contig_assembler.mro +++ b/mro/rna/_sc_vdj_contig_assembler.mro @@ -2,6 +2,7 @@ @include "_cr_vdj_stages.mro" pipeline SC_VDJ_CONTIG_ASSEMBLER( + in string sample_id, in map chemistry_defs, in int gem_well, in map[] chunks, @@ -30,11 +31,11 @@ pipeline SC_VDJ_CONTIG_ASSEMBLER( out csv barcode_support, out json[] barcodes_in_chunks, out fastq unmapped_sample_fastq, - out txt report, out int total_read_pairs, out arp.bincode assemblable_reads_per_bc, out smf.json sequencing_metrics, out bdf.bincode barcode_brief, + out bd.bincode barcode_full, ) { call MAKE_SHARD( @@ -45,7 +46,6 @@ pipeline SC_VDJ_CONTIG_ASSEMBLER( r2_length = self.r2_length, subsample_rate = self.subsample_rate, initial_read_pairs = self.initial_reads, - libraries_to_translate = [], reference_path = null, target_features = null, target_set = null, @@ -61,9 +61,9 @@ pipeline SC_VDJ_CONTIG_ASSEMBLER( chemistry_defs = self.chemistry_defs, invalid_uncorrected = MAKE_SHARD.invalid, valid_read_metrics = MAKE_SHARD.bc_correct_summary, - libraries_to_translate = [], min_reads_to_report_bc = 1000, correction_map = null, + barcodes_under_tissue = null, ) call RUST_BRIDGE( @@ -76,6 +76,7 @@ pipeline SC_VDJ_CONTIG_ASSEMBLER( ) call ASSEMBLE_VDJ( + sample_id = self.sample_id, chemistry_defs = self.chemistry_defs, bc_sorted_rna_reads = RUST_BRIDGE.bc_sorted_rna_reads, vdj_reference_path = self.vdj_reference_folder, @@ -93,7 +94,6 @@ pipeline SC_VDJ_CONTIG_ASSEMBLER( summaries = [ MAKE_SHARD.summary, BARCODE_CORRECTION.summary, - ASSEMBLE_VDJ.metrics_summary_json, RUST_BRIDGE.summary, ], ) @@ -118,10 +118,10 @@ pipeline SC_VDJ_CONTIG_ASSEMBLER( barcode_support = ASSEMBLE_VDJ.barcode_support, barcodes_in_chunks = ASSEMBLE_VDJ.barcodes_in_chunks, unmapped_sample_fastq = ASSEMBLE_VDJ.unmapped_sample_fastq, - report = ASSEMBLE_VDJ.report, total_read_pairs = MAKE_SHARD.total_read_pairs, assemblable_reads_per_bc = ASSEMBLE_VDJ.assemblable_reads_per_bc, sequencing_metrics = MAKE_SHARD.sequencing_metrics, barcode_brief = ASSEMBLE_VDJ.barcode_brief, + barcode_full = ASSEMBLE_VDJ.barcode_full, ) } diff --git a/mro/rna/_slfe_matrix_computer.mro b/mro/rna/_slfe_matrix_computer.mro index 28f3c43..13071c0 100644 --- a/mro/rna/_slfe_matrix_computer.mro +++ b/mro/rna/_slfe_matrix_computer.mro @@ -29,7 +29,6 @@ pipeline _SLFE_MATRIX_COMPUTER( in bool is_pd, in map[] chunks, in path reference_path, - in string[] libraries_to_translate, in float subsample_rate, in int initial_reads, in int r1_length, @@ -49,7 +48,7 @@ pipeline _SLFE_MATRIX_COMPUTER( in FeatureConfig feature_config, # Note: _SLFE_MATRIX_COMPUTER processes data from a single gem well. in int gem_well, - in h5 v1_filtered_fbm, + in V1PatternFixArgs v1_pattern_fix, out frf.bincode slfe_feature_reference, out csv barcode_correction_csv, out h5 barcode_summary, @@ -76,6 +75,7 @@ pipeline _SLFE_MATRIX_COMPUTER( ### This has total barcodes from BARCODE_CORRECTION for use in Spatial out tbcc.bincode barcode_counts, out bool no_star_alignments, + out parquet[] per_read_gap_align, ) { call MAKE_SHARD( @@ -92,7 +92,6 @@ pipeline _SLFE_MATRIX_COMPUTER( target_set = self.target_set, target_set_name = self.target_set_name, feature_reference_path = self.feature_reference, - libraries_to_translate = self.libraries_to_translate, feature_config = self.feature_config, ) @@ -108,9 +107,9 @@ pipeline _SLFE_MATRIX_COMPUTER( chemistry_defs = self.chemistry_defs, invalid_uncorrected = MAKE_SHARD.invalid, valid_read_metrics = MAKE_SHARD.bc_correct_summary, - libraries_to_translate = self.libraries_to_translate, min_reads_to_report_bc = self.min_reads_to_report_bc, correction_map = MAKE_CORRECTION_MAP.correction_map, + barcodes_under_tissue = self.barcodes_under_tissue, ) call MAKE_READ_SHARDS_STRUCT( @@ -140,11 +139,11 @@ pipeline _SLFE_MATRIX_COMPUTER( ) call DISABLE_CORRECTION_FACTOR( - v1_filtered_fbm = self.v1_filtered_fbm, + v1_pattern_fix = self.v1_pattern_fix, ) call COMPUTE_CORRECTION_FACTOR( - v1_filtered_fbm = self.v1_filtered_fbm, + v1_pattern_fix = self.v1_pattern_fix, barcodes_under_tissue = self.barcodes_under_tissue, ) using ( disabled = DISABLE_CORRECTION_FACTOR.disable_correction_factor, @@ -177,6 +176,7 @@ pipeline _SLFE_MATRIX_COMPUTER( call COLLATE_METRICS( per_barcode_metrics = ALIGN_AND_COUNT.per_barcode_metrics, reference_path = self.reference_path, + target_set = self.target_set, feature_reference = MAKE_SHARD.feature_reference, filtered_barcodes = null, aggregate_barcodes = null, @@ -184,29 +184,33 @@ pipeline _SLFE_MATRIX_COMPUTER( ) call WRITE_BARCODE_INDEX( - barcode_counts = BARCODE_CORRECTION.corrected_barcode_counts, - barcodes_under_tissue = self.barcodes_under_tissue, + barcode_counts = BARCODE_CORRECTION.corrected_barcode_counts, + barcodes_under_tissue = self.barcodes_under_tissue, + barcode_correction_summary = BARCODE_CORRECTION.summary, ) call WRITE_BARCODE_SUMMARY( - per_barcode_metrics = ALIGN_AND_COUNT.per_barcode_metrics, - feature_reference = MAKE_SHARD.feature_reference, - barcode_index = WRITE_BARCODE_INDEX.barcode_index, + per_barcode_metrics = ALIGN_AND_COUNT.per_barcode_metrics, + feature_reference = MAKE_SHARD.feature_reference, + barcode_index = WRITE_BARCODE_INDEX.barcode_index, + barcode_correction_summary = BARCODE_CORRECTION.summary, ) call WRITE_H5_MATRIX( - gem_well = self.gem_well, - counts = ALIGN_AND_COUNT.counts_bc_order, - feature_reference = MAKE_SHARD.feature_reference, - chemistry_defs = self.chemistry_defs, - sample_id = self.sample_id, - barcode_index = WRITE_BARCODE_INDEX.barcode_index, + gem_well = self.gem_well, + counts = ALIGN_AND_COUNT.counts_bc_order, + feature_reference = MAKE_SHARD.feature_reference, + chemistry_defs = self.chemistry_defs, + sample_id = self.sample_id, + barcode_index = WRITE_BARCODE_INDEX.barcode_index, + barcode_correction_summary = BARCODE_CORRECTION.summary, ) call WRITE_MATRIX_MARKET( - counts = ALIGN_AND_COUNT.counts_bc_order, - feature_reference = MAKE_SHARD.feature_reference, - barcode_index = WRITE_BARCODE_INDEX.barcode_index, + counts = ALIGN_AND_COUNT.counts_bc_order, + feature_reference = MAKE_SHARD.feature_reference, + barcode_index = WRITE_BARCODE_INDEX.barcode_index, + barcode_correction_summary = BARCODE_CORRECTION.summary, ) call MERGE_METRICS( @@ -244,5 +248,6 @@ pipeline _SLFE_MATRIX_COMPUTER( barcode_counts = BARCODE_CORRECTION.total_barcode_counts, probe_barcode_counts = ALIGN_AND_COUNT.probe_barcode_counts, no_star_alignments = ALIGN_AND_COUNT.no_star_alignments, + per_read_gap_align = ALIGN_AND_COUNT.per_read_gap_align, ) } diff --git a/mro/rna/_targeted_analyzer.mro b/mro/rna/_targeted_analyzer.mro index 43b405d..767a2b4 100644 --- a/mro/rna/_targeted_analyzer.mro +++ b/mro/rna/_targeted_analyzer.mro @@ -12,15 +12,13 @@ filetype json; pipeline _RUN_GDNA_ANALYSIS( in h5 molecule_info, - in path reference_path, in csv probe_set, out json gdna_summary, ) { call GET_GDNA_METRICS( - molecule_info = self.molecule_info, - reference_path = self.reference_path, - probe_set = self.probe_set, + molecule_info = self.molecule_info, + probe_set = self.probe_set, ) call GET_GDNA_PLOT( @@ -44,7 +42,6 @@ pipeline _TARGETED_ANALYZER( in h5 filtered_gene_bc_matrices, in csv filtered_barcodes, in json basic_counter_summary, - in path reference_path, in csv probe_set, in bool is_visium_hd, in tps.json target_panel_summary, @@ -58,9 +55,8 @@ pipeline _TARGETED_ANALYZER( ) call _RUN_GDNA_ANALYSIS( - molecule_info = self.molecule_info, - reference_path = self.reference_path, - probe_set = self.probe_set, + molecule_info = self.molecule_info, + probe_set = self.probe_set, ) using ( disabled = DISABLE_TARGETED_STAGES.disable_targeted_gdna, ) diff --git a/mro/rna/_v1_pattern_fix.mro b/mro/rna/_v1_pattern_fix.mro new file mode 100644 index 0000000..f5b2803 --- /dev/null +++ b/mro/rna/_v1_pattern_fix.mro @@ -0,0 +1,10 @@ +# +# Copyright 2024 10x Genomics, Inc. All rights reserved. +# + +filetype h5; + +struct V1PatternFixArgs( + h5 v1_filtered_fbm, + int v1_pattern_type, +) diff --git a/mro/rna/cell_annotation_service.mro b/mro/rna/cell_annotation_service.mro new file mode 100644 index 0000000..4a33f53 --- /dev/null +++ b/mro/rna/cell_annotation_service.mro @@ -0,0 +1,415 @@ +@include "_cell_annotation_common_stages.mro" +@include "_cr_ana_stages.mro" +@include "_cr_lib_stages.mro" + +filetype csv; +filetype h5; +filetype html; +filetype json; +filetype json.gz; +filetype png; +filetype h5ad; +filetype cloupe; +filetype sring; +filetype fload; + +struct CellTypes( + csv cell_types, + json.gz cell_annotation_results, + html web_summary_cell_types, + csv cell_annotation_differential_expression, +) + +stage GET_CLOUPE_CELL_TYPES( + in csv cell_types, + out json cloupe_cas_types, + src py "stages/cas_cell_typing/get_cloupe_cell_types", +) using ( + volatile = strict, +) + +stage GET_CELL_TYPES_BARCHART( + in csv cell_types, + out json cell_type_interactive_bar_chart, + src py "stages/cas_cell_typing/get_cell_types_barchart", +) using ( + volatile = strict, +) + +stage GET_CELL_TYPES_BOX_PLOT( + in csv cell_types, + in h5 filtered_matrix, + in string pipestance_type, + out json cell_types_box_plot, + src py "stages/cas_cell_typing/get_cell_types_box_plot", +) split ( +) using ( + volatile = strict, +) + +stage GET_CELL_TYPES_UMAP_PLOT( + in path analysis, + in csv cell_types, + in string pipestance_type, + in csv cloupe_projection, + out json cell_types_umap_plot, + src py "stages/cas_cell_typing/get_cell_types_umap_plot", +) using ( + mem_gb = 2, + volatile = strict, +) + +stage EXTRACT_LOUPE_PROJECTION( + in cloupe sample_cloupe, + in string projection_name, + out csv projection, + src py "stages/cas_cell_typing/extract_loupe_projection", +) using ( + mem_gb = 2, + volatile = strict, +) + +stage ANALYZE_CELL_TYPES( + in csv cell_types, + in path analysis, + in csv tissue_positions, + in png tissue_lowres_image, + in json scale_factors, + in float cas_frac_returned_bcs "Fraction of barcodes that went into cell annotation that were returned", + in string cas_model_used, + in string pipestance_type, + in bool cas_success, + in bool is_pd, + in json metadata, + out json cas_metrics, + out json cell_type_bar_chart, + out json spatial_cell_types_chart, + src py "stages/cas_cell_typing/analyze_cell_types", +) using ( + volatile = strict, +) + +stage DISABLE_CAS_REPORTER_STAGES( + in csv cell_types, + out bool disable_differential_expression, + src py "stages/cas_cell_typing/disable_cas_reporter_stages", +) using ( + volatile = strict, +) + +stage APPEND_CELL_TYPES_CLOUPE( + in cloupe sample_cloupe, + in json cloupe_cas_types, + in string cas_track_name, + out cloupe cell_annotation_sample_cloupe, + src py "stages/cas_cell_typing/append_cell_types_cloupe", +) + +stage WRITE_CELL_TYPES_H5( + in csv cell_types, + out h5 cell_types, + out json cell_types_map, + src py "stages/cas_cell_typing/write_cell_types_h5", +) + +stage DEMUX_CLOUPE_TRACK_NAME( + in string cas_track_name_from_user, + in string cas_track_name_from_ppln, + out string cas_track_name, + src py "stages/cas_cell_typing/demux_cloupe_track_name", +) + +stage CHECK_CLOUPE_MATRIX_CONSISTENT( + in cloupe sample_cloupe, + in h5 filtered_matrix, + out string alert_string, + src py "stages/cas_cell_typing/check_cloupe_matrix_consistent", +) + +stage CELL_ANNOTATION_VIABLE_BUT_NOT_REQUESTED( + in h5 filtered_matrix, + in bool skip_cell_annotation, + out bool cell_annotation_viable_but_not_requested, + src py "stages/cas_cell_typing/cell_annotation_viable_but_not_requested", +) + +stage TIDY_CELLTYPE_DIFFEXP( + in path diffexp_csv, + in json cell_types_map, + in h5 filtered_matrix, + out csv cas_diffexp_csv, + out json diffexp, + src py "stages/cas_cell_typing/tidy_celltype_diffexp", +) + +pipeline CELL_TYPE_DIFF_EXP( + in csv cell_types, + in h5 filtered_matrix, + out json diffexp, + out csv cas_diffexp_csv, +) +{ + call WRITE_CELL_TYPES_H5( + cell_types = self.cell_types, + ) + + call RUN_DIFFERENTIAL_EXPRESSION_NG as DIFF_EXP_CAS( + matrix_h5 = self.filtered_matrix, + clustering_h5 = WRITE_CELL_TYPES_H5.cell_types, + is_antibody_only = false, + ) + + call TIDY_CELLTYPE_DIFFEXP( + diffexp_csv = DIFF_EXP_CAS.diffexp_csv, + cell_types_map = WRITE_CELL_TYPES_H5.cell_types_map, + filtered_matrix = self.filtered_matrix, + ) + + return ( + * = TIDY_CELLTYPE_DIFFEXP, + ) +} + +pipeline SUMMARIZE_CELL_TYPES( + in h5 filtered_matrix, + in CellTypeResults cell_type_results, + in path analysis, + in csv tissue_positions, + in png tissue_lowres_image, + in json scale_factors, + in string pipestance_type, + in bool cas_success, + in bool is_pd, + in csv cloupe_projection, + out json cas_metrics, + out json cloupe_cas_types, + out json cell_type_bar_chart, + out json spatial_cell_types_chart, + out json cell_type_interactive_bar_chart, + out json cell_types_box_plot, + out json cell_types_umap_plot, + out csv cas_diffexp_csv, + out json diffexp, + out bool disable_differential_expression, +) +{ + call DISABLE_CAS_REPORTER_STAGES( + cell_types = self.cell_type_results.cell_types, + ) + + call GET_CELL_TYPES_BARCHART( + cell_types = self.cell_type_results.cell_types, + ) + + call GET_CELL_TYPES_BOX_PLOT( + cell_types = self.cell_type_results.cell_types, + filtered_matrix = self.filtered_matrix, + pipestance_type = self.pipestance_type, + ) + + call GET_CELL_TYPES_UMAP_PLOT( + analysis = self.analysis, + cell_types = self.cell_type_results.cell_types, + pipestance_type = self.pipestance_type, + cloupe_projection = self.cloupe_projection, + ) + + call ANALYZE_CELL_TYPES( + cell_types = self.cell_type_results.cell_types, + cas_frac_returned_bcs = self.cell_type_results.frac_returned_bcs, + analysis = self.analysis, + tissue_positions = self.tissue_positions, + tissue_lowres_image = self.tissue_lowres_image, + scale_factors = self.scale_factors, + cas_model_used = self.cell_type_results.model_used, + pipestance_type = self.pipestance_type, + cas_success = self.cas_success, + metadata = self.cell_type_results.metadata, + is_pd = self.is_pd, + ) + + call GET_CLOUPE_CELL_TYPES( + cell_types = self.cell_type_results.cell_types, + ) + + call CELL_TYPE_DIFF_EXP( + cell_types = self.cell_type_results.cell_types, + filtered_matrix = self.filtered_matrix, + ) using ( + disabled = DISABLE_CAS_REPORTER_STAGES.disable_differential_expression, + ) + + return ( + cas_metrics = ANALYZE_CELL_TYPES.cas_metrics, + cloupe_cas_types = GET_CLOUPE_CELL_TYPES.cloupe_cas_types, + cell_type_bar_chart = ANALYZE_CELL_TYPES.cell_type_bar_chart, + spatial_cell_types_chart = ANALYZE_CELL_TYPES.spatial_cell_types_chart, + cell_type_interactive_bar_chart = GET_CELL_TYPES_BARCHART.cell_type_interactive_bar_chart, + cell_types_box_plot = GET_CELL_TYPES_BOX_PLOT.cell_types_box_plot, + cell_types_umap_plot = GET_CELL_TYPES_UMAP_PLOT.cell_types_umap_plot, + diffexp = CELL_TYPE_DIFF_EXP.diffexp, + cas_diffexp_csv = CELL_TYPE_DIFF_EXP.cas_diffexp_csv, + disable_differential_expression = DISABLE_CAS_REPORTER_STAGES.disable_differential_expression, + ) +} + +pipeline CELL_ANNOTATION_SERVICE( + in h5 filtered_matrix, + in path analysis, + in string sample_id, + in string sample_desc, + in csv tissue_positions, + in png tissue_lowres_image, + in json scale_factors, + in string cell_annotation_model, + in string tenx_cloud_token_path, + in string pipestance_type, + in string alert_string, + in bool is_pd, + in csv cloupe_projection, + in cloupe sample_cloupe, + out CellTypes cell_types, + out json cas_metrics, + out json cloupe_cas_types, + out json cell_type_bar_chart, + out json spatial_cell_types_chart, + out json cell_type_interactive_bar_chart, + out json cell_types_box_plot, + out json cell_types_umap_plot, + out json cell_annotation_metrics, + out json diffexp, + out string cell_annotation_cloupe_name, + out bool disable_summarize, +) +{ + call CALL_CLOUD_CELL_TYPES( + override_num_bc_limit = false, + * = self, + ) + + call SUMMARIZE_CELL_TYPES( + filtered_matrix = self.filtered_matrix, + cell_type_results = CALL_CLOUD_CELL_TYPES.cell_type_results, + analysis = self.analysis, + tissue_positions = self.tissue_positions, + tissue_lowres_image = self.tissue_lowres_image, + scale_factors = self.scale_factors, + pipestance_type = self.pipestance_type, + cas_success = CALL_CLOUD_CELL_TYPES.cas_success, + is_pd = self.is_pd, + cloupe_projection = self.cloupe_projection, + ) using ( + disabled = CALL_CLOUD_CELL_TYPES.disable_summarize, + ) + + call GENERATE_CAS_WEBSUMMARY( + sample_id = self.sample_id, + sample_desc = self.sample_desc, + alert_string = self.alert_string, + cas_frac_returned_bcs = CALL_CLOUD_CELL_TYPES.cell_type_results.frac_returned_bcs, + cell_annotation_model = CALL_CLOUD_CELL_TYPES.cell_type_results.model_used, + cell_type_bar_chart = SUMMARIZE_CELL_TYPES.cell_type_bar_chart, + diffexp = SUMMARIZE_CELL_TYPES.diffexp, + spatial_cell_types_chart = SUMMARIZE_CELL_TYPES.spatial_cell_types_chart, + cell_type_interactive_bar_chart = SUMMARIZE_CELL_TYPES.cell_type_interactive_bar_chart, + cell_types_box_plot = SUMMARIZE_CELL_TYPES.cell_types_box_plot, + cell_types_umap_plot = SUMMARIZE_CELL_TYPES.cell_types_umap_plot, + metadata = CALL_CLOUD_CELL_TYPES.cell_type_results.metadata, + cas_success = CALL_CLOUD_CELL_TYPES.cas_success, + disable_cas_ws = CALL_CLOUD_CELL_TYPES.disable_cas_ws, + disable_differential_expression = SUMMARIZE_CELL_TYPES.disable_differential_expression, + pipestance_type = self.pipestance_type, + ) using ( + disabled = CALL_CLOUD_CELL_TYPES.disable_summarize, + ) + + return ( + cell_types = { + cell_annotation_differential_expression: SUMMARIZE_CELL_TYPES.cas_diffexp_csv, + cell_annotation_results: CALL_CLOUD_CELL_TYPES.cell_type_results.results, + cell_types: CALL_CLOUD_CELL_TYPES.cell_type_results.cell_types, + web_summary_cell_types: GENERATE_CAS_WEBSUMMARY.summary, + }, + cell_annotation_metrics = GENERATE_CAS_WEBSUMMARY.cell_annotation_metrics, + cell_annotation_cloupe_name = GENERATE_CAS_WEBSUMMARY.cell_annotation_cloupe_name, + disable_summarize = CALL_CLOUD_CELL_TYPES.disable_summarize, + * = SUMMARIZE_CELL_TYPES, + ) +} + +pipeline CELLRANGER_ANNOTATE_CS( + in h5 filtered_matrix, + in string tenx_cloud_token_path, + in string sample_id, + in string sample_desc, + in string cell_annotation_model, + in cloupe sample_cloupe, + in string cas_track_name, + out csv cell_types, + out json.gz cell_annotation_results, + out html web_summary_cell_types, + out csv cell_annotation_differential_expression, + out cloupe cell_annotation_sample_cloupe, +) +{ + call CELL_ANNOTATION_PREFLIGHT( + is_cr_annotate = true, + is_multi = false, + tenx_cloud_token_path = self.tenx_cloud_token_path, + cell_annotation_model = self.cell_annotation_model, + cas_track_name = self.cas_track_name, + reference_path = null, + cr_annotate_filtered_matrix = self.filtered_matrix, + cr_annotate_sample_cloupe = self.sample_cloupe, + skip_cell_annotation = false, + ) using ( + preflight = true, + ) + + call CHECK_CLOUPE_MATRIX_CONSISTENT( + * = self, + ) + + call EXTRACT_LOUPE_PROJECTION( + sample_cloupe = self.sample_cloupe, + projection_name = "umap", + ) + + call CELL_ANNOTATION_SERVICE( + filtered_matrix = self.filtered_matrix, + analysis = null, + sample_id = self.sample_id, + sample_desc = self.sample_desc, + tissue_positions = null, + tissue_lowres_image = null, + scale_factors = null, + cell_annotation_model = self.cell_annotation_model, + tenx_cloud_token_path = self.tenx_cloud_token_path, + pipestance_type = "CELLRANGER_ANNOTATE_CS", + alert_string = CHECK_CLOUPE_MATRIX_CONSISTENT.alert_string, + is_pd = false, + cloupe_projection = EXTRACT_LOUPE_PROJECTION.projection, + sample_cloupe = self.sample_cloupe, + ) + + call DEMUX_CLOUPE_TRACK_NAME( + cas_track_name_from_user = self.cas_track_name, + cas_track_name_from_ppln = CELL_ANNOTATION_SERVICE.cell_annotation_cloupe_name, + ) + + call APPEND_CELL_TYPES_CLOUPE( + sample_cloupe = self.sample_cloupe, + cloupe_cas_types = CELL_ANNOTATION_SERVICE.cloupe_cas_types, + cas_track_name = DEMUX_CLOUPE_TRACK_NAME.cas_track_name, + ) using ( + disabled = CELL_ANNOTATION_SERVICE.disable_summarize, + ) + + return ( + cell_types = CELL_ANNOTATION_SERVICE.cell_types.cell_types, + cell_annotation_results = CELL_ANNOTATION_SERVICE.cell_types.cell_annotation_results, + cell_annotation_differential_expression = CELL_ANNOTATION_SERVICE.cell_types.cell_annotation_differential_expression, + web_summary_cell_types = CELL_ANNOTATION_SERVICE.cell_types.web_summary_cell_types, + cell_annotation_sample_cloupe = APPEND_CELL_TYPES_CLOUPE.cell_annotation_sample_cloupe, + ) +} diff --git a/mro/rna/sc_multi_core.mro b/mro/rna/sc_multi_core.mro index 8ae252c..cad06e6 100644 --- a/mro/rna/sc_multi_core.mro +++ b/mro/rna/sc_multi_core.mro @@ -1,3 +1,4 @@ +@include "cell_annotation_service.mro" @include "_common_stages.mro" @include "_cr_lib_stages.mro" @include "_cr_vdj_stages.mro" @@ -24,18 +25,24 @@ pipeline MULTI_WEBSUMMARY_BUILDER( in json multi_graph, in CommonInputs common_inputs, in CountInputs count_inputs, + in VdjGenInputs vdj_gen_inputs, in json tag_contaminant_info, - in map sample_tsne_plots, + in map sample_projection_plots, in map sample_barcode_rank_plots, in map sample_treemap_plots, in json barcode_rank_plots, in json antibody_histograms, in map sample_antibody_histograms, + in map cell_annotation_barcharts, + in map cell_annotation_box_plots, + in map cell_annotation_umap_plots, + in map cell_annotation_diffexp_tables, + in map cell_annotation_metrics_jsons, + in map cell_annotation_viable_but_not_requested, in json antigen_histograms, in json jibes_biplot_histogram, - in json cmo_tsne_plot, + in json cmo_projection_plot, in string target_set_name, - in csv targeted_per_feature_metrics, in map antigen_vdj_metrics, in map antigen_specificity, in FeatureConfig feature_config, @@ -52,35 +59,41 @@ pipeline MULTI_WEBSUMMARY_BUILDER( ) call WRITE_MULTI_WEB_SUMMARY_JSON( - per_sample_metrics = self.per_sample_metrics, - library_metrics = self.library_metrics, - multi_config = self.multi_config, - multi_graph = self.multi_graph, - multi_graph_svg = BUILD_MULTI_GRAPH_VIEW.view, - common_inputs = self.common_inputs, - count_inputs = self.count_inputs, - sequencing_metrics = self.sequencing_metrics, - tag_contaminant_info = self.tag_contaminant_info, - sample_tsne_plots = self.sample_tsne_plots, - sample_barcode_rank_plots = self.sample_barcode_rank_plots, - sample_treemap_plots = self.sample_treemap_plots, - barcode_rank_plots = self.barcode_rank_plots, - antibody_histograms = self.antibody_histograms, - sample_antibody_histograms = self.sample_antibody_histograms, - antigen_histograms = self.antigen_histograms, - jibes_biplot_histogram = self.jibes_biplot_histogram, - cmo_tsne_plot = self.cmo_tsne_plot, - target_set_name = self.target_set_name, - targeted_per_feature_metrics = self.targeted_per_feature_metrics, - vdj_t_contents = self.vdj_t, - vdj_t_gd_contents = self.vdj_t_gd, - vdj_b_contents = self.vdj_b, - antigen_vdj_metrics = self.antigen_vdj_metrics, - antigen_specificity = self.antigen_specificity, - feature_config = self.feature_config, - chemistry_defs = self.chemistry_defs, + per_sample_metrics = self.per_sample_metrics, + library_metrics = self.library_metrics, + multi_config = self.multi_config, + multi_graph = self.multi_graph, + multi_graph_svg = BUILD_MULTI_GRAPH_VIEW.view, + common_inputs = self.common_inputs, + count_inputs = self.count_inputs, + sequencing_metrics = self.sequencing_metrics, + tag_contaminant_info = self.tag_contaminant_info, + sample_projection_plots = self.sample_projection_plots, + sample_barcode_rank_plots = self.sample_barcode_rank_plots, + sample_treemap_plots = self.sample_treemap_plots, + barcode_rank_plots = self.barcode_rank_plots, + antibody_histograms = self.antibody_histograms, + sample_antibody_histograms = self.sample_antibody_histograms, + cell_annotation_barcharts = self.cell_annotation_barcharts, + cell_annotation_box_plots = self.cell_annotation_box_plots, + cell_annotation_umap_plots = self.cell_annotation_umap_plots, + cell_annotation_diffexp_tables = self.cell_annotation_diffexp_tables, + cell_annotation_metrics_jsons = self.cell_annotation_metrics_jsons, + cell_annotation_viable_but_not_requested = self.cell_annotation_viable_but_not_requested, + antigen_histograms = self.antigen_histograms, + jibes_biplot_histogram = self.jibes_biplot_histogram, + cmo_projection_plot = self.cmo_projection_plot, + target_set_name = self.target_set_name, + vdj_t_contents = self.vdj_t, + vdj_t_gd_contents = self.vdj_t_gd, + vdj_b_contents = self.vdj_b, + vdj_gen_inputs = self.vdj_gen_inputs, + antigen_vdj_metrics = self.antigen_vdj_metrics, + antigen_specificity = self.antigen_specificity, + feature_config = self.feature_config, + chemistry_defs = self.chemistry_defs, detected_probe_barcode_pairing = self.detected_probe_barcode_pairing, - no_preflight = self.no_preflight, + no_preflight = self.no_preflight, ) call BUILD_MULTI_WEB_SUMMARY( @@ -129,6 +142,8 @@ pipeline SC_MULTI_CORE( out WRITE_MULTI_WEB_SUMMARY_JSON multi_web_summary_json, out map multi_web_summaries, out map multi_metrics_csvs, + out map cell_types, + out CellTypes library_cell_types, out json multi_graph, ) { @@ -173,37 +188,26 @@ pipeline SC_MULTI_CORE( ) call MULTI_GEM_WELL_PROCESSOR( - gem_group = 1, - common_input = self.common_input, - count_inputs = self.count_input, - count_chem = MULTI_CHEMISTRY_DETECTOR.detect_count_chem, - libraries_to_translate = MULTI_CHEMISTRY_DETECTOR.libraries_to_translate, - vdj_t_chem_def = SPLIT_VDJ_INPUTS.vdj_t_chemistry_def, - vdj_t_receptor = SPLIT_VDJ_INPUTS.vdj_t_receptor, - vdj_t_inputs = SPLIT_VDJ_INPUTS.vdj_t_input, - vdj_t_gd_chem_def = SPLIT_VDJ_INPUTS.vdj_t_gd_chemistry_def, - vdj_t_gd_receptor = SPLIT_VDJ_INPUTS.vdj_t_gd_receptor, - vdj_t_gd_inputs = SPLIT_VDJ_INPUTS.vdj_t_gd_input, - vdj_b_chem_def = SPLIT_VDJ_INPUTS.vdj_b_chemistry_def, - vdj_b_receptor = SPLIT_VDJ_INPUTS.vdj_b_receptor, - vdj_b_inputs = SPLIT_VDJ_INPUTS.vdj_b_input, - vdj_gen_inputs = self.vdj_gen_inputs, - is_pd = self.is_pd, - config = MAKE_FULL_CONFIG.config, - multi_graph = CREATE_MULTI_GRAPH.multi_graph, - feature_config = self.feature_config, + gem_group = 1, + common_input = self.common_input, + count_inputs = self.count_input, + count_chem = MULTI_CHEMISTRY_DETECTOR.detect_count_chem, + vdj_t_chem_def = SPLIT_VDJ_INPUTS.vdj_t_chemistry_def, + vdj_t_receptor = SPLIT_VDJ_INPUTS.vdj_t_receptor, + vdj_t_inputs = SPLIT_VDJ_INPUTS.vdj_t_input, + vdj_t_gd_chem_def = SPLIT_VDJ_INPUTS.vdj_t_gd_chemistry_def, + vdj_t_gd_receptor = SPLIT_VDJ_INPUTS.vdj_t_gd_receptor, + vdj_t_gd_inputs = SPLIT_VDJ_INPUTS.vdj_t_gd_input, + vdj_b_chem_def = SPLIT_VDJ_INPUTS.vdj_b_chemistry_def, + vdj_b_receptor = SPLIT_VDJ_INPUTS.vdj_b_receptor, + vdj_b_inputs = SPLIT_VDJ_INPUTS.vdj_b_input, + vdj_gen_inputs = self.vdj_gen_inputs, + is_pd = self.is_pd, + config = MAKE_FULL_CONFIG.config, + multi_graph = CREATE_MULTI_GRAPH.multi_graph, + feature_config = self.feature_config, ) - # eventually GEM_WELL_PROCESSOR will be map-called and this stage will merge those results - #call MERGE_GEM_WELLS_AND_SLICE_CELLS( - # gem_groups = [1], - # count_input = self.count_input, - # gem_well_processor_count = [MULTI_GEM_WELL_PROCESSOR.count], - # is_pd = self.is_pd, - #) using ( - # disabled = MAKE_FULL_CONFIG.config.disable_multi, - #) - call STRUCTIFY_PER_SAMPLE_OUTS( sample_bams = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.multi_pos_sorted_bam, sample_metrics = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.multi_metrics, @@ -226,6 +230,15 @@ pipeline SC_MULTI_CORE( multi_graph = CREATE_MULTI_GRAPH.multi_graph, ) + call DISABLE_MULTI_CORE_STAGES( + is_pd = self.is_pd, + disable_count = MAKE_FULL_CONFIG.config.disable_count, + disable_multi_count = MAKE_FULL_CONFIG.config.disable_multi_count, + disable_gex = DISABLE_FEATURE_STAGES.disable_gex, + no_secondary_analysis = self.count_input.no_secondary_analysis, + skip_cell_annotation = self.count_input.skip_cell_annotation, + ) + # per-sample map call of the count analyzer for multi runs map call COUNT_ANALYZER as SAMPLE_ANALYZER( filtered_matrices_h5 = split STRUCTIFY_PER_SAMPLE_OUTS.sample_outs.filtered_matrix_h5, @@ -241,8 +254,11 @@ pipeline SC_MULTI_CORE( disable_antigen = DISABLE_FEATURE_STAGES.disable_antigen, disable_targeted = DISABLE_FEATURE_STAGES.disable_targeted, feature_reference = self.count_input.feature_reference, + multi_graph = CREATE_MULTI_GRAPH.multi_graph, no_secondary_analysis = self.count_input.no_secondary_analysis, parse_target_features = MULTI_GEM_WELL_PROCESSOR.count.target_outs, + enable_tsne = self.count_input.enable_tsne, + sample_id = split STRUCTIFY_PER_SAMPLE_OUTS.sample_outs.sample, ) using ( disabled = MAKE_FULL_CONFIG.config.disable_multi_count, ) @@ -263,54 +279,105 @@ pipeline SC_MULTI_CORE( disable_antigen = DISABLE_FEATURE_STAGES.disable_antigen, disable_targeted = DISABLE_FEATURE_STAGES.disable_targeted, feature_reference = self.count_input.feature_reference, + multi_graph = null, no_secondary_analysis = self.count_input.no_secondary_analysis, parse_target_features = MULTI_GEM_WELL_PROCESSOR.count.target_outs, + enable_tsne = self.count_input.enable_tsne, + sample_id = null, ) using ( disabled = MAKE_FULL_CONFIG.config.disable_count, ) + map call CELL_ANNOTATION_SERVICE as SAMPLE_CELL_ANNOTATION_SERVICE( + filtered_matrix = split STRUCTIFY_PER_SAMPLE_OUTS.sample_outs.filtered_matrix_h5, + analysis = split SAMPLE_ANALYZER.common_analyzer.analysis, + sample_id = self.common_input.sample_id, + sample_desc = split STRUCTIFY_PER_SAMPLE_OUTS.sample_outs.sample, + tissue_positions = null, + tissue_lowres_image = null, + scale_factors = null, + cell_annotation_model = self.count_input.cell_annotation_model, + tenx_cloud_token_path = self.count_input.tenx_cloud_token_path, + pipestance_type = "SC_MULTI_CORE_SAMPLE", + alert_string = null, + is_pd = self.is_pd, + cloupe_projection = null, + sample_cloupe = null, + ) using ( + disabled = DISABLE_MULTI_CORE_STAGES.disable_sample_cas_celltyping, + ) + + map call CELL_ANNOTATION_VIABLE_BUT_NOT_REQUESTED( + filtered_matrix = split STRUCTIFY_PER_SAMPLE_OUTS.sample_outs.filtered_matrix_h5, + skip_cell_annotation = self.count_input.skip_cell_annotation, + ) + + call CELL_ANNOTATION_SERVICE( + filtered_matrix = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.filtered_gene_bc_matrices_h5, + analysis = COUNT_ANALYZER.common_analyzer.analysis, + sample_id = self.common_input.sample_id, + sample_desc = self.common_input.sample_desc, + tissue_positions = null, + tissue_lowres_image = null, + scale_factors = null, + cell_annotation_model = self.count_input.cell_annotation_model, + tenx_cloud_token_path = self.count_input.tenx_cloud_token_path, + pipestance_type = "SC_MULTI_CORE_LIBRARY", + alert_string = null, + is_pd = self.is_pd, + cloupe_projection = null, + sample_cloupe = null, + ) using ( + disabled = DISABLE_MULTI_CORE_STAGES.disable_library_cas_celltyping, + ) + # per-sample map-called run of reporter, for multi runs map call SAMPLE_REPORTER( - sample_outs = split STRUCTIFY_PER_SAMPLE_OUTS.sample_outs, - count_analyzer = split SAMPLE_ANALYZER.common_analyzer, - crispr_analyzer = split SAMPLE_ANALYZER.crispr_analyzer, - targeted_analyzer = split SAMPLE_ANALYZER.targeted_analyzer, - sample_assignment_metrics = split MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.sample_assignment_metrics, - target_panel_summary = MULTI_GEM_WELL_PROCESSOR.count.target_outs.target_panel_summary, - sample_id = self.common_input.sample_id, - sample_desc = self.common_input.sample_desc, - config = MAKE_FULL_CONFIG.config, - count_pipestance_type = self.count_pipestance_type, - cell_calling_config = self.count_input.cell_calling_config, - barcode_summary = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.barcode_summary, - reference_path = self.count_input.reference_path, - cells_per_sample = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.assign_tags.sample_cell_barcodes, - cells_per_tag = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.assign_tags.cells_per_tag, + sample_outs = split STRUCTIFY_PER_SAMPLE_OUTS.sample_outs, + count_analyzer = split SAMPLE_ANALYZER.common_analyzer, + crispr_analyzer = split SAMPLE_ANALYZER.crispr_analyzer, + targeted_analyzer = split SAMPLE_ANALYZER.targeted_analyzer, + sample_assignment_metrics = split MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.sample_assignment_metrics, + cloupe_cas_types = split SAMPLE_CELL_ANNOTATION_SERVICE.cloupe_cas_types, + cell_annotation_cloupe_name = split SAMPLE_CELL_ANNOTATION_SERVICE.cell_annotation_cloupe_name, + target_panel_summary = MULTI_GEM_WELL_PROCESSOR.count.target_outs.target_panel_summary, + sample_id = self.common_input.sample_id, + sample_desc = self.common_input.sample_desc, + config = MAKE_FULL_CONFIG.config, + count_pipestance_type = self.count_pipestance_type, + cell_calling_config = self.count_input.cell_calling_config, + barcode_summary = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.barcode_summary, + reference_path = self.count_input.reference_path, + cells_per_sample = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.assign_tags.sample_cell_barcodes, + cells_per_tag = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.assign_tags.cells_per_tag, ) using ( disabled = MAKE_FULL_CONFIG.config.disable_multi_count, ) # reporter for library-level information call MULTI_REPORTER( - sample_id = self.common_input.sample_id, - sample_desc = self.common_input.sample_desc, - config = MAKE_FULL_CONFIG.config, - count_pipestance_type = self.count_pipestance_type, - feature_reference = self.count_input.feature_reference, - reference_path = self.count_input.reference_path, - chemistry_defs = MULTI_CHEMISTRY_DETECTOR.detect_count_chem.chemistry_defs, - count_gw = MULTI_GEM_WELL_PROCESSOR.count, - include_introns = self.count_input.include_introns, - count_analyzer = COUNT_ANALYZER.common_analyzer, - crispr_analyzer = COUNT_ANALYZER.crispr_analyzer, - antibody_analyzer = COUNT_ANALYZER.antibody_analyzer, - antigen_analyzer = COUNT_ANALYZER.antigen_analyzer, - targeted_analyzer = COUNT_ANALYZER.targeted_analyzer, - filtered_barcodes = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.filtered_barcodes, - barcode_summary = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.barcode_summary, - assign_tags_outs = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.assign_tags, - disable_library_cloupe = DISABLE_FEATURE_STAGES.disable_library_cloupe, - sample_cloupe = SAMPLE_REPORTER.cloupe, + sample_id = self.common_input.sample_id, + sample_desc = self.common_input.sample_desc, + config = MAKE_FULL_CONFIG.config, + count_pipestance_type = self.count_pipestance_type, + feature_reference = self.count_input.feature_reference, + reference_path = self.count_input.reference_path, + chemistry_defs = MULTI_CHEMISTRY_DETECTOR.detect_count_chem.chemistry_defs, + count_gw = MULTI_GEM_WELL_PROCESSOR.count, + include_introns = self.count_input.include_introns, + count_analyzer = COUNT_ANALYZER.common_analyzer, + crispr_analyzer = COUNT_ANALYZER.crispr_analyzer, + antibody_analyzer = COUNT_ANALYZER.antibody_analyzer, + antigen_analyzer = COUNT_ANALYZER.antigen_analyzer, + targeted_analyzer = COUNT_ANALYZER.targeted_analyzer, + filtered_barcodes = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.filtered_barcodes, + barcode_summary = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.barcode_summary, + assign_tags_outs = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.assign_tags, + disable_library_cloupe = DISABLE_FEATURE_STAGES.disable_library_cloupe, + sample_cloupe = SAMPLE_REPORTER.cloupe, + cloupe_cas_types = CELL_ANNOTATION_SERVICE.cloupe_cas_types, + cas_metrics = CELL_ANNOTATION_SERVICE.cas_metrics, + cell_annotation_cloupe_name = CELL_ANNOTATION_SERVICE.cell_annotation_cloupe_name, ) call PICK_BEAM_ANALYZER( @@ -333,7 +400,7 @@ pipeline SC_MULTI_CORE( in_rna_analysis = null, in_cloupe_file = null, in_metrics_summary = SAMPLE_REPORTER.metrics_summary, - in_sample_tsne_plots = SAMPLE_REPORTER.sample_tsne_plots, + in_sample_projection_plots = SAMPLE_REPORTER.sample_projection_plots, in_sample_barcode_rank_plots = SAMPLE_REPORTER.sample_library_to_barcode_rank, in_sample_treemap_plots = SAMPLE_REPORTER.sample_treemap_plots, in_vdj_t_analyzer = null, @@ -344,34 +411,40 @@ pipeline SC_MULTI_CORE( ) call MULTI_WEBSUMMARY_BUILDER( - vdj_t = MULTI_GEM_WELL_PROCESSOR.vdj_t.vdj_ws_contents, - vdj_t_gd = MULTI_GEM_WELL_PROCESSOR.vdj_t_gd.vdj_ws_contents, - vdj_b = MULTI_GEM_WELL_PROCESSOR.vdj_b.vdj_ws_contents, - per_sample_metrics = SANITIZE_MAP_CALLS.metrics_summary, - library_metrics = MULTI_REPORTER.count_summary.metrics_summary_json, - multi_config = self.multi_config, - multi_graph = CREATE_MULTI_GRAPH.multi_graph, - common_inputs = self.common_input, - count_inputs = self.count_input, - sequencing_metrics = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.sequencing_metrics, - tag_contaminant_info = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.assign_tags.tag_contaminant_info, - sample_tsne_plots = SANITIZE_MAP_CALLS.sample_tsne_plots, - sample_barcode_rank_plots = SANITIZE_MAP_CALLS.sample_barcode_rank_plots, - sample_treemap_plots = SANITIZE_MAP_CALLS.sample_treemap_plots, - barcode_rank_plots = MULTI_REPORTER.barcode_rank_plots, - antibody_histograms = MULTI_REPORTER.antibody_histograms, - sample_antibody_histograms = SAMPLE_ANALYZER.antibody_analyzer.antibody_histograms_json, - antigen_histograms = MULTI_REPORTER.antigen_histograms, - jibes_biplot_histogram = MULTI_REPORTER.jibes_biplot_histogram, - cmo_tsne_plot = MULTI_REPORTER.cmo_tsne_plot, - target_set_name = MULTI_GEM_WELL_PROCESSOR.count.target_outs.target_set_name, - targeted_per_feature_metrics = COUNT_ANALYZER.targeted_analyzer.per_feature_metrics_csv, - antigen_vdj_metrics = PICK_BEAM_ANALYZER.output.antigen_vdj_metrics_bin, - antigen_specificity = PICK_BEAM_ANALYZER.output.antigen_specificity_scores, - feature_config = self.feature_config, - chemistry_defs = MULTI_CHEMISTRY_DETECTOR.detect_count_chem.chemistry_defs, + vdj_t = MULTI_GEM_WELL_PROCESSOR.vdj_t.vdj_ws_contents, + vdj_t_gd = MULTI_GEM_WELL_PROCESSOR.vdj_t_gd.vdj_ws_contents, + vdj_b = MULTI_GEM_WELL_PROCESSOR.vdj_b.vdj_ws_contents, + per_sample_metrics = SANITIZE_MAP_CALLS.metrics_summary, + library_metrics = MULTI_REPORTER.count_summary.metrics_summary_json, + multi_config = self.multi_config, + multi_graph = CREATE_MULTI_GRAPH.multi_graph, + common_inputs = self.common_input, + count_inputs = self.count_input, + vdj_gen_inputs = self.vdj_gen_inputs, + sequencing_metrics = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.sequencing_metrics, + tag_contaminant_info = MULTI_GEM_WELL_PROCESSOR.count.basic_counter_outs.assign_tags.tag_contaminant_info, + sample_projection_plots = SANITIZE_MAP_CALLS.sample_projection_plots, + sample_barcode_rank_plots = SANITIZE_MAP_CALLS.sample_barcode_rank_plots, + sample_treemap_plots = SANITIZE_MAP_CALLS.sample_treemap_plots, + barcode_rank_plots = MULTI_REPORTER.barcode_rank_plots, + antibody_histograms = MULTI_REPORTER.antibody_histograms, + cell_annotation_barcharts = SAMPLE_CELL_ANNOTATION_SERVICE.cell_type_interactive_bar_chart, + cell_annotation_box_plots = SAMPLE_CELL_ANNOTATION_SERVICE.cell_types_box_plot, + cell_annotation_umap_plots = SAMPLE_CELL_ANNOTATION_SERVICE.cell_types_umap_plot, + cell_annotation_diffexp_tables = SAMPLE_CELL_ANNOTATION_SERVICE.diffexp, + cell_annotation_viable_but_not_requested = CELL_ANNOTATION_VIABLE_BUT_NOT_REQUESTED.cell_annotation_viable_but_not_requested, + cell_annotation_metrics_jsons = SAMPLE_CELL_ANNOTATION_SERVICE.cell_annotation_metrics, + sample_antibody_histograms = SAMPLE_ANALYZER.antibody_analyzer.antibody_histograms_json, + antigen_histograms = MULTI_REPORTER.antigen_histograms, + jibes_biplot_histogram = MULTI_REPORTER.jibes_biplot_histogram, + cmo_projection_plot = MULTI_REPORTER.cmo_projection_plot, + target_set_name = MULTI_GEM_WELL_PROCESSOR.count.target_outs.target_set_name, + antigen_vdj_metrics = PICK_BEAM_ANALYZER.output.antigen_vdj_metrics_bin, + antigen_specificity = PICK_BEAM_ANALYZER.output.antigen_specificity_scores, + feature_config = self.feature_config, + chemistry_defs = MULTI_CHEMISTRY_DETECTOR.detect_count_chem.chemistry_defs, detected_probe_barcode_pairing = MULTI_CHEMISTRY_DETECTOR.detect_count_chem.detected_probe_barcode_pairing, - no_preflight = self.no_preflight, + no_preflight = self.no_preflight, ) using ( disabled = MAKE_FULL_CONFIG.config.disable_multi, ) @@ -388,6 +461,8 @@ pipeline SC_MULTI_CORE( vdj_ref_out = COPY_VDJ_REFERENCE.vdj_reference, sample_analyzer = SAMPLE_ANALYZER, sample_reporter = SAMPLE_REPORTER, + cell_types = SAMPLE_CELL_ANNOTATION_SERVICE.cell_types, + library_cell_types = CELL_ANNOTATION_SERVICE.cell_types, sample_outs = STRUCTIFY_PER_SAMPLE_OUTS.sample_outs, unassigned_bam = STRUCTIFY_PER_SAMPLE_OUTS.unassigned_alignments, unassigned_bai = STRUCTIFY_PER_SAMPLE_OUTS.unassigned_alignments_bai_index, diff --git a/mro/rna/sc_multi_cs.mro b/mro/rna/sc_multi_cs.mro index 164e29c..145e650 100644 --- a/mro/rna/sc_multi_cs.mro +++ b/mro/rna/sc_multi_cs.mro @@ -1,10 +1,14 @@ @include "sc_multi_core.mro" +@include "_cell_annotation_common_stages.mro" @include "_cr_lib_stages.mro" @include "_sc_multi_defs.mro" +@include "_sc_rna_counter_stages.mro" # The subset of CountInputs which are not overridden in the CS pipeline. struct CountInputsMinimal( map[] sample_def, + csv target_set, + string target_set_name, map chemistry_specs, path reference_path, CellCalling cell_calling_config, @@ -22,6 +26,9 @@ struct CountInputsMinimal( bool tenx_cmos, float min_assignment_confidence, int min_crispr_umi_threshold, + string tenx_cloud_token_path, + string cell_annotation_model, + bool skip_cell_annotation, ) pipeline FULL_VDJ_INPUTS( @@ -86,6 +93,8 @@ pipeline FULL_VDJ_INPUTS( pipeline FULL_COUNT_INPUTS( in CountInputsMinimal cs_inputs, in string[] allowed_chems, + out csv target_set, + out string target_set_name, out map[] sample_def, out map chemistry_specs, out ChemistryDef custom_chemistry_def, @@ -108,6 +117,7 @@ pipeline FULL_COUNT_INPUTS( out csv feature_reference, out bool include_exons, out bool include_introns, + out bool skip_cell_annotation, out string targeting_method, out string aligner, out map genetic_demux_params, @@ -117,9 +127,11 @@ pipeline FULL_COUNT_INPUTS( out BarcodeAssignments force_sample_barcodes, out bool tenx_cmos, out float min_assignment_confidence, - out csv[] annotations, - out string cas_model, out int min_crispr_umi_threshold, + out csv[] annotations, + out string cell_annotation_model, + out string tenx_cloud_token_path, + out bool enable_tsne, ) { call WRITE_GENE_INDEX( @@ -167,7 +179,7 @@ pipeline FULL_COUNT_INPUTS( trim_tso_min_score = 20, count_allowed_chems = self.allowed_chems, include_exons = true, - cas_model = null, + enable_tsne = true, * = self.cs_inputs, ) } @@ -184,14 +196,6 @@ pipeline SC_MULTI_CS( out map per_sample_outs, ) { - call MULTI_PREFLIGHT as MULTI_PREFLIGHT_LOCAL( - config = self.config, - is_pd = false, - ) using ( - local = true, - preflight = true, - ) - call MULTI_PREFLIGHT( config = self.config, is_pd = false, @@ -217,15 +221,24 @@ pipeline SC_MULTI_CS( "fiveprime", "SC3Pv1", "SC3Pv2", - "SC3Pv3", + "SC3Pv3-polyA", + "SC3Pv3-CS1", + "SFRP-no-trim-R2", + "MFRP-R1-no-trim-R2", # no longer supported, but included to allow DETECT_CHEMISTRY to produce a nice error message "SC3Pv3LT", - "SC3Pv3HT", - "SC3Pv4", + "SC3Pv3HT-polyA", + "SC3Pv3HT-CS1", + "SC3Pv4-polyA", + "SC3Pv4-CS1", + "SC3Pv4-polyA-OCM", + "SC3Pv4-CS1-OCM", "SC5P-PE", "SC5P-PE-v3", + "SC5P-PE-OCM-v3", "SC5P-R2", "SC5P-R2-v3", + "SC5P-R2-OCM-v3", "SC5PHT", "SC-FB", "SFRP", @@ -242,6 +255,18 @@ pipeline SC_MULTI_CS( disabled = PARSE_MULTI_CONFIG.basic_config.disable_count, ) + call CELL_ANNOTATION_PREFLIGHT( + is_cr_annotate = false, + is_multi = true, + tenx_cloud_token_path = PARSE_MULTI_CONFIG.count_input.tenx_cloud_token_path, + cell_annotation_model = PARSE_MULTI_CONFIG.count_input.cell_annotation_model, + reference_path = PARSE_MULTI_CONFIG.count_input.reference_path, + skip_cell_annotation = PARSE_MULTI_CONFIG.basic_config.disable_annotate, + cas_track_name = null, + cr_annotate_filtered_matrix = null, + cr_annotate_sample_cloupe = null, + ) + map call FULL_VDJ_INPUTS( cs_inputs = split PARSE_MULTI_CONFIG.vdj_inputs, ) @@ -261,8 +286,11 @@ pipeline SC_MULTI_CS( "custom", "SCVDJ", "SCVDJ-R2", + "SCVDJ-v3", "SCVDJ-R2-v3", "SCVDJ-R1", + "SCVDJ-v3-OCM", + "SCVDJ-R2-OCM-v3", ], is_multi = true, feature_config = PARSE_MULTI_CONFIG.feature_config, @@ -275,7 +303,7 @@ pipeline SC_MULTI_CS( in_rna_analysis = SC_MULTI_CORE.sample_analyzer.common_analyzer.analysis_csv, in_cloupe_file = SC_MULTI_CORE.sample_reporter.cloupe, in_metrics_summary = SC_MULTI_CORE.sample_reporter.metrics_summary, - in_sample_tsne_plots = null, + in_sample_projection_plots = null, in_sample_barcode_rank_plots = null, in_sample_treemap_plots = null, in_vdj_t_analyzer = SC_MULTI_CORE.multi_gw.vdj_t.per_sample, @@ -317,6 +345,13 @@ pipeline SC_MULTI_CS( vdj_t_gd_outs = split PER_SAMPLE_VDJ_OUTS_CS.vdj_t_gd_outs_cs, output_per_sample_raw_matrix = SC_MULTI_CORE.multi_gw.count.basic_counter_outs.assign_tags.output_per_sample_raw_matrix, beam_analyzer = split SC_MULTI_CORE.beam_analyzer, + cell_types = split SC_MULTI_CORE.cell_types, + ) + + call GET_AGGREGATE_BARCODES_OUT( + antibody_analysis = SC_MULTI_CORE.count_analyzer.antibody_analyzer.antibody_analysis, + is_multi = true, + multiplexing_method = SC_MULTI_CORE.multi_gw.count.basic_counter_outs.assign_tags.multiplexing_method, ) return ( @@ -324,6 +359,7 @@ pipeline SC_MULTI_CS( vdj_reference = SC_MULTI_CORE.vdj_ref_out, multi = { count: { + aggregate_barcodes: GET_AGGREGATE_BARCODES_OUT.aggregate_barcodes, feature_reference_csv: SC_MULTI_CORE.multi_reporter.count_summary.feature_reference, raw_cloupe: SC_MULTI_CORE.multi_reporter.cloupe, raw_feature_bc_matrix_h5: SC_MULTI_CORE.multi_gw.count.basic_counter_outs.raw_gene_bc_matrices_h5, diff --git a/mro/rna/sc_rna_aggregator.mro b/mro/rna/sc_rna_aggregator.mro index 597c84c..e5c0798 100644 --- a/mro/rna/sc_rna_aggregator.mro +++ b/mro/rna/sc_rna_aggregator.mro @@ -36,6 +36,7 @@ pipeline SC_RNA_AGGREGATOR( in string product_type, in bool is_pd, in int min_crispr_umi_threshold, + in bool enable_tsne, out h5 raw_gene_bc_matrices_h5, out h5 filtered_gene_bc_matrices_h5, out path filtered_gene_bc_matrices_mex, @@ -126,6 +127,7 @@ pipeline SC_RNA_AGGREGATOR( cbc_realign_panorama: self.cbc_realign_panorama, cbc_sigma: self.cbc_sigma, chemistry_batch_correction: SETUP_SAMPLES.chemistry_batch_correction, + enable_tsne: self.enable_tsne, exclude_genes: null, filtered_matrices_h5: WRITE_MATRICES.filtered_matrix_h5, force_cells: null, @@ -176,6 +178,7 @@ pipeline SC_RNA_AGGREGATOR( crispr_analysis_metrics = _CRISPR_ANALYZER.crispr_analysis_metrics, product_type = self.product_type, sample_defs = CHECK_MOLECULE_INFO_VERSION.updated_sample_defs, + skip_tsne = SC_RNA_ANALYZER.common_analyzer.skip_tsne, ) call CHECK_INVARIANTS( diff --git a/mro/rna/sc_rna_aggregator_cs.mro b/mro/rna/sc_rna_aggregator_cs.mro index 384e97a..746f149 100644 --- a/mro/rna/sc_rna_aggregator_cs.mro +++ b/mro/rna/sc_rna_aggregator_cs.mro @@ -21,7 +21,7 @@ struct CountAggrOutputs( bool disable_antigen_aggr "Disable antigen aggregation", ) -struct VdjAggrOutputs( +struct VdjAggrOutputsCS( tsv airr_rearrangement "AIRR Rearrangement TSV", csv clonotypes "Clonotypes csv", fasta consensus_fasta "Clonotype consensus FASTA" "consensus.fasta", @@ -31,6 +31,18 @@ struct VdjAggrOutputs( fa donor_regions "Inferred germline gene sequences", ) +struct VdjAggrOutputsPD( + tsv airr_rearrangement "AIRR Rearrangement TSV", + csv clonotypes "Clonotypes csv", + fasta consensus_fasta "Clonotype consensus FASTA" "consensus.fasta", + csv filtered_contig_annotations_csv "Annotations of filtered contigs with library metadata (CSV)" "filtered_contig_annotations.csv", + csv consensus_annotations_csv "Clonotype consensus annotations (CSV)" "consensus_annotations.csv", + vloupe vloupe "Loupe VDJ Browser file", + fa donor_regions "Inferred germline gene sequences", + html filter_summary "Summary of enclone filtering", + pb enclone_output "Clonotypes computed by enclone", +) + stage BUILD_COMBINED_WEB_SUMMARY( in json vdj_t_data, in json vdj_b_data, @@ -51,6 +63,7 @@ pipeline COUNT_AGGR( in bool no_secondary_analysis, in int min_crispr_umi_threshold, in bool is_pd, + in bool enable_tsne, out map gem_group_index, out CountAggrOutputs aggr_outputs, out json ws_data, @@ -85,6 +98,7 @@ pipeline COUNT_AGGR( tsne_mom_switch_iter = null, product_type = "sc", is_pd = self.is_pd, + enable_tsne = self.enable_tsne, ) call CLOUPE_PREPROCESS( @@ -145,12 +159,14 @@ pipeline VDJ_AGGR( in string beam_mode, in bool disable_antigen_aggr, in bool disable_count_aggr, + in bool mix_donors, + in FilterSwitch filter_switch, in map antigen_specificity_controls, - out VdjAggrOutputs vdj_t_outputs, + out VdjAggrOutputsPD vdj_t_outputs, out json vdj_t_ws_data, - out VdjAggrOutputs vdj_t_gd_outputs, + out VdjAggrOutputsPD vdj_t_gd_outputs, out json vdj_t_gd_ws_data, - out VdjAggrOutputs vdj_b_outputs, + out VdjAggrOutputsPD vdj_b_outputs, out json vdj_b_ws_data, out VdjRefFolder vdj_reference, out AntigenAggrResults antigen_analysis, @@ -168,6 +184,8 @@ pipeline VDJ_AGGR( antigen_specificity_controls = self.antigen_specificity_controls, disable_antigen_aggr = self.disable_antigen_aggr, disable_count_aggr = self.disable_count_aggr, + filter_switch = self.filter_switch, + mix_donors = self.mix_donors, ) call MATCH_VDJ_AGGR_OUTS( @@ -183,6 +201,8 @@ pipeline VDJ_AGGR( antigen_analysis = SC_VDJ_AGGREGATOR.antigen_analysis, antigen_aggr_web_summary_data_in = SC_VDJ_AGGREGATOR.antigen_aggr_web_summary_data, airr_rearrangements = SC_VDJ_AGGREGATOR.airr_rearrangement, + filter_summaries = SC_VDJ_AGGREGATOR.filter_summary, + enclone_outputs = SC_VDJ_AGGREGATOR.enclone_output, ) call COPY_VDJ_REFERENCE( @@ -210,12 +230,13 @@ pipeline SC_RNA_AGGREGATOR_CS( in string normalization_mode, in bool no_secondary_analysis, in int min_crispr_umi_threshold, + in bool enable_tsne, out csv aggregation_csv "Copy of the input aggregation CSV" "aggregation.csv", out html web_summary "Aggregation metrics summary HTML", out CountAggrOutputs count, - out VdjAggrOutputs vdj_t, - out VdjAggrOutputs vdj_t_gd, - out VdjAggrOutputs vdj_b, + out VdjAggrOutputsCS vdj_t, + out VdjAggrOutputsCS vdj_t_gd, + out VdjAggrOutputsCS vdj_b, out VdjRefFolder vdj_reference "V(D)J reference", out AntigenAggrResults antigen_analysis, ) @@ -234,6 +255,7 @@ pipeline SC_RNA_AGGREGATOR_CS( no_secondary_analysis = self.no_secondary_analysis, min_crispr_umi_threshold = self.min_crispr_umi_threshold, is_pd = false, + enable_tsne = self.enable_tsne, ) using ( disabled = PARSE_AGGR_CSV.disable_count_aggr, ) @@ -245,10 +267,18 @@ pipeline SC_RNA_AGGREGATOR_CS( feature_reference = COUNT_AGGR.aggr_outputs.feature_reference, sample_id = self.sample_id, sample_desc = self.sample_desc, + mix_donors = false, beam_mode = COUNT_AGGR.aggr_outputs.beam_mode, antigen_specificity_controls = COUNT_AGGR.aggr_outputs.antigen_specificity_controls, disable_antigen_aggr = COUNT_AGGR.aggr_outputs.disable_antigen_aggr, disable_count_aggr = PARSE_AGGR_CSV.disable_count_aggr, + filter_switch = { + asm_shared_contig: true, + enclone_cross: true, + enclone_multiplet: true, + enclone_shared_contig: true, + enclone_umi: true, + }, ) using ( disabled = PARSE_AGGR_CSV.disable_vdj_aggr, ) diff --git a/mro/rna/sc_rna_analyzer.mro b/mro/rna/sc_rna_analyzer.mro index c2f8d32..284feab 100644 --- a/mro/rna/sc_rna_analyzer.mro +++ b/mro/rna/sc_rna_analyzer.mro @@ -35,6 +35,7 @@ pipeline SC_RNA_ANALYZER( is_visium_hd = self.analyzer_inputs.is_visium_hd, is_pd = self.analyzer_inputs.is_pd, get_peak_matrix = false, + enable_tsne = self.analyzer_inputs.enable_tsne, * = ANALYZER_PREFLIGHT, ) using ( volatile = true, @@ -94,7 +95,7 @@ pipeline SC_RNA_ANALYZER( volatile = true, ) - call RUN_GRAPH_CLUSTERING_NG as RUN_GRAPH_CLUSTERING( + call RUN_GRAPH_CLUSTERING( matrix_h5 = PREPROCESS_MATRIX.preprocessed_matrix_h5, pca_h5 = RUN_PCA.pca_h5, num_neighbors = self.analyzer_inputs.graphclust_neighbors, @@ -139,7 +140,7 @@ pipeline SC_RNA_ANALYZER( volatile = true, ) - call RUN_TSNE_NG as RUN_TSNE( + call RUN_TSNE( matrix_h5 = PREPROCESS_MATRIX.preprocessed_matrix_h5, pca_h5 = RUN_PCA.pca_h5, random_seed = self.analyzer_inputs.random_seed, @@ -199,6 +200,8 @@ pipeline SC_RNA_ANALYZER( aggregate_barcodes = self.aggregate_barcodes, is_antibody = true, is_spatial = self.analyzer_inputs.is_spatial, + multi_graph = null, + sample_id = null, ) using ( disabled = PREPROCESS_MATRIX.skip_antibody_analysis, ) @@ -208,6 +211,8 @@ pipeline SC_RNA_ANALYZER( aggregate_barcodes = self.aggregate_barcodes, is_antibody = false, is_spatial = self.analyzer_inputs.is_spatial, + multi_graph = null, + sample_id = null, ) using ( disabled = PREPROCESS_MATRIX.skip_antigen_analysis, ) @@ -220,6 +225,7 @@ pipeline SC_RNA_ANALYZER( analysis: SUMMARIZE_ANALYSIS.analysis, analysis_csv: SUMMARIZE_ANALYSIS.analysis_csv, cloupe_matrix_h5: PREPROCESS_MATRIX.cloupe_matrix_h5, + skip_tsne: PREPROCESS_MATRIX.skip_tsne, summary: SUMMARIZE_ANALYSIS.summary, }, ) diff --git a/mro/rna/sc_rna_counter_cs.mro b/mro/rna/sc_rna_counter_cs.mro index 2f8feee..1b5a277 100644 --- a/mro/rna/sc_rna_counter_cs.mro +++ b/mro/rna/sc_rna_counter_cs.mro @@ -4,6 +4,7 @@ @include "sc_multi_core.mro" @include "sc_multi_cs.mro" +@include "_cell_annotation_common_stages.mro" @include "_common_stages.mro" @include "_cr_lib_stages.mro" @include "_sc_multi_defs.mro" @@ -12,7 +13,6 @@ pipeline _STRUCTIFY( in CommonInputs common_input, in CountInputsCS count_input, - in BasicPipelineConfig config, out CommonInputs common_input, out CountInputsCS count_input, out BasicPipelineConfig config, @@ -21,57 +21,72 @@ pipeline _STRUCTIFY( return ( common_input = self.common_input, count_input = self.count_input, - config = self.config, + config = { + disable_annotate: self.count_input.skip_cell_annotation, + disable_count: false, + disable_multi: true, + disable_multi_count: true, + disable_rtl: true, + disable_vdj: true, + }, ) } pipeline SC_RNA_COUNTER_CS( - in string sample_id, - in map[] sample_def, - in string sample_desc, - in path reference_path, - in int recovered_cells, - in bool no_bam, - in bool filter_probes, - in bool no_secondary_analysis, - in bool no_target_umi_filter, - in int force_cells, - in bool include_introns, - in bool check_library_compatibility, - in string chemistry, - in int r1_length, - in int r2_length, - in string targeting_method, - in string aligner, - in int trim_polya_min_score, - in int trim_tso_min_score, - in csv feature_reference, - in int emptydrops_minimum_umis, - in int global_minimum_umis, - in int max_mito_percent, - in bool disable_ab_aggregate_detection, - in int min_crispr_umi_threshold, - out html web_summary "Run summary HTML", - out csv metrics_summary "Run summary CSV", - out bam possorted_genome_bam "BAM" "possorted_genome_bam.bam", - out bam.bai possorted_genome_bai_index "BAM BAI index" "possorted_genome_bam.bam.bai", - out bam.csi possorted_genome_csi_index "BAM CSI index" "possorted_genome_bam.bam.csi", - out path filtered_feature_bc_matrix "Filtered feature-barcode matrices MEX", - out h5 filtered_feature_bc_matrix_h5 "Filtered feature-barcode matrices HDF5" "filtered_feature_bc_matrix.h5", - out path raw_feature_bc_matrix "Unfiltered feature-barcode matrices MEX", - out h5 raw_feature_bc_matrix_h5 "Unfiltered feature-barcode matrices HDF5" "raw_feature_bc_matrix.h5", - out path analysis "Secondary analysis output CSV", - out h5 molecule_info "Per-molecule read information", - out path crispr_analysis "CRISPR-specific analysis", - out csv aggregate_barcodes "Antibody aggregate barcodes", - out cloupe cloupe "Loupe Browser file", - out csv feature_reference "Feature Reference", - out csv target_panel "Target Panel File", - out csv probe_set "Probe Set File", + in string sample_id, + in map[] sample_def, + in csv target_set, + in string target_set_name, + in string sample_desc, + in path reference_path, + in int recovered_cells, + in bool no_bam, + in bool filter_probes, + in bool no_secondary_analysis, + in bool no_target_umi_filter, + in int force_cells, + in bool include_introns, + in bool check_library_compatibility, + in string chemistry, + in int r1_length, + in int r2_length, + in string targeting_method, + in string aligner, + in int trim_polya_min_score, + in int trim_tso_min_score, + in csv feature_reference, + in int emptydrops_minimum_umis, + in int global_minimum_umis, + in int max_mito_percent, + in bool disable_ab_aggregate_detection, + in int min_crispr_umi_threshold, + in string tenx_cloud_token_path, + in string cell_annotation_model "The model used for Cell Annotation Service. If null, use the default model.", + in bool skip_cell_annotation "An override to skip cell annotation.", + out html web_summary "Run summary HTML", + out csv metrics_summary "Run summary CSV", + out bam possorted_genome_bam "BAM" "possorted_genome_bam.bam", + out bam.bai possorted_genome_bai_index "BAM BAI index" "possorted_genome_bam.bam.bai", + out bam.csi possorted_genome_csi_index "BAM CSI index" "possorted_genome_bam.bam.csi", + out path filtered_feature_bc_matrix "Filtered feature-barcode matrices MEX", + out h5 filtered_feature_bc_matrix_h5 "Filtered feature-barcode matrices HDF5" "filtered_feature_bc_matrix.h5", + out path raw_feature_bc_matrix "Unfiltered feature-barcode matrices MEX", + out h5 raw_feature_bc_matrix_h5 "Unfiltered feature-barcode matrices HDF5" "raw_feature_bc_matrix.h5", + out path analysis "Secondary analysis output CSV", + out h5 molecule_info "Per-molecule read information", + out path crispr_analysis "CRISPR-specific analysis", + out csv aggregate_barcodes "Antibody aggregate barcodes", + out cloupe cloupe "Loupe Browser file", + out csv feature_reference "Feature Reference", + out csv target_panel "Target Panel File", + out csv probe_set "Probe Set File", + out CellTypes cell_types, + out html web_summary_cell_types "Symlink web_summary_cell_types.html", ) { call CELLRANGER_PREFLIGHT as CELLRANGER_PREFLIGHT_LOCAL( sample_def = self.sample_def, + target_set = self.target_set, chemistry = self.chemistry, reference_path = self.reference_path, feature_reference = self.feature_reference, @@ -94,6 +109,7 @@ pipeline SC_RNA_COUNTER_CS( call CELLRANGER_PREFLIGHT( sample_def = self.sample_def, + target_set = self.target_set, chemistry = self.chemistry, reference_path = self.reference_path, feature_reference = self.feature_reference, @@ -113,6 +129,20 @@ pipeline SC_RNA_COUNTER_CS( preflight = true, ) + call CELL_ANNOTATION_PREFLIGHT( + is_cr_annotate = false, + is_multi = false, + tenx_cloud_token_path = self.tenx_cloud_token_path, + cell_annotation_model = self.cell_annotation_model, + reference_path = self.reference_path, + skip_cell_annotation = self.skip_cell_annotation, + cas_track_name = null, + cr_annotate_filtered_matrix = null, + cr_annotate_sample_cloupe = null, + ) using ( + preflight = true, + ) + call WRITE_GENE_INDEX( reference_path = self.reference_path, ) @@ -130,6 +160,7 @@ pipeline SC_RNA_COUNTER_CS( }, count_input = { aligner: self.aligner, + cell_annotation_model: self.cell_annotation_model, cell_calling_config: { cell_barcodes: null, disable_ab_aggregate_detection: self.disable_ab_aggregate_detection, @@ -160,6 +191,7 @@ pipeline SC_RNA_COUNTER_CS( check_library_compatibility: self.check_library_compatibility, chemistry_specs: COPY_CHEMISTRY_SPEC.chemistry_specs, emptydrops_minimum_umis: self.emptydrops_minimum_umis, + enable_tsne: true, feature_reference: self.feature_reference, filter_probes: self.filter_probes, force_sample_barcodes: { @@ -180,17 +212,15 @@ pipeline SC_RNA_COUNTER_CS( r2_length: self.r2_length, reference_path: self.reference_path, sample_def: self.sample_def, + skip_cell_annotation: self.skip_cell_annotation, + target_set: self.target_set, + target_set_name: self.target_set_name, targeting_method: self.targeting_method, + tenx_cloud_token_path: self.tenx_cloud_token_path, tenx_cmos: null, trim_polya_min_score: self.trim_polya_min_score, trim_tso_min_score: self.trim_tso_min_score, }, - config = { - disable_count: false, - disable_multi: true, - disable_multi_count: true, - disable_vdj: true, - }, ) call FULL_COUNT_INPUTS( @@ -202,11 +232,14 @@ pipeline SC_RNA_COUNTER_CS( "fiveprime", "SC3Pv1", "SC3Pv2", - "SC3Pv3", + "SC3Pv3-polyA", + "SC3Pv3-CS1", # no longer supported, but included to allow DETECT_CHEMISTRY to produce a nice error message "SC3Pv3LT", - "SC3Pv3HT", - "SC3Pv4", + "SC3Pv3HT-polyA", + "SC3Pv3HT-CS1", + "SC3Pv4-polyA", + "SC3Pv4-CS1", "SC5P-PE", "SC5P-PE-v3", "SC5P-R2", @@ -236,7 +269,9 @@ pipeline SC_RNA_COUNTER_CS( ) call GET_AGGREGATE_BARCODES_OUT( - antibody_analysis = SC_MULTI_CORE.count_analyzer.antibody_analyzer.antibody_analysis, + antibody_analysis = SC_MULTI_CORE.count_analyzer.antibody_analyzer.antibody_analysis, + is_multi = false, + multiplexing_method = null, ) return ( @@ -257,5 +292,7 @@ pipeline SC_RNA_COUNTER_CS( target_panel = SC_MULTI_CORE.multi_gw.count.target_outs.target_panel, probe_set = SC_MULTI_CORE.multi_gw.count.target_outs.probe_set, web_summary = SC_MULTI_CORE.multi_reporter.count_summary.web_summary, + cell_types = SC_MULTI_CORE.library_cell_types, + web_summary_cell_types = SC_MULTI_CORE.library_cell_types.web_summary_cell_types, ) } diff --git a/mro/rna/sc_rna_reanalyzer_cs.mro b/mro/rna/sc_rna_reanalyzer_cs.mro index 15619d6..9b1e8d5 100644 --- a/mro/rna/sc_rna_reanalyzer_cs.mro +++ b/mro/rna/sc_rna_reanalyzer_cs.mro @@ -67,6 +67,7 @@ pipeline SC_RNA_REANALYZER_CS( cbc_realign_panorama: PARSE_PARAM_CSV.cbc_realign_panorama, cbc_sigma: PARSE_PARAM_CSV.cbc_sigma, chemistry_batch_correction: SETUP_SAMPLES.chemistry_batch_correction, + enable_tsne: true, exclude_genes: self.exclude_genes_csv, filtered_matrices_h5: self.filtered_matrices_h5, force_cells: self.force_cells, diff --git a/mro/rna/sc_vdj_aggregator.mro b/mro/rna/sc_vdj_aggregator.mro index 7a1397b..0be4d4e 100644 --- a/mro/rna/sc_vdj_aggregator.mro +++ b/mro/rna/sc_vdj_aggregator.mro @@ -58,6 +58,8 @@ pipeline ANTIGEN_AGGR( aggregate_barcodes = null, is_antibody = false, is_spatial = false, + multi_graph = null, + sample_id = null, ) using ( disabled = self.disable_antigen_aggr, ) @@ -96,7 +98,10 @@ pipeline SC_VDJ_AGGREGATOR( in map antigen_specificity_controls, in bool disable_antigen_aggr, in bool disable_count_aggr, + in bool mix_donors, + in FilterSwitch filter_switch, out pb enclone_output, + out json barcode_fate, out string receptor, out csv clonotypes, out fa donor_ref_fa, @@ -109,6 +114,7 @@ pipeline SC_VDJ_AGGREGATOR( out AntigenAggrResults antigen_analysis, out json antigen_aggr_web_summary_data, out tsv airr_rearrangement, + out html filter_summary, ) { call PROCESS_VDJ_PROTO( @@ -123,6 +129,8 @@ pipeline SC_VDJ_AGGREGATOR( ) call RUN_ENCLONE_AGGR( + mix_donors = self.mix_donors, + filter_switch = self.filter_switch, contig_ann_json_files = SETUP_VDJ_AGGR.contig_ann_json_files, enclone_input_csv = SETUP_VDJ_AGGR.enclone_input_csv, enclone_gem_well_meta = SETUP_VDJ_AGGR.enclone_gem_well_meta, @@ -130,24 +138,24 @@ pipeline SC_VDJ_AGGREGATOR( ) call WRITE_CONSENSUS_TXT( - sample_number = null, + sample_id = null, enclone_output = RUN_ENCLONE_AGGR.enclone_output, ) call WRITE_CLONOTYPE_OUTS( - sample_number = null, + sample_id = null, receptor = PROCESS_VDJ_PROTO.receptor, enclone_output = RUN_ENCLONE_AGGR.enclone_output, ) call FILL_CLONOTYPE_INFO( - sample_number = null, + sample_id = null, contig_annotations = SETUP_VDJ_AGGR.combined_ann_json, enclone_output = RUN_ENCLONE_AGGR.enclone_output, ) call WRITE_CONCAT_REF_OUTS( - sample_number = null, + sample_id = null, all_contig_annotations_json = FILL_CLONOTYPE_INFO.all_contig_annotations_json, enclone_output = RUN_ENCLONE_AGGR.enclone_output, ) @@ -198,6 +206,15 @@ pipeline SC_VDJ_AGGREGATOR( diversity_chart = CALCULATE_CLONOTYPE_DIVERSITY.plotly_diversity_chart, ) + call SUMMARIZE_VDJ_FILTERS( + sample_id = self.sample_id, + sample_description = self.sample_desc, + all_contig_annotations = FILL_CLONOTYPE_INFO.all_contig_annotations_json, + asm_filter_diagnostics = null, + enclone_barcode_fate = RUN_ENCLONE_AGGR.barcode_fate, + raw_matrix_h5 = null, + ) + call VLOUPE_PREPROCESS( pipestance_type = "SC_VDJ_AGGREGATOR", sample_id = self.sample_id, @@ -213,6 +230,7 @@ pipeline SC_VDJ_AGGREGATOR( return ( enclone_output = RUN_ENCLONE_AGGR.enclone_output, + barcode_fate = RUN_ENCLONE_AGGR.barcode_fate, receptor = PROCESS_VDJ_PROTO.receptor, clonotypes = WRITE_CLONOTYPE_OUTS.clonotypes_csv, donor_ref_fa = RUN_ENCLONE_AGGR.donor_ref_fa, @@ -225,5 +243,6 @@ pipeline SC_VDJ_AGGREGATOR( vloupe = VLOUPE_PREPROCESS.output_for_vloupe, antigen_analysis = ANTIGEN_AGGR.antigen_analysis, airr_rearrangement = CREATE_AIRR_TSV.airr_annotations, + filter_summary = SUMMARIZE_VDJ_FILTERS.filter_summary, ) } diff --git a/mro/rna/sc_vdj_assembler_cs.mro b/mro/rna/sc_vdj_assembler_cs.mro index c26ed25..1868353 100644 --- a/mro/rna/sc_vdj_assembler_cs.mro +++ b/mro/rna/sc_vdj_assembler_cs.mro @@ -106,9 +106,11 @@ pipeline SC_VDJ_ASSEMBLER_CS( }, ], config = { + disable_annotate: true, disable_count: true, disable_multi: true, disable_multi_count: true, + disable_rtl: true, disable_vdj: false, }, ) diff --git a/mro/rna/stages/aggregator/aggregator_preflight/__init__.py b/mro/rna/stages/aggregator/aggregator_preflight/__init__.py index 1554fa2..e6286a5 100644 --- a/mro/rna/stages/aggregator/aggregator_preflight/__init__.py +++ b/mro/rna/stages/aggregator/aggregator_preflight/__init__.py @@ -42,13 +42,13 @@ class AggregatorPreflightStageInputs: is_pd: bool -def incompat_msg(reason): +def incompat_msg(reason) -> str: return ( - "The datasets you are trying to aggregate were created with different {reason}s, " - "but the 'aggr' command requires identical {reason}s in order to combine datasets. " - "Please re-run the original pipeline ('count' or 'multi', as the case may be) with uniform {reason} " - "in order to aggregate these data." - ).format(reason=reason) + f"The datasets you are trying to aggregate were created with different {reason}s, " + f"but the 'aggr' command requires identical {reason}s in order to combine datasets. " + f"Please re-run the original pipeline ('count' or 'multi', as the case may be) with " + f"uniform {reason} in order to aggregate these data." + ) NORM_MODES = ["mapped", cr_constants.NORM_MODE_NONE] @@ -101,9 +101,10 @@ def convert_v2_to_v4_if_needed(filename: str, is_pd: bool) -> str: # pylint: disable=too-many-branches,too-many-statements +# ruff: noqa: PLR0915, PLR0912 def main(args: AggregatorPreflightStageInputs, _outs: None): if args.normalization_mode is not None and args.normalization_mode not in NORM_MODES: - martian.exit("Normalization mode must be one of: %s" % ", ".join(NORM_MODES)) + martian.exit("Normalization mode must be one of: {}".format(", ".join(NORM_MODES))) global_fasta_hash = None global_gtf_hash = None @@ -136,28 +137,27 @@ class GexRtlFeatureCompatibility(NamedTuple): for sample in args.sample_defs: library_id = sample[cr_constants.AGG_ID_FIELD] if len(library_id) == 0: - martian.exit("Library ID cannot be empty: %s" % sample) + martian.exit(f"Library ID cannot be empty: {sample}") if not string_is_ascii(library_id): martian.exit( - "Library ID %s contains unicode characters, only ASCII is allowed." % library_id + f"Library ID {library_id} contains unicode characters, only ASCII is allowed." ) if cr_constants.AGG_BATCH_FIELD in sample: batch_name = sample[cr_constants.AGG_BATCH_FIELD] if not string_is_ascii(batch_name): martian.exit( - "Batch ID %s contains unicode characters, only ASCII is allowed." % batch_name + f"Batch ID {batch_name} contains unicode characters, only ASCII is allowed." ) if library_id in libraries_seen: - martian.exit("Same library ID is specified on multiple rows: %s" % library_id) + martian.exit(f"Same library ID is specified on multiple rows: {library_id}") else: libraries_seen.add(library_id) if not cr_h5.is_hdf5(sample[cr_constants.AGG_H5_FIELD]): martian.exit( - "Input molecule file is not a valid HDF5 file: %s" - % sample[cr_constants.AGG_H5_FIELD] + f"Input molecule file is not a valid HDF5 file: {sample[cr_constants.AGG_H5_FIELD]}" ) mol_h5 = sample[cr_constants.AGG_H5_FIELD] converted_mol_h5 = convert_v2_to_v4_if_needed(mol_h5, args.is_pd) @@ -173,9 +173,11 @@ class GexRtlFeatureCompatibility(NamedTuple): # pre CR 7.0 there was no targeting_method metric and hybrid capture was the only targeting method targeting_method = counter.get_metric( TARGETING_METHOD_METRIC, - TARGETING_METHOD_HC - if any(counter.is_targeted_library(x) for x in library_info) - else None, + ( + TARGETING_METHOD_HC + if any(counter.is_targeted_library(x) for x in library_info) + else None + ), ) if targeting_method == TARGETING_METHOD_HC: @@ -196,7 +198,7 @@ class GexRtlFeatureCompatibility(NamedTuple): Please provide only sample molecule info files from Cellranger Multi (sample_molecule_info.h5) or molecule infos produced by Cellranger Count (molecule_info.h5)." ) - mol_fasta_hash = counter.get_metric("reference_fasta_hash") + mol_fasta_hash = counter.get_metric("reference_fasta_hash", "no-transcriptome") if global_fasta_hash is None: global_fasta_hash = mol_fasta_hash elif global_fasta_hash != mol_fasta_hash: @@ -226,12 +228,11 @@ class GexRtlFeatureCompatibility(NamedTuple): chemistry_endedness = counter.get_metric("chemistry_endedness") if chemistry_endedness is not None: observed_ends.add(chemistry_endedness) - else: + elif chemistry_name in SC3P_CHEMISTRY_NAMES: # Pre-cellranger 2.1 or so does not have chemistry_endedness, so infer based on chemistry_name - if chemistry_name in SC3P_CHEMISTRY_NAMES: - observed_ends.add(cr_constants.THREE_PRIME) - elif chemistry_name in SC5P_CHEMISTRY_NAMES: - observed_ends.add(cr_constants.FIVE_PRIME) + observed_ends.add(cr_constants.THREE_PRIME) + elif chemistry_name in SC5P_CHEMISTRY_NAMES: + observed_ends.add(cr_constants.FIVE_PRIME) # check analysis parameters analysis_parameters = counter.get_metric("analysis_parameters") @@ -256,7 +257,12 @@ class GexRtlFeatureCompatibility(NamedTuple): martian.exit( "Molecule files provided were produced with different --filter-probes settings. All samples must be run with the same --filter-probes setting." ) - + # Agg of Antibody Capture and Gene expression not allowed + if {ANTIBODY_LIBRARY_TYPE} in library_types: + if {ANTIBODY_LIBRARY_TYPE, GENE_EXPRESSION_LIBRARY_TYPE} in library_types: + martian.exit( + "Aggr with Antibody Capture and Gene Expression + Antibody Capture libraries is not supported." + ) mol_feature_ref = counter.feature_reference assert mol_feature_ref is not None if global_feature_ref is None: @@ -289,13 +295,19 @@ class GexRtlFeatureCompatibility(NamedTuple): f"Cannot aggregate file because it contains no data: {mol_h5}.\n" f" Please remove this file from the aggregation and try again." ) + if counter.get_num_filtered_barcodes() == 0: + martian.exit( + f"Cannot aggregate file because it contains no cells: {mol_h5}.\n" + f" Please remove this file from the aggregation and try again." + ) for lib_key, metrics in (counter.get_metric(cr_mol_counter.LIBRARIES_METRIC)).items(): lib_total_reads = metrics[cr_mol_counter.TOTAL_READS_METRIC] if lib_total_reads == 0: - martian.exit( - f"Library {lib_key} has zero reads in file: {mol_h5}\n" - f" Please re-run the `count` pipeline without including this gem group." + lib_type = library_info[int(lib_key)]["library_type"] + martian.log_warn( + f"Library {lib_key} ({lib_type}) has zero reads in file: {mol_h5}\n" + "Barcodes from this library will have zero UMI counts." ) # Track targeting-specific fields @@ -357,12 +369,6 @@ class GexRtlFeatureCompatibility(NamedTuple): "Aggr must only include samples run using the same target panel or probe set csv file." ) - if {ANTIBODY_LIBRARY_TYPE} in library_types: - if {ANTIBODY_LIBRARY_TYPE, GENE_EXPRESSION_LIBRARY_TYPE} in library_types: - martian.exit( - "Aggr with Antibody Capture and Gene Expression + Antibody Capture libraries is not supported." - ) - # RTL + GEX when the RTL sample has deprecated probes + both have antibody will not work unless they # both have the same probe set specified (there is already a check they are the same above) if ( @@ -372,10 +378,12 @@ class GexRtlFeatureCompatibility(NamedTuple): in gex_rtl_feature_compatibility ): martian.exit( - "Aggr of Fixed RNA Profiling and Gene Expression with Feature Barcode requires that all input analyses include the same probe-set. Please rerun the Gene Expression with Feature Barcode analyses with the same probe-set parameter as used for the Fixed RNA Profiling analyses." + "Aggr of Flex and Gene Expression with Feature Barcode requires that all input analyses include the same probe-set. Please rerun the Gene Expression with Feature Barcode analyses with the same probe-set parameter as used for the Flex analyses." ) if len(observed_ag_control_features) > 1: martian.exit( - "The datasets you are trying to aggregate have incompatible control feature ids. Please re-run the original multi pipelines with uniform [antigen-specificity] sections." + "The datasets you are trying to aggregate have incompatible control " + "feature ids. Please re-run the original multi pipelines with uniform " + "[antigen-specificity] sections." ) diff --git a/mro/rna/stages/aggregator/check_invariants/__init__.py b/mro/rna/stages/aggregator/check_invariants/__init__.py index 023912b..13dbc5d 100644 --- a/mro/rna/stages/aggregator/check_invariants/__init__.py +++ b/mro/rna/stages/aggregator/check_invariants/__init__.py @@ -49,7 +49,7 @@ def split(args): + 1 ) # 1 for buffer for storing invariant data join_args = { - "__mem_gb": int(max(matrix_mem_gb, h5_constants.MIN_MEM_GB, mol_info_mem_gb)), + "__mem_gb": 12 + int(0.8 * max(matrix_mem_gb, h5_constants.MIN_MEM_GB, mol_info_mem_gb)), } return {"chunks": [], "join": join_args} @@ -196,13 +196,12 @@ def join(args, outs, chunk_defs, chunk_outs): pass else: martian.exit(exit_message) - else: - if np.any(input_feature_counts[lib_gg] < output_feature_counts[lib_gg]): - martian.log_info( - "Feature(s) in library {}, GEM group {} have higher UMI counts " - "in aggregated output compared to inputs".format(lib_gg[0], lib_gg[1]) - ) - martian.exit(exit_message) + elif np.any(input_feature_counts[lib_gg] < output_feature_counts[lib_gg]): + martian.log_info( + f"Feature(s) in library {lib_gg[0]}, GEM group {lib_gg[1]} have higher UMI counts " + "in aggregated output compared to inputs" + ) + martian.exit(exit_message) summary = { "genomes_present": list(input_genomes), diff --git a/mro/rna/stages/aggregator/check_molecule_info_version/__init__.py b/mro/rna/stages/aggregator/check_molecule_info_version/__init__.py index 983c88c..62b446e 100644 --- a/mro/rna/stages/aggregator/check_molecule_info_version/__init__.py +++ b/mro/rna/stages/aggregator/check_molecule_info_version/__init__.py @@ -103,9 +103,9 @@ def join(args, outs, chunk_defs, chunk_outs): for feature in antigen_feature_ref.feature_defs: if feature.tags[TARGETING_ANTIGEN] == "False": if feature.tags[MHC_ALLELE] not in antigen_specificity_controls: - antigen_specificity_controls[ - feature.tags[MHC_ALLELE] - ] = feature.id + antigen_specificity_controls[feature.tags[MHC_ALLELE]] = ( + feature.id + ) else: # Each separate run has been checked to follow this assert # and we have checked that all feature references match. @@ -123,11 +123,10 @@ def join(args, outs, chunk_defs, chunk_outs): # Each separate run has been checked to follow this assert # and we have checked that all feature references match. assert antigen_specificity_controls[NO_ALLELE] == feature.id + elif MHC_ALLELE in antigen_feature_ref.all_tag_keys: + outs.beam_mode = BEAM_T else: - if MHC_ALLELE in antigen_feature_ref.all_tag_keys: - outs.beam_mode = BEAM_T - else: - outs.beam_mode = BEAM_AB + outs.beam_mode = BEAM_AB if feature_ref is not None: with open(outs.feature_reference, "w") as file_handle: feature_ref.to_csv(file_handle) @@ -142,7 +141,5 @@ def join(args, outs, chunk_defs, chunk_outs): if ncells > CBC_MAX_NCELLS: martian.exit( - "You provided {:,} cells in total, but chemistry batch correction only supports up to {:,} cells.".format( - ncells, CBC_MAX_NCELLS - ) + f"You provided {ncells:,} cells in total, but chemistry batch correction only supports up to {CBC_MAX_NCELLS:,} cells." ) diff --git a/mro/rna/stages/aggregator/normalize_depth/__init__.py b/mro/rna/stages/aggregator/normalize_depth/__init__.py index e1b19e3..70227e3 100644 --- a/mro/rna/stages/aggregator/normalize_depth/__init__.py +++ b/mro/rna/stages/aggregator/normalize_depth/__init__.py @@ -15,7 +15,6 @@ import scipy.sparse as sp_sparse import cellranger.constants as cr_constants -import cellranger.h5_constants as h5_constants import cellranger.matrix as cr_matrix import cellranger.molecule_counter as cr_mol_counter import cellranger.rna.library as rna_library @@ -57,16 +56,15 @@ TARGETED_READ_PAIRS_METRIC = "targeted_read_pairs" NUM_MOLECULE_INFO_ENTRIES_PER_CHUNK_RUST = 400000000 -# Each barcode is 44 bytes long (matching the definition in lib/rust/barcode) -MAX_BARCODE_LENGTH = 44 -def _get_min_rpc_by_lt(library_info: list[dict[str, Any]], usable_rpc: np.ndarray): - """Determine lowest depth for each library type.""" - lt_rpcs = defaultdict(lambda: array.array("d")) +def _get_non_zero_min_rpc_by_lt(library_info: list[dict[str, Any]], usable_rpc: np.ndarray): + """Determine lowest non-zero depth for each library type.""" + lt_rpcs = {lib[rna_library.LIBRARY_TYPE]: array.array("d") for lib in library_info} for lib, rpc in zip(library_info, usable_rpc): - lt_rpcs[lib[rna_library.LIBRARY_TYPE]].append(rpc) - return {lt: min(rpcs) for lt, rpcs in lt_rpcs.items()} + if rpc > 0: + lt_rpcs[lib[rna_library.LIBRARY_TYPE]].append(rpc) + return {lt: min(rpcs) if len(rpcs) else 0 for lt, rpcs in lt_rpcs.items()} def _adjust_frac_kept( @@ -138,9 +136,9 @@ def split(args): cells = mc.get_num_filtered_barcodes_for_libraries(np.arange(0, len(library_info))) - print("Libraries: %s" % library_info) - print("Usable reads: %s" % usable_reads) - print("Cells: %s" % cells) + print(f"Libraries: {library_info}") + print(f"Usable reads: {usable_reads}") + print(f"Cells: {cells}") assert len(library_info) == len(usable_reads) usable_reads = np.array(usable_reads, dtype=np.float64) @@ -152,7 +150,7 @@ def split(args): ) # Determine lowest depth for each library type - min_rpc_by_lt = _get_min_rpc_by_lt(library_info, usable_rpc) + min_rpc_by_lt = _get_non_zero_min_rpc_by_lt(library_info, usable_rpc) for lib_idx, lib in enumerate(library_info): lib_type = lib[rna_library.LIBRARY_TYPE] @@ -221,9 +219,9 @@ def split(args): # Nonetheless, it needs to load the barcodes, which can get large when many samples # are being aggregated. # WRITE_MATRICES will use the precise nnz counts to make an appropriate mem request. - join_mem_gb = max(1 + (num_barcodes * MAX_BARCODE_LENGTH) / 1e9, h5_constants.MIN_MEM_GB) - print(f"{num_barcodes=},{join_mem_gb=}") - return {"chunks": chunks, "join": {"__mem_gb": join_mem_gb, "__threads": 2}} + join_mem_gib = 1 + round(56 * num_barcodes / 1024**3, 1) + print(f"{num_barcodes=},{join_mem_gib=}") + return {"chunks": chunks, "join": {"__mem_gb": join_mem_gib, "__threads": 2}} def summarize_read_matrix(matrix, library_info, barcode_info, barcode_seqs): @@ -248,7 +246,7 @@ def summarize_read_matrix(matrix, library_info, barcode_info, barcode_seqs): genome_idx = None prefix = f"{rna_library.get_library_type_metric_prefix(lib_type)}{genome}" - summary["%s_raw_mapped_reads" % prefix] = m.sum() + summary[f"{prefix}_raw_mapped_reads"] = m.sum() filtered_bcs = MoleculeCounter.get_filtered_barcodes( barcode_info, @@ -258,7 +256,7 @@ def summarize_read_matrix(matrix, library_info, barcode_info, barcode_seqs): library_type=lib_type, ) filtered_m = m.select_barcodes_by_seq(filtered_bcs) - summary["%s_flt_mapped_reads" % prefix] = filtered_m.sum() + summary[f"{prefix}_flt_mapped_reads"] = filtered_m.sum() return summary @@ -574,7 +572,7 @@ def join(args, outs, chunk_defs, chunk_outs): genome_idx=genome_idx, library_type=lib_type, ) - summary["%s_filtered_bcs" % prefix] = len(filtered_bcs) + summary[f"{prefix}_filtered_bcs"] = len(filtered_bcs) # Merge read summary metrics read_summary = defaultdict(int) @@ -618,20 +616,28 @@ def join(args, outs, chunk_defs, chunk_outs): lib_metrics = mol_metrics[cr_mol_counter.LIBRARIES_METRIC][str(lib_idx)] raw_read_pairs = lib_metrics[cr_mol_counter.TOTAL_READS_METRIC] mapped_read_pairs = lib_metrics[cr_mol_counter.USABLE_READS_METRIC] - ds_read_pairs = lib_metrics[cr_mol_counter.DOWNSAMPLED_READS_METRIC] + # Cast string "NaN" to float("NaN") + ds_read_pairs = float(lib_metrics[cr_mol_counter.DOWNSAMPLED_READS_METRIC]) # these metrics are relatively new and might not exist in older versions of molecule info feature_reads = lib_metrics.get(cr_mol_counter.FEATURE_READS_METRIC, 0) - ds_feature_reads = lib_metrics.get(cr_mol_counter.DOWNSAMPLED_FEATURE_READS_METRIC, 0) + ds_feature_reads = float( + lib_metrics.get(cr_mol_counter.DOWNSAMPLED_FEATURE_READS_METRIC, 0) + ) total_raw_read_pairs[lib_type_idx] += raw_read_pairs - total_ds_raw_read_pairs[lib_type_idx] += ds_read_pairs + total_ds_raw_read_pairs[lib_type_idx] += ( + ds_read_pairs if not np.isnan(ds_read_pairs) else 0 + ) total_feature_read_pairs[lib_type_idx] += feature_reads - total_ds_feature_read_pairs[lib_type_idx] += ds_feature_reads + total_ds_feature_read_pairs[lib_type_idx] += ( + ds_feature_reads if not np.isnan(ds_feature_reads) else 0 + ) frac_reads_kept = summary["frac_reads_kept"][lib_idx] - min_frac_reads_kept[lib_type_idx] = min( - min_frac_reads_kept[lib_type_idx], frac_reads_kept - ) + if not frac_reads_kept is None: + min_frac_reads_kept[lib_type_idx] = min( + min_frac_reads_kept[lib_type_idx], frac_reads_kept + ) pre_norm_raw_rppc = tk_stats.robust_divide(raw_read_pairs, n_cells) pre_norm_mapped_rppc = tk_stats.robust_divide(mapped_read_pairs, n_cells) @@ -696,22 +702,18 @@ def join(args, outs, chunk_defs, chunk_outs): p = rna_library.get_library_type_metric_prefix(lib_type) summary.update( { - "%spre_normalization_total_reads" % p: total_raw_read_pairs[lib_type_idx], - "%spost_normalization_total_reads" % p: total_ds_raw_read_pairs[lib_type_idx], - "%spre_normalization_total_feature_reads" - % p: total_feature_read_pairs[lib_type_idx], - "%spost_normalization_total_feature_reads" - % p: total_ds_feature_read_pairs[lib_type_idx], - "%sfiltered_bcs_transcriptome_union" % p: total_cells[lib_type_idx], - "%spre_normalization_multi_transcriptome_total_raw_reads_per_filtered_bc" - % p: mean_rppc, - "%spost_normalization_multi_transcriptome_total_raw_reads_per_filtered_bc" - % p: ds_mean_rppc, - "%spre_normalization_multi_transcriptome_total_feature_reads_per_filtered_bc" - % p: mean_feature_reads_pc, - "%spost_normalization_multi_transcriptome_total_feature_reads_per_filtered_bc" - % p: ds_mean_feature_reads_pc, - "%slowest_frac_reads_kept" % p: min_frac_reads_kept[lib_type_idx], + f"{p}pre_normalization_total_reads": total_raw_read_pairs[lib_type_idx], + f"{p}post_normalization_total_reads": total_ds_raw_read_pairs[lib_type_idx], + f"{p}pre_normalization_total_feature_reads": total_feature_read_pairs[lib_type_idx], + f"{p}post_normalization_total_feature_reads": total_ds_feature_read_pairs[ + lib_type_idx + ], + f"{p}filtered_bcs_transcriptome_union": total_cells[lib_type_idx], + f"{p}pre_normalization_multi_transcriptome_total_raw_reads_per_filtered_bc": mean_rppc, + f"{p}post_normalization_multi_transcriptome_total_raw_reads_per_filtered_bc": ds_mean_rppc, + f"{p}pre_normalization_multi_transcriptome_total_feature_reads_per_filtered_bc": mean_feature_reads_pc, + f"{p}post_normalization_multi_transcriptome_total_feature_reads_per_filtered_bc": ds_mean_feature_reads_pc, + f"{p}lowest_frac_reads_kept": min_frac_reads_kept[lib_type_idx], } ) diff --git a/mro/rna/stages/aggregator/parse_csv/__init__.py b/mro/rna/stages/aggregator/parse_csv/__init__.py index 068068a..625856b 100644 --- a/mro/rna/stages/aggregator/parse_csv/__init__.py +++ b/mro/rna/stages/aggregator/parse_csv/__init__.py @@ -19,7 +19,9 @@ import martian import cellranger.constants as cr_constants +import cellranger.hdf5 as cr_h5 import cellranger.matrix as cr_matrix +import cellranger.molecule_counter as cr_mc import cellranger.spatial.spatial_aggr_files as sa_files __MRO__ = """ @@ -93,9 +95,7 @@ def main(args, outs): # Get the fields to check for in the csv if args.product_type not in META_PARSE_CSV_FIELDS: martian.exit( - "Product type {} for aggr not recognized. Needs to be defined in META_PARSE_CSV_FIELDS".format( - args.product_type - ) + f"Product type {args.product_type} for aggr not recognized. Needs to be defined in META_PARSE_CSV_FIELDS" ) else: field_validation = META_PARSE_CSV_FIELDS[args.product_type] @@ -113,9 +113,7 @@ def main(args, outs): if matrix_library_ids != csv_library_ids: str_csv_library_ids = ",".join([x.decode() for x in sorted(csv_library_ids)]) str_matrix_library_ids = ",".join([x.decode() for x in sorted(matrix_library_ids)]) - this_msg = "Library IDs specified in CSV ({}) do not match those contained in the input matrix ({})".format( - str_csv_library_ids, str_matrix_library_ids - ) + this_msg = f"Library IDs specified in CSV ({str_csv_library_ids}) do not match those contained in the input matrix ({str_matrix_library_ids})" martian.exit(this_msg) copy_csv(args.aggregation_csv, outs.aggregation_csv) @@ -200,9 +198,8 @@ def check_multiple_paths( pipe_relpath = Path(piperoot) / test_path if pipe_relpath.exists(): acceptable_paths.append(pipe_relpath.resolve()) - else: - if test_path.exists(): - acceptable_paths.append(test_path) + elif test_path.exists(): + acceptable_paths.append(test_path) # Now we check if we have exactly one path if len(acceptable_paths) == 1: final_path = acceptable_paths.pop() @@ -250,13 +247,12 @@ def parse_sample_sheet( Builds a sample_def list. Each row defines an input samples with validated inputs. """ if not os.path.exists(aggr_csv_path): - martian.exit("Sample sheet does not exist: %s" % aggr_csv_path) + martian.exit(f"Sample sheet does not exist: {aggr_csv_path}") if not os.access(aggr_csv_path, os.R_OK): martian.exit( - "Sample sheet is not readable, please check file permissions: %s" % aggr_csv_path + f"Sample sheet is not readable, please check file permissions: {aggr_csv_path}" ) - sample_defs: list[dict[str, str]] = [] with open(aggr_csv_path) as f: # skip comment lines @@ -267,8 +263,7 @@ def parse_sample_sheet( for field in fields: if os.path.exists(field): martian.exit( - "Your CSV header contains a path: %s\n Did you forget to include a header line?" - % field + f"Your CSV header contains a path: {field}\n Did you forget to include a header line?" ) if not field or field.isspace(): martian.exit("Your CSV header has an unnamed column, please name all columns.") @@ -283,9 +278,11 @@ def parse_sample_sheet( found_fields = [field.lower() for field in fields] for field in required_fields: if field not in found_fields: - martian.exit("Your header row is missing a required field: %s." % field) + martian.exit(f"Your header row is missing a required field: {field}.") # If we find optional fields, we now consider those as required + # NOTE: we rely below on an optional field (the 'spatial' folder with tissue positions) + # coming after the required fields (specifically the aggr h5) for field in optional_fields: if field in found_fields: required_fields.append(field) @@ -339,6 +336,17 @@ def parse_sample_sheet( martian.exit(f"Field type {field} not recognized.") # Add the value for the field in the unique checker check_unique[field].add(row[field]) + # If this is the h5 file, check whether this is a Visium HD run. + if field == cr_constants.AGG_H5_FIELD: + mol_info_fn = row[field] + if not cr_h5.is_hdf5(mol_info_fn): + martian.exit(f"Input molecule file is not a valid HDF5 file: {mol_info_fn}") + with cr_mc.MoleculeCounter.open(mol_info_fn, "r") as mol_info: + is_visium_hd = mol_info.get_visium_hd_slide_name() is not None + if is_visium_hd: + martian.exit( + f"Visium HD runs, such as in row {i+1} of your CSV, are not currently supported by spaceranger aggr." + ) if AGG_SAMPLE_ID_FIELD in row: row[cr_constants.AGG_ID_FIELD] = row.pop(AGG_SAMPLE_ID_FIELD) diff --git a/mro/rna/stages/aggregator/summarize_aggregated_reports/__init__.py b/mro/rna/stages/aggregator/summarize_aggregated_reports/__init__.py index 222936f..c2154d5 100644 --- a/mro/rna/stages/aggregator/summarize_aggregated_reports/__init__.py +++ b/mro/rna/stages/aggregator/summarize_aggregated_reports/__init__.py @@ -9,6 +9,7 @@ import cellranger.h5_constants as h5_constants import cellranger.matrix as cr_matrix import cellranger.websummary.sample_properties as wsp +from cellranger.analysis.singlegenome import TSNE_NAME, UMAP_NAME from cellranger.websummary.aggr_websummary_builder import ( build_web_summary_data_aggr, build_web_summary_html_aggr, @@ -29,6 +30,7 @@ in json antibody_treemap, in json crispr_analysis_metrics, in string product_type, + in bool skip_tsne, out json summary, out html web_summary, out json web_summary_data, @@ -92,12 +94,15 @@ def join(args, outs, _chunk_defs, _chunk_outs): # Call the websummary builder. gg_id_to_name = {int(id): name[0] for id, name in args.gem_group_index.items()} + projection = UMAP_NAME if args.skip_tsne else TSNE_NAME + build_web_summary_html_aggr( filename=outs.web_summary, sample_properties=sample_properties, gg_id_to_name_map=gg_id_to_name, sample_data_paths=sample_data_paths, sample_defs=args.sample_defs, + projection=projection, ) # Do it again because ReactComponentEncoder transforms and deletes data while encoding @@ -106,6 +111,7 @@ def join(args, outs, _chunk_defs, _chunk_outs): gg_id_to_name_map=gg_id_to_name, sample_data_paths=sample_data_paths, sample_defs=args.sample_defs, + projection=projection, ) with open(outs.web_summary_data, "w") as f: json.dump(ws_data, f, indent=4, cls=ReactComponentEncoder) diff --git a/mro/rna/stages/aggregator/write_matrices/__init__.py b/mro/rna/stages/aggregator/write_matrices/__init__.py index a7c6444..2b85abd 100644 --- a/mro/rna/stages/aggregator/write_matrices/__init__.py +++ b/mro/rna/stages/aggregator/write_matrices/__init__.py @@ -47,28 +47,23 @@ def split(args): with MoleculeCounter.open(args.molecules, "r") as mc: - num_barcodes = mc.get_ref_column_lazy("barcodes").shape[0] + num_barcodes = mc.get_barcode_list_size() # Worst case number of nonzero elements in final matrix if args.is_pd: num_nonzero = args.raw_nnz else: num_nonzero = args.filtered_nnz - join_mem_gb = CountMatrix.get_mem_gb_from_matrix_dim(num_barcodes, num_nonzero) - + mem_gib = 3 + CountMatrix.get_mem_gb_from_matrix_dim(num_barcodes, num_nonzero, scale=1.41) + print(f"{args.raw_nnz=},{args.filtered_nnz=},{num_nonzero=},{num_barcodes=},{mem_gib=}") return { "chunks": [], - "join": {"__mem_gb": join_mem_gb, "__threads": 2}, + "join": {"__mem_gb": mem_gib}, } -def main(args, outs): - raise NotImplementedError() - - def join(args, outs, chunk_defs, chunk_outs): version = martian.get_pipelines_version() - with open(args.summary) as f: summary = json.load(f) @@ -90,24 +85,38 @@ def join(args, outs, chunk_defs, chunk_outs): # track original library/gem info library_map = cr_matrix.make_library_map_aggr(args.gem_group_index) extra_attrs.update(library_map) + sw_version = martian.get_pipelines_version() # Merge raw matrix for PD purposes if args.is_pd: - raw_matrix = cr_matrix.merge_matrices(args.raw_matrices_h5) + martian.log_info("Starting to merge raw matrices.") + cr_matrix.create_merged_matrix_from_col_concat( + args.raw_matrices_h5, outs.raw_matrix_h5, extra_attrs, sw_version + ) if is_antibody_only: + raw_matrix = cr_matrix.CountMatrix.load_h5_file(outs.raw_matrix_h5) raw_matrix = raw_matrix.select_features_by_type(rna_library.ANTIBODY_LIBRARY_TYPE) - raw_matrix.save_h5_file( - outs.raw_matrix_h5, extra_attrs=extra_attrs, sw_version=martian.get_pipelines_version() - ) - del raw_matrix + raw_matrix.save_h5_file( + outs.raw_matrix_h5, + extra_attrs=extra_attrs, + sw_version=sw_version, + ) + del raw_matrix + martian.log_info("Finished merging raw matrices.") # Merge filtered matrix - filt_mat = cr_matrix.merge_matrices(args.filtered_matrices_h5) + cr_matrix.create_merged_matrix_from_col_concat( + args.filtered_matrices_h5, outs.filtered_matrix_h5, extra_attrs, sw_version + ) + filt_mat = cr_matrix.CountMatrix.load_h5_file(outs.filtered_matrix_h5) if is_antibody_only: filt_mat = filt_mat.select_features_by_type(rna_library.ANTIBODY_LIBRARY_TYPE) - filt_mat.save_h5_file( - outs.filtered_matrix_h5, extra_attrs=extra_attrs, sw_version=martian.get_pipelines_version() - ) + filt_mat.save_h5_file( + outs.filtered_matrix_h5, + extra_attrs=extra_attrs, + sw_version=martian.get_pipelines_version(), + ) + martian.log_info("Finished merging filtered matrices.") # Summarize the matrix across library types and genomes for lib_type in lib_types: @@ -153,6 +162,7 @@ def join(args, outs, chunk_defs, chunk_outs): summary[ "{}{}_filtered_bcs_conf_mapped_barcoded_reads_cum_frac".format(*prefixes) ] = frac_reads_in_cells + martian.log_info("Finished collecting metrics") summary.update( { @@ -174,9 +184,13 @@ def join(args, outs, chunk_defs, chunk_outs): summary[ f"{libtype_prefix}{rna_library.MULTI_REFS_PREFIX}_filtered_bcs_conf_mapped_barcoded_reads_cum_frac" ] = frac_reads_in_cells - - # Write MEX format (do it last because it converts the matrices to COO) - rna_matrix.save_mex(filt_mat, outs.filtered_matrix_mex, version) + if args.is_pd: + outs.filtered_matrix_mex = None + else: + martian.log_info("Writing MEX File") + # Write MEX format (do it last because it converts the matrices to COO) + rna_matrix.save_mex(filt_mat, outs.filtered_matrix_mex, version) + martian.log_info("Finished writing MEX file") with open(outs.summary, "w") as f: tk_safe_json.dump_numpy(summary, f, indent=4, sort_keys=True) diff --git a/mro/rna/stages/analyzer/analyzer_preflight/__init__.py b/mro/rna/stages/analyzer/analyzer_preflight/__init__.py index 8a60748..c865cc4 100644 --- a/mro/rna/stages/analyzer/analyzer_preflight/__init__.py +++ b/mro/rna/stages/analyzer/analyzer_preflight/__init__.py @@ -79,7 +79,7 @@ def main(args, outs): return if not (args.filtered_matrices_h5 and os.path.exists(args.filtered_matrices_h5)): - martian.exit("Filtered matrix does not exist: %s" % args.filtered_matrices_h5) + martian.exit(f"Filtered matrix does not exist: {args.filtered_matrices_h5}") flt_matrix_dims = cr_matrix.CountMatrix.load_dims_from_h5(args.filtered_matrices_h5) flt_genomes = cr_matrix.CountMatrix.get_genomes_from_h5(args.filtered_matrices_h5) @@ -262,8 +262,7 @@ def main(args, outs): if not os.access(args.filtered_matrices_h5, os.R_OK): martian.exit( - "Filtered matrix file is not readable, please check file permissions: %s" - % args.filtered_matrices_h5 + f"Filtered matrix file is not readable, please check file permissions: {args.filtered_matrices_h5}" ) outs.skip = False @@ -288,5 +287,5 @@ def validate_csv(csv_file, entry_type, entry_colname): ) counts = sum(1 for line in f) # count remaining lines if counts == 0: - martian.exit("Specified %s file must contain at least one entry." % entry_type) + martian.exit(f"Specified {entry_type} file must contain at least one entry.") return counts diff --git a/mro/rna/stages/analyzer/combine_clustering/__init__.py b/mro/rna/stages/analyzer/combine_clustering/__init__.py index b71cc73..689c0eb 100644 --- a/mro/rna/stages/analyzer/combine_clustering/__init__.py +++ b/mro/rna/stages/analyzer/combine_clustering/__init__.py @@ -27,20 +27,18 @@ """ -def copy_subdirs(src_dir, dest_dir): - for subdir in os.listdir(src_dir): +def hardlink_files_in_dir(src_dir, dest_dir): + """Hardlink all files in src_dir to dest_dir.""" + for filename in os.listdir(src_dir): cr_io.hardlink_with_fallback( - os.path.join(src_dir, subdir), - os.path.join(dest_dir, subdir), + os.path.join(src_dir, filename), + os.path.join(dest_dir, filename), ) def main(args, outs): - list_of_hdfs = [args.kmeans_h5, args.graphclust_h5] - if args.hclust_h5: - list_of_hdfs.append(args.hclust_h5) analysis_io.combine_h5_files( - list_of_hdfs, + [x for x in (args.kmeans_h5, args.graphclust_h5, args.hclust_h5) if x is not None], outs.clustering_h5, [ analysis_constants.ANALYSIS_H5_KMEANS_GROUP, @@ -48,9 +46,7 @@ def main(args, outs): ], ) - csv_path = os.path.join(outs.clustering_csv) - os.makedirs(csv_path, exist_ok=True) - copy_subdirs(args.kmeans_csv, csv_path) - copy_subdirs(args.graphclust_csv, csv_path) - if args.hclust_csv: - copy_subdirs(args.hclust_csv, csv_path) + os.makedirs(outs.clustering_csv, exist_ok=True) + for csv_directory in [args.kmeans_csv, args.graphclust_csv, args.hclust_csv]: + if csv_directory is not None: + hardlink_files_in_dir(csv_directory, outs.clustering_csv) diff --git a/mro/rna/stages/analyzer/correct_chemistry_batch/__init__.py b/mro/rna/stages/analyzer/correct_chemistry_batch/__init__.py index d3ca62b..5e07b70 100644 --- a/mro/rna/stages/analyzer/correct_chemistry_batch/__init__.py +++ b/mro/rna/stages/analyzer/correct_chemistry_batch/__init__.py @@ -300,9 +300,8 @@ def join(args, outs, chunk_defs, chunk_outs): if batch_id_to_alignment_count[i] > 3 and batch_id_to_alignment_count[j] > 3: continue # re-align within panorama is disable - else: - if panorama_idx_i == panorama_idx_j: - continue + elif panorama_idx_i == panorama_idx_j: + continue # use the panorama with the larger shape as reference panorama_i_size = sum( diff --git a/mro/rna/stages/analyzer/merge_clusters/__init__.py b/mro/rna/stages/analyzer/merge_clusters/__init__.py deleted file mode 100644 index 4b36a3e..0000000 --- a/mro/rna/stages/analyzer/merge_clusters/__init__.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2017 10X Genomics, Inc. All rights reserved. -# -# Merge similar clusters produced by graph-clustering - -import resource -import sys - -import numpy as np -import pandas as pd -from scipy.cluster.hierarchy import linkage - -import cellranger.analysis.clustering as cr_clustering -import cellranger.analysis.graphclust as cr_graphclust -import cellranger.analysis.io as analysis_io -from cellranger.analysis.diffexp import ( - compute_sseq_params, - sseq_differential_expression, -) -from cellranger.analysis.pca import load_pca_from_h5 -from cellranger.analysis.singlegenome import SingleGenomeAnalysis -from cellranger.matrix import CountMatrix - -__MRO__ = """ -stage MERGE_CLUSTERS( - in h5 matrix_h5, - in h5 pca_h5, - in h5 clusters_h5, - out h5 clusters_h5, - out path clusters_csv, - src py "stages/analyzer/merge_clusters", -) split using ( -) -""" - -# Adjusted p-value threshold for calling genes DE -MERGE_CLUSTERS_DE_ADJ_P_THRESHOLD = 0.05 - -# Do not merge cluster pairs if they have enough DE genes -MIN_DE_GENES = 1 - - -def split(args): - matrix_mem_gb = CountMatrix.get_mem_gb_from_matrix_h5(args.matrix_h5) - return { - "chunks": [{"__mem_gb": 1}], - "join": { - "__mem_gb": max(6, matrix_mem_gb), - }, - } - - -def main(args, outs): - pass - - -def join(args, outs, chunk_defs, chunk_outs): - np.random.seed(0) - - # Load the matrix - mat = CountMatrix.load_h5_file(args.matrix_h5) - print(mat.m.shape, mat.m.nnz) - - barcodes = mat.bcs - - # Load graph-based clustering from analysis H5 - clustering_key = cr_clustering.format_clustering_key(cr_clustering.CLUSTER_TYPE_GRAPHCLUST, 0) - clustering = SingleGenomeAnalysis.load_clustering_from_h5(args.clusters_h5, clustering_key) - labels = clustering.clusters - - # Clusters that were 0 were unused in the clustering analysis (only relevant if the cluster stage was run by itself) - total_bcs = len(labels) - use_bcs = np.flatnonzero(labels > 0) - expr_mat = mat.m[:, use_bcs] - - # Make cluster labels 0-based - labels = labels[use_bcs] - 1 - - # Convert PCA coords to dataframe - pca = load_pca_from_h5(args.pca_h5)[0].transformed_pca_matrix - assert pca.shape[0] == len(use_bcs) - pca = pca[use_bcs, :] - pca_df = pd.DataFrame(pca) - print(pca_df.shape) - - # 1) Run hierarchical clustering on cluster medoids in PCA-space - # 2) For each pair of clusters that are sibling leaves, - # 3) Run a differential expression analysis - # 4) Merge the clusters if not enough genes are differentially expressed - # 5) If merged, stop considering cluster-pairs and goto 1) - - # Cache already-checked cluster-pairs - # set of (frozenset, frozenset) - checked_cluster_pairs = set() - - while True: - print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss) - sys.stdout.flush() - if len(np.bincount(labels)) == 1: - # One cluster remains - break - - # Compute medoids, perform hierarchical clustering - pca_df["cluster"] = labels - medoids = pca_df.groupby("cluster").apply(lambda x: x.median(axis=0)).to_numpy()[:, :-1] - hc = linkage(medoids, "complete") - max_label = np.max(labels) - - print(np.bincount(labels)) - print("max=%d" % max_label) - - any_merged = False - for step in range(hc.shape[0]): - if hc[step, 0] <= max_label and hc[step, 1] <= max_label: - leaf0, leaf1 = hc[step, 0], hc[step, 1] - - group0 = np.flatnonzero(labels == leaf0) - group1 = np.flatnonzero(labels == leaf1) - - # Skip this cluster pair if already checked - set0 = frozenset(group0) - set1 = frozenset(group1) - cluster_pair = tuple(sorted([set0, set1])) - if cluster_pair in checked_cluster_pairs: - continue - checked_cluster_pairs.add(cluster_pair) - - print(f"Comparing clusters ({1 + leaf0},{1 + leaf1})") - submat = expr_mat[:, np.concatenate((group0, group1))] - - print(f"\tComputing params on {submat.shape} matrix") - params = compute_sseq_params(submat) - - print(f"\tRunning DE on {len(group0)} vs {len(group1)} cells") - group0_submat = np.arange(len(group0)) - group1_submat = np.arange(len(group0), len(group0) + len(group1)) - de_result = sseq_differential_expression( - submat, group0_submat, group1_submat, params - ) - - n_de_genes = np.sum(de_result.adjusted_p_value < MERGE_CLUSTERS_DE_ADJ_P_THRESHOLD) - if n_de_genes == 0: - print( - f"\tFound {n_de_genes} DE genes. Merging clusters ({1 + leaf0},{1 + leaf1})" - ) - # Relabel as the smaller-index cluster - labels[labels == leaf1] = leaf0 - - # Shift all labels above old label down - labels[labels > leaf1] = labels[labels > leaf1] - 1 - - any_merged = True - break - - sys.stdout.flush() - - if not any_merged: - break - - # Convert back to one-based cluster labels - labels += 1 - - labels = cr_clustering.relabel_by_size(labels) - - # Convert back into original bc space, with 0s for unused bcs - final_labels = np.zeros(total_bcs, dtype=int) - final_labels[use_bcs] = labels - - # Save results - with analysis_io.open_h5_for_writing(outs.clusters_h5) as f: - cr_graphclust.save_graphclust_h5(f, final_labels) - - clustering_key = cr_clustering.format_clustering_key(cr_clustering.CLUSTER_TYPE_GRAPHCLUST, 0) - - cr_clustering.save_clustering_csv(outs.clusters_csv, clustering_key, final_labels, barcodes) diff --git a/mro/rna/stages/analyzer/parse_csv/__init__.py b/mro/rna/stages/analyzer/parse_csv/__init__.py index 10117c7..845ed19 100644 --- a/mro/rna/stages/analyzer/parse_csv/__init__.py +++ b/mro/rna/stages/analyzer/parse_csv/__init__.py @@ -89,12 +89,10 @@ def parse_parameters(filename): return {} if not os.path.exists(filename): - martian.exit("Parameters file does not exist: %s" % filename) + martian.exit(f"Parameters file does not exist: {filename}") if not os.access(filename, os.R_OK): - martian.exit( - "Parameters file is not readable, please check file permissions: %s" % filename - ) + martian.exit(f"Parameters file is not readable, please check file permissions: {filename}") params = {} with open(filename) as f: @@ -106,9 +104,9 @@ def parse_parameters(filename): name = row[0].strip().lower() value = row[1].strip() if name not in ANALYSIS_PARAMS: - martian.exit("Unrecognized parameter: %s" % name) + martian.exit(f"Unrecognized parameter: {name}") if name in params: - martian.exit("Cannot specify the same parameter twice: %s" % name) + martian.exit(f"Cannot specify the same parameter twice: {name}") required_type = ANALYSIS_PARAMS[name] try: if required_type == bool: @@ -119,9 +117,7 @@ def parse_parameters(filename): elif value == "false": value = 0 else: - msg = ("Parameter {} must be set to 'true' or 'false', not {}.").format( - name, org_value - ) + msg = f"Parameter {name} must be set to 'true' or 'false', not {org_value}." martian.exit(msg) cast_value = required_type(value) params[name] = cast_value diff --git a/mro/rna/stages/analyzer/post_pca/__init__.py b/mro/rna/stages/analyzer/post_pca/__init__.py index a9d4f9d..d8acd54 100644 --- a/mro/rna/stages/analyzer/post_pca/__init__.py +++ b/mro/rna/stages/analyzer/post_pca/__init__.py @@ -6,7 +6,7 @@ files """ - +import math import pickle import martian @@ -31,7 +31,14 @@ def split(args): - return {"chunks": [], "join": {"__mem_gb": args.mem_gb}} + mem_needed = math.ceil(3 + args.mem_gb * 0.14) + return { + "chunks": [], + "join": { + "__mem_gb": mem_needed, + "__vmem_gb": mem_needed + 10, + }, + } def join(args, outs, chunk_defs, chunk_outs): diff --git a/mro/rna/stages/analyzer/preprocess_matrix/__init__.py b/mro/rna/stages/analyzer/preprocess_matrix/__init__.py index f1d1d74..cae071e 100644 --- a/mro/rna/stages/analyzer/preprocess_matrix/__init__.py +++ b/mro/rna/stages/analyzer/preprocess_matrix/__init__.py @@ -31,6 +31,7 @@ in bool disable_run_pca, in bool disable_correct_chemistry_batch, in bool skip_multigenome_analysis, + in bool enable_tsne, out bool skip_antibody_analysis, out bool skip_antigen_analysis, out h5 cloupe_matrix_h5, @@ -130,16 +131,14 @@ def split(args): return {"chunks": [], "join": {"__mem_gb": max(matrix_mem_gb, h5_constants.MIN_MEM_GB)}} -def main(args, outs): - pass - - def join(args, outs, chunk_defs, chunk_outs): outs.skip = args.skip - outs.skip_tsne = outs.skip or args.is_visium_hd - outs.disable_hierarchical_clustering = outs.skip or not args.is_visium_hd or not args.is_pd + outs.skip_tsne = (not args.enable_tsne) or outs.skip or args.is_visium_hd outs.is_antibody_only = args.is_antibody_only outs.disable_run_pca = args.disable_run_pca + outs.disable_hierarchical_clustering = ( + outs.skip or not args.is_visium_hd or args.disable_run_pca or not args.is_pd + ) outs.disable_correct_chemistry_batch = args.disable_correct_chemistry_batch outs.skip_multigenome_analysis = args.skip_multigenome_analysis outs.skip_antibody_analysis = False @@ -232,6 +231,7 @@ def join(args, outs, chunk_defs, chunk_outs): outs.disable_run_pca = True outs.disable_correct_chemistry_batch = True outs.skip_multigenome_analysis = True + outs.disable_hierarchical_clustering = True return feature_cnts = matrix.get_count_of_feature_types() @@ -254,5 +254,6 @@ def join(args, outs, chunk_defs, chunk_outs): ) outs.skip = True outs.disable_run_pca = True + outs.disable_hierarchical_clustering = True outs.disable_correct_chemistry_batch = True outs.skip_multigenome_analysis = True diff --git a/mro/rna/stages/analyzer/reanalyze_verify_sample_ids/__init__.py b/mro/rna/stages/analyzer/reanalyze_verify_sample_ids/__init__.py index 09bd813..ad21942 100644 --- a/mro/rna/stages/analyzer/reanalyze_verify_sample_ids/__init__.py +++ b/mro/rna/stages/analyzer/reanalyze_verify_sample_ids/__init__.py @@ -40,9 +40,7 @@ def main(args, outs): if matrix_library_ids != csv_library_ids: str_csv_library_ids = ",".join([ensure_str(x) for x in sorted(csv_library_ids)]) str_matrix_library_ids = ",".join([ensure_str(x) for x in sorted(matrix_library_ids)]) - this_msg = "Sample IDs specified in CSV ({}) do not match those contained in the input matrix ({})".format( - str_csv_library_ids, str_matrix_library_ids - ) + this_msg = f"Sample IDs specified in CSV ({str_csv_library_ids}) do not match those contained in the input matrix ({str_matrix_library_ids})" martian.exit(this_msg) # output the sample defs so we can ensure downstream stages execute after this one diff --git a/mro/rna/stages/analyzer/reanalyzer_preflight/__init__.py b/mro/rna/stages/analyzer/reanalyzer_preflight/__init__.py index 45a8b23..0f9cd48 100644 --- a/mro/rna/stages/analyzer/reanalyzer_preflight/__init__.py +++ b/mro/rna/stages/analyzer/reanalyzer_preflight/__init__.py @@ -22,17 +22,16 @@ def main(args, outs): if not (args.filtered_matrices_h5 and os.path.exists(args.filtered_matrices_h5)): - martian.exit("Filtered matrices do not exist: %s" % args.filtered_matrices_h5) + martian.exit(f"Filtered matrices do not exist: {args.filtered_matrices_h5}") if not os.access(args.filtered_matrices_h5, os.R_OK): martian.exit( - "Filtered matrices file is not readable, please check file permissions: %s" - % args.filtered_matrices_h5 + f"Filtered matrices file is not readable, please check file permissions: {args.filtered_matrices_h5}" ) h5_filetype = cr_h5.get_h5_filetype(args.filtered_matrices_h5) if h5_filetype and h5_filetype != cr_matrix.MATRIX_H5_FILETYPE: - martian.exit("Input is a %s file, but a matrix file is required" % h5_filetype) + martian.exit(f"Input is a {h5_filetype} file, but a matrix file is required") h5_version = cr_matrix.CountMatrix.get_format_version_from_h5(args.filtered_matrices_h5) if h5_version > cr_matrix.MATRIX_H5_VERSION: @@ -52,7 +51,7 @@ def main(args, outs): if len(flt_genomes) > 1: martian.exit( - "Reanalyzer only supports matrices with one genome. This matrix has: %s" % flt_genomes + f"Reanalyzer only supports matrices with one genome. This matrix has: {flt_genomes}" ) if len(flt_genomes) == 0: martian.log_info("Only Antibody Capture library detected") diff --git a/mro/rna/stages/analyzer/run_graph_clustering/__init__.py b/mro/rna/stages/analyzer/run_graph_clustering/__init__.py deleted file mode 100644 index 45325c8..0000000 --- a/mro/rna/stages/analyzer/run_graph_clustering/__init__.py +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2017 10X Genomics, Inc. All rights reserved. -# -import sys - -import martian -import numpy as np - -import cellranger.analysis.clustering as cr_clustering -import cellranger.analysis.constants as analysis_constants -import cellranger.analysis.graphclust as cr_graphclust -import cellranger.analysis.io as analysis_io -import cellranger.h5_constants as h5_constants -from cellranger.analysis.pca import load_pca_from_h5 -from cellranger.analysis.singlegenome import SingleGenomeAnalysis -from cellranger.logperf import LogPerf - -__MRO__ = """ -stage RUN_GRAPH_CLUSTERING( - in h5 matrix_h5, - in h5 pca_h5, - in int num_neighbors "Use this many neighbors", - in float neighbor_a "Use larger of (a+b*log10(n_cells) neighbors or num_neighbors", - in float neighbor_b "Use larger of (a+b*log10(n_cells) neighbors or num_neighbors", - in int num_bcs "Use this many cell-barcodes in clustering", - in int input_pcs "Use top N PCs", - in int balltree_leaf_size, - in string similarity_type "Type of similarity to use (nn or snn)", - in int random_seed "Seed for random number generator", - out h5 chunked_neighbors, - out h5 clusters_h5, - out path clusters_csv, - src py "stages/analyzer/run_graph_clustering", -) split using ( - in pickle neighbor_index, - in h5 submatrix, - in int row_start, - in int total_rows, - in int k_nearest, - in h5 use_bcs, -) -""" - -# 1e6 cells => ~64 chunks -NN_QUERIES_PER_CHUNK = 15000 - -DEFAULT_BALLTREE_LEAFSIZE = 40 - -# Memory usage in join, empirically determined -NN_ENTRIES_PER_MEM_GB = 5000000 - -# Unweighted nearest neighbor (boolean: is-nearest-neighbor) -NN_SIMILARITY = "nn" - -# Shared nearest neighbor (fraction of neighbors shared) -SNN_SIMILARITY = "snn" - -SIMILARITY_TYPES = [NN_SIMILARITY, SNN_SIMILARITY] - - -# TODO: Martian needs to provide a way to give split more memory. -# Workaround is mrp --overrides -def split(args): - np.random.seed(0) - - if args.similarity_type not in SIMILARITY_TYPES: - martian.exit( - "Unsupported similarity type: {}. Must be one of: {}".format( - args.similarity_type, ",".join(SIMILARITY_TYPES) - ) - ) - - with LogPerf("load"): - pca_mat = load_pca_from_h5(args.pca_h5)[0].transformed_pca_matrix - - # Subselect barcodes if desired - if args.num_bcs is None: - use_bcs = np.arange(pca_mat.shape[0]) - else: - use_bcs = np.random.choice(pca_mat.shape[0], args.num_bcs, replace=False) - pca_mat = pca_mat[use_bcs, :] - - # Record indices of selected barcodes - use_bcs_path = martian.make_path("use_bcs.h5") - cr_graphclust.save_ndarray_h5(use_bcs, use_bcs_path, "use_bcs") - - # Subselect PCs if desired - if args.input_pcs is not None: - n_pcs = min(pca_mat.shape[1], args.input_pcs) - pca_mat = pca_mat[:, np.arange(n_pcs)] - - # Build the nearest neighbor query index - with LogPerf("nn_build"): - balltree = cr_graphclust.build_neighbor_index( - pca_mat, args.balltree_leaf_size or DEFAULT_BALLTREE_LEAFSIZE - ) - neighbor_index = martian.make_path("neighbor_index.pickle") - cr_graphclust.save_neighbor_index(balltree, neighbor_index) - - # Compute the actual number of nearest neighbors we'll use - given_num_neighbors = ( - args.num_neighbors - if args.num_neighbors is not None - else analysis_constants.GRAPHCLUST_NEIGHBORS_DEFAULT - ) - given_neighbor_a = ( - args.neighbor_a - if args.neighbor_a is not None - else analysis_constants.GRAPHCLUST_NEIGHBOR_A_DEFAULT - ) - given_neighbor_b = ( - args.neighbor_b - if args.neighbor_b is not None - else analysis_constants.GRAPHCLUST_NEIGHBOR_B_DEFAULT - ) - - # Take max of {num_neighbors, a + b*log10(n)} - use_neighbors = int( - max( - given_num_neighbors, - np.round(given_neighbor_a + given_neighbor_b * np.log10(len(use_bcs))), - ) - ) - - # Clamp to [1, n - 1] - num_neighbors = max(1, min(use_neighbors, len(use_bcs) - 1)) - print("Using %d neighbors" % num_neighbors) - - # Divide the PCA matrix up into rows for NN queries - with LogPerf("chunk_pca"): - chunks = [] - for row_start in range(0, pca_mat.shape[0], NN_QUERIES_PER_CHUNK): - row_end = min(row_start + NN_QUERIES_PER_CHUNK, pca_mat.shape[0]) - - # Write the pca submatrix to an h5 file - submatrix_path = martian.make_path("%d_submatrix.h5" % row_start) - cr_graphclust.save_ndarray_h5( - pca_mat[row_start:row_end, :], submatrix_path, "submatrix" - ) - - chunks.append( - { - "neighbor_index": neighbor_index, - "submatrix": submatrix_path, - "row_start": row_start, - "total_rows": pca_mat.shape[0], - "k_nearest": num_neighbors, - "use_bcs": use_bcs_path, - } - ) - - join_mem_gb = ( - 64 - if args.similarity_type == SNN_SIMILARITY - # Scale memory with size of nearest-neighbor adjacency matrix - else max( - h5_constants.MIN_MEM_GB, - int(np.ceil((num_neighbors * len(use_bcs)) / NN_ENTRIES_PER_MEM_GB)), - ) - ) - return { - "chunks": chunks, - "join": { - "__mem_gb": join_mem_gb, - }, - } - - -def main(args, outs): - np.random.seed(0) - - with LogPerf("submatrix_load"): - submatrix = cr_graphclust.load_ndarray_h5(args.submatrix, "submatrix") - - with LogPerf("nn_idx_load"): - balltree = cr_graphclust.load_neighbor_index(args.neighbor_index) - - with LogPerf("nn_query"): - nn_matrix = cr_graphclust.compute_nearest_neighbors( - submatrix, balltree, args.k_nearest, args.row_start - ) - cr_graphclust.write_nearest_neighbors(nn_matrix, outs.chunked_neighbors) - - -def join(args, outs, chunk_defs, chunk_outs): - # Merge the neighbor matrices - with LogPerf("merge_nn"): - nn = cr_graphclust.merge_nearest_neighbors( - [chunk.chunked_neighbors for chunk in chunk_outs], chunk_defs[0].total_rows - ) - print("nn\tnn_nodes\t%0.4f" % nn.shape[0]) - print("nn\tnn_links\t%0.4f" % nn.nnz) - print("nn\tnn_density\t%0.4f" % cr_graphclust.matrix_density(nn)) - sys.stdout.flush() - - matrix_bin = martian.make_path("matrix.bin") - matrix_weights = martian.make_path("matrix.weights") - louvain_out = martian.make_path("louvain.out") - - if args.similarity_type == "snn": - snn = cr_graphclust.compute_snn_matrix(nn, chunk_defs[0].k_nearest) - - print("snn\tsnn_nodes\t%d" % snn.shape[0]) - print("snn\tsnn_links\t%d" % (snn.nnz // 2)) - print("snn\tsnn_density\t%0.4f" % ((snn.nnz) / float(snn.shape[0] * (snn.shape[0] - 1)))) - sys.stdout.flush() - - with LogPerf("convert"): - cr_graphclust.pipe_weighted_edgelist_to_convert(snn, matrix_bin, matrix_weights) - - with LogPerf("louvain"): - cr_graphclust.run_louvain_weighted_clustering( - matrix_bin, matrix_weights, louvain_out, seed=args.random_seed - ) - - else: - with LogPerf("tocoo"): - nn = nn.tocoo(copy=False) - - with LogPerf("convert"): - cr_graphclust.pipe_unweighted_edgelist_to_convert(nn, matrix_bin) - - with LogPerf("louvain"): - cr_graphclust.run_louvain_unweighted_clustering( - matrix_bin, louvain_out, seed=args.random_seed - ) - - with LogPerf("load_bcs"): - barcodes = SingleGenomeAnalysis.load_bcs_from_matrix_h5(args.matrix_h5) - - use_bcs = cr_graphclust.load_ndarray_h5(chunk_defs[0].use_bcs, "use_bcs") - - labels = cr_graphclust.load_louvain_results(len(barcodes), use_bcs, louvain_out) - - labels = cr_clustering.relabel_by_size(labels) - - # Save cluster results - with analysis_io.open_h5_for_writing(outs.clusters_h5) as f: - cr_graphclust.save_graphclust_h5(f, labels) - - clustering_key = cr_clustering.format_clustering_key(cr_clustering.CLUSTER_TYPE_GRAPHCLUST, 0) - - cr_clustering.save_clustering_csv(outs.clusters_csv, clustering_key, labels, barcodes) - - outs.chunked_neighbors = None diff --git a/mro/rna/stages/analyzer/run_kmeans/__init__.py b/mro/rna/stages/analyzer/run_kmeans/__init__.py index e064204..4c1befc 100644 --- a/mro/rna/stages/analyzer/run_kmeans/__init__.py +++ b/mro/rna/stages/analyzer/run_kmeans/__init__.py @@ -11,103 +11,91 @@ import cellranger.analysis.kmeans as cr_kmeans import cellranger.analysis.pca as cr_pca import cellranger.cr_io as cr_io -import cellranger.h5_constants as h5_constants -import cellranger.matrix as cr_matrix import cellranger.rna.library as rna_library +from cellranger.matrix import CountMatrix __MRO__ = """ stage RUN_KMEANS( - in h5 matrix_h5, - in h5 pca_h5, - in int random_seed, - in int max_clusters, - in int num_bcs, - in int num_pcs, - out h5 kmeans_h5, - out path kmeans_csv, - src py "stages/analyzer/run_kmeans", -) split using ( - in int n_clusters, - in string library, + in h5 matrix_h5, + in h5 pca_h5, + in int random_seed, + in int max_clusters, + in int num_bcs, + in int num_pcs, + out h5 kmeans_h5, + out path kmeans_csv, + src py "stages/analyzer/run_kmeans", +) split ( + in int n_clusters, + in string library, + in int which_pca, +) using ( + mem_gb = 3, + volatile = strict, ) """ -MEM_FACTOR = 1.1 - def split(args): - chunks = [] - min_clusters = analysis_constants.MIN_N_CLUSTERS - max_clusters = ( - args.max_clusters - if args.max_clusters is not None - else analysis_constants.MAX_N_CLUSTERS_DEFAULT - ) - - # edge case: very small number of barcodes - matrix_dims = cr_matrix.CountMatrix.load_dims_from_h5(args.matrix_h5) - max_clusters = min(max_clusters, matrix_dims[1]) - - matrix_mem_gb = np.ceil( - MEM_FACTOR * cr_matrix.CountMatrix.get_mem_gb_from_matrix_h5(args.matrix_h5) + pcas = cr_pca.load_pca_from_h5(args.pca_h5) + num_barcodes, num_pcs = pcas[0].transformed_pca_matrix.shape + mem_gib = 1 + round(34 * num_pcs * num_barcodes / 1024**3, 1) + print(f"{num_barcodes=},{num_pcs=},{mem_gib=}") + + max_clusters = min( + ( + args.max_clusters + if args.max_clusters is not None + else analysis_constants.MAX_N_CLUSTERS_DEFAULT + ), + # edge case: very small number of barcodes + num_barcodes, ) - library_types = cr_matrix.CountMatrix.load_library_types_from_h5_file(args.matrix_h5) - allowed_types = [rna_library.GENE_EXPRESSION_LIBRARY_TYPE, rna_library.ANTIBODY_LIBRARY_TYPE] - - for library in library_types: - if library not in allowed_types: - # K-means on other library types not supported - continue - pca = cr_pca.load_pca_from_h5(args.pca_h5) - if library == rna_library.ANTIBODY_LIBRARY_TYPE and len(pca) > 1 and pca[1] is None: - # For antigen and gex only case, antibody capture pca object will not be generated. Skip. - continue - for n_clusters in range(min_clusters, max_clusters + 1): - chunk_mem_gb = max(matrix_mem_gb, h5_constants.MIN_MEM_GB) - chunks.append( - { - "n_clusters": n_clusters, - "library": library, - "__mem_gb": chunk_mem_gb, - } - ) - - return {"chunks": chunks} + library_types = CountMatrix.load_library_types_from_h5_file(args.matrix_h5) + library_types = [ + x + for x in [rna_library.GENE_EXPRESSION_LIBRARY_TYPE, rna_library.ANTIBODY_LIBRARY_TYPE] + if x in library_types + ] + + return { + "chunks": [ + { + "library": library_type, + "which_pca": which_pca, + "n_clusters": n_clusters, + "__mem_gb": mem_gib, + } + for which_pca, (library_type, pca) in enumerate(zip(library_types, pcas)) + for n_clusters in range(analysis_constants.MIN_N_CLUSTERS, 1 + max_clusters) + if pca is not None + ], + "join": {"__mem_gb": 1}, + } def main(args, outs): np.random.seed(args.random_seed) - matrix = cr_matrix.CountMatrix.load_h5_file(args.matrix_h5) - - pca = cr_pca.load_pca_from_h5(args.pca_h5) - if len(pca) > 1: # only gex- and/or ab-based pca projections are present - if args.library == rna_library.GENE_EXPRESSION_LIBRARY_TYPE: - pca = pca[0] - elif args.library == rna_library.ANTIBODY_LIBRARY_TYPE: - pca = pca[1] - elif args.library == rna_library.ANTIGEN_LIBRARY_TYPE: - pca = pca[2] - else: - pca = pca[0] # could be either gex- or ab- or ag-based - pca_mat = pca.transformed_pca_matrix - - # Subsample barcodes + pca_mat = cr_pca.load_pca_from_h5(args.pca_h5)[args.which_pca].transformed_pca_matrix + + barcodes = CountMatrix.load_bcs_from_h5(args.matrix_h5) if args.num_bcs is not None: + # Subsample barcodes use_bcs = np.random.choice(pca_mat.shape[0], args.num_bcs, replace=False) - matrix = matrix.select_barcodes(use_bcs) + use_bcs.sort() + barcodes = barcodes[use_bcs] pca_mat = pca_mat[use_bcs, :] # Subset principal components if args.num_pcs is not None: pca_mat = pca_mat[:, np.arange(args.num_pcs)] - if args.library == rna_library.GENE_EXPRESSION_LIBRARY_TYPE: - clustering_type = cr_clustering.CLUSTER_TYPE_KMEANS - elif args.library == rna_library.ANTIBODY_LIBRARY_TYPE: - clustering_type = cr_clustering.CLUSTER_TYPE_ANTIBODY_KMEANS - + clustering_type = { + rna_library.GENE_EXPRESSION_LIBRARY_TYPE: cr_clustering.CLUSTER_TYPE_KMEANS, + rna_library.ANTIBODY_LIBRARY_TYPE: cr_clustering.CLUSTER_TYPE_ANTIBODY_KMEANS, + }[args.library] kmeans = cr_kmeans.run_kmeans( pca_mat, args.n_clusters, clustering_type, random_state=args.random_seed ) @@ -116,7 +104,7 @@ def main(args, outs): cr_kmeans.save_kmeans_h5(f, args.n_clusters, kmeans, clustering_type) clustering_key = cr_clustering.format_clustering_key(clustering_type, args.n_clusters) - cr_clustering.save_clustering_csv(outs.kmeans_csv, clustering_key, kmeans.clusters, matrix.bcs) + cr_clustering.save_clustering_csv(outs.kmeans_csv, clustering_key, kmeans.clusters, barcodes) def join(args, outs, chunk_defs, chunk_outs): diff --git a/mro/rna/stages/analyzer/run_tsne/__init__.py b/mro/rna/stages/analyzer/run_tsne/__init__.py deleted file mode 100644 index 7950a28..0000000 --- a/mro/rna/stages/analyzer/run_tsne/__init__.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2019 10X Genomics, Inc. All rights reserved. -# - -import itertools - -import numpy as np - -import cellranger.analysis.bhtsne as cr_tsne -import cellranger.analysis.constants as analysis_constants -import cellranger.analysis.io as analysis_io -import cellranger.analysis.pca as cr_pca -import cellranger.cr_io as cr_io -import cellranger.h5_constants as h5_constants -import cellranger.matrix as cr_matrix -import cellranger.rna.library as rna_library - -__MRO__ = """ -stage RUN_TSNE( - in h5 matrix_h5, - in h5 pca_h5, - in int random_seed, - in int perplexity, - in int input_pcs, - in int max_dims, - in int max_iter, - in int stop_lying_iter, - in int mom_switch_iter, - in float theta, - in bool is_antibody_only, - out h5 tsne_h5, - out path tsne_csv, - src py "stages/analyzer/run_tsne", -) split using ( - in int tsne_dims, - in string feature_type, -) -""" - - -def split(args): - feature_ref = cr_matrix.CountMatrix.load_feature_ref_from_h5_file(args.matrix_h5) - feature_types = sorted(list({fd.feature_type for fd in feature_ref.feature_defs})) - - chunks = [] - matrix_mem_gb = cr_matrix.CountMatrix.get_mem_gb_from_matrix_h5(args.matrix_h5) - min_tsne_dims = analysis_constants.TSNE_N_COMPONENTS - max_tsne_dims = args.max_dims if args.max_dims is not None else min_tsne_dims - for tsne_dims, feature_type in itertools.product( - range(min_tsne_dims, max_tsne_dims + 1), feature_types - ): - chunks.append( - { - "tsne_dims": tsne_dims, - "feature_type": feature_type, - "__mem_gb": max(matrix_mem_gb, h5_constants.MIN_MEM_GB), - } - ) - return {"chunks": chunks, "join": {"__mem_gb": 1}} - - -def lower_no_space(s): - return s.replace(" ", "_").lower() - - -def get_tsne_name(feature_type, n_components): - return "%s_%d-d" % (lower_no_space(feature_type), n_components) - - -def get_tsne_key(feature_type, n_components): - if feature_type == rna_library.DEFAULT_LIBRARY_TYPE: - # Preserve backward HDF5 compatibility with pre-3.0 HDF5 files - # where the CSV directory was named "2_components" and the HDF5 dataset was named "_2" - return str(n_components) - else: - return "%s_%d" % (lower_no_space(feature_type), n_components) - - -def main(args, outs): - tsne_dims = args.tsne_dims - - if args.is_antibody_only: - matrix = cr_matrix.CountMatrix.load_h5_file(args.matrix_h5) - matrix = matrix.select_features_by_type(rna_library.ANTIBODY_LIBRARY_TYPE) - matrix.m.data = np.log2(1 + matrix.m.data) - tsne_input = matrix.m.transpose().toarray() - - name = get_tsne_name(rna_library.ANTIBODY_LIBRARY_TYPE, args.tsne_dims) - key = str(args.tsne_dims) - - tsne = cr_tsne.run_tsne( - tsne_input, - name=name, - key=key, - input_pcs=args.input_pcs, - perplexity=args.perplexity, - theta=args.theta, - tsne_dims=tsne_dims, - max_iter=args.max_iter, - stop_lying_iter=args.stop_lying_iter, - mom_switch_iter=args.mom_switch_iter, - random_state=args.random_seed, - ) - - cr_tsne.save_tsne_h5(tsne, outs.tsne_h5) - cr_tsne.save_tsne_csv(tsne, matrix.bcs, outs.tsne_csv) - return - - if args.feature_type == rna_library.GENE_EXPRESSION_LIBRARY_TYPE: - # Use PCA for gene expression - pca = cr_pca.load_pca_from_h5(args.pca_h5)[0] - tsne_input = pca.transformed_pca_matrix - else: - # Use feature space for other feature types - # Assumes other feature types are much lower dimension than gene expression - matrix = cr_matrix.CountMatrix.load_h5_file(args.matrix_h5) - matrix = matrix.select_features_by_type(args.feature_type) - matrix.m.data = np.log2(1 + matrix.m.data) - tsne_input = matrix.m.transpose().toarray() - - name = get_tsne_name(args.feature_type, args.tsne_dims) - key = get_tsne_key(args.feature_type, args.tsne_dims) - - tsne = cr_tsne.run_tsne( - tsne_input, - name=name, - key=key, - input_pcs=args.input_pcs, - perplexity=args.perplexity, - theta=args.theta, - tsne_dims=tsne_dims, - max_iter=args.max_iter, - stop_lying_iter=args.stop_lying_iter, - mom_switch_iter=args.mom_switch_iter, - random_state=args.random_seed, - ) - - cr_tsne.save_tsne_h5(tsne, outs.tsne_h5) - - matrix_bcs = cr_matrix.CountMatrix.load_bcs_from_h5_file(args.matrix_h5) - cr_tsne.save_tsne_csv(tsne, matrix_bcs, outs.tsne_csv) - - -def join(args, outs, chunk_defs, chunk_outs): - chunk_h5s = [chunk_out.tsne_h5 for chunk_out in chunk_outs] - chunk_csv_dirs = [chunk_out.tsne_csv for chunk_out in chunk_outs] - analysis_io.combine_h5_files( - chunk_h5s, outs.tsne_h5, [analysis_constants.ANALYSIS_H5_TSNE_GROUP] - ) - for csv_dir in chunk_csv_dirs: - cr_io.hardlink_with_fallback(csv_dir, outs.tsne_csv) diff --git a/mro/rna/stages/cas_cell_typing/analyze_cell_types/__init__.py b/mro/rna/stages/cas_cell_typing/analyze_cell_types/__init__.py new file mode 100644 index 0000000..9f5f42b --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/analyze_cell_types/__init__.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# +# Copyright (c) 2023 10X Genomics, Inc. All rights reserved. +# + +"""Analyze cell types generated from CALL_CELL_TYPES.""" + +import json + +import martian + +import cellranger.cell_typing.cas_metrics as cas_metrics +import cellranger.feature.utils as feature_utils +import tenkit.safe_json as tk_safe_json + +__MRO__ = """ +stage ANALYZE_CELL_TYPES( + in csv cell_types, + in path analysis, + in csv tissue_positions, + in png tissue_lowres_image, + in json scale_factors, + in float cas_frac_returned_bcs "Fraction of barcodes that went into cell annotation that were returned", + in string cas_model_used, + in string pipestance_type, + in bool cas_success, + in json metadata, + in bool is_pd, + out json cas_metrics, + out json cell_type_bar_chart, + out json spatial_cell_types_chart, + src py "stages/cas_cell_typing/analyze_cell_types", +) using ( + volatile = strict, +) +""" + + +def main(args, outs): + if not args.cell_types: + martian.clear(outs) + return + + if args.analysis: + metadata_dict = {} + if args.metadata: + with open(args.metadata) as f: + metadata_dict = json.load(f) + + cas_mets = cas_metrics.get_cas_cluster_purity( + cell_types=args.cell_types, analysis=args.analysis + ) + if args.cas_frac_returned_bcs: + cas_mets["cas_frac_returned_bcs"] = args.cas_frac_returned_bcs + cas_mets["cell_annotation_model"] = args.cas_model_used + cas_mets["pipestance_type"] = args.pipestance_type + cas_mets["cas_success"] = args.cas_success + cas_mets["tree_version_used"] = metadata_dict.get("tree_version_used") + cas_mets["cas_frac_returned_bcs"] = args.cas_frac_returned_bcs + cas_mets["display_map_version_used"] = metadata_dict.get("display_map_version_used") + with open(martian.make_path(outs.cas_metrics), "w") as f: + tk_safe_json.dump_numpy( + cas_mets, + f, + indent=4, + sort_keys=False, + separators=(",", ": "), + ) + # Make some diagnostic plots + ## Stacked barchart of cluster purity + if args.is_pd: + cell_type_bar_chart = cas_metrics.cell_type_bar_chart( + cell_types=args.cell_types, analysis=args.analysis, stacked=True + ) + feature_utils.write_json_from_dict(cell_type_bar_chart, outs.cell_type_bar_chart) + else: + outs.cell_type_bar_chart = None + + else: + outs.cas_metrics = None + outs.cell_type_bar_chart = None + + ## Spatial plot of cell types + if ( + args.tissue_positions + and args.scale_factors + and args.tissue_lowres_image + and args.cell_types + ): + spatial_plot = cas_metrics.spatial_cell_types_plot( + tissue_positions_path=args.tissue_positions, + tissue_lowres_image=args.tissue_lowres_image, + cell_types=args.cell_types, + analysis=args.analysis, + scale_factors=args.scale_factors, + ) + feature_utils.write_json_from_dict(spatial_plot, outs.spatial_cell_types_chart) + else: + outs.spatial_cell_types_chart = None diff --git a/mro/rna/stages/cas_cell_typing/append_cell_types_cloupe/__init__.py b/mro/rna/stages/cas_cell_typing/append_cell_types_cloupe/__init__.py new file mode 100644 index 0000000..1ff97ce --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/append_cell_types_cloupe/__init__.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Append celltypes to an existing cloupe file.""" + + +import subprocess + +import martian + +import cellranger.cr_io as cr_io +import tenkit.log_subprocess as tk_subproc + +__MRO__ = """ +stage APPEND_CELL_TYPES_CLOUPE( + in cloupe sample_cloupe, + in json cloupe_cas_types, + in string cas_track_name, + out cloupe cell_annotation_sample_cloupe, + src py "stages/cas_cell_typing/append_cell_types_cloupe", +) +""" + + +def main(args, outs): + # If we have a cloupe file but no cell types reroute the input to outs + if args.sample_cloupe and not args.cloupe_cas_types: + cr_io.hardlink_with_fallback(args.sample_cloupe, outs.cell_annotation_sample_cloupe) + return + + # Stage gets skipped if no cloupe file is provided. We should still run CAS + if not args.sample_cloupe or not args.cloupe_cas_types: + martian.clear(outs) + return + + cas_track_name = "Cell Types" if not args.cas_track_name else args.cas_track_name + + call = [ + "appendtracks", + args.cloupe_cas_types, + args.sample_cloupe, + outs.cell_annotation_sample_cloupe, + "--trackName", + cas_track_name, + "--emptyName=Unknown", + "--multiName=Multiple Labels", + ] + + unicode_call = [arg.encode("utf-8") for arg in call] + + martian.log_info("Running appendtracks: {}".format(" ".join(call))) + try: + results = tk_subproc.check_output(unicode_call, stderr=subprocess.STDOUT) + martian.log_info(f"appendtracks output: {results}") + except subprocess.CalledProcessError as err: + outs.cell_annotation_sample_cloupe = None + martian.throw(f"Could not generate .cloupe file: \n{err.output}") diff --git a/mro/rna/stages/cas_cell_typing/call_cloud_cell_types/__init__.py b/mro/rna/stages/cas_cell_typing/call_cloud_cell_types/__init__.py new file mode 100644 index 0000000..0b694c8 --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/call_cloud_cell_types/__init__.py @@ -0,0 +1,433 @@ +#!/usr/bin/env python +# +# Copyright (c) 2023 10X Genomics, Inc. All rights reserved. +# + +"""Call cell types based on Broad Cell Annotation Service.""" + +__MRO__ = """ +stage CALL_CLOUD_CELL_TYPES( + in string sample_id, + in string sample_desc, + in h5 filtered_matrix, + in string cell_annotation_model, + in file tenx_cloud_token_path, + in string pipestance_type, + in bool override_num_bc_limit, + in cloupe sample_cloupe, + out CellTypeResults cell_type_results, + out bool cas_success, + out bool disable_cas_ws, + out bool disable_summarize, + out json summary, + src py "stages/cas_cell_typing/call_cloud_cell_types", +) split ( +) using ( +) +""" + +import csv +import math +from dataclasses import dataclass + +import martian + +import cellranger.cell_typing.cloud_cas_client as cloud_client_lib +import cellranger.cell_typing.cloud_cas_utils as cloud_utils +import cellranger.cell_typing.common as ct_common +import cellranger.matrix as cr_matrix +from tenkit import safe_json + + +@dataclass +class RunInfo: + """Class storing run info.""" + + num_features: int + num_bcs: int + num_entries: int + is_cra: bool + + +def write_analysis_files( + filtered_matrix: str | bytes, + cell_annotation_results: cloud_utils.CasResults, + model_used: str | None, +) -> ct_common.CellTypeResults: + """Return cell_type_results with necessary outs and write CSV/JSON outputs.""" + results_json_gz_path = martian.make_path("results.json.gz").decode() + cell_types_csv_path = martian.make_path("cell_types.csv").decode() + cell_typing_metadata_path = martian.make_path("metadata.json").decode() + + cell_type_results = ct_common.CellTypeResults(model_used=model_used) + if cell_annotation_results.cell_annotation_results_json_gz: + cloud_utils.write_results( + cell_annotation_results.cell_annotation_results_json_gz, + results_json_gz_path, + ) + cell_type_results.results = results_json_gz_path + else: + + cell_type_results.results = None + + if cell_annotation_results.cell_types: + with open(cell_types_csv_path, "w") as f: + f.write(cell_annotation_results.cell_types.decode()) + cell_type_results.cell_types = cell_types_csv_path + + # compute bc fraction by comparing the return length vs input h5 bc length + _, num_bcs, _ = cr_matrix.CountMatrix.load_dims_from_h5(filtered_matrix) + with open(cell_types_csv_path) as f: + reader = csv.DictReader(f) + cell_type_results.frac_returned_bcs = round(sum(1 for _ in reader) / num_bcs, 3) + + else: + cell_type_results.cell_types = None + cell_type_results.frac_returned_bcs = 0.0 + + if cell_annotation_results.cas_metadata: + with open(cell_typing_metadata_path, "w") as f: + f.write(cell_annotation_results.cas_metadata.decode()) + cell_type_results.metadata = cell_typing_metadata_path + else: + cell_type_results.metadata = None + + return cell_type_results + + +def alarm_vs_exit(message, use_exit): + """Use martian alarm vs martian exit given some condition. + + Parameters: + - message (str): The message to be logged with the alarm or exit. + - use_exit (bool): If True, the function will exit. If False, it will trigger an alarm. + + Returns: + None + """ + if use_exit: + martian.exit(message) + else: + martian.alarm(message) + + +def get_token_info( + args, + outs, + run_info, + error_cell_type_results, +): + """Get token info.""" + try: + token_info = cloud_utils.extract_token_info(args.tenx_cloud_token_path) + except Exception as token_exc: # pylint: disable=broad-except + martian.clear(outs) + outs.cell_type_results = error_cell_type_results + alarm_vs_exit( + message=f"Could not read token information from {args.tenx_cloud_token_path}: {token_exc}; skipping annotation", + use_exit=run_info.is_cra, + ) + outs.cas_success = False + token_info = cloud_utils.TokenInfo(successful=False) + return token_info + + +def get_annotation_params( + args, outs, model_name, genome_name, token_info, run_info +) -> cloud_client_lib.AnnotationParams | None: + """Attempt to get the parameters required to invoke against the cloud. + + This will throw an alarm/exception + """ + error_cell_type_results = ct_common.CellTypeResults( + model_used=model_name, + skip_downstream=True, + ).to_outs() + + try: + martian.log_info( + f"Trying to get annotation params for pipestance {args.pipestance_type}, genome {genome_name}, model {model_name}" + ) + annotation_params = cloud_utils.run_get_annotation_defaults( + server_url=token_info.server_url, + cli_token=token_info.cli_token, + cfa_tokens=token_info.cfa_tokens, + pipestance_type=args.pipestance_type, + genome_name=genome_name, + pipeline_requirements=[ct_common.CELL_ANNOTATION_REQUIRES_JSON_RESULTS], + cell_annotation_model=model_name, + ) + martian.log_info(f"resolved annotation params: {annotation_params}") + + # no valid cloud pipeline available + if annotation_params is None: + outs.cas_success = False + outs.disable_cas_ws = True + outs.cell_type_results = error_cell_type_results + outs.disable_summarize = True + alarm_vs_exit( + message=f"no model-pipeline combination found for pipeline inputs: pipestance type {args.pipestance_type}, genome {genome_name}, model {model_name}", + use_exit=run_info.is_cra, + ) + + return annotation_params + except cloud_utils.CloudCellAnnotationException as cloud_cas_exception: + session_stats = cloud_cas_exception.stats + with open(outs.summary, "w") as outfile: + outfile.write(safe_json.safe_jsonify(session_stats.stats, pretty=True)) + + outs.cas_success = False + outs.disable_cas_ws = False + outs.cell_type_results = error_cell_type_results + outs.disable_summarize = True + + alarm_vs_exit( + message=f"cell annotation param lookup failed on barcodes in sample ID: {args.sample_id}, sample description: {args.sample_desc}, cell annotation model: {model_name}. " + f"\nCell annotation lookup failed: {cloud_cas_exception}", + use_exit=run_info.is_cra, + ) + return None + + +def run_cell_annotation( + args, + outs, + pipeline_params: cloud_client_lib.AnnotationParams, + genome_name, + token_info, + run_info, +): + """Ping the end-point and obtain cell annotations.""" + error_cell_type_results = ct_common.CellTypeResults( + model_used=pipeline_params.model, + skip_downstream=True, + ).to_outs() + try: + if run_info.is_cra: + max_timeout = cloud_utils.MAX_CLOUD_TIMEOUT_SECONDS_ANNOTATION_ONLY + else: + max_timeout = cloud_utils.MAX_CLOUD_TIMEOUT_SECONDS + cell_annotation_results, session_stats = cloud_utils.run_cloud_query( + server_url=token_info.server_url, + cli_token=token_info.cli_token, + cfa_tokens=token_info.cfa_tokens, + pipestance_type=args.pipestance_type, + genome_name=genome_name, + pipeline_params=pipeline_params, + filtered_matrix_path=args.filtered_matrix, + max_timeout=max_timeout, + ) + + except cloud_utils.CloudCellAnnotationException as cloud_cas_exception: + session_stats = cloud_cas_exception.stats + with open(outs.summary, "w") as outfile: + outfile.write(safe_json.safe_jsonify(session_stats.stats, pretty=True)) + + outs.cas_success = False + outs.disable_cas_ws = False + outs.cell_type_results = error_cell_type_results + outs.disable_summarize = True + alarm_vs_exit( + message=f"cell annotation failed on barcodes in sample ID: {args.sample_id}, sample description: {args.sample_desc}, cell annotation model: {pipeline_params.model}. " + f"num features: {run_info.num_features}, num barcodes: {run_info.num_bcs}, num non zero entries: {run_info.num_entries}" + f"\nCell annotation failed: {cloud_cas_exception}", + use_exit=run_info.is_cra, + ) + return + except ValueError as api_exc: + martian.clear(outs) + outs.cell_type_results = error_cell_type_results + alarm_vs_exit( + message=f"cell annotation failed on barcodes in sample ID: {args.sample_id}, sample description: {args.sample_desc}, cell annotation model: {pipeline_params.model}. " + f"num features: {run_info.num_features}, num barcodes: {run_info.num_bcs}, num non zero entries: {run_info.num_entries}" + f"\nInvalid parameters passed to cloud API client: {api_exc}", + use_exit=run_info.is_cra, + ) + outs.cas_success = False + outs.disable_summarize = True + return + except Exception as fail_message: # pylint: disable=broad-except + martian.clear(outs) + outs.cell_type_results = error_cell_type_results + alarm_vs_exit( + message=f"cell annotation failed on barcodes in sample ID: {args.sample_id}, sample description: {args.sample_desc}, cell annotation model: {pipeline_params.model}. " + f"num features: {run_info.num_features}, num barcodes: {run_info.num_bcs}, num non zero entries: {run_info.num_entries}" + f"\nUncaught message in cloud annotation: {fail_message}", + use_exit=run_info.is_cra, + ) + outs.cas_success = False + outs.disable_summarize = True + return + outs.disable_summarize = False + + with open(outs.summary, "w") as outfile: + outfile.write(safe_json.safe_jsonify(session_stats.stats, pretty=True)) + + if not cell_annotation_results.is_complete(): + martian.clear(outs) + outs.cell_type_results = error_cell_type_results + alarm_vs_exit( + message=f"cell annotation failed on barcodes in sample ID: {args.sample_id}, sample description: {args.sample_desc}, cell annotation model: {pipeline_params.model}. " + f"num features: {run_info.num_features}, num barcodes: {run_info.num_bcs}, num non zero entries: {run_info.num_entries}" + "\ncell annotation returned empty results.", + use_exit=run_info.is_cra, + ) + outs.cas_success = False + outs.disable_summarize = True + return + + cell_type_results = write_analysis_files( + args.filtered_matrix, + cell_annotation_results, + model_used=pipeline_params.model, + ) + outs.cell_type_results = cell_type_results.to_outs() + outs.cas_success = True + outs.disable_summarize = False + + +def split(args): + if not args.filtered_matrix: + return { + "chunks:": [], + "join": {"__mem_gb": 1}, + } + + _, num_bcs, _ = cr_matrix.CountMatrix.load_dims_from_h5(args.filtered_matrix) + # rough estimate -- JSON representation of output will be 20k per barcode (it's verbose) + join_mem_gb = int(math.ceil((20_000 * num_bcs) / (1024 * 1024 * 1024))) + + return { + "chunks": [], + "join": { + "__mem_gb": join_mem_gb, + }, + } + + +def join( + args, outs, _chunk_defs, _chunk_outs +): # pylint: disable=too-many-locals,too-many-statements + is_cra = args.pipestance_type in ["CELLRANGER_ANNOTATE_PD", "CELLRANGER_ANNOTATE_CS"] + + if not args.pipestance_type: + args.pipestance_type = "UNKNOWN_PIPESTANCE" + + # For backward compatibility run all cell annotation runs through cloud + if not args.cell_annotation_model or len(args.cell_annotation_model.split(":", 1)) < 2: + inferred_model_name = args.cell_annotation_model + else: + model_tokens = args.cell_annotation_model.split(":", 1) + inferred_model_name = model_tokens[1] if model_tokens[1] else None + + # set model name to explicit None if blank / unset + if not inferred_model_name: + inferred_model_name = None + + error_cell_type_results = ct_common.CellTypeResults( + model_used=inferred_model_name, + skip_downstream=True, + ).to_outs() + + # SAP-38; after SAP-39 resolution, drop THRESHOLD to 1 + num_features, num_bcs, num_entries = cr_matrix.CountMatrix.load_dims_from_h5( + args.filtered_matrix + ) + run_info = RunInfo( + num_features=num_features, num_bcs=num_bcs, num_entries=num_entries, is_cra=is_cra + ) + + if run_info.num_bcs < cloud_utils.MIN_BARCODE_THRESHOLD: + martian.clear(outs) + outs.cell_type_results = error_cell_type_results + alarm_vs_exit( + message=f"Under minimum barcode count required to compute cell annotation: {run_info.num_bcs}", + use_exit=run_info.is_cra, + ) + outs.cas_success = False + outs.disable_summarize = True + return + + if not args.override_num_bc_limit and run_info.num_bcs > cloud_utils.MAX_BARCODE_THRESHOLD: + martian.clear(outs) + outs.cell_type_results = error_cell_type_results + alarm_vs_exit( + message=f"Over the maximum barcode count to compute cell annotation: {run_info.num_bcs}", + use_exit=run_info.is_cra, + ) + outs.cas_success = False + outs.disable_summarize = True + return + + if not args.filtered_matrix: + martian.clear(outs) + outs.cell_type_results = error_cell_type_results + alarm_vs_exit( + message="No filtered matrix supplied; skipping annotation", use_exit=run_info.is_cra + ) + outs.cas_success = False + outs.disable_cas_ws = True + outs.disable_summarize = True + return + + # skip annotation barnyard sample + ref = cr_matrix.CountMatrix.get_genomes_from_h5(args.filtered_matrix) + if len(ref) > 1: + martian.log_warn( + f"Multi-genome references, {ref}, are not supported by cell annotation at this time." + ) + outs.disable_summarize = True + return + + # Make sure the genome is some version of GRCh38 or mm10 but there aren't more than 1 and that there is a GEX library + valid_genome_library, _, genome_name = ct_common.check_valid_genome_and_library( + matrix=args.filtered_matrix + ) + if not valid_genome_library: + martian.clear(outs) + outs.cell_type_results = error_cell_type_results + alarm_vs_exit( + message="Cell annotation was skipped because the reference used is not yet supported", + use_exit=run_info.is_cra, + ) + outs.cas_success = False + outs.disable_cas_ws = True + outs.disable_summarize = True + return + + # lookup cloud access token information + token_info = get_token_info( + args=args, + outs=outs, + run_info=run_info, + error_cell_type_results=error_cell_type_results, + ) + if not token_info.successful: + outs.disable_summarize = True + return + + # look up annotation parameters (pipeline version, model name) from cloud first + # (this sets outs if it fails and returns None-- not sure if I like the side effects) + params = get_annotation_params( + args=args, + outs=outs, + model_name=inferred_model_name, + genome_name=genome_name, + token_info=token_info, + run_info=run_info, + ) + + # only run cell annotation if valid params returned + if params is not None: + martian.log_info( + f"Trying to run cell annotation on barcodes. Sample ID: {args.sample_id}, Sample description: {args.sample_desc}, cell annotation model: {params.model}, " + f"num features: {run_info.num_features}, num barcodes: {run_info.num_bcs}, num non zero entries: {run_info.num_entries}" + ) + run_cell_annotation( + args=args, + outs=outs, + pipeline_params=params, + genome_name=genome_name, + token_info=token_info, + run_info=run_info, + ) diff --git a/mro/rna/stages/cas_cell_typing/cell_annotation_preflight/__init__.py b/mro/rna/stages/cas_cell_typing/cell_annotation_preflight/__init__.py new file mode 100644 index 0000000..9ad22ee --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/cell_annotation_preflight/__init__.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# +"""Determine whether or not the cell annotation stage should run.""" + + +__MRO__ = """ +stage CELL_ANNOTATION_PREFLIGHT( + in bool is_cr_annotate, + in bool is_multi, + in string tenx_cloud_token_path, + in string cell_annotation_model, + in path reference_path, + in string cas_track_name, + in bool skip_cell_annotation, + in h5 cr_annotate_filtered_matrix, + in cloupe cr_annotate_sample_cloupe, + src py "stages/cas_cell_typing/cell_annotation_preflight", +) using ( + mem_gb = 8, + volatile = strict, +) +""" + +import os +import re +import time + +import martian + +import cellranger.cell_typing.cloud_cas_client as cloud_client_lib +import cellranger.cell_typing.cloud_cas_utils as cloud_cas_utils +import cellranger.matrix as cr_matrix + + +def _check_connection(args, cloud_client: cloud_client_lib.CloudAPIClient): + """Verify that we can connect to the cloud server with the current client. + + Exit if there is something wrong with the setup. This will try 3 times in case of the + server being unreachable, but will exit immediately if there is something wrong with the token. + """ + num_tries = 0 + max_retries = 3 + retry_interval = 60 + preflight_succeeded = False + while num_tries < max_retries: + num_tries += 1 + try: + connected, valid_user = cloud_cas_utils.test_cloud_connection(cloud_client) + except ValueError as err: + martian.exit( + "Error while trying to test 10x Cloud connection. " + f"Please check the contents of {args.tenx_cloud_token_path}, or run 'cellranger cloud auth verify' to verify that your token is valid. \n" + f"Error seen: {err}" + ) + if connected and valid_user: + preflight_succeeded = True + break + elif connected and not valid_user: + martian.exit( + f"Invalid cloud access token found at {args.tenx_cloud_token_path}. " + f"Please check the contents of this file, or run 'cellranger cloud auth setup' to re-authenticate." + ) + # wait momentarily for server to come back + martian.log_info(f"Waiting {retry_interval} seconds for server response") + time.sleep(retry_interval) + + if not preflight_succeeded: + martian.exit(f"Could not connect to cloud server after {max_retries} attempts") + + +def main(args, _outs): + if args.skip_cell_annotation: + return + + # CHECKS COMMON TO ANNOTATE, COUNT, MULTI + # if cloud token path is None, check local token + if args.tenx_cloud_token_path is None: + if not cloud_cas_utils.LOCAL_TOKEN_PATH.exists(): + martian.log_warn( + "No 10x cloud token defined. To enable cell annotation via the 10x Cloud, please run `cellranger cloud auth setup`." + ) + elif args.tenx_cloud_token_path and not os.path.exists(args.tenx_cloud_token_path): + martian.exit( + f"No 10x cloud token found at {args.tenx_cloud_token_path}. To create a token, please run `cellranger cloud auth setup`. " + "Please check that the path and is valid and ensure the permissions are correct." + ) + # check if the token is valid + token_info = None + try: + token_info = cloud_cas_utils.extract_token_info(args.tenx_cloud_token_path) + except Exception as token_exc: # pylint: disable=broad-except + if args.tenx_cloud_token_path is not None: + martian.exit( + f"Could not read token information from {args.tenx_cloud_token_path}: {token_exc}. " + "Please check that the path and is valid and ensure the permissions are correct." + ) + elif args.is_multi: + martian.exit( + "Failed to authenticate for Cell Ranger Cloud. " + "Please run `cellranger cloud auth setup` to set up cloud authentication or provide a valid token via the tenx-cloud-token-path parameter in the config CSV." + ) + else: + martian.exit( + "Failed to authenticate for Cell Ranger Cloud. " + "Please run `cellranger cloud auth setup` to set up cloud authentication or provide a valid token via the --tenx-cloud-token-path parameter." + ) + + # check if the model provided is valid (and that we can connect to the cloud) + if token_info: + with cloud_client_lib.CloudAPIClient( + token_info.server_url, + token_info.cli_token, + cfa_tokens=token_info.cfa_tokens, + ) as cloud_client: + _check_connection(args, cloud_client) + + if args.cell_annotation_model: + # this could also be in a retry loop but it's unlikely to fail + models = cloud_client.get_available_models() + matched_models = [ + model for model in models if model.name == f"{args.cell_annotation_model}" + ] + if len(matched_models) != 1: + martian.exit( + f"{args.cell_annotation_model} is not a valid cell annotation model. " + "Please run `cellranger cloud annotation models` to view available models." + ) + + genomes = set(matched_models[0].genomes) + if args.reference_path is not None: + ref = [os.path.basename(args.reference_path)] + + # Check if annotation ref and genome are compatible + # Allows for matching GRCh38 to custom genomes like GRCh38-2024-A_and_XYZ. + if not any(any(genome in r for r in ref) for genome in genomes): + valid_models = cloud_cas_utils.get_valid_models(models, ref) + martian.exit( + f"The {args.cell_annotation_model} model cannot run data from the {ref} genome. " + f"Valid models for this reference are {valid_models}" + ) + + # CHECKS SPECIFIC TO ANNOTATE + if args.is_cr_annotate: + # Check if cas_track_name_from_user contains invalid characters + # that can't be displayed in loupe browser + if args.cas_track_name: + re_check = re.compile(r"^[a-zA-Z0-9\s_-]*$") + if not re_check.match(args.cas_track_name): + martian.exit( + f"Invalid characters in cloupe group name: {args.cas_track_name}. " + "Only alphanumeric characters, spaces, underscores, and dashes are allowed." + ) + + # Barnyard check + # Checks if the matrix file exists. Guaranteed in count or multi but not annotate + if not os.path.exists(args.cr_annotate_filtered_matrix): + martian.exit( + f"Filtered matrix file not found at {args.cr_annotate_filtered_matrix}. " + "Please check that the path and is valid and ensure the permissions are correct." + ) + try: + ref = cr_matrix.CountMatrix.get_genomes_from_h5(args.cr_annotate_filtered_matrix) + _, num_bcs, _ = cr_matrix.CountMatrix.load_dims_from_h5( + args.cr_annotate_filtered_matrix + ) + except Exception as matrix_exc: # pylint: disable=broad-except + martian.exit( + f"Could not validate the matrix.h5 {args.cr_annotate_filtered_matrix}: {matrix_exc}. " + "Please check that the path and is valid and ensure the permissions are correct " + "and the the matrix file is a valid 10x Genomics matrix.h5 file." + ) + if len(ref) > 1: + martian.exit( + f"Multi-genome references, {ref}, are not supported by cell annotation at this time." + ) + if num_bcs > 800000: + martian.exit( + f"Filtered matrix file {args.cr_annotate_filtered_matrix} contains more barcodes than the maximum allowed threshold. " + "Cell Ranger Cell Annotation has a maximum limit of 800,000 barcodes." + ) + + # check if the cloupe file is valid + ## Check the path is valid + if args.cr_annotate_sample_cloupe: + if not os.path.exists(args.cr_annotate_sample_cloupe): + martian.exit( + f"Cloupe file not found at {args.cr_annotate_sample_cloupe}. " + "Please check that the path and is valid and ensure the permissions are correct." + ) + ## Check if the extension is valid + if args.cr_annotate_sample_cloupe and not args.cr_annotate_sample_cloupe.endswith( + ".cloupe" + ): + martian.exit(f"{args.cr_annotate_sample_cloupe} does not end with a .cloupe extension.") diff --git a/mro/rna/stages/cas_cell_typing/cell_annotation_viable_but_not_requested/__init__.py b/mro/rna/stages/cas_cell_typing/cell_annotation_viable_but_not_requested/__init__.py new file mode 100644 index 0000000..dcd5a7e --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/cell_annotation_viable_but_not_requested/__init__.py @@ -0,0 +1,43 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# +"""Stage checking if cell annotation is viable but not requested in a multi run.""" + +import martian + +import cellranger.cell_typing.common as ct_common +import cellranger.matrix as cr_matrix + +__MRO__ = """ +stage CELL_ANNOTATION_VIABLE_BUT_NOT_REQUESTED( + in h5 filtered_matrix, + in bool skip_cell_annotation, + out bool cell_annotation_viable_but_not_requested, + src py "stages/cas_cell_typing/cell_annotation_viable_but_not_requested", +) +""" + + +def main(args, outs): + if not args.filtered_matrix: + martian.clear(outs) + return + + viable_run = True + ref = cr_matrix.CountMatrix.get_genomes_from_h5(args.filtered_matrix) + if len(ref) > 1: + viable_run = False + + # Make sure the genome is some version of GRCh38 or mm10 but there aren't more than 1 and that there is a GEX library + valid_genome_library, _, _ = ct_common.check_valid_genome_and_library( + matrix=args.filtered_matrix + ) + if not valid_genome_library: + viable_run = False + + if args.skip_cell_annotation: + outs.cell_annotation_viable_but_not_requested = viable_run + return + else: + outs.cell_annotation_viable_but_not_requested = False + return diff --git a/mro/rna/stages/cas_cell_typing/check_cloupe_matrix_consistent/__init__.py b/mro/rna/stages/cas_cell_typing/check_cloupe_matrix_consistent/__init__.py new file mode 100644 index 0000000..8b29c3c --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/check_cloupe_matrix_consistent/__init__.py @@ -0,0 +1,66 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# +"""Stage checking if bcs in cloupe and feature-bc matrix are the same.""" + +import subprocess + +import martian + +import cellranger.matrix as cr_matrix +import tenkit.log_subprocess as tk_subproc + +__MRO__ = """ +stage CHECK_CLOUPE_MATRIX_CONSISTENT( + in cloupe sample_cloupe, + in h5 filtered_matrix, + out string alert_string, + src py "stages/cas_cell_typing/check_cloupe_matrix_consistent", +) +""" + + +def main(args, outs): + if not args.sample_cloupe or not args.filtered_matrix: + martian.clear(outs) + return + + tmp_bc_path = martian.make_path("bcs.txt").decode() + + call = [ + "getbarcodes", + args.sample_cloupe, + tmp_bc_path, + ] + + unicode_call = [arg.encode("utf-8") for arg in call] + + martian.log_info("Running getbarcodes: {}".format(" ".join(call))) + try: + results = tk_subproc.check_output(unicode_call, stderr=subprocess.STDOUT) + martian.log_info(f"getbarcodes output: {results}") + except subprocess.CalledProcessError as err: + martian.clear(outs) + martian.throw( + f"Could not run getbarcodes to get barcodes from cloupe file. Error: \n{err.output}" + ) + + with open(tmp_bc_path) as f: + barcodes_from_cloupe = set(x.strip() for x in f.readlines()) + + barcodes_from_matrix = set( + x.decode() for x in cr_matrix.CountMatrix.load_bcs_from_h5(args.filtered_matrix) + ) + + if barcodes_from_matrix != barcodes_from_cloupe: + common_bcs = len(barcodes_from_matrix.intersection(barcodes_from_cloupe)) + bcs_in_matrix_only = len(barcodes_from_matrix - barcodes_from_cloupe) + bcs_in_cloupe_only = len(barcodes_from_cloupe - barcodes_from_matrix) + total_bcs = len(barcodes_from_matrix.union(barcodes_from_cloupe)) + outs.alert_string = ( + f"{common_bcs} out of {total_bcs} are seen in both the feature barcode matrix and cloupe file. " + f"{bcs_in_matrix_only} seen in the feature barcode matrix only. " + f"{bcs_in_cloupe_only} seen in the cloupe file only. " + ) + else: + outs.alert_string = None diff --git a/mro/rna/stages/cas_cell_typing/demux_cloupe_track_name/__init__.py b/mro/rna/stages/cas_cell_typing/demux_cloupe_track_name/__init__.py new file mode 100644 index 0000000..c2b1214 --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/demux_cloupe_track_name/__init__.py @@ -0,0 +1,20 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# +"""Demux cas track name.""" + +__MRO__ = """ +stage DEMUX_CLOUPE_TRACK_NAME( + in string cas_track_name_from_user, + in string cas_track_name_from_ppln, + out string cas_track_name, + src py "stages/cas_cell_typing/demux_cloupe_track_name", +) +""" + + +def main(args, outs): + if args.cas_track_name_from_user: + outs.cas_track_name = args.cas_track_name_from_user + else: + outs.cas_track_name = args.cas_track_name_from_ppln diff --git a/mro/rna/stages/cas_cell_typing/disable_cas_reporter_stages/__init__.py b/mro/rna/stages/cas_cell_typing/disable_cas_reporter_stages/__init__.py new file mode 100644 index 0000000..87a919e --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/disable_cas_reporter_stages/__init__.py @@ -0,0 +1,39 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Disable reporter stages based on cell annotation outs.""" + +import csv + +from cellranger.cell_typing.cas_postprocessing import ( + BARCODE_KEY, + COARSE_CELL_TYPES_KEY, +) + +__MRO__ = """ +stage DISABLE_CAS_REPORTER_STAGES( + in csv cell_types, + out bool disable_differential_expression, + src py "stages/cas_cell_typing/disable_cas_reporter_stages", +) using ( + volatile = strict, +) +""" + + +def main(args, outs): + if not args.cell_types: + outs.disable_differential_expression = True + return + + with open(args.cell_types) as read_csv_file: + reader = csv.DictReader( + read_csv_file, + ) + hdrs = reader.fieldnames + if not hdrs or BARCODE_KEY not in hdrs and COARSE_CELL_TYPES_KEY not in hdrs: + raise ValueError("Invalid cell type CSV file.") + + set_of_cell_types = {row[COARSE_CELL_TYPES_KEY] for row in reader} + outs.disable_differential_expression = len(set_of_cell_types) < 2 diff --git a/mro/rna/stages/cas_cell_typing/extract_loupe_projection/__init__.py b/mro/rna/stages/cas_cell_typing/extract_loupe_projection/__init__.py new file mode 100644 index 0000000..e966ee5 --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/extract_loupe_projection/__init__.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""This stage extracts a projection from a cloupe file.""" + +__MRO__ = """ +stage ETXRACT_LOUPE_PROJECTION( + in cloupe sample_cloupe, + in string projection_name, + out csv projection, + src py "stages/cas_cell_typing/extract_loupe_projection", +) +""" + +import subprocess + +import martian + +import tenkit.log_subprocess as tk_subproc + + +def main(args, outs): + if not args.sample_cloupe: + martian.clear(outs) + return + + outs.projection = martian.make_path(f"{args.projection_name}.csv").decode() + + call = [ + "exportprojectioncsv", + args.sample_cloupe, + outs.projection, + args.projection_name, + ] + + unicode_call = [arg.encode("utf-8") for arg in call] + + martian.log_info("Running exportprojectioncsv: {}".format(" ".join(call))) + try: + results = tk_subproc.check_output(unicode_call, stderr=subprocess.STDOUT) + martian.log_info(f"exportprojectioncsv output: {results}") + except subprocess.CalledProcessError as err: + martian.clear(outs) + martian.alarm( + f"Could not run exportprojectioncsv to get a projection from cloupe file. Error: \n{err.output}" + ) diff --git a/mro/rna/stages/cas_cell_typing/get_cell_types_barchart/__init__.py b/mro/rna/stages/cas_cell_typing/get_cell_types_barchart/__init__.py new file mode 100644 index 0000000..080f0ca --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/get_cell_types_barchart/__init__.py @@ -0,0 +1,294 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Generate cell types interactive barchart.""" + +import json +import textwrap + +import altair as alt +import martian +import polars as pl + +from cellranger.altair_utils import chart_to_json +from cellranger.cell_typing.cas_postprocessing import ( + BARCODE_KEY, + COARSE_CELL_TYPES_KEY, + FINE_CELL_TYPES_KEY, +) + +__MRO__ = """ +stage GET_CELL_TYPES_BARCHART( + in csv cell_types, + out json cell_type_interactive_bar_chart, + src py "stages/cas_cell_typing/get_cell_types_barchart", +) using ( + volatile = strict, +) +""" + + +# Keys of things shown in the graph +NUM_BARCODES_KEY = "num_barcodes" +NUM_BC_IN_COARSE_CELL_TYPE_KEY = "num_bc_in_coarse_cell_type" +FRACTION_OF_COARSE_CELL_TYPE_KEY = "fraction_of_coarse_cell_type" +TITLE_COARSE_CELL_TYPE_KEY = f"title_{COARSE_CELL_TYPES_KEY}" + +# Hyperparameters of figure +CELL_TYPE_WIDTH_IN_LEGEND = 50 +COARSE_CELL_TYPE_LOWER_BOUND = 10 +MAX_SUBTYPES_TO_SHOW = 5 +MIN_FRACTION_TO_LIST = 0.000051 +NUMBER_OF_BARCODES_LABEL = "Number of Barcodes" +CELL_TYPES_LABEL = "Cell Type" +CELL_SUB_TYPE_LABEL = "Sub-type" +FRACTION_BARCODES_LABEL = "Fraction BCs" +RIGHT_CHART_HEADING_FONTSIZE = 18 +RIGHT_CHART_TABLE_FONTSIZE = 14 +RIGHT_CHART_CELL_TYPES_WIDTH = 175 +RIGHT_CHART_CELL_TYPES_X = 0 +RIGHT_CHART_CELL_TYPE_STRING_LIMIT = RIGHT_CHART_CELL_TYPES_WIDTH +RIGHT_CHART_CELL_TYPES_ALIGNMENT = "left" +RIGHT_CHART_FRAC_BCS_X = 0 +RIGHT_CHART_FRAC_BCS_WIDTH = 30 +RIGHT_CHART_FRAC_BCS_ALIGNMENT = "right" + + +# Schema of postprocessed cell annotation out +CELL_TYPING_CSV_SCHEMA = { + BARCODE_KEY: pl.String, + COARSE_CELL_TYPES_KEY: pl.String, + FINE_CELL_TYPES_KEY: pl.String, +} + + +def main(args, outs): # pylint: disable=too-many-locals + if not args.cell_types: + martian.clear(outs) + return + + lazy_df = pl.scan_csv(args.cell_types, schema=CELL_TYPING_CSV_SCHEMA) + + df = ( + lazy_df.group_by(FINE_CELL_TYPES_KEY) + .agg( + pl.len().alias(NUM_BARCODES_KEY), + pl.first( + COARSE_CELL_TYPES_KEY + ), # Assumes that every coarse cell type can come from only one fine cell type + ) + .sort(pl.col(NUM_BARCODES_KEY), descending=True) + .collect() + ) + + df = ( + df.lazy() + .with_columns( + pl.col(COARSE_CELL_TYPES_KEY).str.to_titlecase().alias(TITLE_COARSE_CELL_TYPE_KEY) + ) + .collect() + ) + + list_of_dicts = ( + df.lazy() + .group_by(COARSE_CELL_TYPES_KEY) + .agg(pl.col(NUM_BARCODES_KEY).sum().alias(NUM_BC_IN_COARSE_CELL_TYPE_KEY)) + .collect() + .to_dicts() + ) + map_of_total_coarce_cell_types = { + x[COARSE_CELL_TYPES_KEY]: x[NUM_BC_IN_COARSE_CELL_TYPE_KEY] for x in list_of_dicts + } + df = df.with_columns( + [ + pl.struct([NUM_BARCODES_KEY, COARSE_CELL_TYPES_KEY]) + .map_elements( + lambda x: x[NUM_BARCODES_KEY] + / map_of_total_coarce_cell_types[x[COARSE_CELL_TYPES_KEY]], + return_dtype=pl.Float64, + ) + .alias(FRACTION_OF_COARSE_CELL_TYPE_KEY) + ] + ) + + df = df.with_columns( + [ + pl.col(FINE_CELL_TYPES_KEY).map_elements( + lambda x: "\n".join(textwrap.wrap(x, width=CELL_TYPE_WIDTH_IN_LEGEND)), + return_dtype=pl.String, + ) + ] + ) + + df = df.with_columns( + [ + pl.lit(CELL_SUB_TYPE_LABEL).alias(CELL_SUB_TYPE_LABEL), + pl.lit(FRACTION_BARCODES_LABEL).alias(FRACTION_BARCODES_LABEL), + ] + ) + + default_value = ( + df.group_by(COARSE_CELL_TYPES_KEY) + .agg(pl.sum(NUM_BARCODES_KEY)) + .sort(pl.col(NUM_BARCODES_KEY), descending=True) + .select(pl.col(COARSE_CELL_TYPES_KEY).first()) + .to_series() + .to_list()[0] + ) + + brush = alt.selection_point( + fields=[COARSE_CELL_TYPES_KEY], + empty=False, + value=default_value, + clear="dblclick", + toggle=False, + ) + + hover_brush = alt.selection_point(on="mouseover", empty=False, value=default_value) + + base_chart = alt.Chart(df) + + base_left_chart = base_chart.transform_aggregate( + groupby=[COARSE_CELL_TYPES_KEY], num_barcodes=f"sum({NUM_BARCODES_KEY})" + ) + + left_chart = ( + base_left_chart.transform_filter(f"datum.num_barcodes > {COARSE_CELL_TYPE_LOWER_BOUND}") + .mark_bar( + stroke="black", + color="#0071D9", + cursor=alt.Cursor("pointer"), + ) + .encode( + y=alt.Y(f"{COARSE_CELL_TYPES_KEY}:N") + .sort("-x") + .axis(title=CELL_TYPES_LABEL, labelFontSize=12, titleFontSize=14), + x=alt.X("num_barcodes:Q").axis( + title=NUMBER_OF_BARCODES_LABEL, labelFontSize=12, titleFontSize=14 + ), + tooltip=[ + alt.Tooltip(COARSE_CELL_TYPES_KEY, title=CELL_TYPES_LABEL), + alt.Tooltip("num_barcodes", title=NUMBER_OF_BARCODES_LABEL), + ], + opacity=alt.condition(brush, alt.value(1), alt.value(0.5)), + strokeWidth=alt.condition(hover_brush, alt.value(2), alt.value(0)), + ) + .add_params(brush, hover_brush) + ).properties(height=250) + + transformed_chart = base_chart.transform_filter(brush) + + heading = ( + transformed_chart.transform_calculate(major_type_tooltip_text="'Major cell type'") + .transform_aggregate( + groupby=[TITLE_COARSE_CELL_TYPE_KEY, "major_type_tooltip_text"], + ) + .mark_text( + align=RIGHT_CHART_CELL_TYPES_ALIGNMENT, + fontSize=RIGHT_CHART_HEADING_FONTSIZE, + fontWeight="bold", + x=RIGHT_CHART_CELL_TYPES_X, + ) + .encode( + text=f"{TITLE_COARSE_CELL_TYPE_KEY}:N", + tooltip=alt.Tooltip("major_type_tooltip_text:N"), + ) + .properties(width=RIGHT_CHART_CELL_TYPES_WIDTH) + ) + + cell_type_subheading = ( + transformed_chart.transform_calculate( + sub_type_tooltip_text="'Cell sub-types that compose the major cell type'" + ) + .transform_aggregate( + groupby=[CELL_SUB_TYPE_LABEL, "sub_type_tooltip_text"], + ) + .mark_text( + align=RIGHT_CHART_CELL_TYPES_ALIGNMENT, + fontSize=RIGHT_CHART_TABLE_FONTSIZE, + fontWeight="bold", + x=RIGHT_CHART_CELL_TYPES_X, + ) + .encode( + text=f"{CELL_SUB_TYPE_LABEL}:N", + tooltip=alt.Tooltip("sub_type_tooltip_text:N"), + ) + .properties(width=RIGHT_CHART_CELL_TYPES_WIDTH) + ) + + frac_bcs_subheading = ( + transformed_chart.transform_calculate( + frac_bc_tooltip_text="'The fraction of barcodes in the major cell type'" + ) + .transform_aggregate( + groupby=[FRACTION_BARCODES_LABEL, "frac_bc_tooltip_text"], + ) + .mark_text( + align=RIGHT_CHART_FRAC_BCS_ALIGNMENT, + fontSize=RIGHT_CHART_TABLE_FONTSIZE, + fontWeight="bold", + x=RIGHT_CHART_FRAC_BCS_X, + ) + .encode( + text=f"{FRACTION_BARCODES_LABEL}:N", + tooltip=alt.Tooltip("frac_bc_tooltip_text:N"), + ) + .properties(width=RIGHT_CHART_FRAC_BCS_WIDTH) + ) + + text_chart = ( + transformed_chart.transform_aggregate( + groupby=[FINE_CELL_TYPES_KEY], + frac_barcodes_in_subtype=f"sum({FRACTION_OF_COARSE_CELL_TYPE_KEY})", + ) + .transform_window(row_number="row_number()") + .transform_filter(f"datum.row_number < {MAX_SUBTYPES_TO_SHOW}") + .transform_filter(f"datum.frac_barcodes_in_subtype >= {MIN_FRACTION_TO_LIST}") + .encode(y=alt.Y("row_number:O", axis=None)) + ) + + cell_type_name = cell_type_subheading & text_chart.mark_text( + x=RIGHT_CHART_CELL_TYPES_X, + limit=RIGHT_CHART_CELL_TYPE_STRING_LIMIT, + align=RIGHT_CHART_CELL_TYPES_ALIGNMENT, + fontSize=RIGHT_CHART_TABLE_FONTSIZE, + ).encode( + text=alt.Text(f"{FINE_CELL_TYPES_KEY}:N"), + tooltip=[ + alt.Tooltip(f"{FINE_CELL_TYPES_KEY}:N", title=CELL_SUB_TYPE_LABEL), + alt.Tooltip( + "frac_barcodes_in_subtype:O", + format="0.02%", + title=FRACTION_BARCODES_LABEL, + ), + ], + ).properties( + width=RIGHT_CHART_CELL_TYPES_WIDTH, + ) # Combine data tables + num_subtype_bcs = frac_bcs_subheading & text_chart.mark_text( + align=RIGHT_CHART_FRAC_BCS_ALIGNMENT, + fontSize=RIGHT_CHART_TABLE_FONTSIZE, + x=RIGHT_CHART_FRAC_BCS_X, + ).encode( + text=alt.Text( + "frac_barcodes_in_subtype:O", + format="0.02%", + ), + ).properties( + width=RIGHT_CHART_FRAC_BCS_WIDTH + ) + text = alt.vconcat( + heading, + alt.hconcat(cell_type_name, num_subtype_bcs, spacing=10).resolve_axis(x="independent"), + ) + + chart = ( + alt.hconcat(left_chart, text, spacing=100) + .configure_concat(spacing=10) + .resolve_legend(color="independent") + .configure_view(strokeWidth=0) + ) + + with open(outs.cell_type_interactive_bar_chart, "w") as f: + json.dump(chart_to_json(chart), f) diff --git a/mro/rna/stages/cas_cell_typing/get_cell_types_box_plot/__init__.py b/mro/rna/stages/cas_cell_typing/get_cell_types_box_plot/__init__.py new file mode 100644 index 0000000..d2a0b46 --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/get_cell_types_box_plot/__init__.py @@ -0,0 +1,47 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Generate cell types interactive barchart.""" + +import json + +import cellranger.matrix as cr_matrix +import cellranger.websummary.violin_plots as cr_vp + +__MRO__ = """ +stage GET_CELL_TYPES_BOX_PLOT( + in csv cell_types, + in h5 filtered_matrix, + out json cell_types_box_plot, + src py "stages/cas_cell_typing/get_cell_types_box_plot", +) split ( +) using ( + volatile = strict, +) +""" +COARSE_CELL_TYPE_LOWER_BOUND = 10 + + +def split(args): + mem_gib = 2 + cr_matrix.CountMatrix.get_mem_gb_from_matrix_h5(args.filtered_matrix, scale=1.1) + return { + "chunks": [], + "join": {"__mem_gb": mem_gib}, + } + + +def join(args, outs, _chunk_defs, _chunk_outs): + if args.pipestance_type.startswith("SC_MULTI_CORE_SAMPLE"): + plot_width = 450 + else: + plot_width = 900 + box_plot = cr_vp.make_cell_types_boxplot( + h5_path=args.filtered_matrix, + cell_types=args.cell_types, + barcode_lower_bound=COARSE_CELL_TYPE_LOWER_BOUND, + final_plot_width=plot_width, + return_plot=False, + ) + with open(outs.cell_types_box_plot, "w") as f: + json.dump(box_plot, f) diff --git a/mro/rna/stages/cas_cell_typing/get_cell_types_umap_plot/__init__.py b/mro/rna/stages/cas_cell_typing/get_cell_types_umap_plot/__init__.py new file mode 100644 index 0000000..be125b0 --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/get_cell_types_umap_plot/__init__.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Make umap colored by cell type.""" + +__MRO__ = """ +stage GET_CELL_TYPES_UMAP_PLOT( + in path analysis, + in csv cell_types, + in string pipestance_type, + out json cell_types_umap_plot, + src py "stages/cas_cell_typing/get_cell_types_umap_plot", +) using ( + mem_gb = 2, + volatile = strict, +) +""" + +import martian + +import cellranger.feature.utils as feature_utils +from cellranger.cell_typing.cas_metrics import cell_type_umap + + +def main(args, outs): + if args.analysis and args.cell_types: + ## UMAP of cell types + umap_plot = cell_type_umap( + cell_types=args.cell_types, analysis=args.analysis, cloupe_projection=None + ) + feature_utils.write_json_from_dict(umap_plot, outs.cell_types_umap_plot) + return + if args.cloupe_projection and args.cell_types: + umap_plot = cell_type_umap( + cell_types=args.cell_types, + analysis=None, + cloupe_projection=args.cloupe_projection, + ) + feature_utils.write_json_from_dict(umap_plot, outs.cell_types_umap_plot) + return + else: + martian.clear(outs) diff --git a/mro/rna/stages/cas_cell_typing/get_cloupe_cell_types/__init__.py b/mro/rna/stages/cas_cell_typing/get_cloupe_cell_types/__init__.py new file mode 100644 index 0000000..d74547b --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/get_cloupe_cell_types/__init__.py @@ -0,0 +1,36 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Get JSON to pass into loupe file.""" + +import csv +import json + +from cellranger.cell_typing.cas_postprocessing import BARCODE_KEY, COARSE_CELL_TYPES_KEY + +__MRO__ = """ +stage GET_CLOUPE_CELL_TYPES( + in csv cell_types, + out json cloupe_cas_types, + src py "stages/cas_cell_typing/get_cloupe_cell_types", +) using ( + volatile = strict, +) +""" + + +def main(args, outs): + if not args.cell_types: + outs.cloupe_cas_types = None + return + + dct = {} + + with open(args.cell_types) as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + dct.setdefault(row[COARSE_CELL_TYPES_KEY], []).append(row[BARCODE_KEY]) + + with open(outs.cloupe_cas_types, "w") as outfile: + json.dump(dct, outfile) diff --git a/mro/rna/stages/cas_cell_typing/tidy_celltype_diffexp/__init__.py b/mro/rna/stages/cas_cell_typing/tidy_celltype_diffexp/__init__.py new file mode 100644 index 0000000..c19e9a4 --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/tidy_celltype_diffexp/__init__.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Postprocess the cell type diff expression generated. + +Rewrite the header of the cell types diff expression csv to have the celltypes +and generate the figure for websummary. +""" + +import json +import os +from dataclasses import asdict, dataclass + +import martian + +from cellranger.analysis.analysis_types import DifferentialExpressionWithFeatures +from cellranger.websummary.analysis_tab_core import diffexp_table +from cellranger.websummary.react_components import ReactComponentEncoder + +__MRO__ = """ +stage TIDY_CELLTYPE_DIFFEXP( + in path diffexp_csv, + in json cell_types_map, + out csv cas_diffexp_csv, + out json diffexp, + src py "stages/cas_cell_typing/tidy_celltype_diffexp", +) +""" + + +@dataclass +class DifferentialExpressionTable: + """Differential expression table for a single bin size and clustering algorithm.""" + + table: dict + + +def replace_header(header, cluster_mapping): + """Replaces substrings in the header string based on a provided mapping dictionary. + + Parameters: + header (str): The header line of a CSV file, where each column name is + separated by commas. + cluster_mapping (dict): A dictionary where each key is a new string to + replace the existing 'Cluster X' substring and each + value is the integer X part of the 'Cluster X' pattern + to be replaced in the header. + + Returns: + str: A new header string with the specified replacements made. + """ + parts = header.split(",") + new_parts = [] + for part in parts: + part_split = part.split() + if len(part_split) >= 2: + cluster_name = " ".join(part_split[:2]) + for key, value in cluster_mapping.items(): + if f"Cluster {value}" == cluster_name: + part = part.replace(f"Cluster {value}", key) + new_parts.append(part) + return ",".join(new_parts) + + +def main(args, outs): + if not args.cell_types_map or not args.diffexp_csv or not args.filtered_matrix: + martian.clear(outs) + return + + diffexp_csv_path = os.path.join( + args.diffexp_csv, "gene_expression_graphclust", "differential_expression.csv" + ) + with open(args.cell_types_map) as file: + cell_types_map = json.load(file) + + with open(diffexp_csv_path) as infile: + with open(martian.make_path(outs.cas_diffexp_csv), "w") as outfile: + # Replace header with celltypes instead of clusters + header = infile.readline().strip() + new_header = replace_header(header, cell_types_map) + outfile.write(new_header + "\n") + # Write the rest of the file as is + for line in infile: + outfile.write(line) + + diffexp_with_features = DifferentialExpressionWithFeatures.from_diffexp_csv(diffexp_csv_path) + cell_types_list = sorted(cell_types_map, key=lambda x: cell_types_map[x]) + + diffexp_table_dict = DifferentialExpressionTable( + table=json.loads( + json.dumps( + diffexp_table( + diffexp_with_features=diffexp_with_features, + cluster_names=cell_types_list, + ), + cls=ReactComponentEncoder, + ) + ) + ) + + with open(outs.diffexp, "w") as f: + json.dump(asdict(diffexp_table_dict), f) diff --git a/mro/rna/stages/cas_cell_typing/write_cell_types_h5/__init__.py b/mro/rna/stages/cas_cell_typing/write_cell_types_h5/__init__.py new file mode 100644 index 0000000..435241e --- /dev/null +++ b/mro/rna/stages/cas_cell_typing/write_cell_types_h5/__init__.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# + +"""Write out cell_types.h5 to use in diff expression.""" + +__MRO__ = """ +call WRITE_CELL_TYPES_H5( + cell_types = POSTPROCESS_CELL_ANNOTATIONS.cell_types, +) using ( + disabled = CALL_CELL_TYPES.skip_cell_annotation, + volatile = true, +) +""" +import martian +import polars as pl + +import cellranger.analysis.graphclust as cr_graphclust +import cellranger.analysis.io as analysis_io +import tenkit.safe_json as tk_safe_json +from cellranger.cell_typing.cas_postprocessing import COARSE_CELL_TYPES_KEY + + +def main(args, outs): + cell_types = pl.read_csv(args.cell_types) + unique_values = cell_types[COARSE_CELL_TYPES_KEY].unique().sort() + mapper = {v: i + 1 for i, v in enumerate(unique_values)} + cell_types = cell_types.with_columns( + cell_types[COARSE_CELL_TYPES_KEY] + .map_elements(lambda x: mapper[x]) + .alias(f"{COARSE_CELL_TYPES_KEY}_int") + ) + labels = cell_types[f"{COARSE_CELL_TYPES_KEY}_int"].to_numpy() + with analysis_io.open_h5_for_writing(outs.cell_types) as f: + cr_graphclust.save_graphclust_h5(f, labels) + + # Convert DataFrame columns to lists + cell_types_list = cell_types[COARSE_CELL_TYPES_KEY].to_list() + cell_type_ints = cell_types[f"{COARSE_CELL_TYPES_KEY}_int"].to_list() + + # Zip the lists together and create a dictionary + cell_dict = dict(zip(cell_types_list, cell_type_ints)) + + with open(martian.make_path(outs.cell_types_map), "w") as f: + tk_safe_json.dump_numpy( + cell_dict, + f, + indent=4, + sort_keys=True, + separators=(",", ": "), + ) diff --git a/mro/rna/stages/cloupe/cloupe_preprocess/__init__.py b/mro/rna/stages/cloupe/cloupe_preprocess/__init__.py index 2965ab5..776fe1e 100644 --- a/mro/rna/stages/cloupe/cloupe_preprocess/__init__.py +++ b/mro/rna/stages/cloupe/cloupe_preprocess/__init__.py @@ -244,10 +244,10 @@ def join(args, outs, _chunk_defs, _chunk_outs): # but keep the arg 'call' here because log_info inherently # attempts to encode the message... (TODO: should log_info # figure out the encoding of the input string) - martian.log_info("Running crconverter: %s" % " ".join(call)) + martian.log_info("Running crconverter: {}".format(" ".join(call))) try: results = tk_subproc.check_output(unicode_call, stderr=subprocess.STDOUT) - martian.log_info("crconverter output: %s" % results) + martian.log_info(f"crconverter output: {results}") except subprocess.CalledProcessError as e: outs.output_for_cloupe = None - martian.throw("Could not generate .cloupe file: \n%s" % e.output) + martian.throw(f"Could not generate .cloupe file: \n{e.output}") diff --git a/mro/rna/stages/common/build_multi_web_summary/__init__.py b/mro/rna/stages/common/build_multi_web_summary/__init__.py index a9e7a02..e5aee63 100644 --- a/mro/rna/stages/common/build_multi_web_summary/__init__.py +++ b/mro/rna/stages/common/build_multi_web_summary/__init__.py @@ -29,7 +29,7 @@ def main(args, outs): with open(web_summary_data) as f: web_summary_data = json.load(f) - contents = """
""" + contents = """
""" web_summary_path = martian.make_path(sample + "_web_summary.html") with open(web_summary_path, "w") as outfile: diff --git a/mro/rna/stages/common/cellranger_preflight/__init__.py b/mro/rna/stages/common/cellranger_preflight/__init__.py index 7938089..ecf44df 100644 --- a/mro/rna/stages/common/cellranger_preflight/__init__.py +++ b/mro/rna/stages/common/cellranger_preflight/__init__.py @@ -13,6 +13,7 @@ in bool full_check, in string chemistry, in map[] sample_def, + in csv target_set, in path reference_path, in csv feature_reference, in CellCallingParam recovered_cells, @@ -31,11 +32,6 @@ def run_preflight_checks(args): cr_preflight.check_os() - cr_preflight.check_chemistry( - args.chemistry, - args.sample_def, - ) - cr_preflight.check_sample_info( args.sample_def, args.reference_path, args.full_check, args.feature_reference ) @@ -51,7 +47,7 @@ def run_preflight_checks(args): cr_preflight.check_feature_preflights(args.sample_def, args.feature_reference) cr_preflight.check_targeting_preflights( - args.sample_def, + args.target_set, args.reference_path, args.feature_reference, parse_files=args.full_check, diff --git a/mro/rna/stages/common/disable_secondary_analysis/__init__.py b/mro/rna/stages/common/disable_secondary_analysis/__init__.py index 997388b..4533191 100644 --- a/mro/rna/stages/common/disable_secondary_analysis/__init__.py +++ b/mro/rna/stages/common/disable_secondary_analysis/__init__.py @@ -8,8 +8,11 @@ in bool is_spatial, in h5 filtered_matrices_h5, in bool no_secondary_analysis, + in bool is_visium_hd_main_run "Boolean indicating if this is being called from a main (not-binning) Visium HD run", out bool no_secondary_analysis, src py "stages/common/disable_secondary_analysis", +) using ( + volatile = strict, ) """ @@ -21,7 +24,7 @@ def main(args, outs): - if args.no_secondary_analysis: + if args.no_secondary_analysis or args.is_visium_hd_main_run: outs.no_secondary_analysis = True return diff --git a/mro/rna/stages/common/parse_target_features/__init__.py b/mro/rna/stages/common/parse_target_features/__init__.py index 72eb357..4c99262 100644 --- a/mro/rna/stages/common/parse_target_features/__init__.py +++ b/mro/rna/stages/common/parse_target_features/__init__.py @@ -15,20 +15,20 @@ import cellranger.csv_io as cr_csv_io import cellranger.reference as cr_reference -import cellranger.rna.library as rna_library -import cellranger.sample_def as cr_sample_def from cellranger.reference_hash import compute_hash_of_file from cellranger.targeted import simple_utils, targeted_constants __MRO__ = """ stage PARSE_TARGET_FEATURES( - in map[] sample_def, + in string target_set_name, + in csv target_set, in path reference_path, in json gene_index, in bool filter_probes, in bool no_target_umi_filter, in bool no_bam, in bool is_pd, + in bool is_antibody_only, out fa bait_fasta, out csv target_panel, out csv probe_set, @@ -48,24 +48,8 @@ def main(args, outs): - # HACK: needed for backwards compatibility against old sample defs. ultimately this stage - # needs to be within count_gem_well_processor or the new (rustified) setup_chunks, - # which will fix this. - for sample_def in args.sample_def: - if cr_sample_def.get_library_type(sample_def) is None: - sample_def[rna_library.LIBRARY_TYPE] = rna_library.GENE_EXPRESSION_LIBRARY_TYPE - - # is there any target set? - target_sets = [ - (cr_sample_def.get_target_set_name(sd), cr_sample_def.get_target_set(sd)) - for sd in args.sample_def - if cr_sample_def.get_target_set(sd) is not None - ] - target_sets = sorted(set(target_sets)) - - if len(target_sets) > 1: - martian.exit(f"Multiple target sets/target set names found:\n\t{target_sets}") - elif len(target_sets) == 0: + + if args.target_set is None or args.target_set == "" or args.is_antibody_only: # Sample is not targeted ## Set relevant flags outs.no_bam = args.no_bam @@ -84,11 +68,16 @@ def main(args, outs): outs.target_panel_summary = None else: # Sample is targeted, gather basic info first - target_set_name, target_set_fn = target_sets[0] + target_set_name = args.target_set_name + target_set_fn = args.target_set ## load reference genes - gene_index = cr_reference.NewGeneIndex.load_from_json(args.gene_index) - gene_name_to_id = {gene.name: gene.id for gene in gene_index.genes} + if args.gene_index is None: + gene_index = None + gene_name_to_id = None + else: + gene_index = cr_reference.NewGeneIndex.load_from_json(args.gene_index) + gene_name_to_id = {gene.name: gene.id for gene in gene_index.genes} ## parse target set (target_set_metadata, target_gene_ids, bait_sequences) = simple_utils.parse_target_csv( @@ -100,16 +89,21 @@ def main(args, outs): targeting_method = simple_utils.determine_targeting_type_from_csv(target_set_fn) ## get gene indices - target_gene_indices = sorted( - filter( - lambda x: x is not None, - (gene_index.gene_id_to_int(gene_id) for gene_id in target_gene_ids), - ) - ) - if len(target_gene_indices) == 0: - martian.exit( - "There are no gene IDs in common between the reference transcriptome and the probe set." + if gene_index is None: + outs.target_gene_indices = None + else: + target_gene_indices = sorted( + filter( + lambda x: x is not None, + (gene_index.gene_id_to_int(gene_id) for gene_id in target_gene_ids), + ) ) + if len(target_gene_indices) == 0: + martian.exit( + "There are no gene IDs in common between the reference transcriptome and the probe set." + ) + ## gene indices + cr_csv_io.write_target_features_csv(outs.target_gene_indices, target_gene_indices) # Set up outs outs.no_bam = args.no_bam @@ -138,9 +132,6 @@ def main(args, outs): ## (FIXME: after moving target_set to top-level arg this isn't needed) shutil.copyfile(target_set_fn, outs.target_panel_or_probe_set) - ## gene indices - cr_csv_io.write_target_features_csv(outs.target_gene_indices, target_gene_indices) - ## Write the bait sequence FASTA file simple_utils.write_bait_fasta(outs.bait_fasta, bait_sequences) @@ -152,7 +143,7 @@ def main(args, outs): ("target_panel_hash", target_panel_hash), ("target_panel_name", target_set_name), ("target_panel_path", target_set_fn), - ("target_panel_gene_count", len(target_gene_indices)), + ("target_panel_gene_count", len(target_gene_ids)), ("target_panel_type", target_set_type), ("targeting_method", targeting_method), ] diff --git a/mro/rna/stages/counter/filter_barcodes/__init__.py b/mro/rna/stages/counter/filter_barcodes/__init__.py index 2ddf78e..9530802 100644 --- a/mro/rna/stages/counter/filter_barcodes/__init__.py +++ b/mro/rna/stages/counter/filter_barcodes/__init__.py @@ -50,8 +50,6 @@ from cellranger.targeted.simple_utils import determine_targeting_type_from_csv from cellranger.targeted.targeted_constants import TARGETING_METHOD_HC -FILTER_BARCODES_MIN_MEM_GB = 2.0 - PROBE_BC_SAMPLE_ID = "id" PROBE_BC_SEQS = "sequence" PROBE_BC_OFFSET = "offset" @@ -136,9 +134,7 @@ def split(args): chemistry_def = cr_chemistry.get_primary_chemistry_def(args.chemistry_defs) chemistry_barcode = chemistry_def["barcode"] - # We need to store one full copy of the matrix. - mem_gb = 2.3 * cr_matrix.CountMatrix.get_mem_gb_from_matrix_h5(args.matrices_h5) + 1 - mem_gb = max(mem_gb, FILTER_BARCODES_MIN_MEM_GB) + mem_gb = 2 + cr_matrix.CountMatrix.get_mem_gb_from_matrix_h5(args.matrices_h5, scale=6) if args.multi_graph is None: return { @@ -261,10 +257,10 @@ def join(args, outs, chunk_defs, chunk_outs): if fbc_control_names or number_of_fbcs_in_matrix > MINIMUM_FBCS_TO_NORMALIZE: # Normalise the filtered matrix - normalisation_metrics[ - "number_of_overflows_in_normalization" - ] = filtered_matrix.normalise_library_type_by_control_features( - rna_library.ANTIBODY_LIBRARY_TYPE, FBC_SCALE_FACTOR, fbc_control_names + normalisation_metrics["number_of_overflows_in_normalization"] = ( + filtered_matrix.normalise_library_type_by_control_features( + rna_library.ANTIBODY_LIBRARY_TYPE, FBC_SCALE_FACTOR, fbc_control_names + ) ) # Compute normalisation factor for all barcodes in raw matrix @@ -307,7 +303,7 @@ def join(args, outs, chunk_defs, chunk_outs): parse_filtered_bcs_method(filtered_metrics_groups, summary) - genomes = get_reference_genomes(args.reference_path) + genomes = get_reference_genomes(args.reference_path, args.target_set) summary = helpers.combine_initial_metrics( genomes, filtered_metrics_groups, genome_filtered_bcs, summary ) @@ -407,16 +403,14 @@ def filter_barcodes(args, outs): # pylint: disable=too-many-branches method = FilterMethod.MANUAL elif force_cells is not None: method = FilterMethod.TOP_N_BARCODES + elif config.override_mode is not None: + method = get_filter_method_from_string(config.override_mode) + elif args.is_antibody_only: + method = FilterMethod.ORDMAG + elif is_targeted and not is_rtl: + method = FilterMethod.TARGETED else: - # Override from MRO takes precedence - if config.override_mode is not None: - method = get_filter_method_from_string(config.override_mode) - elif args.is_antibody_only: - method = FilterMethod.ORDMAG - elif is_targeted and not is_rtl: - method = FilterMethod.TARGETED - else: - method = FilterMethod.ORDMAG_NONAMBIENT + method = FilterMethod.ORDMAG_NONAMBIENT # Get unique gem groups unique_gem_groups = sorted(list(set(args.gem_groups))) @@ -462,7 +456,11 @@ def filter_barcodes(args, outs): # pylint: disable=too-many-branches # report all identified aggregate barcodes, together with their umis, # umi corrected reads, fraction of corrected reads, and fraction of total reads removed_bcs_df = removed_bcs_df.round( - {FRACTION_CORRECTED_READS: 3, FRACTION_TOTAL_READS: 3} + { + FRACTION_CORRECTED_READS: 3, + FRACTION_TOTAL_READS: 3, + ab_utils.FRACTION_SAMPLE_READS: 3, + } ) if len(removed_bcs_df) != 0: removed_bcs_df.to_csv(outs.aggregate_barcodes) @@ -482,12 +480,12 @@ def filter_barcodes(args, outs): # pylint: disable=too-many-branches ) summary[total_diversity_key] = matrix.bcs_dim - genomes = get_reference_genomes(args.reference_path) + genomes = get_reference_genomes(args.reference_path, args.target_set) # Get per-gem group cell load if recovered_cells is not None: gg_recovered_cells = int(float(recovered_cells) / float(len(unique_gem_groups))) - elif method == FilterMethod.ORDMAG or method == FilterMethod.ORDMAG_NONAMBIENT: + elif method in (FilterMethod.ORDMAG, FilterMethod.ORDMAG_NONAMBIENT): gg_recovered_cells = None else: gg_recovered_cells = cr_constants.DEFAULT_RECOVERED_CELLS_PER_GEM_GROUP @@ -532,6 +530,7 @@ def filter_barcodes(args, outs): # pylint: disable=too-many-branches filtered_bcs_groups, feature_types, chemistry_description, + probe_barcode_sample_id, num_probe_barcodes=num_probe_barcodes, emptydrops_minimum_umis=helpers.get_emptydrops_minimum_umis( config.emptydrops_minimum_umis, probe_barcode_sample_id @@ -540,7 +539,7 @@ def filter_barcodes(args, outs): # pylint: disable=too-many-branches if nonambient_summary.empty: outs.nonambient_calls = None else: - nonambient_summary.to_csv(outs.nonambient_calls) + nonambient_summary.to_csv(outs.nonambient_calls, index=False) for (genome, gg), value in emptydrops_minimum_umis.items(): summary[ f"{genome}_gem_group_{gg}_{get_filter_method_name(FilterMethod.ORDMAG_NONAMBIENT)}_threshold" diff --git a/mro/rna/stages/counter/get_aggregate_barcodes_out/__init__.py b/mro/rna/stages/counter/get_aggregate_barcodes_out/__init__.py index 3baa60f..dc4389f 100644 --- a/mro/rna/stages/counter/get_aggregate_barcodes_out/__init__.py +++ b/mro/rna/stages/counter/get_aggregate_barcodes_out/__init__.py @@ -6,20 +6,34 @@ import os +import cellranger.rna.library as rna_library from cellranger.cr_io import hard_link __MRO__ = """ stage GET_AGGREGATE_BARCODES_OUT( - in path antibody_analysis, - out csv aggregate_barcodes, - src py "stages/counter/get_aggregate_barcodes_out", + in path antibody_analysis, + in bool is_multi, + in string multiplexing_method, + out csv aggregate_barcodes, + src py "stages/counter/get_aggregate_barcodes_out", ) """ def main(args, outs): - if args.antibody_analysis is not None and os.path.exists( - os.path.join(args.antibody_analysis, "aggregate_barcodes.csv") + make_aggregate_file = True + if args.is_multi: + if args.multiplexing_method is None: + make_aggregate_file = False + else: + multiplexing_method = rna_library.BarcodeMultiplexingType(args.multiplexing_method) + if multiplexing_method.is_read_multiplexed(): + make_aggregate_file = False + + if ( + args.antibody_analysis is not None + and os.path.exists(os.path.join(args.antibody_analysis, "aggregate_barcodes.csv")) + and make_aggregate_file ): outs.aggregate_barcodes = hard_link( os.path.join(args.antibody_analysis, "aggregate_barcodes.csv") diff --git a/mro/rna/stages/counter/summarize_reports/__init__.py b/mro/rna/stages/counter/summarize_reports/__init__.py index cfb8908..360d249 100644 --- a/mro/rna/stages/counter/summarize_reports/__init__.py +++ b/mro/rna/stages/counter/summarize_reports/__init__.py @@ -9,6 +9,8 @@ import cellranger.report as cr_report import cellranger.webshim.common as cr_webshim import cellranger.websummary.sample_properties as sp +from cellranger.analysis.singlegenome import TSNE_NAME +from cellranger.matrix import CountMatrix from cellranger.reference_paths import get_reference_genomes from cellranger.webshim.constants.shared import PIPELINE_COUNT from cellranger.websummary.react_components import ReactComponentEncoder @@ -40,8 +42,8 @@ out csv feature_reference, out json ws_data, src py "stages/counter/summarize_reports", +) split ( ) using ( - mem_gb = 16, volatile = strict, ) retain ( metrics_summary_json, @@ -49,7 +51,16 @@ """ -def main(args, outs): +def split(args): + _num_features, num_barcodes, nnz = CountMatrix.load_dims_from_h5( + args.filtered_gene_bc_matrices_h5 + ) + mem_gib = 7 + CountMatrix.get_mem_gb_from_matrix_dim(num_barcodes, nnz, scale=1.0) + print(f"{num_barcodes=},{nnz=},{mem_gib=}") + return {"chunks": [], "join": {"__mem_gb": mem_gib}} + + +def join(args, outs, _chunk_defs, _chunk_outs): id_dict = {"sample_id": args.sample_id, "sample_desc": args.sample_desc} cr_report.merge_jsons(args.summaries, outs.metrics_summary_json, [id_dict]) @@ -79,7 +90,9 @@ def main(args, outs): ) # TODO: Move metrics CSV somewhere else - sample_data = cr_webshim.load_sample_data(sample_properties, sample_data_paths) + sample_data = cr_webshim.load_sample_data( + sample_properties, sample_data_paths, projections=(TSNE_NAME,) + ) cr_webshim.build_metrics_summary_csv( outs.metrics_summary_csv, sample_properties, sample_data, PIPELINE_COUNT ) diff --git a/mro/rna/stages/feature/call_antibodies/__init__.py b/mro/rna/stages/feature/call_antibodies/__init__.py index 74b0af9..1b9c953 100644 --- a/mro/rna/stages/feature/call_antibodies/__init__.py +++ b/mro/rna/stages/feature/call_antibodies/__init__.py @@ -7,6 +7,7 @@ import cellranger.feature.utils as feature_utils import cellranger.matrix as cr_matrix import cellranger.rna.library as rna_library +from cellranger.fast_utils import MultiGraph # from cellranger.feature.feature_assigner import AntibodyAssigner from cellranger.websummary.histograms import make_antibody_histograms @@ -19,6 +20,8 @@ in h5 filtered_feature_counts_matrix, in bool is_antibody, in bool is_spatial, + in json multi_graph, + in string sample_id, out json antibody_histograms_json, out json antibody_treemap_json, src py "stages/feature/call_antibodies", @@ -89,8 +92,17 @@ def join(args, outs, chunk_defs, chunk_outs): # ab_assigner.assignments = ab_assigner.get_feature_assignments() # ab_assigner.assignment_metadata = ab_assigner.compute_assignment_metadata() + # Read in the multi graph + + is_hashtag_multiplexed = False + if args.multi_graph: + multi_graph = MultiGraph.from_path(args.multi_graph) + is_hashtag_multiplexed = multi_graph.is_hashtag_multiplexed() + + hashtags = multi_graph.sample_tag_ids().get(args.sample_id) if is_hashtag_multiplexed else None + antibody_histograms = make_antibody_histograms( - filtered_ab_counts_matrix, is_spatial=args.is_spatial + filtered_ab_counts_matrix, is_spatial=args.is_spatial, hashtags=hashtags ) antibody_treemap = make_antibody_treemap_plot( filtered_ab_counts_matrix, feature_type, MIN_ANTIBODY_UMI, args.is_spatial diff --git a/mro/rna/stages/feature/call_protospacers/__init__.py b/mro/rna/stages/feature/call_protospacers/__init__.py index 73f2f71..c891a98 100644 --- a/mro/rna/stages/feature/call_protospacers/__init__.py +++ b/mro/rna/stages/feature/call_protospacers/__init__.py @@ -61,11 +61,11 @@ def split(args): return { "chunks": [ { - "chunk_start": i * num_features_per_chunk, - "chunk_end": min(num_features, (i + 1) * num_features_per_chunk), + "chunk_start": start, + "chunk_end": min(num_features, start + num_features_per_chunk), "__mem_gb": mem_gib, } - for i in range(num_chunks) + for start in range(0, num_features, num_features_per_chunk) ], "join": {"__mem_gb": mem_gib}, } diff --git a/mro/rna/stages/feature/call_tags_jibes/__init__.py b/mro/rna/stages/feature/call_tags_jibes/__init__.py index 677a93e..6423b42 100644 --- a/mro/rna/stages/feature/call_tags_jibes/__init__.py +++ b/mro/rna/stages/feature/call_tags_jibes/__init__.py @@ -6,13 +6,13 @@ import pickle -# pylint: disable=wrong-import-position, too-many-locals import martian import numpy as np import pandas as pd import cellranger.feature.multiplexing.metrics_utils as multi_metrics_utils import cellranger.feature.utils as feature_utils +import cellranger.feature_ref as feature_ref import cellranger.matrix as cr_matrix import cellranger.rna.library as rna_library from cellranger.feature import jibes_tag_assigner as cr_jta @@ -21,6 +21,8 @@ calculate_fat_tail_frac, ) from cellranger.feature.feature_assignments import CMO_CATEGORY_NAMES, CellsPerFeature + +# pylint: disable=wrong-import-position, too-many-locals from cellranger.pandas_utils import sanitize_dataframe __MRO__ = """ @@ -32,6 +34,7 @@ in h5 molecule_info, in string throughput, in string library_type, + in string multiplexing_method, in float min_assignment_confidence, out json jibes_parameters, out csv jibes_model_summary, @@ -47,6 +50,8 @@ out json non_singlet_barcodes, src py "stages/feature/call_tags_jibes", ) split ( +) using ( + volatile = strict, ) """ @@ -103,17 +108,12 @@ def _get_input_files(args): ] -def join(args, outs, chunk_defs, chunk_outs): +def join(args, outs, chunk_defs, chunk_outs): # pylint: disable=too-many-locals,too-many-statements matrix_present = feature_utils.all_files_present([args.filtered_feature_counts_matrix]) if not matrix_present: set_empty(outs=outs, all_tags=[]) return - if args.library_type is None: - library_type = rna_library.MULTIPLEXING_LIBRARY_TYPE - else: - library_type = args.library_type - filtered_feature_counts_matrix = cr_matrix.CountMatrix.load_h5_file( args.filtered_feature_counts_matrix ) @@ -122,9 +122,26 @@ def join(args, outs, chunk_defs, chunk_outs): feature_utils.get_gex_cell_list(args.filtered_barcodes) ) - filtered_tag_counts_matrix = filtered_feature_counts_matrix.select_features_by_type( - library_type - ) + # exactly one of library_type or multiplexing_method is required to be set + assert (args.library_type is None) ^ (args.multiplexing_method is None) + if args.multiplexing_method is not None: + multiplexing_method = rna_library.BarcodeMultiplexingType(args.multiplexing_method) + assert multiplexing_method.is_cell_multiplexed(), "Unsupported multiplexing method!" + library_type = multiplexing_method.multiplexing_library_type() + if multiplexing_method.type == rna_library.CellLevel.Hashtag: + filtered_tag_counts_matrix = ( + filtered_feature_counts_matrix.select_features_by_type_and_tag( + library_type, feature_ref.HASHTAG_TAG + ) + ) + else: + filtered_tag_counts_matrix = filtered_feature_counts_matrix.select_features_by_type( + library_type + ) + else: + filtered_tag_counts_matrix = filtered_feature_counts_matrix.select_features_by_type( + args.library_type + ) if filtered_tag_counts_matrix is None: set_empty(outs=outs, all_tags=[]) @@ -148,7 +165,7 @@ def join(args, outs, chunk_defs, chunk_outs): # Tag calling try: tag_assigner = cr_jta.run_assignment_stage( - filtered_feature_counts_matrix, + filtered_tag_counts_matrix, args.marginal_tag_calls_per_cell, library_type, args.throughput, @@ -198,7 +215,7 @@ def join(args, outs, chunk_defs, chunk_outs): non_singlet_barcodes.save_to_file(outs.non_singlet_barcodes) # Save memory - del tag_assigner.matrix + del tag_assigner.sub_matrix del filtered_feature_counts_matrix tag_call_metrics.update(tag_assigner.get_feature_assignment_metrics()) diff --git a/mro/rna/stages/feature/call_tags_marginal/__init__.py b/mro/rna/stages/feature/call_tags_marginal/__init__.py index 3cab1ea..8b327d5 100644 --- a/mro/rna/stages/feature/call_tags_marginal/__init__.py +++ b/mro/rna/stages/feature/call_tags_marginal/__init__.py @@ -8,12 +8,10 @@ import numpy as np import cellranger.feature.utils as feature_utils +import cellranger.feature_ref as feature_ref import cellranger.matrix as cr_matrix import cellranger.rna.library as rna_library -from cellranger.feature.feature_assigner import ( - CellEstimateCantConvergeException, - TagAssigner, -) +from cellranger.feature.feature_assigner import CellEstimateCantConvergeException, TagAssigner from cellranger.feature.throughputs import G19_N_GEMS from cellranger.pandas_utils import sanitize_dataframe @@ -22,6 +20,7 @@ in csv filtered_barcodes, in h5 filtered_feature_counts_matrix, in string throughput, + in string multiplexing_method, in string library_type, out csv marginal_tag_calls_per_cell, out csv marginal_tag_frequencies, @@ -62,11 +61,6 @@ def join(args, outs, chunk_defs, chunk_outs): set_empty(outs) return - if args.library_type is None: - library_type = rna_library.MULTIPLEXING_LIBRARY_TYPE - else: - library_type = args.library_type - filtered_feature_counts_matrix = cr_matrix.CountMatrix.load_h5_file( args.filtered_feature_counts_matrix ) @@ -74,9 +68,27 @@ def join(args, outs, chunk_defs, chunk_outs): filtered_feature_counts_matrix = filtered_feature_counts_matrix.select_barcodes_by_seq( feature_utils.get_gex_cell_list(args.filtered_barcodes) ) - filtered_tag_counts_matrix = filtered_feature_counts_matrix.select_features_by_type( - library_type - ) + + # exactly one of library_type or multiplexing_method is required to be set + assert (args.library_type is None) ^ (args.multiplexing_method is None) + if args.multiplexing_method is not None: + multiplexing_method = rna_library.BarcodeMultiplexingType(args.multiplexing_method) + assert multiplexing_method.is_cell_multiplexed(), "Unsupported multiplexing method!" + library_type = multiplexing_method.multiplexing_library_type() + if multiplexing_method.type == rna_library.CellLevel.Hashtag: + filtered_tag_counts_matrix = ( + filtered_feature_counts_matrix.select_features_by_type_and_tag( + library_type, feature_ref.HASHTAG_TAG + ) + ) + else: + filtered_tag_counts_matrix = filtered_feature_counts_matrix.select_features_by_type( + library_type + ) + else: + filtered_tag_counts_matrix = filtered_feature_counts_matrix.select_features_by_type( + args.library_type + ) if feature_utils.check_if_none_or_empty(filtered_tag_counts_matrix): set_empty(outs) @@ -85,7 +97,7 @@ def join(args, outs, chunk_defs, chunk_outs): # Tag calling n_gems = G19_N_GEMS[args.throughput] tag_assigner = TagAssigner( - matrix=filtered_feature_counts_matrix, + matrix=filtered_tag_counts_matrix, feature_type=library_type, n_gems=n_gems, ) @@ -105,7 +117,7 @@ def join(args, outs, chunk_defs, chunk_outs): features_per_cell_table = tag_assignments_matrix.get_features_per_cell_table() # Save memory - del tag_assigner.matrix + del tag_assigner.sub_matrix del filtered_feature_counts_matrix sanitize_dataframe(features_per_cell_table, inplace=True).to_csv( outs.marginal_tag_calls_per_cell diff --git a/mro/rna/stages/feature/infer_gem_well_throughput/__init__.py b/mro/rna/stages/feature/infer_gem_well_throughput/__init__.py index 23e3c39..2d1ba39 100644 --- a/mro/rna/stages/feature/infer_gem_well_throughput/__init__.py +++ b/mro/rna/stages/feature/infer_gem_well_throughput/__init__.py @@ -12,13 +12,19 @@ import cellranger.feature.utils as feature_utils import cellranger.rna.library as rna_library import cellranger.utils as cr_utils -from cellranger.chemistry import CHEMISTRY_DESCRIPTION_FIELD, CHEMISTRY_SC3P_LT +from cellranger.chemistry import ( + CHEMISTRY_DESCRIPTION_FIELD, + CHEMISTRY_SC3P_LT, + SC_GEMX_CHEMISTRIES, +) from cellranger.feature.throughputs import ( + GEMX_THROUGHPUT, HT_THROUGHPUT, LT_THROUGHPUT, MT_THROUGHPUT, THROUGHPUT_INFERRED_METRIC, ) +from cellranger.feature_ref import HASHTAG_TAG from cellranger.matrix import CountMatrix from cellranger.reference_paths import get_reference_genomes @@ -41,7 +47,10 @@ def main(args, outs): feature_ref = CountMatrix.load_feature_ref_from_h5_file(args.filtered_feature_counts_matrix) - no_cmos = feature_ref.get_count_of_feature_type(rna_library.MULTIPLEXING_LIBRARY_TYPE) == 0 + no_cmos = ( + feature_ref.get_count_of_feature_type(rna_library.MULTIPLEXING_LIBRARY_TYPE) == 0 + and HASHTAG_TAG not in feature_ref.all_tag_keys + ) if no_cmos or not feature_utils.all_files_present([args.barcode_summary_h5]): outs.throughput = None outs.inferred_throughputs = None @@ -79,6 +88,15 @@ def main(args, outs): gex_chemistry_def = args.chemistry_defs[rna_library.GENE_EXPRESSION_LIBRARY_TYPE] gex_chemistry_description = gex_chemistry_def[CHEMISTRY_DESCRIPTION_FIELD] + if gex_chemistry_description in [ + chem[CHEMISTRY_DESCRIPTION_FIELD] for chem in SC_GEMX_CHEMISTRIES + ]: + # Downstream code uses "throughput" to estimate droplet counts, so GEM-X + # data needs an annotated "throughput" to handle this, even though + # it no longer supports actual throughput differences. + outs.throughput = GEMX_THROUGHPUT + return + inferred_throughputs = { "throughput_specified_by_chemistry": gex_chemistry_description, "throughput_specified_by_user": args.throughput, diff --git a/mro/rna/stages/feature/measure_perturbations/__init__.py b/mro/rna/stages/feature/measure_perturbations/__init__.py index 9e6ae33..a67d318 100644 --- a/mro/rna/stages/feature/measure_perturbations/__init__.py +++ b/mro/rna/stages/feature/measure_perturbations/__init__.py @@ -42,7 +42,7 @@ def split(args): # Sometimes this stage uses a lot of vmem. It has proven difficult to reproduce and measure. vmem_gib = 6 + 2 * mem_gib - return {"chunks": [], "join": {"__mem_gb": mem_gib, "__threads": 2, "__vmem_gb": vmem_gib}} + return {"chunks": [], "join": {"__mem_gb": mem_gib, "__threads": 5, "__vmem_gb": vmem_gib}} def join(args, outs, _chunk_defs, _chunk_outs): diff --git a/mro/rna/stages/feature/summarize_crispr_analysis/__init__.py b/mro/rna/stages/feature/summarize_crispr_analysis/__init__.py index 07b1474..f982ada 100644 --- a/mro/rna/stages/feature/summarize_crispr_analysis/__init__.py +++ b/mro/rna/stages/feature/summarize_crispr_analysis/__init__.py @@ -66,5 +66,3 @@ def main(args, outs): args.perturbation_effects_by_target, perturbation_effects_by_target_dir, ) - - return diff --git a/mro/rna/stages/multi/build_multi_graph_view/__init__.py b/mro/rna/stages/multi/build_multi_graph_view/__init__.py index 6a7d602..539d853 100644 --- a/mro/rna/stages/multi/build_multi_graph_view/__init__.py +++ b/mro/rna/stages/multi/build_multi_graph_view/__init__.py @@ -192,6 +192,13 @@ def create_graphviz_digraph(multi_graph: MultiGraph) -> AGraph: color=GraphVizColors.GREY, fillcolor=GraphVizColors.GREY, ) + elif multi_graph.is_hashtag_multiplexed(): + g_tags.add_node( + "Hashtags", + style=GraphVizProps.FILLEDSTYLE, + color=GraphVizColors.GREY, + fillcolor=GraphVizColors.GREY, + ) elif multi_graph.is_rtl_multiplexed(): g_tags.add_node( "Probe Barcode IDs", @@ -201,7 +208,7 @@ def create_graphviz_digraph(multi_graph: MultiGraph) -> AGraph: ) elif multi_graph.is_oh_multiplexed(): g_tags.add_node( - "Overhang IDs", + "OCM Barcode IDs", style=GraphVizProps.FILLEDSTYLE, color=GraphVizColors.GREY, fillcolor=GraphVizColors.GREY, diff --git a/mro/rna/stages/multi/compute_extra_multiplexing_metrics/__init__.py b/mro/rna/stages/multi/compute_extra_multiplexing_metrics/__init__.py index 260c769..3f537be 100644 --- a/mro/rna/stages/multi/compute_extra_multiplexing_metrics/__init__.py +++ b/mro/rna/stages/multi/compute_extra_multiplexing_metrics/__init__.py @@ -13,23 +13,27 @@ from __future__ import annotations +import json + import numpy as np +import cellranger.feature_ref as feature_ref +import cellranger.rna.library as rna_library import tenkit.safe_json as tk_safe_json import tenkit.stats as tk_stats from cellranger import matrix as cr_matrix from cellranger.fast_utils import MultiGraph, tag_read_counts from cellranger.feature.feature_assignments import SampleBarcodes -from cellranger.rna.library import MULTIPLEXING_LIBRARY_TYPE __MRO__ = """ -stage COMPUTE_EXTRA_MULTIPLEXING_METRICS ( - in h5 molecule_info, - in h5 filtered_feature_counts_matrix, - in json multi_graph, - in json sample_cell_barcodes, - in json non_singlet_barcodes, - out json summary, +stage COMPUTE_EXTRA_MULTIPLEXING_METRICS( + in h5 molecule_info, + in h5 filtered_feature_counts_matrix, + in json multi_graph, + in json sample_cell_barcodes, + in json non_singlet_barcodes, + in string multiplexing_method, + out json summary, src py "stages/multi/compute_extra_multiplexing_metrics", ) split ( ) using ( @@ -39,12 +43,13 @@ # calculate median CMO UMIs per singlet -def calculate_median_cmo_umis_per_singlet(fbm_fname, singlet_barcodes_json): - """Calculate the median CMO UMIs per singlet. +def calculate_median_cmo_umis_per_singlet(fbm_fname, singlet_barcodes_json, library_type): + """Calculate the median CMO or Hashtag UMIs per singlet. Args: fbm_fname: File name of filtered feature_barcode_matrix singlet_barcodes_json: the SampleBarcodes in JSON format mapping sample names to list of barcodes assigned to it + library_type: Multiplexing Capture (for CMO) or Antibody Capture (for Hashatag) Returns: dict containing the MULTIPLEXING_median_cmo_umis_per_singlet metric. @@ -52,7 +57,11 @@ def calculate_median_cmo_umis_per_singlet(fbm_fname, singlet_barcodes_json): fbm = cr_matrix.CountMatrix.load_h5_file(fbm_fname) # Subset features to multiplexing types - fbm = fbm.select_features_by_type(MULTIPLEXING_LIBRARY_TYPE) + if library_type == rna_library.MULTIPLEXING_LIBRARY_TYPE: + fbm = fbm.select_features_by_type(library_type) + else: + fbm = fbm.select_features_by_type_and_tag(library_type, feature_ref.HASHTAG_TAG) + # If not multiplexing features, return None if fbm.features_dim == 0: return None @@ -103,16 +112,21 @@ def join(args, outs, chunk_defs, chunk_outs): config = MultiGraph.from_path(args.multi_graph) + multiplexing_method = rna_library.BarcodeMultiplexingType(args.multiplexing_method) + assert multiplexing_method.is_cell_multiplexed(), "Unsupported multiplexing method!" + library_type = multiplexing_method.multiplexing_library_type() + metrics = {} - singlet_metric_name = "MULTIPLEXING_median_cmo_umis_per_singlet" - frac_reads_metric_name = "MULTIPLEXING_frac_reads_from_multiplets" + lib_prefix = rna_library.metric_prefix_map[library_type] + singlet_metric_name = f"{lib_prefix}_median_cmo_umis_per_singlet" + frac_reads_metric_name = f"{lib_prefix}_frac_reads_from_multiplets" def tag_frac_metric_name_maker(tag): return f"tag_{tag}_frac_reads_in_cells" # Caclulate median CMO UMI per singlet median_umi_per_singlet = calculate_median_cmo_umis_per_singlet( - args.filtered_feature_counts_matrix, args.sample_cell_barcodes + args.filtered_feature_counts_matrix, args.sample_cell_barcodes, library_type ) if median_umi_per_singlet is None: # Occurs if no multiplexing features @@ -130,7 +144,12 @@ def tag_frac_metric_name_maker(tag): multiplet_counts, cell_associated_counts, total_counts, - ) = tag_read_counts(mol_info, args.sample_cell_barcodes, args.non_singlet_barcodes) + ) = tag_read_counts( + mol_info, + args.sample_cell_barcodes, + args.non_singlet_barcodes, + json.dumps(args.multiplexing_method), + ) # get the list of tags from multi graph tags = set(tag for names in config.sample_tag_ids().values() for tag in names) diff --git a/mro/rna/stages/multi/determine_sample_assignments/__init__.py b/mro/rna/stages/multi/determine_sample_assignments/__init__.py index f1b2cc3..82b8d63 100644 --- a/mro/rna/stages/multi/determine_sample_assignments/__init__.py +++ b/mro/rna/stages/multi/determine_sample_assignments/__init__.py @@ -140,14 +140,14 @@ def _get_barcodes_per_tag(config: MultiGraph, args, outs): barcodes_per_tag_files = [x for x in args.barcodes_per_tag if x is not None] if config.is_multiplexed(): assert len(barcodes_per_tag_files) <= 1 - # In case of CMO multiplexing will be restricted to cell barcodes + # In case of CMO/HASHTAG multiplexing will be restricted to cell barcodes # however, in case of RTL & OH multiplexing will include cell and non-cell barcodes - # CMO multiplexing produces nothing if no cells are called + # CMO/HASHTAG multiplexing produces nothing if no cells are called barcodes_per_tag_file = ( None if len(barcodes_per_tag_files) == 0 else barcodes_per_tag_files[0] ) barcodes_per_tag = CellsPerFeature.load_from_file(barcodes_per_tag_file) - if config.is_cmo_multiplexed(): + if config.is_cmo_multiplexed() or config.is_hashtag_multiplexed(): if barcodes_per_tag_file is not None: hardlink_with_fallback(barcodes_per_tag_file, outs.cells_per_tag) else: diff --git a/mro/rna/stages/multi/disable_multi_core_stages/__init__.py b/mro/rna/stages/multi/disable_multi_core_stages/__init__.py new file mode 100644 index 0000000..fa3fa11 --- /dev/null +++ b/mro/rna/stages/multi/disable_multi_core_stages/__init__.py @@ -0,0 +1,46 @@ +# +# Copyright (c) 2024 10X Genomics, Inc. All rights reserved. +# +"""A helper stage to disable stages in SC_MULTI_CORE.""" + +import martian + +__MRO__ = """ +stage DISABLE_MULTI_CORE_STAGES( + in bool is_pd, + in bool disable_gex, + in bool disable_multi_count, + in bool disable_count, + in bool no_secondary_analysis, + in bool skip_cell_annotation, + out bool disable_sample_cas_celltyping, + out bool disable_library_cas_celltyping, + src py "stages/multi/disable_multi_core_stages", +) using ( + volatile = strict, +) +""" + + +def main(args, outs): + disable_cell_typing_totally = ( + bool(args.disable_gex) + or bool(args.no_secondary_analysis) + or bool(args.skip_cell_annotation) + ) + if args.disable_gex: + martian.alarm( + "Not running cell annotation as there is no gene expression library in sample!" + ) + if args.no_secondary_analysis: + martian.alarm("Not running cell annotation as secondary analysis has been disabled!") + + outs.disable_sample_cas_celltyping = disable_cell_typing_totally or bool( + args.disable_multi_count + ) + outs.disable_library_cas_celltyping = disable_cell_typing_totally or bool(args.disable_count) + + # dont run cell typing at library level if it is run at sample level + outs.disable_library_cas_celltyping = outs.disable_library_cas_celltyping or ( + not outs.disable_sample_cas_celltyping + ) diff --git a/mro/rna/stages/multi/generate_library_plots/__init__.py b/mro/rna/stages/multi/generate_library_plots/__init__.py index 78e759a..0a6b506 100644 --- a/mro/rna/stages/multi/generate_library_plots/__init__.py +++ b/mro/rna/stages/multi/generate_library_plots/__init__.py @@ -9,6 +9,7 @@ """ from __future__ import annotations +import csv import json import pickle @@ -17,12 +18,14 @@ import cellranger.rna.library as rna_library import cellranger.utils as cr_utils import tenkit.safe_json as tk_safe_json +from cellranger.analysis.singlegenome import UMAP_NAME from cellranger.feature.feature_assignments import CellsPerFeature +from cellranger.feature_ref import HASHTAG_TAG from cellranger.multi.barcode_rank_plots import write_library_to_barcode_rank_json from cellranger.reference_paths import get_reference_genomes from cellranger.webshim.jibes_web import make_jibes_biplot_histogram -from cellranger.websummary.analysis_tab_aux import cmo_tags_on_tsne_from_path -from cellranger.websummary.analysis_tab_core import umi_on_tsne_from_path +from cellranger.websummary.analysis_tab_aux import cmo_tags_on_umap_from_path +from cellranger.websummary.analysis_tab_core import umi_on_projection_from_path from cellranger.websummary.react_components import ReactComponentEncoder __MRO__ = """ @@ -34,15 +37,15 @@ in path reference_path, # for jibes biplot in pickle tag_assigner_pickle, - # for cmo TSNE plot + # for cmo UMAP plot in path analysis, in json cells_per_tag, in json non_singlet_barcodes, in BarcodeAssignments force_sample_barcodes, - in bool multiplexing_is_not_cmo, + in string multiplexing_method, out json library_to_barcode_rank, out json jibes_biplot_histogram, - out json cmo_tsne_plot, + out json cmo_projection_plot, src py "stages/multi/generate_library_plots", ) using ( mem_gb = 8, @@ -56,14 +59,18 @@ def main(args, outs): outs.library_to_barcode_rank = None outs.jibes_biplot = None outs.targeted_plot = None - outs.cmo_tsne_plot = None + outs.cmo_projection_plot = None return # BARCODE RANK PLOTS FOR MULTI WEBSUMMARY # read in data barcode_summary = h5py.File(args.barcode_summary_h5, "r") - genomes = get_reference_genomes(args.reference_path) + if args.reference_path: + genomes = get_reference_genomes(args.reference_path) + else: + with open(args.filtered_barcodes) as f: + genomes = sorted(set(x[0] for x in csv.reader(f))) cell_barcodes = ( cr_utils.get_cell_associated_barcode_set(args.filtered_barcodes) if args.filtered_barcodes @@ -80,41 +87,54 @@ def main(args, outs): cells_per_tag = args.force_sample_barcodes["cells_per_tag"] or args.cells_per_tag if ( - not args.multiplexing_is_not_cmo + args.multiplexing_method is not None + and rna_library.BarcodeMultiplexingType(args.multiplexing_method).is_cell_multiplexed() and args.analysis is not None and cells_per_tag is not None and args.non_singlet_barcodes is not None ): - cmo_umi_tsne_plot = umi_on_tsne_from_path( - args.analysis, library_type=rna_library.MULTIPLEXING_LIBRARY_TYPE - ) - cmo_umi_tsne_plot["layout"]["title"] = None + multiplexing_method = rna_library.BarcodeMultiplexingType(args.multiplexing_method) + if multiplexing_method.type == rna_library.CellLevel.Hashtag: + cmo_umi_projection_plot = umi_on_projection_from_path( + args.analysis, + projection=UMAP_NAME, + library_type=multiplexing_method.multiplexing_library_type(), + tag_type=HASHTAG_TAG, + ) + else: + cmo_umi_projection_plot = umi_on_projection_from_path( + args.analysis, + projection=UMAP_NAME, + library_type=multiplexing_method.multiplexing_library_type(), + ) + cmo_umi_projection_plot["layout"]["title"] = None cells_per_tag = CellsPerFeature.load_from_file(cells_per_tag) non_singlet_barcodes = CellsPerFeature.load_from_file(args.non_singlet_barcodes) - cmo_tags_tsne_plot = cmo_tags_on_tsne_from_path( + cmo_tags_projection_plot = cmo_tags_on_umap_from_path( args.analysis, cells_per_tag, non_singlet_barcodes, + multiplexing_method, ) - cmo_tags_tsne_plot["layout"]["title"] = None + cmo_tags_projection_plot["layout"]["title"] = None - cmo_tsne_plot = { - "cmo_umi_tsne_plot": cmo_umi_tsne_plot, - "cmo_tags_tsne_plot": cmo_tags_tsne_plot, + cmo_projection_plot = { + "cmo_umi_projection_plot": cmo_umi_projection_plot, + "cmo_tags_projection_plot": cmo_tags_projection_plot, } - with open(outs.cmo_tsne_plot, "w") as out: + with open(outs.cmo_projection_plot, "w") as out: json.dump( - tk_safe_json.json_sanitize(cmo_tsne_plot), + tk_safe_json.json_sanitize(cmo_projection_plot), out, sort_keys=True, indent=4, cls=ReactComponentEncoder, ) else: - outs.cmo_tsne_plot = None + outs.cmo_projection_plot = None if args.tag_assigner_pickle is not None and force_sample_barcodes is None: with open(args.tag_assigner_pickle, "rb") as p: diff --git a/mro/rna/stages/multi/generate_sample_plots/__init__.py b/mro/rna/stages/multi/generate_sample_plots/__init__.py index 326a969..78b3890 100644 --- a/mro/rna/stages/multi/generate_sample_plots/__init__.py +++ b/mro/rna/stages/multi/generate_sample_plots/__init__.py @@ -2,7 +2,7 @@ # # Copyright (c) 2022 10X Genomics, Inc. All rights reserved. # -"""For a single sample, generate the gene expression clustering/tsne plots, antibody clustering/tsne plots,. +"""For a single sample, generate the gene expression clustering/umap plots, antibody clustering/umap plots,. and sample-level rank plots as plotly JSON, so that they can be passed forward to the WRITE_MULTI_WEB_SUMMARY_JSON stage and inserted into the sample web summary @@ -14,12 +14,12 @@ import h5py import cellranger.rna.library as rna_library -from cellranger import matrix as cr_matrix +from cellranger.analysis.singlegenome import UMAP_NAME +from cellranger.matrix import CountMatrix from cellranger.multi.barcode_rank_plots import write_library_to_barcode_rank_json -from cellranger.reference_paths import get_reference_genomes from cellranger.websummary.analysis_tab_core import ( - tsne_diffexp_plots_from_path, - umi_on_tsne_from_path, + projection_diffexp_plots_from_path, + umi_on_projection_from_path, ) from cellranger.websummary.react_components import ReactComponentEncoder from cellranger.websummary.treemaps import MIN_ANTIBODY_UMI, make_antibody_treemap_plot @@ -30,8 +30,7 @@ in h5 raw_matrices_h5, in path analysis, in h5 barcode_summary, - in path reference_path, - out json sample_tsne_plots, + out json sample_projection_plots, out json sample_library_to_barcode_rank, out json sample_treemap_plots, src py "stages/multi/generate_sample_plots", @@ -47,20 +46,19 @@ ("antibody_diffexp_clustering_plots", rna_library.ANTIBODY_LIBRARY_TYPE), ] -# pairs colored-by-UMI TSNE plot names with library types -# names should be kept in sync with SampleTsnePlots field names in write_websummary_json.rs -UMI_ON_TSNE_PLOT_NAMES = [ - ("antibody_umi_on_tsne", rna_library.ANTIBODY_LIBRARY_TYPE), - ("crispr_umi_on_tsne", rna_library.CRISPR_LIBRARY_TYPE), - ("custom_umi_on_tsne", rna_library.CUSTOM_LIBRARY_TYPE), +# pairs colored-by-UMI UMAP plot names with library types +# names should be kept in sync with SampleUmapPlots field names in write_websummary_json.rs +UMI_ON_UMAP_PLOT_NAMES = [ + ("antibody_umi_on_umap", rna_library.ANTIBODY_LIBRARY_TYPE), + ("crispr_umi_on_umap", rna_library.CRISPR_LIBRARY_TYPE), + ("custom_umi_on_umap", rna_library.CUSTOM_LIBRARY_TYPE), ] def split(args): - _features, _cells, nnz = cr_matrix.CountMatrix.load_dims_from_h5(args.matrices_h5) + _features, _cells, nnz = CountMatrix.load_dims_from_h5(args.matrices_h5) mem_gib = ceil( - cr_matrix.CountMatrix.get_mem_gb_from_matrix_h5(args.matrices_h5) - + (3 + 31 * nnz / 1024**3) + CountMatrix.get_mem_gb_from_matrix_h5(args.matrices_h5) + (3 + 31 * nnz / 1024**3) ) return { @@ -69,43 +67,48 @@ def split(args): } -def write_tsne_plots(args, outs): - """Write t-SNE plots.""" +def write_umap_plots(args, outs): + """Write UMAP plots.""" if args.analysis is None: - outs.sample_tsne_plots = None + outs.sample_projection_plots = None return - # build tsne/clustering, differential expression plots for gene expression - library_types = cr_matrix.CountMatrix.load_library_types_from_h5_file(args.matrices_h5) - tsne_plots = { - plot_name: tsne_diffexp_plots_from_path(args.analysis, library_type=library_type) - if library_type in library_types - else None + # build umap/clustering, differential expression plots for gene expression + library_types = CountMatrix.load_library_types_from_h5_file(args.matrices_h5) + umap_plots = { + plot_name: ( + projection_diffexp_plots_from_path( + args.analysis, projection=UMAP_NAME, library_type=library_type + ) + if library_type in library_types + else None + ) for plot_name, library_type in DIFFEXP_CLUSTERING_PLOT_NAMES } - tsne_plots.update( - (plot_name, umi_on_tsne_from_path(args.analysis, library_type=library_type)) - for plot_name, library_type in UMI_ON_TSNE_PLOT_NAMES + umap_plots.update( + ( + plot_name, + umi_on_projection_from_path( + args.analysis, projection=UMAP_NAME, library_type=library_type + ), + ) + for plot_name, library_type in UMI_ON_UMAP_PLOT_NAMES ) - with open(outs.sample_tsne_plots, "w") as out: - json.dump(tsne_plots, out, sort_keys=True, cls=ReactComponentEncoder) + with open(outs.sample_projection_plots, "w") as out: + json.dump(umap_plots, out, sort_keys=True, cls=ReactComponentEncoder) def write_barcode_rank_plots(args, outs): """Write per-sample barcode-rank plots.""" - # FIXME: would be better to load this directly into a set instead of - # building a list first. - cell_barcodes = set(cr_matrix.CountMatrix.load_bcs_from_h5(args.matrices_h5)) + genomes = CountMatrix.get_genomes_from_h5(args.matrices_h5) + cell_barcodes = set(CountMatrix.load_bcs_from_h5(args.matrices_h5)) barcode_summary = h5py.File(args.barcode_summary, "r") - genomes = get_reference_genomes(args.reference_path) # If raw matrix for this specific sample is available, restrict to those barcodes in rank plot restrict_barcodes = ( - None - if args.raw_matrices_h5 is None - else cr_matrix.CountMatrix.load_bcs_from_h5(args.raw_matrices_h5) + None if args.raw_matrices_h5 is None else CountMatrix.load_bcs_from_h5(args.raw_matrices_h5) ) write_library_to_barcode_rank_json( @@ -119,28 +122,26 @@ def write_barcode_rank_plots(args, outs): def call_make_treemap(filtered_matrix, lib_type): """Generates inputs for make_antibody_treemap_plot function.""" - filtered_counts_matrix = cr_matrix.CountMatrix.load_h5_file( - filtered_matrix - ).select_features_by_type(lib_type) + filtered_counts_matrix = CountMatrix.load_h5_file(filtered_matrix).select_features_by_type( + lib_type + ) return make_antibody_treemap_plot(filtered_counts_matrix, lib_type, MIN_ANTIBODY_UMI, False) def write_treemap_plots(args, outs): """Write per-sample treemap feature UMI distribution plots.""" - # build tsne/clustering, differential expression plots for antigen and antibody - sample_library_types = cr_matrix.CountMatrix.load_library_types_from_h5_file(args.matrices_h5) - + # build UMAP/clustering, differential expression plots for antigen and antibody + sample_library_types = CountMatrix.load_library_types_from_h5_file(args.matrices_h5) treemap_plots = { library_type: call_make_treemap(args.matrices_h5, library_type) for library_type in sample_library_types if library_type in [rna_library.ANTIBODY_LIBRARY_TYPE, rna_library.ANTIGEN_LIBRARY_TYPE] } - with open(outs.sample_treemap_plots, "w") as out: json.dump(treemap_plots, out, sort_keys=True, cls=ReactComponentEncoder) def join(args, outs, _chunk_defs, _chunk_outs): - write_tsne_plots(args, outs) + write_umap_plots(args, outs) write_barcode_rank_plots(args, outs) write_treemap_plots(args, outs) diff --git a/mro/rna/stages/multi/make_multi_gem_rna_aggr_sample_defs/__init__.py b/mro/rna/stages/multi/make_multi_gem_rna_aggr_sample_defs/__init__.py deleted file mode 100644 index 41f8b50..0000000 --- a/mro/rna/stages/multi/make_multi_gem_rna_aggr_sample_defs/__init__.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2020 10X Genomics, Inc. All rights reserved. -# -"""When merging metrics and files from multiple gem wells, the aggr pipeline is used. - -to do a lot of the heavy lifting of generating combined molecule info, matrices etc. -This stage generates the aggr sample defs and aggr CSV that are passed to aggr to do this. -Each sample in the sample def specifies a different gem well. -""" -import cellranger.constants as cr_constants - -__MRO__ = """ -struct CountAggrSampleDef( - string library_id, - h5 molecule_h5, -) - -stage MAKE_MULTI_GEM_RNA_AGGR_SAMPLE_DEFS( - in int[] gem_groups, - in h5[] molecule_info, - out CountAggrSampleDef[] sample_defs, - out csv aggr_csv, - src py "stages/multi/make_multi_gem_rna_aggr_sample_defs", -) using ( - volatile = strict, -) -""" - - -def main(args, outs): - assert len(args.gem_groups) == len(args.molecule_info) - - outs.sample_defs = [] - with open(outs.aggr_csv, "w") as outfile: - print( - f"{cr_constants.AGG_ID_FIELD},{cr_constants.AGG_H5_FIELD}", - file=outfile, - ) - - for gem_group, molecule_info in zip(args.gem_groups, args.molecule_info): - gem_group_label = f"gem_group_{gem_group}" - # write CSV line - print(f"{gem_group_label},{molecule_info}", file=outfile) - - # add sample def - sample_def = { - cr_constants.AGG_ID_FIELD: gem_group_label, - cr_constants.AGG_H5_FIELD: molecule_info, - } - outs.sample_defs.append(sample_def) diff --git a/mro/rna/stages/multi/multi_write_per_sample_matrices/__init__.py b/mro/rna/stages/multi/multi_write_per_sample_matrices/__init__.py index d1e4f97..af0d231 100644 --- a/mro/rna/stages/multi/multi_write_per_sample_matrices/__init__.py +++ b/mro/rna/stages/multi/multi_write_per_sample_matrices/__init__.py @@ -54,7 +54,7 @@ def split(args): - mem_gib = 3 + cr_matrix.CountMatrix.get_mem_gb_from_matrix_h5(args.raw_matrix_h5, scale=1.5) + mem_gib = 4 + cr_matrix.CountMatrix.get_mem_gb_from_matrix_h5(args.raw_matrix_h5, scale=1.5) return { "chunks": [ { @@ -64,7 +64,7 @@ def split(args): for sample_id in MultiGraph.from_path(args.multi_graph).sample_ids() ], "join": { - "__mem_gb": 3, + "__mem_gb": 1, }, } @@ -139,7 +139,13 @@ def load_sample_barcodes(barcodes_file: str) -> list[str]: has_header=False, ) - if args.aggregate_barcodes is not None: + multi_graph = MultiGraph.from_path(args.multi_graph) + + if ( + args.aggregate_barcodes is not None + and not multi_graph.is_cmo_multiplexed() + and not multi_graph.is_hashtag_multiplexed() + ): sample_aggregate_barcodes_csv = martian.make_path( f"{args.sample}_aggregate_barcodes.csv" ).decode("utf8") diff --git a/mro/rna/stages/multi/multiplexing_method/__init__.py b/mro/rna/stages/multi/multiplexing_method/__init__.py index 9dc92ea..0319b27 100644 --- a/mro/rna/stages/multi/multiplexing_method/__init__.py +++ b/mro/rna/stages/multi/multiplexing_method/__init__.py @@ -4,16 +4,18 @@ # """A helper stage to determine method used for multiplexed data.""" +import cellranger.rna.library as rna_library from cellranger.fast_utils import MultiGraph __MRO__ = """ stage MULTIPLEXING_METHOD( - in json multi_graph, - out bool multiplexing_is_not_rtl, - out bool multiplexing_is_not_cmo, - out bool multiplexing_is_not_oh, - out bool output_per_sample_raw_matrix, - src py "../rna/stages/multi/multiplexing_method", + in json multi_graph, + out bool multiplexing_is_not_rtl, + out bool multiplexing_is_not_cmo_or_hashtag, + out bool multiplexing_is_not_oh, + out bool output_per_sample_raw_matrix, + out string multiplexing_method, + src py "../rna/stages/multi/multiplexing_method", ) using ( mem_gb = 1, threads = 1, @@ -25,8 +27,9 @@ def main(args, outs): if args.multi_graph is None: outs.multiplexing_is_not_rtl = True - outs.multiplexing_is_not_cmo = True + outs.multiplexing_is_not_cmo_or_hashtag = True outs.multiplexing_is_not_oh = True + outs.multiplexing_method = None return # Read in the multi graph @@ -34,21 +37,31 @@ def main(args, outs): if config.is_cmo_multiplexed(): outs.multiplexing_is_not_rtl = True - outs.multiplexing_is_not_cmo = False + outs.multiplexing_is_not_cmo_or_hashtag = False outs.multiplexing_is_not_oh = True outs.output_per_sample_raw_matrix = False + outs.multiplexing_method = rna_library.CellLevel.CMO.value + elif config.is_hashtag_multiplexed(): + outs.multiplexing_is_not_rtl = True + outs.multiplexing_is_not_cmo_or_hashtag = False + outs.multiplexing_is_not_oh = True + outs.output_per_sample_raw_matrix = False + outs.multiplexing_method = rna_library.CellLevel.Hashtag.value elif config.is_rtl_multiplexed(): outs.multiplexing_is_not_rtl = False - outs.multiplexing_is_not_cmo = True + outs.multiplexing_is_not_cmo_or_hashtag = True outs.multiplexing_is_not_oh = True outs.output_per_sample_raw_matrix = True + outs.multiplexing_method = rna_library.ReadLevel.RTL.value elif config.is_oh_multiplexed(): outs.multiplexing_is_not_rtl = True - outs.multiplexing_is_not_cmo = True + outs.multiplexing_is_not_cmo_or_hashtag = True outs.multiplexing_is_not_oh = False outs.output_per_sample_raw_matrix = True + outs.multiplexing_method = rna_library.ReadLevel.OH.value else: outs.multiplexing_is_not_rtl = True - outs.multiplexing_is_not_cmo = True + outs.multiplexing_is_not_cmo_or_hashtag = True outs.multiplexing_is_not_oh = True outs.output_per_sample_raw_matrix = False + outs.multiplexing_method = None diff --git a/mro/rna/stages/multi/sanitize_map_calls/__init__.py b/mro/rna/stages/multi/sanitize_map_calls/__init__.py index bbf3dc9..4278ab6 100644 --- a/mro/rna/stages/multi/sanitize_map_calls/__init__.py +++ b/mro/rna/stages/multi/sanitize_map_calls/__init__.py @@ -14,7 +14,7 @@ in map in_rna_analysis, in map in_cloupe_file, in map in_metrics_summary, - in map in_sample_tsne_plots, + in map in_sample_projection_plots, in map in_sample_barcode_rank_plots, in map in_sample_treemap_plots, in map in_vdj_t_analyzer, @@ -24,7 +24,7 @@ out map rna_analysis, out map cloupe_file, out map metrics_summary, - out map sample_tsne_plots, + out map sample_projection_plots, out map sample_barcode_rank_plots, out map sample_treemap_plots, out map vdj_t_analyzer, @@ -32,8 +32,9 @@ out map vdj_b_analyzer, src py "stages/multi/sanitize_map_calls", ) using ( - volatile = strict, -) + volatile = false, +) retain ( + metrics_summary, """ @@ -102,9 +103,10 @@ def __init__(self): self.productive_cell_barcodes = None self.filter_summary = None self.filter_metrics = None - self.contig_summary = None + self.per_bc_filters = None self.umi_summary = None self.barcode_brief = None + self.report = None # pylint: disable=invalid-name @@ -123,7 +125,7 @@ def main(args, outs): outs.crispr_analysis = cr_io.recursive_hard_link_dict(args.in_crispr_analysis) outs.cloupe_file = cr_io.recursive_hard_link_dict(args.in_cloupe_file) outs.metrics_summary = cr_io.recursive_hard_link_dict(args.in_metrics_summary) - outs.sample_tsne_plots = cr_io.recursive_hard_link_dict(args.in_sample_tsne_plots) + outs.sample_projection_plots = cr_io.recursive_hard_link_dict(args.in_sample_projection_plots) outs.sample_barcode_rank_plots = cr_io.recursive_hard_link_dict( args.in_sample_barcode_rank_plots ) diff --git a/mro/rna/stages/spatial/check_correction_factor/stub.py b/mro/rna/stages/spatial/check_correction_factor/stub.py index b72ee50..2e95496 100644 --- a/mro/rna/stages/spatial/check_correction_factor/stub.py +++ b/mro/rna/stages/spatial/check_correction_factor/stub.py @@ -5,9 +5,9 @@ __MRO__ = """ stage COMPUTE_CORRECTION_FACTOR( - in h5 v1_filtered_fbm, - in h5 filtered_fbm, - src py "stages/spatial/check_correction_factor", + in V1PatternFixArgs v1_pattern_fix, + in h5 filtered_fbm, + src py "stages/spatial/check_correction_factor", ) """ diff --git a/mro/rna/stages/spatial/compute_correction_factor/stub.py b/mro/rna/stages/spatial/compute_correction_factor/stub.py index 75d2911..78af9bf 100644 --- a/mro/rna/stages/spatial/compute_correction_factor/stub.py +++ b/mro/rna/stages/spatial/compute_correction_factor/stub.py @@ -5,12 +5,12 @@ __MRO__ = """ stage COMPUTE_CORRECTION_FACTOR( - in h5 v1_filtered_fbm, - in json barcodes_under_tissue, - out float correction_factor, - out json affected_barcodes, - out bool disable_downsampling, - src py "stages/spatial/compute_correction_factor", + in V1PatternFixArgs v1_pattern_fix, + in json barcodes_under_tissue, + out float correction_factor, + out json affected_barcodes, + out bool disable_downsampling, + src py "stages/spatial/compute_correction_factor", ) """ diff --git a/mro/rna/stages/spatial/disable_correction_factor/__init__.py b/mro/rna/stages/spatial/disable_correction_factor/__init__.py index 6f3e05e..9c97a44 100644 --- a/mro/rna/stages/spatial/disable_correction_factor/__init__.py +++ b/mro/rna/stages/spatial/disable_correction_factor/__init__.py @@ -3,7 +3,7 @@ __MRO__ = """ stage DISABLE_CORRECTION_FACTOR( - in h5 v1_filtered_fbm, + in V1PatternFixArgs v1_pattern_fix, out bool disable_correction_factor, src py "stages/spatial/disable_correction_factor", ) @@ -11,4 +11,4 @@ def main(args, outs): - outs.disable_correction_factor = not bool(args.v1_filtered_fbm) + outs.disable_correction_factor = args.v1_pattern_fix is None diff --git a/mro/rna/stages/targeted/calculate_targeted_metrics/__init__.py b/mro/rna/stages/targeted/calculate_targeted_metrics/__init__.py index 9a247ae..8504a4b 100644 --- a/mro/rna/stages/targeted/calculate_targeted_metrics/__init__.py +++ b/mro/rna/stages/targeted/calculate_targeted_metrics/__init__.py @@ -9,14 +9,13 @@ """ import json -import math -import os +from typing import Any import numpy as np -import cellranger.matrix as cr_matrix import cellranger.pandas_utils as pdu import tenkit.safe_json as tk_safe_json +from cellranger.matrix import CountMatrix from cellranger.molecule_counter import MoleculeCounter from cellranger.pandas_utils import FEATURE_DF_UMI_COL from cellranger.rna.library import GENE_EXPRESSION_LIBRARY_TYPE @@ -41,6 +40,8 @@ out csv per_feature_metrics_csv, src py "stages/targeted/calculate_targeted_metrics", ) split ( +) using ( + volatile = strict, ) """ @@ -50,15 +51,15 @@ def split(args): - fbm_bytes = os.stat(args.filtered_gene_bc_matrices).st_size - mem_gib = 3 + math.ceil(11.7 * fbm_bytes / 1024**3) - print(f"{fbm_bytes=},{mem_gib=}") + _, num_barcodes, nnz = CountMatrix.load_dims_from_h5(args.filtered_gene_bc_matrices) + mem_gib = max(4, 0.5 + CountMatrix.get_mem_gb_from_matrix_dim(num_barcodes, nnz, scale=1.0)) + print(f"{num_barcodes=},{nnz=},{mem_gib=}") return {"chunks": [], "join": {"__mem_gb": mem_gib}} # pylint: disable=invalid-name, singleton-comparison def get_enrichment_metrics( - is_spatial, + is_spatial: bool, pfm, disable_rpu_enrichments, method=OFFTARGETS_ONLY, @@ -217,7 +218,7 @@ def get_enrichment_metrics( return pfm, enrichment_calc_metrics -def get_mean_per_gene_rpu_metrics(is_spatial, pfm): +def get_mean_per_gene_rpu_metrics(is_spatial: bool, pfm): """Compute reads per UMI statistics per gene, for targeted and off-target genes.""" per_gene_rpu_metrics = {} @@ -251,9 +252,9 @@ def get_mean_per_gene_rpu_metrics(is_spatial, pfm): per_gene_rpu_metrics[ f"mean_reads_per_umi_per_gene{in_cells_suffix}_{target_suffix}" ] = mean_rpu - per_gene_rpu_metrics[ - f"cv_reads_per_umi_per_gene{in_cells_suffix}_{target_suffix}" - ] = cv_rpu + per_gene_rpu_metrics[f"cv_reads_per_umi_per_gene{in_cells_suffix}_{target_suffix}"] = ( + cv_rpu + ) per_gene_rpu_metrics[ f"median_reads_per_umi_per_gene{in_cells_suffix}_{target_suffix}" ] = median_rpu @@ -267,16 +268,19 @@ def get_mean_per_gene_rpu_metrics(is_spatial, pfm): return per_gene_rpu_metrics -def get_feature_summary_df(molecule_info_fn): +def get_feature_summary_df(molecule_info_fn, genome: str | None = None): """Returns a dataframe with UMI and read counts per gene.""" with MoleculeCounter.open(molecule_info_fn, "r") as mc: feature_summary_df = pdu.collapse_feature_counts( mc, filter_library_idx=mc.get_library_indices_by_type()[GENE_EXPRESSION_LIBRARY_TYPE], + barcode_genome=genome, ) feature_ref = mc.feature_reference target_gene_indices = feature_ref.get_target_feature_indices() target_gene_ids = [feature_ref.feature_defs[i].id for i in target_gene_indices] + if genome is not None: + feature_summary_df = feature_summary_df[feature_summary_df.genome == genome] # filter to GEX features feature_summary_df = feature_summary_df[ @@ -306,80 +310,138 @@ def join(args, outs, chunk_defs, chunk_outs): # need to translate and use a couple metrics from the original summary with open(args.basic_counter_summary) as in_f: basic_counter_metrics = json.load(in_f) - targeted_metrics = {} - - # add a few useful metrics from count matrix to targeted metrics - matrix = cr_matrix.CountMatrix.load_h5_file(args.filtered_gene_bc_matrices) - target_feature_indices = matrix.feature_ref.get_target_feature_indices() - matrix_view = matrix.view().select_features(target_feature_indices) - - median_on_target_umis_per_cell = np.nanmedian(matrix_view.sum(axis=0)) - median_on_target_genes_per_cell = np.nanmedian(matrix_view.count_ge(axis=0, threshold=1)) - _, num_cells, _ = cr_matrix.CountMatrix.load_dims_from_h5(args.filtered_gene_bc_matrices) - - with MoleculeCounter.open(args.molecule_info, "r") as mc: - gex_library_indices = mc.get_library_indices_by_type()[GENE_EXPRESSION_LIBRARY_TYPE] - raw_reads_per_lib = mc.get_raw_read_pairs_per_library() - total_reads = np.sum([raw_reads_per_lib[idx] for idx in gex_library_indices]) - # This can be a NaN so need to convert before multiplying below - multi_transcriptome_targeted_conf_mapped_reads_frac_float = float( - basic_counter_metrics["multi_transcriptome_targeted_conf_mapped_reads_frac"] - ) - mean_targeted_reads_per_cell = robust_divide( - multi_transcriptome_targeted_conf_mapped_reads_frac_float * total_reads, - num_cells, - ) - targeted_metrics.update( - { - "median_umis_per_cell_on_target": median_on_target_umis_per_cell, - "median_genes_per_cell_on_target": median_on_target_genes_per_cell, - "total_targeted_reads_per_filtered_bc": mean_targeted_reads_per_cell, - # rewrite these metrics with usual suffix notation for easier use in WS - "multi_frac_conf_transcriptomic_reads_on_target": basic_counter_metrics[ - "multi_transcriptome_targeted_conf_mapped_reads_frac" - ], - "multi_frac_conf_transcriptomic_reads_off_target": basic_counter_metrics[ - "multi_transcriptome_untargeted_conf_mapped_reads_frac" - ], - } - ) + all_targeted_metrics: dict[str, Any] = dict() # add a warning flag if we're processing an unsupported targeted panel for spatial if args.is_spatial: with open(args.target_panel_summary) as in_f: target_panel_summary = json.load(in_f) - targeted_metrics["targeted_unsupported_panel"] = ( + all_targeted_metrics["targeted_unsupported_panel"] = ( target_panel_summary["target_panel_type"] in SPATIAL_TARGET_DISALLOWED_PANEL_TYPES ) # get table of per_feature_metrics - feature_summary_df = get_feature_summary_df(args.molecule_info) - - # add targeted sequencing saturation - total_targeted_reads = feature_summary_df[feature_summary_df[TARGETING_COLNAME]][ - "num_reads" - ].sum() - total_targeted_umis = feature_summary_df[feature_summary_df[TARGETING_COLNAME]][ - "num_umis" - ].sum() - targeted_sequencing_saturation = robust_divide( - total_targeted_reads - total_targeted_umis, total_targeted_reads - ) - targeted_metrics["multi_cdna_pcr_dupe_reads_frac_on_target"] = targeted_sequencing_saturation - # get RPU metrics - targeted_metrics.update(get_mean_per_gene_rpu_metrics(args.is_spatial, feature_summary_df)) - disable_rpu_enrichments = np.isnan(targeted_metrics[TARGETED_RPU_METRIC_KEY]) or ( - targeted_metrics[TARGETED_RPU_METRIC_KEY] < MIN_RPU_THRESHOLD - ) + # add a few useful metrics from count matrix to targeted metrics + matrix = CountMatrix.load_h5_file(args.filtered_gene_bc_matrices) + all_target_feature_indices = matrix.feature_ref.get_target_feature_indices() + assert all_target_feature_indices is not None, "Targeted panel not found in feature reference." + genomes = [g for g in matrix.feature_ref.get_genomes() if g != ""] + if len(genomes) < 2: + genomes = [None] + else: + genomes = [None] + genomes + for genome in genomes: + targeted_metrics = dict() + feature_summary_df = get_feature_summary_df( + args.molecule_info, + genome=genome, + ) + if genome is None: + metric_prefix = "" + target_feature_by_genome_indices = all_target_feature_indices + else: + metric_prefix = f"{genome}_" + target_feature_by_genome_indices = sorted( + set(all_target_feature_indices).intersection( + matrix.feature_ref.get_feature_indices_by_genome(genome) + ) + ) + matrix_view = matrix.view().select_features(target_feature_by_genome_indices) + + median_on_target_umis_per_cell = np.nanmedian(matrix_view.sum(axis=0)) + median_on_target_genes_per_cell = np.nanmedian(matrix_view.count_ge(axis=0, threshold=1)) + _, num_cells, _ = CountMatrix.load_dims_from_h5(args.filtered_gene_bc_matrices) + + with MoleculeCounter.open(args.molecule_info, "r") as mc: + gex_library_indices = mc.get_library_indices_by_type()[GENE_EXPRESSION_LIBRARY_TYPE] + raw_reads_per_lib = mc.get_raw_read_pairs_per_library() + total_reads = np.sum([raw_reads_per_lib[idx] for idx in gex_library_indices]) + # This can be a NaN so need to convert before multiplying below + multi_transcriptome_targeted_conf_mapped_reads_frac_float = float( + basic_counter_metrics["multi_transcriptome_targeted_conf_mapped_reads_frac"] + ) + mean_targeted_reads_per_cell = robust_divide( + multi_transcriptome_targeted_conf_mapped_reads_frac_float * total_reads, + num_cells, + ) + targeted_metrics.update( + { + f"{metric_prefix}median_umis_per_cell_on_target": median_on_target_umis_per_cell, + f"{metric_prefix}median_genes_per_cell_on_target": median_on_target_genes_per_cell, + f"{metric_prefix}total_targeted_reads_per_filtered_bc": mean_targeted_reads_per_cell, + # rewrite these metrics with usual suffix notation for easier use in WS + f"{metric_prefix}multi_frac_conf_transcriptomic_reads_on_target": basic_counter_metrics[ + "multi_transcriptome_targeted_conf_mapped_reads_frac" + ], + f"{metric_prefix}multi_frac_conf_transcriptomic_reads_off_target": basic_counter_metrics[ + "multi_transcriptome_untargeted_conf_mapped_reads_frac" + ], + } + ) - # get per gene enrichments - feature_summary_df, enrichment_calc_metrics = get_enrichment_metrics( - args.is_spatial, feature_summary_df, disable_rpu_enrichments, method=BOTH_TIED - ) - targeted_metrics.update(enrichment_calc_metrics) + # add targeted sequencing saturation + total_targeted_reads = feature_summary_df[feature_summary_df[TARGETING_COLNAME]][ + "num_reads" + ].sum() + total_targeted_umis = feature_summary_df[feature_summary_df[TARGETING_COLNAME]][ + "num_umis" + ].sum() + targeted_sequencing_saturation = robust_divide( + total_targeted_reads - total_targeted_umis, total_targeted_reads + ) + targeted_metrics[f"{metric_prefix}multi_cdna_pcr_dupe_reads_frac_on_target"] = ( + targeted_sequencing_saturation + ) - feature_summary_df.to_csv(outs.per_feature_metrics_csv, index=False) + # get RPU metrics + targeted_metrics.update( + { + f"{metric_prefix}{k}": v + for k, v in get_mean_per_gene_rpu_metrics( + args.is_spatial, + feature_summary_df, + ).items() + } + ) + disable_rpu_enrichments = np.isnan( + targeted_metrics[metric_prefix + TARGETED_RPU_METRIC_KEY] + ) or (targeted_metrics[metric_prefix + TARGETED_RPU_METRIC_KEY] < MIN_RPU_THRESHOLD) + + # get per gene enrichments + feature_summary_df, enrichment_calc_metrics = get_enrichment_metrics( + args.is_spatial, + feature_summary_df, + disable_rpu_enrichments, + method=BOTH_TIED, + ) + targeted_metrics.update( + {f"{metric_prefix}{k}": v for k, v in enrichment_calc_metrics.items()} + ) + + if genome is None: + # For the input unfiltered by genome, output all metrics + CSV + all_targeted_metrics.update(targeted_metrics) + feature_summary_df = feature_summary_df.drop(columns=["genome"]) + feature_summary_df.to_csv(outs.per_feature_metrics_csv, index=False) + else: + # In BY-Flex, we only need these per genome metrics for the WS: + # - median_umis_per_cell_on_target + # - median_genes_per_cell_on_target + # - num_genes_detected_on_target + all_targeted_metrics.update( + { + key: targeted_metrics[key] + for key in ( + f"{metric_prefix}{k}" + for k in [ + "median_umis_per_cell_on_target", + "median_genes_per_cell_on_target", + "num_genes_detected_on_target", + ] + ) + } + ) with open(outs.summary, "w") as outf: - tk_safe_json.dump_numpy(targeted_metrics, outf) + tk_safe_json.dump_numpy(all_targeted_metrics, outf) diff --git a/mro/rna/stages/vdj/report_contigs/__init__.py b/mro/rna/stages/vdj/report_contigs/__init__.py index d5af14e..29c9771 100644 --- a/mro/rna/stages/vdj/report_contigs/__init__.py +++ b/mro/rna/stages/vdj/report_contigs/__init__.py @@ -28,12 +28,11 @@ in fasta contigs, in json annotations, in csv filter_summary, - in tsv contig_summary, in tsv umi_summary, in string prefix, out json summary, src py "stages/vdj/report_contigs", -) split using ( +) split ( ) """ @@ -84,30 +83,6 @@ def main(args, outs): for annotation in iter(json.load(open(args.annotations))): contig_annotations[ensure_binary(annotation["contig_name"])] = annotation - if ( - args.contig_summary - and os.path.isfile(args.contig_summary) - and os.path.getsize(args.contig_summary) > 0 - ): - contig_summary = pd.read_csv( - ensure_str(args.contig_summary), - header=0, - index_col=None, - sep="\t", - dtype={ - "component": int, - "num_reads": int, - "num_pairs": int, - "num_umis": int, - "umi_list": str, - }, - converters={"barcode": ensure_binary}, - ) - contig_summary["barcode"] = contig_summary["barcode"].astype("S") - contig_summary = contig_summary.groupby("barcode") - else: - contig_summary = None - file_size = os.path.getsize(args.umi_summary) if args.umi_summary and os.path.isfile(args.umi_summary) and file_size > 0: try: @@ -166,17 +141,12 @@ def main(args, outs): annotations = [contig_annotations[contig[0]] for contig in contigs] reporter.vdj_barcode_contig_cb(barcode, contigs, annotations, reference, prefix) - if not contig_summary is None and barcode in contig_summary.groups: - bc_contig_summary = contig_summary.get_group(barcode) - else: - bc_contig_summary = None - if not umi_summary is None and barcode in umi_summary.groups: bc_umi_summary = umi_summary.get_group(barcode) else: bc_umi_summary = None - reporter.vdj_assembly_cb(bc_contig_summary, bc_umi_summary, annotations, reference, prefix) + reporter.vdj_assembly_cb(bc_umi_summary, annotations, reference, prefix) reporter.report_summary_json(outs.summary) diff --git a/mro/rna/stages/vdj/split_vdj_inputs/__init__.py b/mro/rna/stages/vdj/split_vdj_inputs/__init__.py index a46f166..5dcbad5 100644 --- a/mro/rna/stages/vdj/split_vdj_inputs/__init__.py +++ b/mro/rna/stages/vdj/split_vdj_inputs/__init__.py @@ -28,7 +28,6 @@ def main(args, outs): assert len(args.vdj_inputs) > 0 - assert len(args.vdj_inputs) <= 3 assert len(args.vdj_inputs) == len(args.vdj_chemistry_defs) assert len(args.vdj_inputs) == len(args.vdj_receptors) diff --git a/mro/rna/stages/vdj/summarize_reports/__init__.py b/mro/rna/stages/vdj/summarize_reports/__init__.py index c424d3a..505f8a6 100644 --- a/mro/rna/stages/vdj/summarize_reports/__init__.py +++ b/mro/rna/stages/vdj/summarize_reports/__init__.py @@ -8,6 +8,7 @@ import cellranger.report as cr_report import cellranger.webshim.common as cr_webshim import cellranger.websummary.vdj as vdj_web +from cellranger.analysis.singlegenome import TSNE_NAME from cellranger.webshim.constants.shared import PIPELINE_VDJ from cellranger.websummary.sample_properties import SampleDataPaths, VdjSampleProperties @@ -22,6 +23,7 @@ in csv clonotype_summary, in csv barcode_support, in string receptor, + in int n50_n50_rpu, out string receptor, out json metrics_summary_json, out csv metrics_summary_csv, @@ -55,6 +57,7 @@ def join(args, outs, chunk_defs, chunk_outs): "chain_type": args.receptor, # Hack to pass this metric at the per-sample level, CELLRANGER-7783 "VDJ_total_read_pairs": args.total_read_pairs, + "n50_n50_rpu": args.n50_n50_rpu, } cr_report.merge_jsons(args.summaries, outs.metrics_summary_json, dicts=[sample_info]) @@ -74,7 +77,9 @@ def join(args, outs, chunk_defs, chunk_outs): chemistry_def=args.vdj_chemistry_def, chain_type=outs.receptor, ) - sample_data = cr_webshim.load_sample_data(sample_properties, sample_data_paths) + sample_data = cr_webshim.load_sample_data( + sample_properties, sample_data_paths, projections=TSNE_NAME + ) ws_data = vdj_web.build_vdj_web_summary_html(outs.web_summary, sample_properties, sample_data) with open(outs.web_summary_data, "w") as f: diff --git a/mro/rna/stages/vloupe/vloupe_preprocess/__init__.py b/mro/rna/stages/vloupe/vloupe_preprocess/__init__.py index 3d38f42..1f6958d 100644 --- a/mro/rna/stages/vloupe/vloupe_preprocess/__init__.py +++ b/mro/rna/stages/vloupe/vloupe_preprocess/__init__.py @@ -99,10 +99,10 @@ def main(args, outs): # but keep the arg 'call' here because log_info inherently # attempts to encode the message... (TODO: should log_info # figure out the encoding of the input string) - martian.log_info("Running vlconverter: %s" % " ".join(call)) + martian.log_info("Running vlconverter: {}".format(" ".join(call))) try: results = tk_subproc.check_output(unicode_call) - martian.log_info("vlconverter output: %s" % results) + martian.log_info(f"vlconverter output: {results}") except subprocess.CalledProcessError as e: outs.output_for_vloupe = None - martian.throw("Could not generate .vloupe file: \n%s" % e.output) + martian.throw(f"Could not generate .vloupe file: \n{e.output}") diff --git a/mro/tenkit/_make_fastqs_stages.mro b/mro/tenkit/_make_fastqs_stages.mro index 7d9de5b..69c2bbf 100644 --- a/mro/tenkit/_make_fastqs_stages.mro +++ b/mro/tenkit/_make_fastqs_stages.mro @@ -12,7 +12,6 @@ stage MAKE_FASTQS_PREFLIGHT_LOCAL( in int[] lanes, in map[] specs, in string bcl2fastq2_args, - in string barcode_whitelist, in string bc_read_type, in int bc_start_index, in int bc_length, @@ -26,13 +25,12 @@ stage MAKE_FASTQS_PREFLIGHT_LOCAL( ) stage MAKE_FASTQS_PREFLIGHT( - in path run_path, - in path output_path, - in path interop_output_path, - in string barcode_whitelist, - in bool check_executables, - in int max_bcl2fastq_threads, - src py "stages/make_fastqs/make_fastqs_preflight", + in path run_path, + in path output_path, + in path interop_output_path, + in bool check_executables, + in int max_bcl2fastq_threads, + src py "stages/make_fastqs/make_fastqs_preflight", ) stage PREPARE_SAMPLESHEET( diff --git a/mro/tenkit/make_fastqs.mro b/mro/tenkit/make_fastqs.mro index 7bb4395..5565d13 100644 --- a/mro/tenkit/make_fastqs.mro +++ b/mro/tenkit/make_fastqs.mro @@ -12,7 +12,6 @@ pipeline MAKE_FASTQS( in string bases_mask "--use-bases-mask override", in string bcl2fastq1_args "Bonus arguments to bcl2fastq v1", in string bcl2fastq2_args "Bonus arguments to bcl2fastq v2", - in string barcode_whitelist, in string bc_read_type, in int bc_start_index, in int bc_length, @@ -39,7 +38,6 @@ pipeline MAKE_FASTQS( check_executables = false, lanes = self.lanes, specs = self.specs, - barcode_whitelist = self.barcode_whitelist, bc_read_type = self.bc_read_type, bc_start_index = self.bc_start_index, bc_length = self.bc_length, @@ -59,7 +57,6 @@ pipeline MAKE_FASTQS( run_path = self.run_path, output_path = self.output_path, interop_output_path = self.interop_output_path, - barcode_whitelist = self.barcode_whitelist, check_executables = true, max_bcl2fastq_threads = self.max_bcl2fastq_threads, ) using ( diff --git a/mro/tenkit/make_fastqs_cs.mro b/mro/tenkit/make_fastqs_cs.mro index 4377c7e..5957e2d 100644 --- a/mro/tenkit/make_fastqs_cs.mro +++ b/mro/tenkit/make_fastqs_cs.mro @@ -12,7 +12,6 @@ pipeline MAKE_FASTQS_CS( in string bases_mask "--use-bases-mask argument", in string bcl2fastq1_args "Additional arguments to pass to bcl2fastq if RTA needs v1", in string bcl2fastq2_args "Additional arguments to pass to bcl2fastq if RTA needs v2", - in string barcode_whitelist "Path to barcode whitelist to check matching rates", in string bc_read_type "Read type containing the barcode (R1, I1, I2, R2)", in int bc_start_index "Zero-based index of first base of barcode on read", in int bc_length "Length of barcode", @@ -42,7 +41,6 @@ pipeline MAKE_FASTQS_CS( bases_mask = self.bases_mask, bcl2fastq1_args = self.bcl2fastq1_args, bcl2fastq2_args = self.bcl2fastq2_args, - barcode_whitelist = self.barcode_whitelist, bc_read_type = self.bc_read_type, bc_start_index = self.bc_start_index, bc_length = self.bc_length, diff --git a/mro/tenkit/stages/make_fastqs/bcl2fastq_with_samplesheet/__init__.py b/mro/tenkit/stages/make_fastqs/bcl2fastq_with_samplesheet/__init__.py index f8f4733..42d7129 100644 --- a/mro/tenkit/stages/make_fastqs/bcl2fastq_with_samplesheet/__init__.py +++ b/mro/tenkit/stages/make_fastqs/bcl2fastq_with_samplesheet/__init__.py @@ -109,8 +109,8 @@ def run_bcl2fastq(args, outs): interop_dir = outs.interop_path - martian.log_info("Running bcl2fastq on run: %s" % args.run_path) - martian.log_info("FASTQ output dir: %s" % output_dir) + martian.log_info(f"Running bcl2fastq on run: {args.run_path}") + martian.log_info(f"FASTQ output dir: {output_dir}") run_info_xml = os.path.join(args.run_path, "RunInfo.xml") read_info = tk_bcl.load_run_info(run_info_xml)[0] @@ -146,8 +146,8 @@ def run_bcl2fastq(args, outs): (major_ver, full_ver) = rta_info.check_bcl2fastq(hostname) outs.bcl2fastq_version = full_ver - martian.log_info("Using bcl2fastq version: %s" % ensure_str(full_ver)) - martian.log_info("RC'ing i2 read: %s" % str(rta_info.rc_i2)) + martian.log_info(f"Using bcl2fastq version: {ensure_str(full_ver)}") + martian.log_info(f"RC'ing i2 read: {rta_info.rc_i2!s}") # Restore the LD_LIBRARY_PATH set aside by sourceme.bash/shell10x. # Only do this for the environment in which BCL2FASTQ will run. @@ -193,7 +193,7 @@ def run_bcl2fastq(args, outs): cmd += remove_deprecated_args(args.bcl2fastq2_args, major_ver, full_ver) outs.bcl2fastq_args = " ".join(cmd) - martian.log_info("Running bcl2fastq2: %s" % outs.bcl2fastq_args) + martian.log_info(f"Running bcl2fastq2: {outs.bcl2fastq_args}") try: ret = tk_proc.call(cmd, env=new_environ) @@ -207,8 +207,7 @@ def run_bcl2fastq(args, outs): enclosing_path = os.path.dirname(os.path.dirname(files_path)) stderr_path = os.path.join(enclosing_path, b"_stderr") martian.exit( - "bcl2fastq exited with an error. You may have specified an invalid command-line option. See the full error here:\n%s" - % ensure_str(stderr_path) + f"bcl2fastq exited with an error. You may have specified an invalid command-line option. See the full error here:\n{ensure_str(stderr_path)}" ) elif ret < 0: # subprocess.call returns negative code (on UNIX): bcl2fastq killed by external signal diff --git a/mro/tenkit/stages/make_fastqs/make_fastqs_preflight/__init__.py b/mro/tenkit/stages/make_fastqs/make_fastqs_preflight/__init__.py index c0ae35c..b6ca7a1 100644 --- a/mro/tenkit/stages/make_fastqs/make_fastqs_preflight/__init__.py +++ b/mro/tenkit/stages/make_fastqs/make_fastqs_preflight/__init__.py @@ -19,7 +19,6 @@ in path run_path, in path output_path, in path interop_output_path, - in string barcode_whitelist, in bool check_executables, in int max_bcl2fastq_threads, src py "stages/make_fastqs/make_fastqs_preflight", @@ -41,14 +40,6 @@ def main(args, outs): if not ok: martian.exit(msg) - if args.barcode_whitelist: - # split by comma - whitelist_candidates = args.barcode_whitelist.split(",") - for candidate in whitelist_candidates: - tk_preflight.check_barcode_whitelist(candidate) - else: - martian.exit("Must specify a barcode whitelist or lists.") - if args.check_executables: print("Checking bcl2fastq...") rta_info = tk_bcl.RTAVersionInformation(args.run_path) diff --git a/mro/tenkit/stages/make_fastqs/make_fastqs_preflight_local/__init__.py b/mro/tenkit/stages/make_fastqs/make_fastqs_preflight_local/__init__.py index b0f9fa3..f42b1e5 100644 --- a/mro/tenkit/stages/make_fastqs/make_fastqs_preflight_local/__init__.py +++ b/mro/tenkit/stages/make_fastqs/make_fastqs_preflight_local/__init__.py @@ -22,7 +22,6 @@ in int[] lanes, in map[] specs, in string bcl2fastq2_args, - in string barcode_whitelist, in string bc_read_type, in int bc_start_index, in int bc_length, @@ -69,7 +68,7 @@ def check_specs(args): is_iem = tk_sheet.file_is_iem_samplesheet(csv_path) is_csv = tk_sheet.file_is_simple_samplesheet(csv_path) if not (is_iem or is_csv): - martian.exit("Formatting error in sample sheet: %s" % csv_path) + martian.exit(f"Formatting error in sample sheet: {csv_path}") def check_read_params(args, runinfo): @@ -80,7 +79,7 @@ def check_read_params(args, runinfo): if args.bc_read_type is None: martian.exit("Barcode read must be specified.") if args.bc_read_type not in read_info_by_read_type: - martian.exit("Barcode read not found in run folder: %s" % args.bc_read_type) + martian.exit(f"Barcode read not found in run folder: {args.bc_read_type}") if args.bc_start_index is not None and args.bc_length is not None: if ( @@ -99,7 +98,7 @@ def check_read_params(args, runinfo): # if UMI present, do bounds check if args.umi_read_type is not None and args.umi_read_type not in read_info_by_read_type: - martian.exit("UMI read type not found in run folder: %s" % args.umi_read_type) + martian.exit(f"UMI read type not found in run folder: {args.umi_read_type}") if args.umi_start_index is not None and args.umi_length is not None: if ( args.umi_start_index + args.umi_length @@ -124,12 +123,12 @@ def emit_info(args): martian.log_info("samplesheet:") try: with open(csv_path) as sheet: - martian.log_info("\n%s" % sheet.read()) + martian.log_info(f"\n{sheet.read()}") except PermissionError: - martian.exit("Permission Denied: %s" % csv_path) + martian.exit(f"Permission Denied: {csv_path}") else: - martian.log_info("samplesheet not found: %s" % csv_path) + martian.log_info(f"samplesheet not found: {csv_path}") else: martian.log_info("specs:") martian.log_info(args.specs) @@ -149,13 +148,6 @@ def main(args, outs): if not ok: martian.exit(msg) - if args.barcode_whitelist: - whitelist_candidates = args.barcode_whitelist.split(",") - for candidate in whitelist_candidates: - tk_preflight.check_barcode_whitelist(candidate) - else: - martian.exit("Must specify a barcode whitelist.") - if args.check_executables: print("Checking bcl2fastq...") rta_info = tk_bcl.RTAVersionInformation(args.run_path) diff --git a/mro/tenkit/stages/make_fastqs/merge_fastqs_by_lane_sample/__init__.py b/mro/tenkit/stages/make_fastqs/merge_fastqs_by_lane_sample/__init__.py index d0dd49e..7d43972 100644 --- a/mro/tenkit/stages/make_fastqs/merge_fastqs_by_lane_sample/__init__.py +++ b/mro/tenkit/stages/make_fastqs/merge_fastqs_by_lane_sample/__init__.py @@ -285,7 +285,7 @@ def join(args, outs, chunk_args, chunk_outs): continue for input_file in chunk_arg.input_files: if os.path.exists(input_file): - martian.log_info("Removing split file: %s" % input_file) + martian.log_info(f"Removing split file: {input_file}") os.remove(input_file) unique_folders.update( [os.path.dirname(input_file) for input_file in chunk_arg.input_files] @@ -293,8 +293,8 @@ def join(args, outs, chunk_args, chunk_outs): # remove empty split folders for folder in unique_folders: - if not glob.glob("%s/*fastq*" % folder): - martian.log_info("Removing empty folder: %s" % folder) + if not glob.glob(f"{folder}/*fastq*"): + martian.log_info(f"Removing empty folder: {folder}") os.rmdir(folder) # rename merged files (which have a _S0n FASTQ name for distinction in flat directories) @@ -315,7 +315,7 @@ def join(args, outs, chunk_args, chunk_outs): os.rename(merged_file, out_path) if args.remove_undetermined_fastqs: - undetermined_fastqs = glob.glob("%s/Undetermined*fastq.gz" % args.fastq_path) + undetermined_fastqs = glob.glob(f"{args.fastq_path}/Undetermined*fastq.gz") for undetermined_fastq in undetermined_fastqs: - martian.log_info("Removing undetermined file: %s" % undetermined_fastq) + martian.log_info(f"Removing undetermined file: {undetermined_fastq}") os.remove(undetermined_fastq) diff --git a/mro/tenkit/stages/make_fastqs/prepare_samplesheet/__init__.py b/mro/tenkit/stages/make_fastqs/prepare_samplesheet/__init__.py index 7c0d353..5e7a284 100644 --- a/mro/tenkit/stages/make_fastqs/prepare_samplesheet/__init__.py +++ b/mro/tenkit/stages/make_fastqs/prepare_samplesheet/__init__.py @@ -133,7 +133,7 @@ def main(args, outs): else: rc_i2_read = args.rc_i2_override - martian.log_info("I2 Read is RC: %s" % str(rc_i2_read)) + martian.log_info(f"I2 Read is RC: {rc_i2_read!s}") lane_count = tk_lane.get_flowcell_lane_count(runinfo_path) @@ -162,7 +162,7 @@ def main(args, outs): ) except tk_sheet.IndexAmbiguityException as e: martian.exit( - """ + f""" The sample sheet supplied has a sample index collision. This can happen if the same sample index and lane were specified for multiple samples, or in certain cases where 10x Chromium i7 Multiplex Kit and i7 Multiplex Kit N samples were @@ -178,9 +178,8 @@ def main(args, outs): match the sample indices exactly. The small percentage of reads that are a single base away from multiple sample indices will be ignored. -Colliding sample index oligos: %s +Colliding sample index oligos: {e.message} """ - % e.message ) except tk_sheet.SingleIndexFlowcellException: martian.exit( diff --git a/third-party/STAR.BUILD b/third-party/STAR.BUILD index b683685..b30f742 100644 --- a/third-party/STAR.BUILD +++ b/third-party/STAR.BUILD @@ -34,6 +34,7 @@ cc_binary( ], copts = [ "-Wno-literal-conversion", + "-Wno-vla-cxx-extension", ], visibility = ["//visibility:public"], deps = [ @@ -173,7 +174,9 @@ cc_library( "-Wno-unused-function", "-Wno-unused-private-field", "-Wno-unqualified-std-cast-call", + "-Wno-deprecated-declarations", "-Wno-deprecated-register", + "-Wno-vla-cxx-extension", ], includes = [ "source", @@ -233,6 +236,7 @@ cc_library( copts = [ "-DSAMTOOLS=1", "-Wno-misleading-indentation", + "-Wno-single-bit-bitfield-constant-conversion", "-Wno-unused-but-set-variable", "-Wno-unused-function", "-Wno-unused-variable", diff --git a/third-party/bwa.BUILD b/third-party/bwa.BUILD index 478c188..3f46ee5 100644 --- a/third-party/bwa.BUILD +++ b/third-party/bwa.BUILD @@ -80,6 +80,7 @@ DFLAGS = [ "-DUSE_MALLOC_WRAPPERS", "-Wno-unused-function", "-Wno-unused-but-set-variable", + "-Wno-single-bit-bitfield-constant-conversion", ] cc_library( diff --git a/third-party/c_deps.bzl b/third-party/c_deps.bzl index 4d1b76c..afe306a 100644 --- a/third-party/c_deps.bzl +++ b/third-party/c_deps.bzl @@ -67,7 +67,7 @@ def load_c_deps(): # tracking the "bazel" branch in 10xdev/graphviz github_http_archive( name = "com_github_10xdev_graphviz", - commit = "d5953a58dea6568be4b623640cc68e49b79e5b86", + commit = "11a86ea0ca32a79d65102f90eae122dba203ddd6", url = "https://github.com/10XDev/graphviz", - sha256 = "b12b5938260ba9a6b358d7dc67cabc9b1541940132240d854eb6bf28940f9f4a", + sha256 = "aa7842ce0d400277531ba89016218b6426c2245deee6b2668d72c25aa055c2ef", ) diff --git a/third-party/cell-annotation-service-client.BUILD b/third-party/cell-annotation-service-client.BUILD deleted file mode 100644 index 894c759..0000000 --- a/third-party/cell-annotation-service-client.BUILD +++ /dev/null @@ -1,88 +0,0 @@ -load("@conda_package_python//:vars.bzl", "PYTHON_PREFIX") -load( - "@rules_license//rules:license.bzl", - "license", -) -load( - "@tenx_bazel_rules//rules/conda:conda_manifest.bzl", - "conda_deps", - "conda_manifest", -) - -package(default_applicable_licenses = ["license"]) - -site_packages = PYTHON_PREFIX + "/site-packages" - -license( - name = "license", - package_name = "cell-annotation-service-client", - additional_info = { - "homepage": "https://github.com/10XGenomics/cell-annotation-service-client", - "version": "1.4.0.dev", - "manifest": "third-party/deps.bzl", - "pURL": "pkg:github/10XGenomics/cell-annotation-service-client@1.4.0.dev", - }, - license_kinds = [ - "@rules_license//licenses/spdx:BSD-3-Clause", - ], - license_text = site_packages + "/LICENSE.txt", -) - -filegroup( - name = "conda_package_cellarium_hdrs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_cellarium_libs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_cellarium_solibs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_cellarium_python", - srcs = [site_packages + f for f in [ - "/cellarium/cas/__init__.py", - "/cellarium/cas/_io.py", - "/cellarium/cas/assets/cellarium_cas_tx_pca_002_grch38_2020_a.json", - "/cellarium/cas/client.py", - "/cellarium/cas/data_preparation.py", - "/cellarium/cas/endpoints.py", - "/cellarium/cas/exceptions.py", - "/cellarium/cas/service.py", - ]], - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_cellarium_data", - visibility = ["@anaconda//:__pkg__"], -) - -exports_files( - ["BUILD.bazel"], - visibility = ["//visibility:public"], -) - -conda_manifest( - name = "conda_metadata", - info_files = ["info/index.json"], - manifest = "info/files", - visibility = ["//visibility:public"], -) - -conda_deps( - name = "conda_deps", - visibility = ["@anaconda//:__pkg__"], - deps = [ - "@anaconda//:aiohttp", - "@anaconda//:anndata", - "@anaconda//:certifi", - "@anaconda//:nest-asyncio", - "@anaconda//:tqdm", - ], -) diff --git a/third-party/conda/conda_spec.bzl b/third-party/conda/conda_spec.bzl new file mode 100644 index 0000000..c3bcb55 --- /dev/null +++ b/third-party/conda/conda_spec.bzl @@ -0,0 +1,1745 @@ +# Code generated by make_conda_spec. DO NOT EDIT. +"""This file contains the workspace rules for the anaconda distribution. + +To use, add +``` + load(":conda_spec.bzl", "anaconda_workspace") + anaconda_workspace() +``` +to your `WORKSPACE` file. +""" + +load( + "@tenx_bazel_rules//rules:anaconda_repository.bzl", + "anaconda_repository", +) +load( + "@tenx_bazel_rules//rules:conda_package_repository.bzl", + "conda_package_repository", +) + +def anaconda_workspace(name = "anaconda"): + """Create remote repositories to download each conda package. + + Also create the repository rule to generate the complete distribution. In + general, other targets should depend on targets in the `@anaconda` + repository, rather than individual package repositories. + + Args: + name (string): The name of the top level distribution repo. + """ + + conda_package_repository( + name = "conda_package__libgcc_mutex", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "_libgcc_mutex-0.1-conda_forge", + sha256 = "fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_altair", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "altair-5.4.1-pyhd8ed1ab_1", + sha256 = "adc8a0ff6052c11e9addbcf329d15180aa5481376f0d5048cfefe314354a2c9e", + archive_type = "conda", + # Needed to use non-pandas dataframes with construct of altair + extra_deps = [ + "pyarrow", + ], + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_attrs", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "attrs-24.2.0-pyh71513ae_0", + sha256 = "28dba85a7e0f7fb57d7315e13f603d1e41b83c5b88aa2a602596b52c833a2ff8", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_biopython", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "biopython-1.84-py310hc51659f_0", + sha256 = "cc686ead6074272cc5f1f137eee1fd746b60cc4fbcef070a4a4f2efa0935040b", + exclude = [ + "lib/python*/site-packages/Bio/Entrez/DTDs", + ], + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_blosc", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "blosc-1.21.5-h0f2a231_0", + sha256 = "e2b15b017775d1bda8edbb1bc48e545e45364edefa4d926732fc5488cc600731", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_brotli_python", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "brotli-python-1.0.9-py310hd8f1fbe_9", + sha256 = "a4984cb906910850ae979387f0ac4e2623e0a3c8139bc67eb1fff0403bf8388b", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_bzip2", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "bzip2-1.0.8-h4bc722e_7", + sha256 = "5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d", + exclude = [ + "man", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_c_ares", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "c-ares-1.32.3-h4bc722e_0", + sha256 = "3c5a844bb60b0d52d89c3f1bd828c9856417fe33a6102fd8bbd5c13c3351704a", + archive_type = "conda", + exclude = [ + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_c_blosc2", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "c-blosc2-2.12.0-hb4ffafa_0", + sha256 = "68ae377f7baeb616e5a24facadebd8bf7a9cd48a297124be9d814ba92ff5e40f", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_ca_certificates", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "ca-certificates-2024.8.30-hbcca054_0", + sha256 = "afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_cached_property", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "cached_property-1.5.2-pyha770c72_1", + sha256 = "6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_certifi", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "certifi-2024.8.30-pyhd8ed1ab_0", + sha256 = "7020770df338c45ac6b560185956c32f0a5abf4b76179c037f115fc7d687819f", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_cffi", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "cffi-1.17.1-py310h8deb56e_0", + sha256 = "1b389293670268ab80c3b8735bc61bc71366862953e000efbb82204d00e41b6c", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_charset_normalizer", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "charset-normalizer-3.4.0-pyhd8ed1ab_0", + sha256 = "1873ac45ea61f95750cb0b4e5e675d1c5b3def937e80c7eebb19297f76810be8", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_cython", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "cython-3.0.11-py310h5b1441d_3", + sha256 = "ab2fc6b4b8c203da4cade3c25334342dc9f3ce846a2ae81591c3d09bf7b7ed4d", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_docopt", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "docopt-0.6.2-py_1", + sha256 = "4bbfb8ab343b4711223aedf797a2678955412124e71415dc2fe9816248f0b28d", + exclude = [ + "lib/python3.*/site-packages/docopt-0.6.2.dist-info/METADATA", + ], + license_file = "info/LICENSE.txt", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_freetype", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "freetype-2.12.1-h267a509_2", + sha256 = "b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6", + licenses = ["@rules_license//licenses/spdx:FTL"], + license_file = "info/licenses/docs/FTL.TXT", + exclude = [ + "share/man", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_h2", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "h2-4.1.0-pyhd8ed1ab_0", + sha256 = "bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_h5py", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "h5py-3.9.0-nompi_py310h367e799_100", + sha256 = "6a8a5b595032eff60df322492b865640dba7392348afe318756855f98de94792", + exclude = [ + "lib/python3.*/site-packages/h5py/tests", + ], + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_hdf5", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "hdf5-1.14.0-nompi_h5231ba7_103", + sha256 = "cfec313dcb1c51a0f6faee9c6af7dcb9cbe86847697f0be9846eaa0058500d29", + exclude = [ + "share", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_hpack", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "hpack-4.0.0-pyh9f0ad1d_0", + sha256 = "5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_htslib", + base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], + dist_name = "htslib-1.17-h6bc39ce_1", + sha256 = "3236e98be603dabec298c15e493445e2b6e9059648e951b595f032e8cb994cb6", + exclude = [ + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_hyperframe", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "hyperframe-6.0.1-pyhd8ed1ab_0", + sha256 = "e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_icu", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "icu-73.2-h59595ed_0", + sha256 = "e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_idna", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "idna-3.10-pyhd8ed1ab_0", + sha256 = "8c57fd68e6be5eecba4462e983aed7e85761a519aab80e834bbd7794d4b545b2", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_importlib_metadata", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "importlib-metadata-8.5.0-pyha770c72_0", + sha256 = "7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_importlib_resources", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "importlib_resources-6.4.5-pyhd8ed1ab_0", + sha256 = "2cb9db3e40033c3df72d3defc678a012840378fd55a67e4351363d4b321a0dc1", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_jinja2", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "jinja2-3.1.4-pyhd8ed1ab_0", + sha256 = "27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_joblib", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "joblib-1.4.2-pyhd8ed1ab_0", + sha256 = "8ad719524b1039510fcbd75eb776123189d75e2c09228189257ddbcab86f5b64", + exclude = [ + "site-packages/joblib/test", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_jpeg", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "jpeg-9e-h0b41bf4_3", + sha256 = "8f73194d09c9ea4a7e2b3562766b8d72125cc147b62c7cf83393e3a3bbfd581b", + archive_type = "conda", + licenses = ["@rules_license//licenses/spdx:IJG"], + exclude = [ + "share/man", + ], + license_file = "info/licenses/LICENSE0.txt", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_jsonschema", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "jsonschema-4.23.0-pyhd8ed1ab_0", + sha256 = "7d0c4c0346b26be9f220682b7c5c0d84606d48c6dbc36fc238e4452dda733aff", + archive_type = "conda", + exclude = [ + "site-packages/jsonschema/tests", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_jsonschema_specifications", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "jsonschema-specifications-2024.10.1-pyhd8ed1ab_0", + sha256 = "82f8bed0f21dc0b3aff40dd4e39d77e85b93b0417bc5659b001e0109341b8b98", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_keyutils", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "keyutils-1.6.1-h166bdaf_0", + sha256 = "150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb", + exclude = [ + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_krb5", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "krb5-1.20.1-hf9c8cef_0", + sha256 = "3274ef26e40df1c23bd34adc075e40cc6c335540688c36ac261d64561da56278", + exclude = [ + "share/man", + "share/examples", + ], + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_lcms2", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "lcms2-2.14-h6ed2654_0", + sha256 = "cbadb4150850941bf0518ba948effbbdd89b2c28dfdfed54eae196037e015b43", + exclude = [ + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_lerc", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "lerc-4.0.0-h27087fc_0", + sha256 = "cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12", + exclude = [ + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libaec", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libaec-1.1.3-h59595ed_0", + sha256 = "2ef420a655528bca9d269086cf33b7e90d2f54ad941b437fb1ed5eca87cee017", + archive_type = "conda", + exclude = ["share/man"], + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libblas", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libblas-3.9.0-20_linux64_mkl", + sha256 = "9e5f27fca79223a5d38ccdf4c468e798c3684ba01bdb6b4b44e61f2103a298eb", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libcblas", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libcblas-3.9.0-20_linux64_mkl", + sha256 = "841b4d44e20e5207f4a74ca98176629ead5ba590384ed6b0fe3c8600248c9fef", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libcurl", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libcurl-7.87.0-h6312ad2_0", + sha256 = "4e95c12244a50c8f8e9173e0bd37d6067fd753437ab636afb44ce28382a325eb", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libdeflate", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libdeflate-1.14-h166bdaf_0", + sha256 = "6f7cbc9347964e7f9697bde98a8fb68e0ed926888b3116474b1224eaa92209dc", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libedit", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libedit-3.1.20191231-he28a2e2_2", + sha256 = "a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf", + exclude = [ + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libev", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libev-4.33-hd590300_2", + sha256 = "1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4", + archive_type = "conda", + exclude = [ + "share/man", + ], + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libffi", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libffi-3.4.2-h7f98852_5", + sha256 = "ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e", + licenses = ["@rules_license//licenses/spdx:MIT"], + exclude = [ + "share/info", + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libgcc", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libgcc-14.2.0-h77fa898_1", + sha256 = "53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569", + archive_type = "conda", + exclude_deps = ["_openmp_mutex"], + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libgcc_ng", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libgcc-ng-14.2.0-h69a702a_1", + sha256 = "3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7", + exclude = [ + "lib/libgomp.so*", + "x86_64-conda_cos6-linux-gnu/sysroot/lib/libgomp.so*", + "share/info", + ], + exclude_deps = ["_openmp_mutex"], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libgfortran_ng", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libgfortran-ng-14.2.0-h69a702a_1", + sha256 = "423f1e2403f0c665748e42d335e421e53fd03c08d457cfb6f360d329d9459851", + archive_type = "conda", + exclude_deps = ["libgfortran"], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libgfortran5", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libgfortran5-14.2.0-hd5240d6_1", + sha256 = "d149a37ca73611e425041f33b9d8dbed6e52ec506fe8cc1fc0ee054bddeb6d5d", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libhwloc", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libhwloc-2.11.1-default_hecaa2ac_1000", + sha256 = "8473a300e10b79557ce0ac81602506b47146aff3df4cc3568147a7dd07f480a2", + archive_type = "conda", + exclude = [ + "share/doc", + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libiconv", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libiconv-1.17-hd590300_2", + sha256 = "8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_liblapack", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "liblapack-3.9.0-20_linux64_mkl", + sha256 = "21b4324dd65815f6b5a83c15f0b9a201434d0aa55eeecc37efce7ee70bbbf482", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libnghttp2", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libnghttp2-1.51.0-hdcd2b5c_0", + sha256 = "3f76e99eacfc4ce3deac3b78d5508449efb8b72dea3e31d9f2c6db7f5cf00e75", + archive_type = "conda", + exclude = [ + "share/doc", + "share/man", + ], + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libnsl", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libnsl-2.0.1-hd590300_0", + sha256 = "26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libpng", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libpng-1.6.43-h2797004_0", + sha256 = "502f6ff148ac2777cc55ae4ade01a8fc3543b4ffab25c4e0eaa15f94e90dd997", + exclude = [ + "share/man", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libsqlite", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libsqlite-3.46.0-hde9e2c9_0", + sha256 = "daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libssh2", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libssh2-1.10.0-haa6b8db_3", + sha256 = "3c2ed83502bedf4ec8c5b972accb6ff1b6c018f72fb711cdb65cb8540d5ab89e", + exclude = [ + "share/doc", + "share/man", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libstdcxx", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libstdcxx-14.2.0-hc0a3c3a_1", + sha256 = "4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libstdcxx_ng", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libstdcxx-ng-14.2.0-h4852527_1", + sha256 = "25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libtiff", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libtiff-4.4.0-h82bc61c_5", + sha256 = "f81d38e7458c6ba2fcf93bef4ed2c12c2977e89ca9a7f936ce53a3338a88352f", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libuuid", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libuuid-2.38.1-h0b41bf4_0", + sha256 = "787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_libwebp_base", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libwebp-base-1.4.0-hd590300_0", + sha256 = "49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f", + exclude = [ + "share/man", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libxcb", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libxcb-1.13-h7f98852_1004", + sha256 = "8d5d24cbeda9282dd707edd3156e5fde2e3f3fe86c802fa7ce08c8f1e803bfd9", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libxml2", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libxml2-2.12.7-hc051c1a_1", + sha256 = "576ea9134176636283ff052897bf7a91ffd8ac35b2c505dfde2890ec52849698", + archive_type = "conda", + exclude = [ + "share/man", + "share/doc", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_libzlib", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "libzlib-1.2.13-h4ab18f5_6", + sha256 = "8ced4afed6322172182af503f21725d072a589a6eb918f8a58135c1e00d35980", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_llvm_openmp", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "llvm-openmp-19.1.2-h024ca30_0", + sha256 = "77ef4713b1762ec2c0326400e5009e15595d3c27a10e5bbe91a29d63c99ee9b9", + archive_type = "conda", + exclude = [ + "lib/libomptarget.rtl.*", + ], + exclude_deps = [ + "zstd", + "libzlib", + ], + patch_cmds = [ + "ln -s libomp.so lib/libgomp.so.1", + ], + patch_args = ["-p1"], + patches = [ + "@cellranger//third-party/conda:intel-openmp-symlinks.patch", + ], + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_lz4", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "lz4-4.3.3-py310hb259640_1", + sha256 = "432b919e052fd0e0687ae7395f147629ba708457e17e491db1d7a286a83d6f41", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_lz4_c", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "lz4-c-1.9.4-hcb278e6_0", + sha256 = "1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f", + exclude = [ + "share/man", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_markupsafe", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "markupsafe-3.0.2-py310h89163eb_0", + sha256 = "cd30ab169cf8685a405d5ff65d6b6887603b5d3c9acfc844b5ff5ff09de21213", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_mkl", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "mkl-2023.2.0-h84fe81f_50496", + sha256 = "046073737bf73153b0c39e343b197cdf0b7867d336962369407465a17ea5979a", + exclude = [ + "lib/libmkl_*avx512_mic.so.1", + "lib/libmkl_blacs_*mpi_*.so*", + "lib/libmkl_blacs_sgimpt*.so*", + "lib/libmkl_pgi_thread.so*", + "lib/libmkl_scalapack*.so*", + "lib/libmkl_*_ilp64.so*", + ], + patch_args = ["-p1"], + # Normally these symlinks would come from the libblas package, but the + # bazel rules won't generate those because they're broken symlinks in + # that package. So we add them here instead. Otherwise opencv ends up + # linking openblas, which causes problems. + patches = ["@cellranger//third-party/conda:mkl-libblas-symlinks.patch"], + patch_cmds = [ + "ln -s libmkl_rt.so.2 lib/libblas.so", + "ln -s libmkl_rt.so.2 lib/libblas.so.3", + "ln -s libmkl_rt.so.2 lib/libcblas.so", + "ln -s libmkl_rt.so.2 lib/libcblas.so.3", + "ln -s libmkl_rt.so.2 lib/liblapack.so", + "ln -s libmkl_rt.so.2 lib/liblapack.so.3", + ], + exclude_deps = ["_openmp_mutex"], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_narwhals", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "narwhals-1.9.4-pyhd8ed1ab_0", + sha256 = "9ffae2d9162ba3e818bde14f04485a10a18475fb6379834b936a1ceb5b03e9e4", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_ncurses", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "ncurses-6.5-he02047a_1", + sha256 = "6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a", + licenses = ["@rules_license//licenses/spdx:MIT-open-group"], + # Exclude the capital-letter directories, which cause misbehavior on + # macs with their case-insensitive filesystems. That means also + # excluding a few other things which are symlinks to the others. + # Note that this does not make the build work on mac, because the + # exclusion happens after the untar step, which will still fail. But it + # does improve the situation for e.g. the cs tarball. + exclude = [ + "share/terminfo/[A-Z]", + "share/terminfo/d/darwin*", + "share/terminfo/n/n7900", + "share/terminfo/n/ncr*", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_numexpr", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "numexpr-2.10.1-mkl_py310h78a85ae_2", + sha256 = "a251988d4d1a589c0d042ea2db68f905fa83e9ac643213a4bcf935f31a68f6f7", + exclude = [ + "lib/python*/site-packages/numexpr/tests", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_numpy", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "numpy-1.26.4-py310hb13e2d6_0", + sha256 = "028fe2ea8e915a0a032b75165f11747770326f3d767e642880540c60a3256425", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_openjpeg", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "openjpeg-2.5.0-h7d73246_1", + sha256 = "a715cba5649f12a1dca53dfd72fc49577152041f033d7595cf4b6a655a5b93b6", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_openssl", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "openssl-1.1.1w-hd590300_0", + sha256 = "4fe19885c77f0758084feb54954bd1977dfeeab7134fba0a1d9c0cfff821d6bd", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_packaging", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "packaging-24.1-pyhd8ed1ab_0", + sha256 = "36aca948219e2c9fdd6d80728bcc657519e02f06c2703d8db3446aec67f51d81", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_pandas", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "pandas-2.1.4-py310hcc13569_0", + sha256 = "d0743541397140a25a89ab0686933005a4c104d95c23ff1c322f903a50b18099", + exclude = [ + "lib/python3.*/site-packages/pandas/tests", + ], + extra_deps = [ + "pytables", + ], + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_patsy", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "patsy-0.5.6-pyhd8ed1ab_0", + sha256 = "35ad5cab1d9c08cf98576044bf28f75e62f8492afe6d1a89c94bbe93dc8d7258", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_pillow", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "pillow-9.2.0-py310h454ad03_3", + sha256 = "202cc5b4c60e32096b67791f822699bf91670584ac3db7e86ebb1b6a4c584218", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_pkgutil_resolve_name", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1", + sha256 = "fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_plotly", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "plotly-5.24.1-pyhd8ed1ab_0", + sha256 = "39cef6d3056211840709054b90badfa4efd6f61ea37935a89ab0b549a54cc83f", + license_file = "info/licenses/LICENSE0.txt", + archive_type = "conda", + exclude = [ + "lib/python3.*/site-packages/plotly/graph_objs/*/__pycache__", + "lib/python3.*/site-packages/plotly/graph_objs/*/*/__pycache__", + "lib/python3.*/site-packages/plotly/graph_objs/*/*/*/__pycache__", + "lib/python3.*/site-packages/plotly/graph_objs/*/*/*/*/__pycache__", + "lib/python3.*/site-packages/plotly/validators/*/__pycache__", + "lib/python3.*/site-packages/plotly/validators/*/*/__pycache__", + "lib/python3.*/site-packages/plotly/validators/*/*/*/__pycache__", + "lib/python3.*/site-packages/plotly/validators/*/*/*/*/__pycache__", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_polars", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "polars-1.9.0-py310h4a863d9_1", + sha256 = "4c82c23bdbd282bc5b411954ada6ed6c57181b8941ddc06cc2a6f5f7aadf5964", + archive_type = "conda", + # Needed to use the to_pandas() construct of polars + extra_deps = [ + "pyarrow", + ], + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_pthread_stubs", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "pthread-stubs-0.4-hb9d3cd8_1002", + sha256 = "9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973", + conda_repo = name, + archive_type = "conda", + ) + conda_package_repository( + name = "conda_package_py_cpuinfo", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "py-cpuinfo-9.0.0-pyhd8ed1ab_0", + sha256 = "1bb0459fdebf2f3155ee511e99097c5506ef206acbdd871b74ae9fc4b0c4a019", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_pycparser", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "pycparser-2.22-pyhd8ed1ab_0", + sha256 = "406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_pyfaidx", + base_urls = ["https://conda.anaconda.org/bioconda/noarch"], + dist_name = "pyfaidx-0.8.1.3-pyhdfd78af_0", + sha256 = "00e960f12330c3bc44fccac0417f2602143d145a5ad0e6ac7599b002ec7f1cf4", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_pysam", + base_urls = ["https://conda.anaconda.org/bioconda/linux-64"], + dist_name = "pysam-0.21.0-py310hff46b53_0", + sha256 = "c231557375a2fb4db78ecdd0d63a660c9316244885e9cc8e5eee75d0f5cb97b3", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_pysocks", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "pysocks-1.7.1-pyha2e5f31_6", + sha256 = "a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_pytables", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "pytables-3.8.0-py310hde6a235_1", + sha256 = "2b444e6e7fe42ac9a025661a4bb00b1de4d8e08c260d9e242cb790cb8cd32ba7", + patch_args = ["-p1"], + patches = ["@cellranger//third-party/conda:pytables-3.8.0-slurmdir.patch"], + exclude = [ + "lib/python3.*/site-packages/tables/tests/*.h5", + "lib/python3.*/site-packages/tables/tests/*.mat", + "lib/python3.*/site-packages/tables/tests/*/*", + ], + exclude_deps = ["lzo"], + extra_deps = [ + "setuptools", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_python", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "python-3.10.8-h257c98d_0_cpython", + sha256 = "090a5d0ed7acf75479664f4751f69833c9aa183f73366fe83681f4e85f72670b", + exclude = [ + "lib/python*/lib2to3", + "lib/python*/distutils/tests", + "lib/python*/ensurepip", + "lib/python*/idlelib/idle_test", + "lib/python*/test", + "doc", + "share/man", + ], + exclude_deps = [ + "ld_impl_linux-64", + "readline", + "tk", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_python_dateutil", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "python-dateutil-2.9.0-pyhd8ed1ab_0", + sha256 = "f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_python_tzdata", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "python-tzdata-2024.2-pyhd8ed1ab_0", + sha256 = "fe3f62ce2bc714bdaa222ab3f0344a2815ad9e853c6df38d15c9f25de8a3a6d4", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_python_abi", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "python_abi-3.10-5_cp310", + sha256 = "074d2f0b31f0333b7e553042b17ea54714b74263f8adda9a68a4bd8c7e219971", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_pytz", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "pytz-2024.2-pyhd8ed1ab_0", + sha256 = "81c16d9183bb4a6780366ce874e567ee5fc903722f85b2f8d1d9479ef1dafcc9", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_pyvcf3", + base_urls = ["https://conda.anaconda.org/bioconda/noarch"], + dist_name = "pyvcf3-1.0.3-pyhdfd78af_0", + sha256 = "5283bca618cea395f5aabdc40a9a136c0203c247e16935a2b250e84670e1dccb", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_referencing", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "referencing-0.35.1-pyhd8ed1ab_0", + sha256 = "be8d6d9e86b1a3fef5424127ff81782f8ca63d3058980859609f6f1ecdd34cb3", + exclude = ["site-packages/referencing/tests"], + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_requests", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "requests-2.32.3-pyhd8ed1ab_0", + sha256 = "5845ffe82a6fa4d437a2eae1e32a1ad308d7ad349f61e337c0a890fe04c513cc", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_rpds_py", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "rpds-py-0.20.0-py310h505e2c1_1", + sha256 = "30b77b0487e78092117a60df392568d622c784138bccc026b4bcd32492c388aa", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_scikit_learn", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "scikit-learn-1.5.2-py310h27f47ee_1", + sha256 = "777580d5ba89c5382fa63807a7981ae2261784258e84f5a9e747f5bd3d3428f3", + exclude = [ + "lib/python*/site-packages/sklearn/*/*/tests", + "lib/python*/site-packages/sklearn/*/tests", + "lib/python*/site-packages/sklearn/tests", + ], + archive_type = "conda", + exclude_deps = ["_openmp_mutex"], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_scipy", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "scipy-1.10.1-py310ha4c1d20_3", + sha256 = "c7beb091db82a1be2fa9dafb878695b1e8bd6d7efe7764afa457cabfea2a93d3", + exclude = [ + "lib/python*/site-packages/scipy/linalg/src/id_dist/doc", + "lib/python*/site-packages/scipy/*/*/*/*/tests", + "lib/python*/site-packages/scipy/*/*/*/tests", + "lib/python*/site-packages/scipy/*/*/tests", + "lib/python*/site-packages/scipy/*/tests", + ], + archive_type = "conda", + exclude_deps = [ + "fftw", + "pooch", + ], + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_setuptools", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "setuptools-75.1.0-pyhd8ed1ab_0", + sha256 = "6725235722095c547edd24275053c615158d6163f396550840aebd6e209e4738", + exclude = [ + # excludes if the library does not come from noarch + "lib/python*/site-packages/setuptools/command/launcher manifest.xml", + "lib/python*/site-packages/setuptools/script (dev).tmpl", + "lib/python*/site-packages/setuptools/*.exe", + "lib/python*/site-packages/pkg_resources/tests", + # excludes if the library comes from noarch + "site-packages/setuptools/command/launcher manifest.xml", + "site-packages/setuptools/script (dev).tmpl", + "site-packages/setuptools/*.exe", + "site-packages/pkg_resources/tests", + ], + patch_args = ["-p1"], + patches = [ + "@cellranger//third-party/conda:setuptools-71.0.4-rename.patch", + ], + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_six", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "six-1.16.0-pyh6c4a22f_0", + sha256 = "a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_snappy", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "snappy-1.1.10-hdb0a2a9_1", + sha256 = "082eadbc355016e948f1acc2f16e721ae362ecdaa204cbd60136ada19bd43f3a", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_statsmodels", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "statsmodels-0.14.4-py310hf462985_0", + sha256 = "a060f9b7e9bff3cae075a00e278089893c20cc0663ced09f9c4d92522ce76a21", + exclude = [ + "lib/python*/site-packages/statsmodels/*/tests", + "lib/python*/site-packages/statsmodels/*/*/tests", + "lib/python*/site-packages/statsmodels/*/*/*/tests", + "lib/python*/site-packages/statsmodels/tests", + "lib/python*/site-packages/statsmodels/sandbox/distributions/examples", + ], + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_tbb", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "tbb-2021.13.0-h84d6215_0", + sha256 = "7d4d3ad608dc6ae5a7e0f431f784985398a18bcde2ba3ce19cc32f61e2defd98", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_tenacity", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "tenacity-9.0.0-pyhd8ed1ab_0", + sha256 = "0d33171e1d303b57867f0cfcffb8a35031700acb3c52b1862064d8f4e1085538", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_threadpoolctl", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "threadpoolctl-3.5.0-pyhc1e730c_0", + sha256 = "45e402941f6bed094022c5726a2ca494e6224b85180d2367fb6ddd9aea68079d", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_tk", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "tk-8.6.13-noxft_h4845f30_101", + sha256 = "e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_typing_extensions", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "typing_extensions-4.12.2-pyha770c72_0", + sha256 = "0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_tzdata", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "tzdata-2024b-hc8b5060_0", + sha256 = "4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_urllib3", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "urllib3-2.2.3-pyhd8ed1ab_0", + sha256 = "b6bb34ce41cd93956ad6eeee275ed52390fb3788d6c75e753172ea7ac60b66e5", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_xorg_libxau", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "xorg-libxau-1.0.11-hb9d3cd8_1", + sha256 = "532a046fee0b3a402db867b6ec55c84ba4cdedb91d817147c8feeae9766be3d6", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_xorg_libxdmcp", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "xorg-libxdmcp-1.1.5-hb9d3cd8_0", + sha256 = "6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee", + conda_repo = name, + archive_type = "conda", + ) + + conda_package_repository( + name = "conda_package_xz", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "xz-5.2.6-h166bdaf_0", + sha256 = "03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162", + licenses = ["@rules_license//licenses/spdx:LGPL-2.1"], + exclude = [ + # GPL-licensed scripts which we don't need. + "bin/*cmp", + "bin/*diff", + "bin/*grep", + "bin/*less", + "bin/*more", + # Not useful + "share", + ], + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_zipp", + base_urls = ["https://conda.anaconda.org/conda-forge/noarch"], + dist_name = "zipp-3.20.2-pyhd8ed1ab_0", + sha256 = "1e84fcfa41e0afdd87ff41e6fbb719c96a0e098c1f79be342293ab0bd8dea322", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_zlib", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "zlib-1.2.13-h4ab18f5_6", + sha256 = "534824ea44939f3e59ca8ebb95e3ece6f50f9d2a0e69999fbc692311252ed6ac", + archive_type = "conda", + conda_repo = name, + ) + conda_package_repository( + name = "conda_package_zlib_ng", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "zlib-ng-2.0.7-h0b41bf4_0", + sha256 = "6b3a22b7cc219e8d83f16c1ceba67aa51e0b7e3bcc4a647b97a0a510559b0477", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_zstandard", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "zstandard-0.23.0-py310ha39cb0e_1", + sha256 = "fcd784735205d6c5f19dcb339f92d2eede9bc42a01ec2c384381ee1b6089d4f6", + archive_type = "conda", + conda_repo = name, + ) + + conda_package_repository( + name = "conda_package_zstd", + base_urls = ["https://conda.anaconda.org/conda-forge/linux-64"], + dist_name = "zstd-1.5.6-ha6fb4c9_0", + sha256 = "c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b", + exclude = [ + "share/man", + ], + licenses = [ + "@rules_license//licenses/spdx:BSD-3-Clause", + ], + archive_type = "conda", + conda_repo = name, + ) + anaconda_repository( + name = name, + conda_packages = [ + "_libgcc_mutex", + "absl-py", + "aiohappyeyeballs", + "aiohttp", + "aiosignal", + "altair", + "anndata", + "anyio", + "anywidget", + "aom", + "appdirs", + "argcomplete", + "argh", + "argon2-cffi", + "argon2-cffi-bindings", + "array-api-compat", + "arrow", + "asciitree", + "asgiref", + "astroid", + "asttokens", + "astunparse", + "async-lru", + "async-timeout", + "attrs", + "babel", + "backports.zoneinfo", + "bamtools", + "bcbio-gff", + "beautifulsoup4", + "bedtools", + "biocantor", + "biopython", + "black", + "blas", + "blas-devel", + "blast", + "bleach", + "blinker", + "blosc", + "boto3", + "botocore", + "brotli", + "brotli-bin", + "brotli-python", + "brunsli", + "bx-python", + "bzip2", + "c-ares", + "c-blosc2", + "ca-certificates", + "cached_property", + "cachetools", + "certifi", + "cffi", + "cfitsio", + "charls", + "charset-normalizer", + "click", + "colorama", + "comm", + "contourpy", + "coverage", + "cramjam", + "cryptography", + "cuda-cudart", + "cuda-cupti", + "cuda-libraries", + "cuda-nvcc", + "cuda-nvrtc", + "cuda-opencl", + "cuda-version", + "cudnn", + "curl", + "cycler", + "cython", + "dataclasses", + "dav1d", + "debugpy", + "decorator", + "defusedxml", + "deprecated", + "dill", + "docopt", + "eigen", + "entrez-direct", + "entrypoints", + "et_xmlfile", + "exceptiongroup", + "executing", + "fasteners", + "fastparquet", + "fonttools", + "fqdn", + "freetype", + "frozenlist", + "fsspec", + "future", + "gast", + "geojson", + "geos", + "gettext", + "gettext-tools", + "gffutils", + "giflib", + "google-auth", + "google-auth-oauthlib", + "google-pasta", + "grpcio", + "h11", + "h2", + "h5py", + "hdf5", + "hpack", + "htmltools", + "htslib", + "httpcore", + "httpx", + "hyperframe", + "hypothesis", + "icu", + "idna", + "imagecodecs", + "imageio", + "importlib-metadata", + "importlib_resources", + "iniconfig", + "intervaltree", + "ipykernel", + "ipython", + "ipywidgets", + "isoduration", + "isort", + "isoseq", + "isoseq3", + "jedi", + "jinja2", + "jmespath", + "joblib", + "jpeg", + "json5", + "jsonpointer", + "jsonschema", + "jsonschema-specifications", + "jsonschema-with-format-nongpl", + "jupyter-lsp", + "jupyter_client", + "jupyter_core", + "jupyter_events", + "jupyter_server", + "jupyter_server_terminals", + "jupyterlab", + "jupyterlab_pygments", + "jupyterlab_server", + "jupyterlab_widgets", + "jxrlib", + "keyutils", + "kiwisolver", + "krb5", + "lazy-loader", + "lazy-object-proxy", + "lcms2", + "lerc", + "libabseil", + "libaec", + "libasprintf", + "libasprintf-devel", + "libavif", + "libblas", + "libbrotlicommon", + "libbrotlidec", + "libbrotlienc", + "libcblas", + "libclang", + "libclang13", + "libcublas", + "libcufft", + "libcufile", + "libcurand", + "libcurl", + "libcusolver", + "libcusparse", + "libdeflate", + "libedit", + "libev", + "libffi", + "libgcc", + "libgcc-ng", + "libgettextpo", + "libgettextpo-devel", + # DO NOT REMOVE, DO NOT ADD libgfortran(non_ng) + "libgfortran-ng", + "libgfortran5", + "libgrpc", + "libhwloc", + "libiconv", + "libidn2", + "liblapack", + "liblapacke", + "libllvm14", + "libllvm18", + "libnghttp2", + "libnpp", + "libnsl", + "libnvfatbin", + "libnvjitlink", + "libnvjpeg", + "libpng", + "libprotobuf", + "libsodium", + "libsqlite", + "libssh2", + "libstdcxx", + "libstdcxx-ng", + "libtiff", + "libunistring", + "libuuid", + "libwebp-base", + "libxcb", + "libxcrypt", + "libxml2", + "libzlib", + "libzopfli", + "lima", + "line_profiler", + "linkify-it-py", + "llvm-openmp", + "llvmlite", + "lz4", + "lz4-c", + "lzstring", + "markdown", + "markdown-it-py", + "markupsafe", + "marshmallow", + "marshmallow-dataclass", + "marshmallow-enum", + "marshmallow-union", + "matplotlib-base", + "matplotlib-inline", + "mccabe", + "mdit-py-plugins", + "mdurl", + "memory_profiler", + "methodtools", + "mistune", + "mizani", + "mkl", + "mkl-devel", + "mkl-include", + "mkl-service", + "msgpack-python", + "multidict", + "munkres", + "mypy_extensions", + "narwhals", + "natsort", + "nbclient", + "nbconvert-core", + "nbformat", + "ncbi-vdb", + "ncurses", + "nest-asyncio", + "networkx", + "notebook", + "notebook-shim", + "numba", + "numcodecs", + "numexpr", + "numpy", + "oauthlib", + "openjpeg", + "openpyxl", + "openssl", + "opt_einsum", + "overrides", + "packaging", + "pandas", + "pandocfilters", + "parasail-python", + "parso", + "pathspec", + "patsy", + "pbmm2", + "pbtk", + "pcre", + "pexpect", + "pickleshare", + "pillow", + "pip", + "pkgutil-resolve-name", + "platformdirs", + "plotly", + "plotnine", + "pluggy", + "polars", + "primer3-py", + "progressbar2", + "prometheus_client", + "prompt-toolkit", + "propcache", + "protobuf", + "psutil", + "psygnal", + "pthread-stubs", + "ptyprocess", + "pure_eval", + "py-cpuinfo", + "pyasn1", + "pyasn1-modules", + "pybedtools", + "pybigwig", + "pycparser", + "pyfaidx", + "pyflakes", + "pygments", + "pyjwt", + "pylint", + "pynndescent", + "pyopenssl", + "pyparsing", + "pysam", + "pysocks", + "pytables", + "pytest", + "python", + "python-annoy", + "python-dateutil", + "python-fastjsonschema", + "python-flatbuffers", + "python-json-logger", + "python-multipart", + "python-tzdata", + "python-utils", + "python_abi", + "pytz", + "pyu2f", + "pyvcf3", + "pywavelets", + "pyyaml", + "pyzmq", + "qhull", + "questionary", + "re2", + "read-roi", + "referencing", + "requests", + "requests-oauthlib", + "rfc3339-validator", + "rfc3986-validator", + "rpds-py", + "rsa", + "s3fs", + "s3transfer", + "scikit-image", + "scikit-learn", + "scipy", + "seaborn", + "seaborn-base", + "send2trash", + "setuptools", + "shapely", + "shellcheck", + "shiny", + "shinywidgets", + "simplejson", + "six", + "snappy", + "sniffio", + "sortedcontainers", + "soupsieve", + "stack_data", + "starlette", + "statsmodels", + "tbb", + "tbb-devel", + "tenacity", + "tensorboard", + "tensorboard-data-server", + "tensorboard-plugin-wit", + "termcolor", + "terminado", + "threadpoolctl", + "tifffile", + "tinycss2", + "tk", + "tomli", + "tomlkit", + "tornado", + "tqdm", + "traitlets", + "typeguard", + "types-python-dateutil", + "typing_extensions", + "typing_inspect", + "typing_utils", + "tzdata", + "uc-micro-py", + "umap-learn", + "unicodedata2", + "uri-template", + "urllib3", + "uvicorn", + "watchfiles", + "wcwidth", + "webcolors", + "webencodings", + "websocket-client", + "websockets", + "werkzeug", + "wget", + "wheel", + "widgetsnbextension", + "wirerope", + "wrapt", + "xmltodict", + "xorg-libxau", + "xorg-libxdmcp", + "xz", + "yaml", + "yarl", + "zarr", + "zeromq", + "zfp", + "zipp", + "zlib", + "zlib-ng", + "zstandard", + "zstd", + "csbdeep", + "fbpca", + "faicons", + "hjson", + "ipytablewidgets", + "keras", + "moods", + "pyarrow", + "py-opencv", + "shiny_semantic", + "simpleitk", + "stardist", + "tensorflow", + "tenxpy", + "tsne", + "vega", + ], + executable_packages = [ + "coverage", + "cython", + "ipython", + "jupyterlab", + "notebook", + "python", + "shellcheck", + ], + aliases = { + "bh_sne_3d": "tsne", + "bh_sne": "tsne", + "cached-property": "cached_property", + "Bio": "biopython", + "importlib_metadata": "importlib-metadata", + "lazy_loader": "lazy-loader", # Package was renamed upstream: https://github.com/conda-forge/lazy_loader-feedstock/pull/11 + "matplotlib": "matplotlib-base", + "melting": "melt", + "MOODS": "moods", + "numpy-base": "numpy", + "numpy_base": "numpy", + "parasail": "parasail-python", + "PIL": "pillow", + "pyBigWig": "pybigwig", + "primer3": "primer3-py", + "progressbar": "progressbar2", + "prompt_toolkit": "prompt-toolkit", + "SimpleITK": "simpleitk", + "skimage": "scikit-image", + "sklearn": "scikit-learn", + "tables": "pytables", + "typing-extensions": "typing_extensions", + "umap": "umap-learn", + }, + py_version = 3, + ) + native.register_toolchains("@{}//:python_toolchain".format(name)) diff --git a/third-party/fbpca.BUILD b/third-party/fbpca.BUILD index 7765439..673e91c 100644 --- a/third-party/fbpca.BUILD +++ b/third-party/fbpca.BUILD @@ -6,6 +6,7 @@ load( load( "@tenx_bazel_rules//rules/conda:conda_manifest.bzl", "conda_deps", + "conda_files", "conda_manifest", ) @@ -29,42 +30,15 @@ license( license_text = site_packages + "/LICENSE", ) -filegroup( - name = "conda_package_fbpca_python", - srcs = [site_packages + "/fbpca.py"], +conda_files( + name = "files", + py_srcs = [site_packages + "/fbpca.py"], visibility = ["@anaconda//:__pkg__"], ) -filegroup( - name = "conda_package_fbpca_hdrs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_fbpca_libs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_fbpca_solibs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_fbpca_data", - srcs = [], - visibility = ["@anaconda//:__pkg__"], -) - -exports_files( - ["BUILD.bazel"], - visibility = ["//visibility:public"], -) - conda_manifest( name = "conda_metadata", info_files = ["info/index.json"], - manifest = "info/files", visibility = ["//visibility:public"], ) diff --git a/third-party/go_deps.bzl b/third-party/go_deps.bzl index 2214678..560a0c8 100644 --- a/third-party/go_deps.bzl +++ b/third-party/go_deps.bzl @@ -2,6 +2,7 @@ # gazelle:repo bazel_gazelle load("@bazel_gazelle//:deps.bzl", "go_repository") +load("@tenx_cloud_cli//:deps.bzl", "cloud_cli_dependencies") load("@tenx_loupekit//:deps.bzl", "loupekit_dependencies") def load_go_deps(): @@ -68,6 +69,8 @@ def load_go_deps(): loupekit_dependencies() + cloud_cli_dependencies() + _maybe_go_repository( name = "com_github_stretchr_testify", commit = "8019298d9fa5a04fc2ad10ae03349df3483096a6", @@ -80,6 +83,13 @@ def load_go_deps(): importpath = "gopkg.in/stretchr/testify.v1", ) + _maybe_go_repository( + name = "in_gopkg_yaml_v3", + sum = "h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=", + version = "v3.0.1", + importpath = "gopkg.in/yaml.v3", + ) + def _maybe_go_repository(name, **kwargs): if name not in native.existing_rules(): go_repository(name = name, **kwargs) diff --git a/third-party/grpc_conda_python.patch b/third-party/grpc_conda_python.patch index 08efab1..bfdb5ee 100644 --- a/third-party/grpc_conda_python.patch +++ b/third-party/grpc_conda_python.patch @@ -52,7 +52,7 @@ index fa47d89ebc..364bffbb9a 100644 + return """ +alias( + name = "_python3_include", -+ actual = "@conda_package_python//:conda_package_python_hdrs", ++ actual = "@conda_package_python//:hdrs", +) +""" diff --git a/third-party/hjson.BUILD b/third-party/hjson.BUILD index 694601f..1f7b818 100644 --- a/third-party/hjson.BUILD +++ b/third-party/hjson.BUILD @@ -6,6 +6,7 @@ load( load( "@tenx_bazel_rules//rules/conda:conda_manifest.bzl", "conda_deps", + "conda_files", "conda_manifest", ) @@ -30,24 +31,9 @@ license( license_text = site_packages + "/LICENSE.txt", ) -filegroup( - name = "conda_package_hjson_hdrs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_hjson_libs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_hjson_solibs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_hjson_python", - srcs = [site_packages + "/hjson/" + f for f in [ +conda_files( + name = "files", + py_srcs = [site_packages + "/hjson/" + f for f in [ "__init__.py", "compat.py", "decoder.py", @@ -60,20 +46,9 @@ filegroup( visibility = ["@anaconda//:__pkg__"], ) -filegroup( - name = "conda_package_hjson_data", - visibility = ["@anaconda//:__pkg__"], -) - -exports_files( - ["BUILD.bazel"], - visibility = ["//visibility:public"], -) - conda_manifest( name = "conda_metadata", info_files = ["info/index.json"], - manifest = "info/files", visibility = ["//visibility:public"], ) diff --git a/third-party/intel-openmp-symlinks.patch b/third-party/intel-openmp-symlinks.patch deleted file mode 100644 index c040b59..0000000 --- a/third-party/intel-openmp-symlinks.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/info/files b/info/files -index 431997e..f8a511d 100644 ---- a/info/files -+++ b/info/files -@@ -1,0 +1,2 @@ -+lib/libgomp.so -+lib/libgomp.so.1 -diff --git a/info/paths.json b/info/paths.json -index 0b5bca8..577fbc4 100644 ---- a/info/paths.json -+++ b/info/paths.json -@@ -1,3 +1,11 @@ - { - "paths": [ -+ { -+ "_path": "lib/libgomp.so", -+ "path_type": "softlink" -+ }, -+ { -+ "_path": "lib/libgomp.so.1", -+ "path_type": "softlink" -+ }, - { --- -2.26.1 - diff --git a/third-party/matplotlib-base-3.7.2-mplconfigdir.patch b/third-party/matplotlib-base-3.7.2-mplconfigdir.patch deleted file mode 100644 index 1f2b9b3..0000000 --- a/third-party/matplotlib-base-3.7.2-mplconfigdir.patch +++ /dev/null @@ -1,52 +0,0 @@ -diff --git a/lib/python3.10/site-packages/matplotlib/__init__.py b/lib/python3.10/site-packages/matplotlib/__init__.py -index ba9cd6c..689f067 100644 ---- a/lib/python3.10/site-packages/matplotlib/__init__.py -+++ b/lib/python3.10/site-packages/matplotlib/__init__.py -@@ -503,37 +503,25 @@ def _get_config_or_cache_dir(xdg_base_getter): - configdir = os.environ.get('MPLCONFIGDIR') - if configdir: - configdir = Path(configdir).resolve() -- elif sys.platform.startswith(('linux', 'freebsd')): -- # Only call _xdg_base_getter here so that MPLCONFIGDIR is tried first, -- # as _xdg_base_getter can throw. -- configdir = Path(xdg_base_getter(), "matplotlib") -- else: -- configdir = Path.home() / ".matplotlib" -- try: -- configdir.mkdir(parents=True, exist_ok=True) -- except OSError: -- pass -- else: -- if os.access(str(configdir), os.W_OK) and configdir.is_dir(): -- return str(configdir) -+ try: -+ configdir.mkdir(parents=True, exist_ok=True) -+ except OSError: -+ pass -+ else: -+ if os.access(str(configdir), os.W_OK) and configdir.is_dir(): -+ return str(configdir) - # If the config or cache directory cannot be created or is not a writable - # directory, create a temporary one. - try: - tmpdir = tempfile.mkdtemp(prefix="matplotlib-") - except OSError as exc: - raise OSError( - f"Matplotlib requires access to a writable cache directory, but the " - f"default path ({configdir}) is not a writable directory, and a temporary " - f"directory could not be created; set the MPLCONFIGDIR environment " - f"variable to a writable directory") from exc - os.environ["MPLCONFIGDIR"] = tmpdir - atexit.register(shutil.rmtree, tmpdir) -- _log.warning( -- "Matplotlib created a temporary cache directory at %s because the default path " -- "(%s) is not a writable directory; it is highly recommended to set the " -- "MPLCONFIGDIR environment variable to a writable directory, in particular to " -- "speed up the import of Matplotlib and to better support multiprocessing.", -- tmpdir, configdir) - return tmpdir - - --- -2.26.1 - diff --git a/third-party/mkl-libblas-symlinks.patch b/third-party/mkl-libblas-symlinks.patch deleted file mode 100644 index 050a98a..0000000 --- a/third-party/mkl-libblas-symlinks.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/info/paths.json b/info/paths.json -index 0b5bca8..577fbc4 100644 ---- a/info/paths.json -+++ b/info/paths.json -@@ -1,5 +1,29 @@ - { - "paths": [ -+ { -+ "_path": "lib/libblas.so", -+ "path_type": "softlink" -+ }, -+ { -+ "_path": "lib/libblas.so.3", -+ "path_type": "softlink" -+ }, -+ { -+ "_path": "lib/libcblas.so", -+ "path_type": "softlink" -+ }, -+ { -+ "_path": "lib/libcblas.so.3", -+ "path_type": "softlink" -+ }, -+ { -+ "_path": "lib/liblapack.so", -+ "path_type": "softlink" -+ }, -+ { -+ "_path": "lib/liblapack.so.3", -+ "path_type": "softlink" -+ }, - { - "_path": "lib/libmkl_avx.so.2", - "path_type": "hardlink", --- -2.26.1 - diff --git a/third-party/moods.BUILD b/third-party/moods.BUILD index d7ff431..c7b9ddf 100644 --- a/third-party/moods.BUILD +++ b/third-party/moods.BUILD @@ -7,6 +7,7 @@ load( load( "@tenx_bazel_rules//rules/conda:conda_manifest.bzl", "conda_deps", + "conda_files", "conda_manifest", ) @@ -33,38 +34,6 @@ license( license_text = site_packages + "/COPYING.BIOPYTHON", ) -filegroup( - name = "conda_package_moods_python", - srcs = [site_packages + "/MOODS/" + f for f in [ - "__init__.py", - "misc.py", - "parsers.py", - "scan.py", - "tools.py", - ]], - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_moods_hdrs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_moods_libs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_moods_solibs", - visibility = ["@anaconda//:__pkg__"], -) - -exports_files( - ["BUILD.bazel"], - visibility = ["//visibility:public"], -) - core = site_packages + "/core" copts = [ @@ -183,20 +152,26 @@ cc_library( linkstatic = True, ) -filegroup( - name = "conda_package_moods_data", - srcs = [ +conda_files( + name = "files", + link_safe_runfiles = [ PARSERS, SCAN, TOOLS, ], + py_srcs = [site_packages + "/MOODS/" + f for f in [ + "__init__.py", + "misc.py", + "parsers.py", + "scan.py", + "tools.py", + ]], visibility = ["@anaconda//:__pkg__"], ) conda_manifest( name = "conda_metadata", info_files = ["info/index.json"], - manifest = "info/files", visibility = ["//visibility:public"], ) diff --git a/third-party/numba-0.55.1-nocache.patch b/third-party/numba-0.55.1-nocache.patch deleted file mode 100644 index 9f84cb0..0000000 --- a/third-party/numba-0.55.1-nocache.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- a/lib/python3.10/site-packages/numba/core/ccallback.py -+++ b/lib/python3.10/site-packages/numba/core/ccallback.py -@@ -56,7 +56,7 @@ class CFunc(object): - self._cache_hits = 0 - - def enable_caching(self): -- self._cache = FunctionCache(self._pyfunc) -+ pass - - @global_compiler_lock - def compile(self): -diff --git a/lib/python3.10/site-packages/numba/core/dispatcher.py b/lib/python3.10/site-packages/numba/core/dispatcher.py -index 18d9426..fb7ab55 100644 ---- a/lib/python3.10/site-packages/numba/core/dispatcher.py -+++ b/lib/python3.10/site-packages/numba/core/dispatcher.py -@@ -740,7 +740,7 @@ class Dispatcher(serialize.ReduceMixin, _MemoMixin, _DispatcherBase): - return types.Dispatcher(self) - - def enable_caching(self): -- self._cache = FunctionCache(self.py_func) -+ pass - - def __get__(self, obj, objtype=None): - '''Allow a JIT function to be bound as a method to an object''' -diff --git a/lib/python3.10/site-packages/numba/np/ufunc/ufuncbuilder.py b/lib/python3.10/site-packages/numba/np/ufunc/ufuncbuilder.py -index 8339c48..f7cbf47 100644 ---- a/lib/python3.10/site-packages/numba/np/ufunc/ufuncbuilder.py -+++ b/lib/python3.10/site-packages/numba/np/ufunc/ufuncbuilder.py -@@ -72,7 +72,7 @@ class UFuncDispatcher(serialize.ReduceMixin): - return cls(py_func=pyfunc, locals=locals, targetoptions=targetoptions) - - def enable_caching(self): -- self.cache = FunctionCache(self.py_func) -+ pass - - def compile(self, sig, locals={}, **targetoptions): - locs = self.locals.copy() diff --git a/third-party/opencv.BUILD b/third-party/opencv.BUILD index 4d8aac4..3028b8d 100644 --- a/third-party/opencv.BUILD +++ b/third-party/opencv.BUILD @@ -6,6 +6,7 @@ load( load( "@tenx_bazel_rules//rules/conda:conda_manifest.bzl", "conda_deps", + "conda_files", "conda_manifest", ) @@ -30,40 +31,14 @@ license( license_text = "src/LICENSE", ) -alias( - name = "conda_package_py_opencv_python", - actual = ":cv2", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_py_opencv_hdrs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_py_opencv_libs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_py_opencv_solibs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_py_opencv_data", - srcs = [ +conda_files( + name = "files", + link_safe_runfiles = [ ":cv2", ], visibility = ["@anaconda//:__pkg__"], ) -exports_files( - ["BUILD.bazel"], - visibility = ["//visibility:public"], -) - filegroup( name = "srcs", srcs = glob( @@ -132,7 +107,6 @@ genrule( conda_manifest( name = "conda_metadata", info_files = ["info/index.json"], - manifest = "info/files", visibility = ["//visibility:public"], ) diff --git a/third-party/py_deps.bzl b/third-party/py_deps.bzl index 7fa8885..5bf3e62 100644 --- a/third-party/py_deps.bzl +++ b/third-party/py_deps.bzl @@ -1,5 +1,9 @@ """Repository rule invocations for third-party python dependencies.""" +load( + "@tenx_bazel_rules//rules:conda_package_repository.bzl", + "conda_package_repository", +) load( "@tenx_bazel_rules//rules:new_conda_package_repository.bzl", "new_conda_package_http_repository", @@ -48,11 +52,15 @@ def load_py_deps(): patch_args = ["-p1"], patches = ["@cellranger//third-party:open-cv-warnings.patch", "@cellranger//third-party:open-cv-grabcut.patch"], sha256 = "c20bb83dd790fc69df9f105477e24267706715a9d3c705ca1e7f613c7b3bad3d", - exported_files = [ - site_packages + "/cv2.so", - ], - license = "Apache-2.0", - version = opencv_version, + ) + + # This package over-constrains libtiff, which makes other updates impossible. + # So, just pull it in separately without letting it take part in the solve. + conda_package_repository( + name = "conda_package_simpleitk", + base_urls = ["https://conda.anaconda.org/simpleitk/linux-64"], + dist_name = "simpleitk-2.2.1-py310h3fd9d12_0", + sha256 = "bbe4fce613459cf15d5c176b30ecc0d8b7c17d594822c36af9b3d735c7283aee", ) tenxpy_commit = "c99de5e11ed7c564752c2c44c9bb8e4890dac1bf" @@ -67,17 +75,10 @@ def load_py_deps(): ], strip_prefix = "tenxpy-" + tenxpy_commit, add_prefix = site_packages, - exported_files = [site_packages + "/tenxpy/" + f for f in [ - "__init__.py", - "constants.py", - "lena2.py", - "utils.py", - ]], sha256 = "b1aa4089b075d02b089e71ac9da8b4a69bb3ea611d82810bf142af2d95f0490a", auth_patterns = { "github.com": "token ", }, - license = "10X Genomics", ) tsne_commit = "45360b641183b6d899bdef201455d89de59a03a2" @@ -91,41 +92,7 @@ def load_py_deps(): ], strip_prefix = "tsne-" + tsne_commit, add_prefix = site_packages, - exported_files = [ - site_packages + "/bh_sne.so", - site_packages + "/bh_sne_3d.so", - site_packages + "/tsne/__init__.py", - site_packages + "/tsne/_version.py", - ], sha256 = "7c7c29c19a703c4ec30d3d5886656f35ae4352e070c4106115336e317279a4c0", - license = "BSD-4-Clause", - version = "0.1.5-10x", - ) - - cas_commit = "9aa178dae7a0a03a8ac05a2fd3deb75e67388ea3" - cas_version = "1.4.0.dev" - cas_prefix = site_packages + "/cellarium/cas/" - new_conda_package_http_repository( - name = "conda_package_cellarium", - build_file = "@cellranger//third-party:cell-annotation-service-client.BUILD", - urls = [ - "https://github.com/cellarium-ai/cellarium-cas/archive/{}.tar.gz".format(cas_commit), - ], - strip_prefix = "cellarium-cas-" + cas_commit, - add_prefix = site_packages, - exported_files = [cas_prefix + f for f in [ - "service.py", - "__init__.py", - "_io.py", - "assets/cellarium_cas_tx_pca_002_grch38_2020_a.json", - "client.py", - "data_preparation.py", - "endpoints.py", - "exceptions.py", - ]], - sha256 = "3c9a44141ba01c5c0f8a054cc9d8e8bd6d41acd849dcdb3e35cb974424f45c86", - license = "BSD-3-Clause", - version = cas_version, ) hjson_version = "3.0.2" @@ -139,51 +106,6 @@ def load_py_deps(): sha256 = "1c16084568a6328ba404703aad6db8ddf7e3b6afec9e141b375a40a61a209c30", strip_prefix = "hjson-py-" + hjson_version, add_prefix = site_packages, - exported_files = [site_packages + "/hjson/" + f for f in [ - "__init__.py", - "compat.py", - "decoder.py", - "encoder.py", - "encoderH.py", - "ordered_dict.py", - "scanner.py", - "tool.py", - ]], - license = "MIT and AFL-2.1", - version = hjson_version, - ) - - shinywidgets_version = "0.2.4" - - new_conda_package_http_repository( - name = "conda_package_shinywidgets", - build_file = "@cellranger//third-party:shinywidgets.BUILD", - urls = [ - "https://github.com/posit-dev/py-shinywidgets/archive/refs/tags/v{}.tar.gz".format(shinywidgets_version), - ], - sha256 = "b167449404e46827d313973ce7d08ef4a98997fc07726a5e406e0cb791826f16", - strip_prefix = "py-shinywidgets-" + shinywidgets_version, - add_prefix = site_packages, - exported_files = [site_packages + "/shinywidgets/" + f for f in [ - "__init__.py", - "_as_widget.py", - "_comm.py", - "_dependencies.py", - "_serialization.py", - "_shinywidgets.py", - "static/1e59d2330b4c6deb84b340635ed36249.ttf", - "static/20fd1704ea223900efa9fd4e869efb08.woff2", - "static/8b43027f47b20503057dfbbaa9401fef.eot", - "static/c1e38fd9e0e74ba58f7a2b77ef29fdd3.svg", - "static/f691f37e57f04c152e2315ab7dbad881.woff", - "static/libembed-amd.js", - "static/node_modules_codemirror_mode_sync_recursive_js_.output.js", - "static/output.js", - "static/vendors-node_modules_codemirror_mode_apl_apl_js-node_modules_codemirror_mode_asciiarmor_ascii-26282f.output.js", - "static/shinywidgets.css", - ]], - license = "MIT", - version = shinywidgets_version, ) ipytablewidgets_version = "0.3.1" @@ -196,35 +118,6 @@ def load_py_deps(): ], sha256 = "6624cbeb73c73c68c5900a3a7719bf6aab560455e76247d373f3fa50336342a8", add_prefix = site_packages, - exported_files = [site_packages + "/ipytablewidgets/" + f for f in [ - "__init__.py", - "_frontend.py", - "_version.py", - "compressors.py", - "numpy_adapter.py", - "pandas_adapter.py", - "progressivis_adapter.py", - "serializers.py", - "source_adapter.py", - "traitlets.py", - "widgets.py", - "labextension/package.json", - "labextension/static/149.40f4249249bc14416a21.js", - "labextension/static/261.bc115825a135ccbef0e9.js", - "labextension/static/405.6e1d012d86b0ed03bddf.js", - "labextension/static/424.e42e48076aba64887fd2.js", - "labextension/static/568.46074a0ad0e0cb2bad6c.js", - "labextension/static/861.78ea6fdd74d109f94c90.js", - "labextension/static/861.78ea6fdd74d109f94c90.js.LICENSE.txt", - "labextension/static/remoteEntry.830facb2b8d2798f80f1.js", - "labextension/static/style.js", - "labextension/static/third-party-licenses.json", - "static/extension.js", - "static/index.js", - "static/index.js.LICENSE.txt", - ]], - license = "BSD-3-Clause", - version = ipytablewidgets_version, patch_args = ["-p1"], patches = ["@cellranger//third-party:ipytablewidgets_dependency_fix.patch"], type = "zip", @@ -240,14 +133,19 @@ def load_py_deps(): ], sha256 = "8a32638798dfaae1f84c1d215fef2fa4936e51a07ea48b667422b6756943ab4c", add_prefix = site_packages, - exported_files = [site_packages + "/faicons/" + f for f in [ - "__init__.py", - "_core.py", - "icons.json", - "py.typed", - ]], - license = "MIT", - version = faicons_version, + type = "zip", + ) + + pyarrow_version = "15.0.2" + + new_conda_package_http_repository( + name = "conda_package_pyarrow", + build_file = "@cellranger//third-party:pyarrow.BUILD", + urls = [ + "https://files.pythonhosted.org/packages/01/e0/13aada7b0af1039554e675bd8c878acb3d86bab690e5a6b05fc8547a9cf2/pyarrow-{}-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl".format(pyarrow_version), + ], + sha256 = "f639c059035011db8c0497e541a8a45d98a58dbe34dc8fadd0ef128f2cee46e5", + add_prefix = site_packages, type = "zip", ) @@ -261,52 +159,6 @@ def load_py_deps(): ], sha256 = "404e7d3496a1f2a15eb94b4fd25a543f3b502466223b0e7c2220aef3eb4d2e0a", add_prefix = site_packages, - exported_files = [site_packages + "/shiny_semantic/" + f for f in [ - "__init__.py", - "_utils.py", - "page.py", - "collections/__init__.py", - "elements/__init__.py", - "elements/button.py", - "elements/container.py", - "elements/divider.py", - "elements/emoji.py", - "elements/flag.py", - "elements/header.py", - "elements/icon.py", - "elements/input.py", - "elements/segment.py", - "modules/__init__.py", - "modules/checkbox.py", - "modules/dropdown.py", - "modules/modal.py", - "modules/slider.py", - "types/__init__.py", - "views/__init__.py", - "views/statistic.py", - "www/shiny-semantic-bindings.js", - "www/bindings/semanticButton.js", - "www/bindings/semanticCheckbox.js", - "www/bindings/semanticCheckboxGroup.js", - "www/bindings/semanticDropdown.js", - "www/bindings/semanticModal.js", - "www/bindings/semanticSlider.js", - "www/semantic/fomantic.min.css", - "www/semantic/fomantic.min.js", - "www/semantic/themes/default/assets/fonts/Lato-Bold.woff2", - "www/semantic/themes/default/assets/fonts/Lato-BoldItalic.woff2", - "www/semantic/themes/default/assets/fonts/Lato-Italic.woff2", - "www/semantic/themes/default/assets/fonts/Lato-Regular.woff2", - "www/semantic/themes/default/assets/fonts/LatoLatin-Bold.woff2", - "www/semantic/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2", - "www/semantic/themes/default/assets/fonts/LatoLatin-Italic.woff2", - "www/semantic/themes/default/assets/fonts/LatoLatin-Regular.woff2", - "www/semantic/themes/default/assets/fonts/brand-icons.woff2", - "www/semantic/themes/default/assets/fonts/icons.woff2", - "www/semantic/themes/default/assets/fonts/outline-icons.woff2", - ]], - license = "LGPL-3.0", - version = shiny_semantic_version, type = "zip", ) @@ -321,27 +173,6 @@ def load_py_deps(): sha256 = "a40002cc618bbd00fbe6f688024abb6a2805e93aed31df1f5f915d37c0c11688", strip_prefix = "ipyvega-" + vega_version, add_prefix = site_packages, - exported_files = [site_packages + "/vega/" + f for f in [ - "__init__.py", - "_frontend.py", - "altair.py", - "base.py", - "utils.py", - "vega.py", - "vegalite.py", - "widget.py", - "static/extension.js", - "static/extension.js.map", - "static/index.js", - "static/index.js.LICENSE.txt", - "static/index.js.map", - "static/labplugin.js", - "static/labplugin.js.LICENSE.txt", - "static/labplugin.js.map", - "static/vega.js", - ]], - license = "BSD-3-Clause", - version = vega_version, ) fbpca_commit = "151c2364cd0ec1fd7da6dec6d3ed2de9c6bfec5d" @@ -355,9 +186,6 @@ def load_py_deps(): sha256 = "49ea11626b7ef26ed3b2ff27e6efca04cd16e3e499442202a73d52f2e4a9f345", strip_prefix = "fbpca-" + fbpca_commit, add_prefix = site_packages, - exported_files = [site_packages + "/fbpca.py"], - version = "1.0", - license = "BSD-3-Clause", ) new_conda_package_http_repository( @@ -369,16 +197,40 @@ def load_py_deps(): sha256 = "79d9ffe8acb7d32182dd190bfd55ad9e3170d1f69ab53ee7e243d2c1449f50d4", strip_prefix = "MOODS-python-1.9.3", add_prefix = site_packages, - exported_files = [ - site_packages + "/MOODS/__init__.py", - site_packages + "/MOODS/_parsers.so", - site_packages + "/MOODS/_scan.so", - site_packages + "/MOODS/_tools.so", - site_packages + "/MOODS/misc.py", - site_packages + "/MOODS/parsers.py", - site_packages + "/MOODS/scan.py", - site_packages + "/MOODS/tools.py", + ) + + csbdeep_version = "0.8.0" + new_conda_package_http_repository( + name = "conda_package_csbdeep", + build_file = "@cellranger//third-party:csbdeep.BUILD", + urls = [ + "https://files.pythonhosted.org/packages/fa/ae/16c5541707c15bfb3ec438dd738846f274899312094b323677e9f47fa3f5/csbdeep-{}-py2.py3-none-any.whl".format(csbdeep_version), ], - license = "Biopython License Agreement and GPL-3.0", - version = "1.9.3", + sha256 = "366cfd039cc440331095f68786563afb54ecb1f35c6e0b629d045507a213f265", + add_prefix = site_packages, + type = "zip", + ) + + stardist_version = "0.9.1" + new_conda_package_http_repository( + name = "conda_package_stardist", + build_file = "@cellranger//third-party:stardist.BUILD", + urls = [ + "https://files.pythonhosted.org/packages/75/5e/4c0d2e48d064dec8f81be2b88404ce1f3440d0b86ee68dc43ab6924008da/stardist-{}-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl".format(stardist_version), + ], + sha256 = "f0f4542970e1c37472bb185bb36c3e4acb9e4efd65181cbbb89de917b7511e42", + add_prefix = site_packages, + type = "zip", + ) + + keras_version = "2.13.1-py3" + new_conda_package_http_repository( + name = "conda_package_keras", + build_file = "@cellranger//third-party:keras.BUILD", + urls = [ + "https://files.pythonhosted.org/packages/2e/f3/19da7511b45e80216cbbd9467137b2d28919c58ba1ccb971435cb631e470/keras-{}-none-any.whl".format(keras_version), + ], + sha256 = "5ce5f706f779fa7330e63632f327b75ce38144a120376b2ae1917c00fa6136af", + add_prefix = site_packages, + type = "zip", ) diff --git a/third-party/pytables-3.8.0-slurmdir.patch b/third-party/pytables-3.8.0-slurmdir.patch deleted file mode 100644 index 87eb679..0000000 --- a/third-party/pytables-3.8.0-slurmdir.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/tables/utils.py b/tables/utils.py -index 8b5d0267d62753bb6b952a4b9adae76561145f56..96186d89cc2c5ea20c9ae4219679b462821ab866 100644 ---- a/lib/python3.10/site-packages/tables/utils.py -+++ b/lib/python3.10/site-packages/tables/utils.py -@@ -157,11 +157,6 @@ def check_file_access(filename, mode='r'): - raise FileNotFoundError(f"``{path.parent}`` does not exist") - if not path.parent.is_dir(): - raise NotADirectoryError(f"``{path.parent}`` is not a directory") -- if not os.access(path.parent, os.W_OK): -- raise PermissionError( -- f"directory ``{path.parent}`` exists but it can not be " -- f"written" -- ) - elif mode == 'a': - if os.access(path, os.F_OK): - check_file_access(path, 'r+') diff --git a/third-party/scikit-image-0.20.0-nocache.patch b/third-party/scikit-image-0.20.0-nocache.patch deleted file mode 100644 index a1aef91..0000000 --- a/third-party/scikit-image-0.20.0-nocache.patch +++ /dev/null @@ -1,156 +0,0 @@ ---- a/lib/python3.10/site-packages/skimage/data/_fetchers.py -+++ b/lib/python3.10/site-packages/skimage/data/_fetchers.py -@@ -20,48 +20,44 @@ - legacy_data_dir = osp.abspath(osp.dirname(__file__)) - skimage_distribution_dir = osp.join(legacy_data_dir, '..') - --try: -- from pooch import file_hash --except ModuleNotFoundError: -- # Function taken from -- # https://github.com/fatiando/pooch/blob/master/pooch/utils.py -- def file_hash(fname, alg="sha256"): -- """ -- Calculate the hash of a given file. -- Useful for checking if a file has changed or been corrupted. -- Parameters -- ---------- -- fname : str -- The name of the file. -- alg : str -- The type of the hashing algorithm -- Returns -- ------- -- hash : str -- The hash of the file. -- Examples -- -------- -- >>> fname = "test-file-for-hash.txt" -- >>> with open(fname, "w") as f: -- ... __ = f.write("content of the file") -- >>> print(file_hash(fname)) -- 0fc74468e6a9a829f103d069aeb2bb4f8646bad58bf146bb0e3379b759ec4a00 -- >>> import os -- >>> os.remove(fname) -- """ -- import hashlib -- if alg not in hashlib.algorithms_available: -- raise ValueError(f'Algorithm \'{alg}\' not available in hashlib') -- # Calculate the hash in chunks to avoid overloading the memory -- chunksize = 65536 -- hasher = hashlib.new(alg) -- with open(fname, "rb") as fin: -+# Function taken from -+# https://github.com/fatiando/pooch/blob/master/pooch/utils.py -+def file_hash(fname, alg="sha256"): -+ """ -+ Calculate the hash of a given file. -+ Useful for checking if a file has changed or been corrupted. -+ Parameters -+ ---------- -+ fname : str -+ The name of the file. -+ alg : str -+ The type of the hashing algorithm -+ Returns -+ ------- -+ hash : str -+ The hash of the file. -+ Examples -+ -------- -+ >>> fname = "test-file-for-hash.txt" -+ >>> with open(fname, "w") as f: -+ ... __ = f.write("content of the file") -+ >>> print(file_hash(fname)) -+ 0fc74468e6a9a829f103d069aeb2bb4f8646bad58bf146bb0e3379b759ec4a00 -+ >>> import os -+ >>> os.remove(fname) -+ """ -+ import hashlib -+ if alg not in hashlib.algorithms_available: -+ raise ValueError(f'Algorithm \'{alg}\' not available in hashlib') -+ # Calculate the hash in chunks to avoid overloading the memory -+ chunksize = 65536 -+ hasher = hashlib.new(alg) -+ with open(fname, "rb") as fin: -+ buff = fin.read(chunksize) -+ while buff: -+ hasher.update(buff) - buff = fin.read(chunksize) -- while buff: -- hasher.update(buff) -- buff = fin.read(chunksize) -- return hasher.hexdigest() -- -+ return hasher.hexdigest() - - def _has_hash(path, expected_hash): - """Check if the provided path has the expected hash.""" -@@ -71,64 +67,9 @@ - - - def create_image_fetcher(): -- try: -- import pooch -- # older versions of Pooch don't have a __version__ attribute -- if not hasattr(pooch, '__version__'): -- retry = {} -- else: -- pooch_version = pooch.__version__.lstrip('v') -- retry = {'retry_if_failed': 3} -- # Keep version check in synch with -- # scikit-image/requirements/optional.txt -- if version.parse(pooch_version) < version.parse('1.3.0'): -- # we need a more recent version of pooch to retry -- retry = {} -- except ImportError: -- # Without pooch, fallback on the standard data directory -- # which for now, includes a few limited data samples -- return None, legacy_data_dir -- -- # Pooch expects a `+` to exist in development versions. -- # Since scikit-image doesn't follow that convention, we have to manually -- # remove `.dev` with a `+` if it exists. -- # This helps pooch understand that it should look in master -- # to find the required files -- if '+git' in __version__: -- skimage_version_for_pooch = __version__.replace('.dev0+git', '+git') -- else: -- skimage_version_for_pooch = __version__.replace('.dev', '+') -- -- if '+' in skimage_version_for_pooch: -- url = ("https://github.com/scikit-image/scikit-image/raw/" -- "{version}/skimage/") -- else: -- url = ("https://github.com/scikit-image/scikit-image/raw/" -- "v{version}/skimage/") -- -- # Create a new friend to manage your sample data storage -- image_fetcher = pooch.create( -- # Pooch uses appdirs to select an appropriate directory for the cache -- # on each platform. -- # https://github.com/ActiveState/appdirs -- # On linux this converges to -- # '$HOME/.cache/scikit-image' -- # With a version qualifier -- path=pooch.os_cache("scikit-image"), -- base_url=url, -- version=skimage_version_for_pooch, -- version_dev="main", -- env="SKIMAGE_DATADIR", -- registry=registry, -- urls=registry_urls, -- # Note: this should read `retry_if_failed=3,`, but we generate that -- # dynamically at import time above, in case installed pooch is a less -- # recent version -- **retry, -- ) -- -- data_dir = osp.join(str(image_fetcher.abspath), 'data') -- return image_fetcher, data_dir -+ # Without pooch, fallback on the standard data directory -+ # which for now, includes a few limited data samples -+ return None, legacy_data_dir - - - image_fetcher, data_dir = create_image_fetcher() diff --git a/third-party/tenxpy.BUILD b/third-party/tenxpy.BUILD index 1099d94..04ff90d 100644 --- a/third-party/tenxpy.BUILD +++ b/third-party/tenxpy.BUILD @@ -2,6 +2,7 @@ load("@conda_package_python//:vars.bzl", "PYTHON_PREFIX") load( "@tenx_bazel_rules//rules/conda:conda_manifest.bzl", "conda_deps", + "conda_files", "conda_manifest", ) @@ -16,35 +17,20 @@ filegroup( visibility = ["@anaconda//:__pkg__"], ) -filegroup( - name = "conda_package_tenxpy_hdrs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_tenxpy_libs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_tenxpy_solibs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_tenxpy_data", +conda_files( + name = "files", + py_srcs = [PYTHON_PREFIX + "/site-packages/tenxpy/" + f for f in [ + "__init__.py", + "constants.py", + "lena2.py", + "utils.py", + ]], visibility = ["@anaconda//:__pkg__"], ) -exports_files( - ["BUILD.bazel"], - visibility = ["//visibility:public"], -) - conda_manifest( name = "conda_metadata", info_files = ["info/index.json"], - manifest = "info/files", visibility = ["//visibility:public"], ) diff --git a/third-party/tsne.BUILD b/third-party/tsne.BUILD index b837498..6b8daab 100644 --- a/third-party/tsne.BUILD +++ b/third-party/tsne.BUILD @@ -9,6 +9,7 @@ load("@tenx_bazel_rules//rules:cython_library.bzl", "cython_library") load( "@tenx_bazel_rules//rules/conda:conda_manifest.bzl", "conda_deps", + "conda_files", "conda_manifest", ) @@ -35,44 +36,19 @@ license( license_text = site_packages + "/LICENSE", ) -filegroup( - name = "conda_package_tsne_hdrs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_tsne_libs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_tsne_solibs", - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_tsne_python", - srcs = [ - site_packages + "/tsne/__init__.py", - site_packages + "/tsne/_version.py", - ], - visibility = ["@anaconda//:__pkg__"], -) - -filegroup( - name = "conda_package_tsne_data", - srcs = [ +conda_files( + name = "files", + link_safe_runfiles = [ ":bh_sne_3d_cp", ":bh_sne_cp", ], + py_srcs = [ + site_packages + "/tsne/__init__.py", + site_packages + "/tsne/_version.py", + ], visibility = ["@anaconda//:__pkg__"], ) -exports_files( - ["BUILD.bazel"], - visibility = ["//visibility:public"], -) - copy_file( name = "bh_sne_cp", src = ":bh_sne.so", @@ -176,7 +152,6 @@ cc_library( conda_manifest( name = "conda_metadata", info_files = ["info/index.json"], - manifest = "info/files", visibility = ["//visibility:public"], )